Reinhard Russinger 5 ani în urmă
părinte
comite
1e79904163
100 a modificat fișierele cu 21407 adăugiri și 5352 ștergeri
  1. 41 0
      Make-bb-kernel_noRT_Qt5.7.sh
  2. 1 1
      board/GfA/Display001/BUILD
  3. 5841 0
      board/GfA/Display001/Display001_4.4.104_bone23_defconfig
  4. 2967 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-001-Bootlogo-GfA.patch
  5. 17 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-002-disa_pru_no_cild_msg.patch
  6. 1015 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-004-egalax_i2c_touchcontroller.patch
  7. 828 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-005-edt-ft5x06.patch
  8. 62 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-006-RS485_udelay_before_tx.patch
  9. 13 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-007-am33xx.dtsi_add_operating_points.patch
  10. 134 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-020-edt-touch-make-gain-offset-threshold-writeable.patch
  11. 18 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-021-remove_endless_loop_in_rtc-ds1307_driver.patch
  12. 108 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-022-add-dts-flags-to-atmel-mxt-touch.patch
  13. 47 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-023-edt-ft5x06-shared-irq.disabled__patch
  14. 65 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-024-edt-ft5x06-fix-report-rate-for-M09.patch
  15. 20 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-025-edt-ft5x06-fix-M9-M12-registercount-on-write.patch
  16. 39 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-026-gpio-pca953x-sitara-i2c-quirks.patch
  17. 28 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-027-input_events_add_IN1-IN4.patch
  18. 3583 0
      board/GfA/Display001/linux_4.4.145_bone23/linux-030-atmel_mxt_ts_backport.patch
  19. BIN
      board/GfA/Display001/rootfs/usr/sbin/fbvncserver
  20. 0 45
      board/GfA/Display001/rootfs/var/GfA/WebVnc/index.vnc
  21. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/VncViewer.jar
  22. 0 141
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/javaviewer.pseudo_proxy.patch
  23. 0 382
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile
  24. 0 2
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.am
  25. 0 382
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.in
  26. 0 338
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/README
  27. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/SignedUltraViewerSSL.jar
  28. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/SignedVncViewer.jar
  29. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/UltraViewerSSL.jar
  30. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/VncViewer.jar
  31. 0 26
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/index.vnc
  32. 0 65
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/onetimekey
  33. 0 73
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/proxy.vnc
  34. 0 3676
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ss_vncviewer
  35. 0 28
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultra.vnc
  36. 0 28
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultraproxy.vnc
  37. 0 28
      board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultrasigned.vnc
  38. 0 35
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/LICENSE.txt
  39. 0 102
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/README.md
  40. 56 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/error-handler.js
  41. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/alt.svg
  42. 106 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/clipboard.svg
  43. 96 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/connect.svg
  44. 96 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrl.svg
  45. 100 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrlaltdel.svg
  46. 94 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/disconnect.svg
  47. 71 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/drag.svg
  48. 81 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/error.svg
  49. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/esc.svg
  50. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/expander.svg
  51. 93 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/fullscreen.svg
  52. 82 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle.svg
  53. 172 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle_bg.svg
  54. 42 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/Makefile
  55. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-120x120.png
  56. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-144x144.png
  57. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-152x152.png
  58. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-16x16.png
  59. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-192x192.png
  60. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-24x24.png
  61. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-32x32.png
  62. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-48x48.png
  63. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-60x60.png
  64. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-64x64.png
  65. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-72x72.png
  66. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-76x76.png
  67. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-96x96.png
  68. 163 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon-sm.svg
  69. 163 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon.svg
  70. 81 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/info.svg
  71. 75 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/keyboard.svg
  72. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_left.svg
  73. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_middle.svg
  74. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_none.svg
  75. 92 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_right.svg
  76. 87 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/power.svg
  77. 76 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/settings.svg
  78. 86 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/tab.svg
  79. 90 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/toggleextrakeys.svg
  80. 81 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/warning.svg
  81. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/de.json
  82. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/el.json
  83. 68 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/es.json
  84. 68 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/nl.json
  85. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/pl.json
  86. 68 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/sv.json
  87. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/tr.json
  88. 69 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/zh.json
  89. 170 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/localization.js
  90. 4 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/CREDITS
  91. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.mp3
  92. BIN
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.oga
  93. 0 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/Orbitron700.ttf
  94. 0 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/Orbitron700.woff
  95. 902 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/base.css
  96. 63 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/lite.css
  97. 1669 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/ui.js
  98. 230 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/webutil.js
  99. 110 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/base64.js
  100. 271 0
      board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/des.js

+ 41 - 0
Make-bb-kernel_noRT_Qt5.7.sh

@@ -0,0 +1,41 @@
+#!/bin/bash
+#-- build kernelsources from RCN Repos
+#--
+##GFAWRKDIR=`pwd`
+##cd ..
+##rm -rf bb-kernel
+##git clone https://github.com/RobertCNelson/bb-kernel
+##cd bb-kernel
+##git checkout -b GfA 4.4.104-bone-rt-r21
+# -- patch kernelbuild
+##patch -p1 < ../GfA/build_kernel_44104rt.sh.patch
+#---------------------------------
+##./build_kernel.sh
+##cd $GFAWRKDIR
+##rm ~/buildroot_dl/GfAkernel57.tar.gz
+##rm GfAkernel57.tar.gz
+##tar -C ../bb-kernel/KERNEL --exclude=./.config --exclude=./.git  -czvf GfAkernel57.tar.gz ./
+#--
+#--
+#!/bin/bash
+GFAWRKDIR=`pwd`
+cd ..
+rm -rf buildroot57
+#git clone git://git.buildroot.net/buildroot ./buildroot57
+##git clone ssh://gogs@gogs.reru.org:2222/PUBLIC_REPOS/buildroot.git ./buildroot57
+git clone https://gogs.reru.org/PUBLIC_REPOS/buildroot.git ./buildroot57
+cd buildroot57
+git checkout 2016.11.3 -b gfawrk
+for i in ../GfA/patches/*.patch
+do
+	echo "==Apply patch : <$i> =="
+	patch -p1 < $i
+done
+
+chmod a+x *.sh
+cp ../GfA/configs/* ./configs
+git add .
+git commit -m "GfA wrk changes and setup"
+make BR2_EXTERNAL=../GfA Display001_4.4.145_bone23_Qt5.7_defconfig
+cd $GFAWRKDIR
+#------

+ 1 - 1
board/GfA/Display001/BUILD

@@ -1 +1 @@
-652
+653

+ 5841 - 0
board/GfA/Display001/Display001_4.4.104_bone23_defconfig

@@ -0,0 +1,5841 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/arm 4.4.145 Kernel Configuration
+#
+CONFIG_ARM=y
+CONFIG_ARM_HAS_SG_CHAIN=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_ARM_DMA_USE_IOMMU=y
+CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
+CONFIG_MIGHT_HAVE_PCI=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_BANDGAP=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_ARM_PATCH_PHYS_VIRT=y
+CONFIG_GENERIC_BUG=y
+CONFIG_PGTABLE_LEVELS=2
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_IRQ_WORK=y
+CONFIG_BUILDTIME_EXTABLE_SORT=y
+
+#
+# General setup
+#
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+# CONFIG_COMPILE_TEST is not set
+CONFIG_LOCALVERSION="-bone23"
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_HAVE_KERNEL_LZ4=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_XZ is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_KERNEL_LZ4 is not set
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_FHANDLE=y
+# CONFIG_USELIB is not set
+CONFIG_AUDIT=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_AUDITSYSCALL=y
+CONFIG_AUDIT_WATCH=y
+CONFIG_AUDIT_TREE=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_CHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_HANDLE_DOMAIN_IRQ=y
+# CONFIG_IRQ_DOMAIN_DEBUG is not set
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+
+#
+# Timers subsystem
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_HZ_PERIODIC=y
+# CONFIG_NO_HZ_IDLE is not set
+# CONFIG_NO_HZ is not set
+CONFIG_HIGH_RES_TIMERS=y
+
+#
+# CPU/Task time and stats accounting
+#
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+CONFIG_TASK_XACCT=y
+CONFIG_TASK_IO_ACCOUNTING=y
+
+#
+# RCU Subsystem
+#
+CONFIG_PREEMPT_RCU=y
+# CONFIG_RCU_EXPERT is not set
+CONFIG_SRCU=y
+# CONFIG_TASKS_RCU is not set
+CONFIG_RCU_STALL_COMMON=y
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_RCU_EXPEDITE_BOOT is not set
+CONFIG_BUILD_BIN2C=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_PIDS=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_PROC_PID_CPUSET=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_PAGE_COUNTER=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMCG_SWAP_ENABLED=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_BLK_CGROUP=y
+# CONFIG_DEBUG_BLK_CGROUP is not set
+CONFIG_CGROUP_WRITEBACK=y
+CONFIG_CHECKPOINT_RESTORE=y
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+CONFIG_SCHED_AUTOGROUP=y
+# CONFIG_SYSFS_DEPRECATED is not set
+CONFIG_RELAY=y
+# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+CONFIG_HAVE_UID16=y
+CONFIG_BPF=y
+CONFIG_EXPERT=y
+CONFIG_UID16=y
+CONFIG_MULTIUSER=y
+# CONFIG_SGETMASK_SYSCALL is not set
+CONFIG_SYSFS_SYSCALL=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_ADVISE_SYSCALLS=y
+# CONFIG_USERFAULTFD is not set
+CONFIG_MEMBARRIER=y
+CONFIG_EMBEDDED=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_SYSTEM_DATA_VERIFICATION is not set
+CONFIG_PROFILING=y
+CONFIG_TRACEPOINTS=y
+CONFIG_KEXEC_CORE=y
+# CONFIG_OPROFILE is not set
+CONFIG_HAVE_OPROFILE=y
+CONFIG_KPROBES=y
+# CONFIG_JUMP_LABEL is not set
+CONFIG_UPROBES=y
+# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_KRETPROBES=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_SECCOMP_FILTER=y
+CONFIG_HAVE_CC_STACKPROTECTOR=y
+CONFIG_CC_STACKPROTECTOR=y
+# CONFIG_CC_STACKPROTECTOR_NONE is not set
+# CONFIG_CC_STACKPROTECTOR_REGULAR is not set
+CONFIG_CC_STACKPROTECTOR_STRONG=y
+CONFIG_HAVE_CONTEXT_TRACKING=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_MODULES_USE_ELF_REL=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_OLD_SIGACTION=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_MODULE_SIG is not set
+# CONFIG_MODULE_COMPRESS is not set
+CONFIG_MODULES_TREE_LOOKUP=y
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_BLK_DEV_THROTTLING=y
+# CONFIG_BLK_CMDLINE_PARSER is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_AIX_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+CONFIG_KARMA_PARTITION=y
+CONFIG_EFI_PARTITION=y
+# CONFIG_SYSV68_PARTITION is not set
+# CONFIG_CMDLINE_PARTITION is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_CFQ_GROUP_IOSCHED=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+CONFIG_MMU=y
+CONFIG_ARCH_MULTIPLATFORM=y
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_LPC32XX is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C24XX is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP1 is not set
+
+#
+# Multiple platform selection
+#
+
+#
+# CPU Core family selection
+#
+# CONFIG_ARCH_MULTI_V6 is not set
+CONFIG_ARCH_MULTI_V7=y
+CONFIG_ARCH_MULTI_V6_V7=y
+# CONFIG_ARCH_MULTI_CPU_AUTO is not set
+# CONFIG_ARCH_VIRT is not set
+# CONFIG_ARCH_MVEBU is not set
+# CONFIG_ARCH_ALPINE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BCM is not set
+# CONFIG_ARCH_BERLIN is not set
+# CONFIG_ARCH_DIGICOLOR is not set
+# CONFIG_ARCH_HIGHBANK is not set
+# CONFIG_ARCH_HISI is not set
+# CONFIG_ARCH_KEYSTONE is not set
+# CONFIG_ARCH_MESON is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_MEDIATEK is not set
+CONFIG_ARCH_OMAP=y
+
+#
+# TI OMAP Common Features
+#
+
+#
+# OMAP Feature Selections
+#
+CONFIG_OMAP_RESET_CLOCKS=y
+CONFIG_OMAP_MUX=y
+CONFIG_OMAP_MUX_DEBUG=y
+CONFIG_OMAP_MUX_WARNINGS=y
+CONFIG_OMAP_32K_TIMER=y
+CONFIG_OMAP_DM_TIMER=y
+CONFIG_OMAP_PM_NOOP=y
+CONFIG_MACH_OMAP_GENERIC=y
+
+#
+# TI OMAP/AM/DM/DRA Family
+#
+# CONFIG_ARCH_OMAP3 is not set
+# CONFIG_ARCH_OMAP4 is not set
+# CONFIG_SOC_OMAP5 is not set
+CONFIG_SOC_AM33XX=y
+# CONFIG_SOC_AM43XX is not set
+# CONFIG_SOC_DRA7XX is not set
+CONFIG_ARCH_OMAP2PLUS=y
+
+#
+# TI OMAP2/3/4 Specific Features
+#
+CONFIG_ARCH_OMAP2PLUS_TYPICAL=y
+CONFIG_SOC_HAS_OMAP2_SDRC=y
+
+#
+# OMAP Legacy Platform Data Board Type
+#
+# CONFIG_ARCH_QCOM is not set
+# CONFIG_ARCH_ROCKCHIP is not set
+# CONFIG_ARCH_SOCFPGA is not set
+# CONFIG_PLAT_SPEAR is not set
+# CONFIG_ARCH_STI is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_EXYNOS is not set
+# CONFIG_ARCH_SHMOBILE_MULTI is not set
+# CONFIG_ARCH_SUNXI is not set
+# CONFIG_ARCH_SIRF is not set
+# CONFIG_ARCH_TEGRA is not set
+# CONFIG_ARCH_UNIPHIER is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_WM8850 is not set
+# CONFIG_ARCH_ZX is not set
+# CONFIG_ARCH_ZYNQ is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_V7=y
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_32v7=y
+CONFIG_CPU_ABRT_EV7=y
+CONFIG_CPU_PABRT_V7=y
+CONFIG_CPU_CACHE_V7=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_TLB_V7=y
+CONFIG_CPU_HAS_ASID=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_LPAE is not set
+# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
+CONFIG_ARM_THUMB=y
+CONFIG_ARM_THUMBEE=y
+CONFIG_ARM_VIRT_EXT=y
+CONFIG_SWP_EMULATE=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_KUSER_HELPERS=y
+CONFIG_VDSO=y
+CONFIG_OUTER_CACHE=y
+CONFIG_OUTER_CACHE_SYNC=y
+CONFIG_MIGHT_HAVE_CACHE_L2X0=y
+CONFIG_CACHE_L2X0=y
+CONFIG_PL310_ERRATA_588369=y
+CONFIG_PL310_ERRATA_727915=y
+# CONFIG_PL310_ERRATA_753970 is not set
+# CONFIG_PL310_ERRATA_769419 is not set
+CONFIG_ARM_L1_CACHE_SHIFT_6=y
+CONFIG_ARM_L1_CACHE_SHIFT=6
+CONFIG_ARM_DMA_MEM_BUFFERABLE=y
+CONFIG_ARM_HEAVY_MB=y
+# CONFIG_ARM_KERNMEM_PERMS is not set
+CONFIG_MULTI_IRQ_HANDLER=y
+CONFIG_ARM_ERRATA_430973=y
+CONFIG_ARM_ERRATA_720789=y
+CONFIG_ARM_ERRATA_754322=y
+CONFIG_ARM_ERRATA_775420=y
+# CONFIG_ARM_ERRATA_773022 is not set
+
+#
+# Bus support
+#
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS_GENERIC is not set
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_HAVE_SMP=y
+# CONFIG_SMP is not set
+CONFIG_HAVE_ARM_ARCH_TIMER=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_3G_OPT is not set
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_ARM_PSCI=y
+CONFIG_ARCH_NR_GPIO=0
+CONFIG_PREEMPT=y
+CONFIG_HAVE_PREEMPT_LAZY=y
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT__LL=y
+# CONFIG_PREEMPT_RTB is not set
+# CONFIG_PREEMPT_RT_FULL is not set
+CONFIG_PREEMPT_COUNT=y
+CONFIG_HZ_FIXED=0
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_200 is not set
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_500 is not set
+CONFIG_HZ_1000=y
+CONFIG_HZ=1000
+CONFIG_SCHED_HRTICK=y
+CONFIG_THUMB2_KERNEL=y
+CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11=y
+CONFIG_ARM_ASM_UNIFIED=y
+CONFIG_AEABI=y
+CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+CONFIG_HAVE_ARCH_PFN_VALID=y
+CONFIG_HIGHMEM=y
+CONFIG_HIGHPTE=y
+CONFIG_CPU_SW_DOMAIN_PAN=y
+CONFIG_HW_PERF_EVENTS=y
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+# CONFIG_ARM_MODULE_PLTS is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_NO_BOOTMEM=y
+CONFIG_MEMORY_ISOLATION=y
+# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_MEMORY_BALLOON=y
+CONFIG_BALLOON_COMPACTION=y
+CONFIG_COMPACTION=y
+CONFIG_MIGRATION=y
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_BOUNCE=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_NEED_PER_CPU_KM=y
+# CONFIG_CLEANCACHE is not set
+CONFIG_FRONTSWAP=y
+CONFIG_CMA=y
+# CONFIG_CMA_DEBUG is not set
+# CONFIG_CMA_DEBUGFS is not set
+CONFIG_CMA_AREAS=7
+CONFIG_ZSWAP=y
+CONFIG_ZPOOL=y
+CONFIG_ZBUD=y
+CONFIG_ZSMALLOC=m
+# CONFIG_PGTABLE_MAPPING is not set
+# CONFIG_ZSMALLOC_STAT is not set
+# CONFIG_IDLE_PAGE_TRACKING is not set
+CONFIG_FRAME_VECTOR=y
+CONFIG_FORCE_MAX_ZONEORDER=12
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+CONFIG_SECCOMP=y
+CONFIG_SWIOTLB=y
+CONFIG_IOMMU_HELPER=y
+# CONFIG_XEN is not set
+
+#
+# Boot options
+#
+CONFIG_USE_OF=y
+CONFIG_ATAGS=y
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_ARM_APPENDED_DTB=y
+CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y
+# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set
+CONFIG_CMDLINE=""
+CONFIG_KEXEC=y
+CONFIG_ATAGS_PROC=y
+# CONFIG_CRASH_DUMP is not set
+CONFIG_AUTO_ZRELADDR=y
+
+#
+# CPU Power Management
+#
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_GOV_COMMON=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+
+#
+# CPU frequency scaling drivers
+#
+CONFIG_CPUFREQ_DT=y
+# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set
+# CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set
+# CONFIG_QORIQ_CPUFREQ is not set
+
+#
+# CPU Idle
+#
+# CONFIG_CPU_IDLE is not set
+# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_VFP=y
+CONFIG_VFPv3=y
+CONFIG_NEON=y
+CONFIG_KERNEL_MODE_NEON=y
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+CONFIG_BINFMT_SCRIPT=y
+# CONFIG_HAVE_AOUT is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_COREDUMP=y
+
+#
+# Power management options
+#
+# CONFIG_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_APM_EMULATION is not set
+CONFIG_PM_OPP=y
+CONFIG_PM_CLK=y
+# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARM_CPU_SUSPEND=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_NET=y
+CONFIG_NET_INGRESS=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_DIAG=m
+CONFIG_UNIX=y
+CONFIG_UNIX_DIAG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_ALGO=m
+CONFIG_XFRM_USER=m
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_MIGRATE=y
+# CONFIG_XFRM_STATISTICS is not set
+CONFIG_XFRM_IPCOMP=m
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_WIREGUARD=m
+# CONFIG_WIREGUARD_DEBUG is not set
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_FIB_TRIE_STATS=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_ROUTE_CLASSID=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE_DEMUX=m
+CONFIG_NET_IP_TUNNEL=m
+CONFIG_NET_IPGRE=m
+CONFIG_NET_IPGRE_BROADCAST=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_SYN_COOKIES=y
+CONFIG_NET_IPVTI=m
+CONFIG_NET_UDP_TUNNEL=m
+CONFIG_NET_FOU=m
+CONFIG_NET_FOU_IP_TUNNELS=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INET_TUNNEL=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_INET_LRO=m
+CONFIG_INET_DIAG=m
+CONFIG_INET_TCP_DIAG=m
+CONFIG_INET_UDP_DIAG=m
+CONFIG_TCP_CONG_ADVANCED=y
+CONFIG_TCP_CONG_BIC=m
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_TCP_CONG_WESTWOOD=m
+CONFIG_TCP_CONG_HTCP=m
+CONFIG_TCP_CONG_HSTCP=m
+CONFIG_TCP_CONG_HYBLA=m
+CONFIG_TCP_CONG_VEGAS=m
+CONFIG_TCP_CONG_SCALABLE=m
+CONFIG_TCP_CONG_LP=m
+CONFIG_TCP_CONG_VENO=m
+CONFIG_TCP_CONG_YEAH=m
+CONFIG_TCP_CONG_ILLINOIS=m
+CONFIG_TCP_CONG_DCTCP=m
+CONFIG_TCP_CONG_CDG=m
+CONFIG_DEFAULT_CUBIC=y
+# CONFIG_DEFAULT_RENO is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_TCP_MD5SIG=y
+CONFIG_IPV6=y
+CONFIG_IPV6_ROUTER_PREF=y
+CONFIG_IPV6_ROUTE_INFO=y
+CONFIG_IPV6_OPTIMISTIC_DAD=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_MIP6=y
+CONFIG_IPV6_ILA=m
+CONFIG_INET6_XFRM_TUNNEL=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
+CONFIG_IPV6_VTI=m
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_SIT_6RD=y
+CONFIG_IPV6_NDISC_NODETYPE=y
+CONFIG_IPV6_TUNNEL=m
+CONFIG_IPV6_GRE=m
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_SUBTREES=y
+CONFIG_IPV6_MROUTE=y
+CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IPV6_PIMSM_V2=y
+CONFIG_NETLABEL=y
+CONFIG_NETWORK_SECMARK=y
+CONFIG_NET_PTP_CLASSIFY=y
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+CONFIG_BRIDGE_NETFILTER=m
+
+#
+# Core Netfilter Configuration
+#
+CONFIG_NETFILTER_INGRESS=y
+CONFIG_NETFILTER_NETLINK=m
+CONFIG_NETFILTER_NETLINK_ACCT=m
+CONFIG_NETFILTER_NETLINK_QUEUE=m
+CONFIG_NETFILTER_NETLINK_LOG=m
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_LOG_COMMON=m
+CONFIG_NF_CONNTRACK_MARK=y
+CONFIG_NF_CONNTRACK_SECMARK=y
+CONFIG_NF_CONNTRACK_ZONES=y
+CONFIG_NF_CONNTRACK_PROCFS=y
+CONFIG_NF_CONNTRACK_EVENTS=y
+CONFIG_NF_CONNTRACK_TIMEOUT=y
+CONFIG_NF_CONNTRACK_TIMESTAMP=y
+CONFIG_NF_CONNTRACK_LABELS=y
+CONFIG_NF_CT_PROTO_DCCP=m
+CONFIG_NF_CT_PROTO_GRE=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CT_PROTO_UDPLITE=m
+CONFIG_NF_CONNTRACK_AMANDA=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_BROADCAST=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_SNMP=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NF_CT_NETLINK_TIMEOUT=m
+CONFIG_NF_CT_NETLINK_HELPER=m
+CONFIG_NETFILTER_NETLINK_GLUE_CT=y
+CONFIG_NF_NAT=m
+CONFIG_NF_NAT_NEEDED=y
+CONFIG_NF_NAT_PROTO_DCCP=m
+CONFIG_NF_NAT_PROTO_UDPLITE=m
+CONFIG_NF_NAT_PROTO_SCTP=m
+CONFIG_NF_NAT_AMANDA=m
+CONFIG_NF_NAT_FTP=m
+CONFIG_NF_NAT_IRC=m
+CONFIG_NF_NAT_SIP=m
+CONFIG_NF_NAT_TFTP=m
+CONFIG_NF_NAT_REDIRECT=m
+CONFIG_NETFILTER_SYNPROXY=m
+CONFIG_NF_TABLES=m
+CONFIG_NF_TABLES_INET=m
+# CONFIG_NF_TABLES_NETDEV is not set
+CONFIG_NFT_EXTHDR=m
+CONFIG_NFT_META=m
+CONFIG_NFT_CT=m
+CONFIG_NFT_RBTREE=m
+CONFIG_NFT_HASH=m
+CONFIG_NFT_COUNTER=m
+CONFIG_NFT_LOG=m
+CONFIG_NFT_LIMIT=m
+CONFIG_NFT_MASQ=m
+CONFIG_NFT_REDIR=m
+CONFIG_NFT_NAT=m
+CONFIG_NFT_QUEUE=m
+CONFIG_NFT_REJECT=m
+CONFIG_NFT_REJECT_INET=m
+CONFIG_NFT_COMPAT=m
+CONFIG_NETFILTER_XTABLES=y
+
+#
+# Xtables combined modules
+#
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_CONNMARK=m
+CONFIG_NETFILTER_XT_SET=m
+
+#
+# Xtables targets
+#
+CONFIG_NETFILTER_XT_TARGET_AUDIT=m
+CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
+CONFIG_NETFILTER_XT_TARGET_CT=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_HL=m
+CONFIG_NETFILTER_XT_TARGET_HMARK=m
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
+CONFIG_NETFILTER_XT_TARGET_LED=m
+CONFIG_NETFILTER_XT_TARGET_LOG=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_NAT=m
+CONFIG_NETFILTER_XT_TARGET_NETMAP=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
+CONFIG_NETFILTER_XT_TARGET_RATEEST=m
+CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
+CONFIG_NETFILTER_XT_TARGET_TEE=m
+CONFIG_NETFILTER_XT_TARGET_TPROXY=m
+CONFIG_NETFILTER_XT_TARGET_TRACE=m
+CONFIG_NETFILTER_XT_TARGET_SECMARK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
+
+#
+# Xtables matches
+#
+CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
+CONFIG_NETFILTER_XT_MATCH_BPF=m
+CONFIG_NETFILTER_XT_MATCH_CGROUP=m
+CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_CPU=m
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ECN=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_HL=m
+CONFIG_NETFILTER_XT_MATCH_IPCOMP=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_IPVS=m
+CONFIG_NETFILTER_XT_MATCH_L2TP=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_NFACCT=m
+CONFIG_NETFILTER_XT_MATCH_OSF=m
+CONFIG_NETFILTER_XT_MATCH_OWNER=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_RATEEST=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_SOCKET=m
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NETFILTER_XT_MATCH_U32=m
+CONFIG_IP_SET=m
+CONFIG_IP_SET_MAX=256
+CONFIG_IP_SET_BITMAP_IP=m
+CONFIG_IP_SET_BITMAP_IPMAC=m
+CONFIG_IP_SET_BITMAP_PORT=m
+CONFIG_IP_SET_HASH_IP=m
+CONFIG_IP_SET_HASH_IPMARK=m
+CONFIG_IP_SET_HASH_IPPORT=m
+CONFIG_IP_SET_HASH_IPPORTIP=m
+CONFIG_IP_SET_HASH_IPPORTNET=m
+CONFIG_IP_SET_HASH_MAC=m
+CONFIG_IP_SET_HASH_NETPORTNET=m
+CONFIG_IP_SET_HASH_NET=m
+CONFIG_IP_SET_HASH_NETNET=m
+CONFIG_IP_SET_HASH_NETPORT=m
+CONFIG_IP_SET_HASH_NETIFACE=m
+CONFIG_IP_SET_LIST_SET=m
+CONFIG_IP_VS=m
+CONFIG_IP_VS_IPV6=y
+# CONFIG_IP_VS_DEBUG is not set
+CONFIG_IP_VS_TAB_BITS=12
+
+#
+# IPVS transport protocol load balancing support
+#
+CONFIG_IP_VS_PROTO_TCP=y
+CONFIG_IP_VS_PROTO_UDP=y
+CONFIG_IP_VS_PROTO_AH_ESP=y
+CONFIG_IP_VS_PROTO_ESP=y
+CONFIG_IP_VS_PROTO_AH=y
+CONFIG_IP_VS_PROTO_SCTP=y
+
+#
+# IPVS scheduler
+#
+CONFIG_IP_VS_RR=m
+CONFIG_IP_VS_WRR=m
+CONFIG_IP_VS_LC=m
+CONFIG_IP_VS_WLC=m
+CONFIG_IP_VS_FO=m
+CONFIG_IP_VS_OVF=m
+CONFIG_IP_VS_LBLC=m
+CONFIG_IP_VS_LBLCR=m
+CONFIG_IP_VS_DH=m
+CONFIG_IP_VS_SH=m
+CONFIG_IP_VS_SED=m
+CONFIG_IP_VS_NQ=m
+
+#
+# IPVS SH scheduler
+#
+CONFIG_IP_VS_SH_TAB_BITS=8
+
+#
+# IPVS application helper
+#
+CONFIG_IP_VS_FTP=m
+CONFIG_IP_VS_NFCT=y
+CONFIG_IP_VS_PE_SIP=m
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV4=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+CONFIG_NF_TABLES_IPV4=m
+CONFIG_NFT_CHAIN_ROUTE_IPV4=m
+CONFIG_NFT_REJECT_IPV4=m
+CONFIG_NFT_DUP_IPV4=m
+CONFIG_NF_TABLES_ARP=m
+CONFIG_NF_DUP_IPV4=m
+CONFIG_NF_LOG_ARP=m
+CONFIG_NF_LOG_IPV4=m
+CONFIG_NF_REJECT_IPV4=m
+CONFIG_NF_NAT_IPV4=m
+CONFIG_NFT_CHAIN_NAT_IPV4=m
+CONFIG_NF_NAT_MASQUERADE_IPV4=m
+CONFIG_NFT_MASQ_IPV4=m
+CONFIG_NFT_REDIR_IPV4=m
+CONFIG_NF_NAT_SNMP_BASIC=m
+CONFIG_NF_NAT_PROTO_GRE=m
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_RPFILTER=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_SYNPROXY=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_SECURITY=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_NF_DEFRAG_IPV6=m
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_NF_TABLES_IPV6=m
+CONFIG_NFT_CHAIN_ROUTE_IPV6=m
+CONFIG_NFT_REJECT_IPV6=m
+CONFIG_NFT_DUP_IPV6=m
+CONFIG_NF_DUP_IPV6=m
+CONFIG_NF_REJECT_IPV6=m
+CONFIG_NF_LOG_IPV6=m
+CONFIG_NF_NAT_IPV6=m
+CONFIG_NFT_CHAIN_NAT_IPV6=m
+CONFIG_NF_NAT_MASQUERADE_IPV6=m
+CONFIG_NFT_MASQ_IPV6=m
+CONFIG_NFT_REDIR_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_RPFILTER=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_TARGET_HL=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_TARGET_SYNPROXY=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_RAW=m
+CONFIG_IP6_NF_SECURITY=m
+CONFIG_IP6_NF_NAT=m
+CONFIG_IP6_NF_TARGET_MASQUERADE=m
+CONFIG_IP6_NF_TARGET_NPT=m
+CONFIG_NF_TABLES_BRIDGE=m
+CONFIG_NFT_BRIDGE_META=m
+CONFIG_NFT_BRIDGE_REJECT=m
+CONFIG_NF_LOG_BRIDGE=m
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_IP6=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_NFLOG=m
+CONFIG_IP_DCCP=m
+CONFIG_INET_DCCP_DIAG=m
+
+#
+# DCCP CCIDs Configuration
+#
+# CONFIG_IP_DCCP_CCID2_DEBUG is not set
+CONFIG_IP_DCCP_CCID3=y
+# CONFIG_IP_DCCP_CCID3_DEBUG is not set
+CONFIG_IP_DCCP_TFRC_LIB=y
+
+#
+# DCCP Kernel Hacking
+#
+# CONFIG_IP_DCCP_DEBUG is not set
+CONFIG_NET_DCCPPROBE=m
+CONFIG_IP_SCTP=m
+CONFIG_NET_SCTPPROBE=m
+# CONFIG_SCTP_DBG_OBJCNT is not set
+CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set
+# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set
+CONFIG_SCTP_COOKIE_HMAC_MD5=y
+CONFIG_SCTP_COOKIE_HMAC_SHA1=y
+CONFIG_RDS=m
+CONFIG_RDS_TCP=m
+# CONFIG_RDS_DEBUG is not set
+CONFIG_TIPC=m
+CONFIG_TIPC_MEDIA_UDP=y
+CONFIG_ATM=m
+CONFIG_ATM_CLIP=m
+# CONFIG_ATM_CLIP_NO_ICMP is not set
+CONFIG_ATM_LANE=m
+CONFIG_ATM_MPOA=m
+CONFIG_ATM_BR2684=m
+# CONFIG_ATM_BR2684_IPFILTER is not set
+CONFIG_L2TP=m
+CONFIG_L2TP_DEBUGFS=m
+CONFIG_L2TP_V3=y
+CONFIG_L2TP_IP=m
+CONFIG_L2TP_ETH=m
+CONFIG_STP=m
+CONFIG_GARP=m
+CONFIG_MRP=m
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+CONFIG_BRIDGE_VLAN_FILTERING=y
+CONFIG_HAVE_NET_DSA=y
+# CONFIG_NET_DSA is not set
+CONFIG_VLAN_8021Q=m
+CONFIG_VLAN_8021Q_GVRP=y
+CONFIG_VLAN_8021Q_MVRP=y
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+CONFIG_LLC2=m
+# CONFIG_IPX is not set
+CONFIG_ATALK=m
+CONFIG_DEV_APPLETALK=m
+CONFIG_IPDDP=m
+CONFIG_IPDDP_ENCAP=y
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+CONFIG_PHONET=m
+CONFIG_6LOWPAN=m
+CONFIG_6LOWPAN_NHC=m
+CONFIG_6LOWPAN_NHC_DEST=m
+CONFIG_6LOWPAN_NHC_FRAGMENT=m
+CONFIG_6LOWPAN_NHC_HOP=m
+CONFIG_6LOWPAN_NHC_IPV6=m
+CONFIG_6LOWPAN_NHC_MOBILITY=m
+CONFIG_6LOWPAN_NHC_ROUTING=m
+CONFIG_6LOWPAN_NHC_UDP=m
+CONFIG_IEEE802154=m
+# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set
+CONFIG_IEEE802154_SOCKET=m
+CONFIG_IEEE802154_6LOWPAN=m
+CONFIG_MAC802154=m
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_ATM=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_MULTIQ=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFB=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_DRR=m
+CONFIG_NET_SCH_MQPRIO=m
+CONFIG_NET_SCH_CHOKE=m
+CONFIG_NET_SCH_QFQ=m
+CONFIG_NET_SCH_CODEL=m
+CONFIG_NET_SCH_FQ_CODEL=m
+CONFIG_NET_SCH_FQ=m
+CONFIG_NET_SCH_HHF=m
+CONFIG_NET_SCH_PIE=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_SCH_PLUG=m
+
+#
+# Classification
+#
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_BASIC=m
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_CLS_U32_MARK=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_FLOW=m
+CONFIG_NET_CLS_CGROUP=m
+CONFIG_NET_CLS_BPF=m
+# CONFIG_NET_CLS_FLOWER is not set
+CONFIG_NET_EMATCH=y
+CONFIG_NET_EMATCH_STACK=32
+CONFIG_NET_EMATCH_CMP=m
+CONFIG_NET_EMATCH_NBYTE=m
+CONFIG_NET_EMATCH_U32=m
+CONFIG_NET_EMATCH_META=m
+CONFIG_NET_EMATCH_TEXT=m
+CONFIG_NET_EMATCH_CANID=m
+CONFIG_NET_EMATCH_IPSET=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_NAT=m
+CONFIG_NET_ACT_PEDIT=m
+CONFIG_NET_ACT_SIMP=m
+CONFIG_NET_ACT_SKBEDIT=m
+CONFIG_NET_ACT_CSUM=m
+CONFIG_NET_ACT_VLAN=m
+CONFIG_NET_ACT_BPF=m
+CONFIG_NET_ACT_CONNMARK=m
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_SCH_FIFO=y
+CONFIG_DCB=y
+CONFIG_DNS_RESOLVER=y
+CONFIG_BATMAN_ADV=m
+CONFIG_BATMAN_ADV_BLA=y
+CONFIG_BATMAN_ADV_DAT=y
+CONFIG_BATMAN_ADV_NC=y
+CONFIG_BATMAN_ADV_MCAST=y
+# CONFIG_BATMAN_ADV_DEBUG is not set
+CONFIG_OPENVSWITCH=m
+CONFIG_OPENVSWITCH_GRE=m
+CONFIG_OPENVSWITCH_VXLAN=m
+CONFIG_OPENVSWITCH_GENEVE=m
+# CONFIG_VSOCKETS is not set
+CONFIG_NETLINK_DIAG=m
+CONFIG_MPLS=y
+CONFIG_NET_MPLS_GSO=y
+CONFIG_MPLS_ROUTING=m
+CONFIG_MPLS_IPTUNNEL=m
+CONFIG_HSR=m
+# CONFIG_NET_SWITCHDEV is not set
+# CONFIG_NET_L3_MASTER_DEV is not set
+CONFIG_CGROUP_NET_PRIO=y
+CONFIG_CGROUP_NET_CLASSID=y
+CONFIG_NET_RX_BUSY_POLL=y
+CONFIG_BQL=y
+CONFIG_BPF_JIT=y
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=m
+# CONFIG_NET_TCPPROBE is not set
+CONFIG_NET_DROP_MONITOR=m
+# CONFIG_HAMRADIO is not set
+CONFIG_CAN=m
+CONFIG_CAN_RAW=m
+CONFIG_CAN_BCM=m
+CONFIG_CAN_GW=m
+
+#
+# CAN Device Drivers
+#
+CONFIG_CAN_VCAN=m
+# CONFIG_CAN_SLCAN is not set
+CONFIG_CAN_DEV=m
+CONFIG_CAN_CALC_BITTIMING=y
+# CONFIG_CAN_LEDS is not set
+CONFIG_CAN_TI_HECC=m
+# CONFIG_CAN_FLEXCAN is not set
+# CONFIG_CAN_GRCAN is not set
+# CONFIG_CAN_RCAR is not set
+# CONFIG_CAN_SJA1000 is not set
+CONFIG_CAN_C_CAN=m
+CONFIG_CAN_C_CAN_PLATFORM=m
+# CONFIG_CAN_M_CAN is not set
+# CONFIG_CAN_CC770 is not set
+
+#
+# CAN SPI interfaces
+#
+CONFIG_CAN_MCP251X=m
+
+#
+# CAN USB interfaces
+#
+CONFIG_CAN_EMS_USB=m
+CONFIG_CAN_ESD_USB2=m
+CONFIG_CAN_GS_USB=m
+CONFIG_CAN_KVASER_USB=m
+CONFIG_CAN_PEAK_USB=m
+CONFIG_CAN_8DEV_USB=m
+# CONFIG_CAN_SOFTING is not set
+# CONFIG_CAN_DEBUG_DEVICES is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_BREDR=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HS=y
+CONFIG_BT_LE=y
+CONFIG_BT_6LOWPAN=m
+# CONFIG_BT_SELFTEST is not set
+CONFIG_BT_DEBUGFS=y
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_INTEL=m
+CONFIG_BT_BCM=m
+CONFIG_BT_RTL=m
+CONFIG_BT_QCA=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTUSB_BCM=y
+CONFIG_BT_HCIBTUSB_RTL=y
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIUART_3WIRE=y
+# CONFIG_BT_HCIUART_INTEL is not set
+CONFIG_BT_HCIUART_BCM=y
+CONFIG_BT_HCIUART_QCA=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_BT_WILINK=m
+CONFIG_AF_RXRPC=m
+# CONFIG_AF_RXRPC_DEBUG is not set
+CONFIG_RXKAD=m
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_SPY=y
+CONFIG_WEXT_PRIV=y
+CONFIG_CFG80211=m
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEBUGFS is not set
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+CONFIG_CFG80211_CRDA_SUPPORT=y
+CONFIG_CFG80211_WEXT=y
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_LIB80211_DEBUG is not set
+CONFIG_MAC80211=m
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+# CONFIG_MAC80211_RC_MINSTREL_VHT is not set
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+CONFIG_MAC80211_MESH=y
+CONFIG_MAC80211_LEDS=y
+# CONFIG_MAC80211_DEBUGFS is not set
+# CONFIG_MAC80211_MESSAGE_TRACING is not set
+# CONFIG_MAC80211_DEBUG_MENU is not set
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+CONFIG_WIMAX=m
+CONFIG_WIMAX_DEBUG_LEVEL=8
+CONFIG_RFKILL=y
+CONFIG_RFKILL_LEDS=y
+CONFIG_RFKILL_INPUT=y
+# CONFIG_RFKILL_REGULATOR is not set
+# CONFIG_RFKILL_GPIO is not set
+CONFIG_NET_9P=m
+CONFIG_NET_9P_VIRTIO=m
+# CONFIG_NET_9P_DEBUG is not set
+# CONFIG_CAIF is not set
+CONFIG_CEPH_LIB=m
+# CONFIG_CEPH_LIB_PRETTYDEBUG is not set
+# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set
+CONFIG_NFC=m
+CONFIG_NFC_DIGITAL=m
+CONFIG_NFC_NCI=m
+CONFIG_NFC_NCI_SPI=m
+# CONFIG_NFC_NCI_UART is not set
+CONFIG_NFC_HCI=m
+CONFIG_NFC_SHDLC=y
+
+#
+# Near Field Communication (NFC) devices
+#
+CONFIG_NFC_PN533=m
+CONFIG_NFC_WILINK=m
+# CONFIG_NFC_TRF7970A is not set
+CONFIG_NFC_SIM=m
+CONFIG_NFC_PORT100=m
+# CONFIG_NFC_FDP is not set
+CONFIG_NFC_PN544=m
+CONFIG_NFC_PN544_I2C=m
+CONFIG_NFC_MICROREAD=m
+CONFIG_NFC_MICROREAD_I2C=m
+# CONFIG_NFC_MRVL_USB is not set
+# CONFIG_NFC_ST21NFCA is not set
+# CONFIG_NFC_ST_NCI is not set
+# CONFIG_NFC_NXP_NCI is not set
+# CONFIG_NFC_S3FWRN5_I2C is not set
+CONFIG_LWTUNNEL=y
+CONFIG_DST_CACHE=y
+CONFIG_HAVE_BPF_JIT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_UEVENT_HELPER is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE="am335x-pm-firmware.elf am335x-bone-scale-data.bin am335x-evm-scale-data.bin am43x-evm-scale-data.bin"
+CONFIG_EXTRA_FIRMWARE_DIR="firmware"
+CONFIG_FW_LOADER_USER_HELPER=y
+# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
+CONFIG_WANT_DEV_COREDUMP=y
+CONFIG_ALLOW_DEV_COREDUMP=y
+CONFIG_DEV_COREDUMP=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_GENERIC_CPU_DEVICES is not set
+CONFIG_SOC_BUS=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_SPI=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_REGMAP_IRQ=y
+CONFIG_DMA_SHARED_BUFFER=y
+# CONFIG_FENCE_TRACE is not set
+CONFIG_DMA_CMA=y
+
+#
+# Default contiguous memory area size:
+#
+CONFIG_CMA_SIZE_MBYTES=24
+CONFIG_CMA_SIZE_SEL_MBYTES=y
+# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
+# CONFIG_CMA_SIZE_SEL_MIN is not set
+# CONFIG_CMA_SIZE_SEL_MAX is not set
+CONFIG_CMA_ALIGNMENT=8
+
+#
+# Bus devices
+#
+# CONFIG_ARM_CCI400_PMU is not set
+# CONFIG_ARM_CCI500_PMU is not set
+# CONFIG_ARM_CCN is not set
+# CONFIG_BRCMSTB_GISB_ARB is not set
+CONFIG_OMAP_INTERCONNECT=y
+CONFIG_OMAP_OCP2SCP=y
+CONFIG_VEXPRESS_CONFIG=y
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+CONFIG_MTD=y
+# CONFIG_MTD_TESTS is not set
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+CONFIG_MTD_OF_PARTS=m
+CONFIG_MTD_AR7_PARTS=m
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+CONFIG_MTD_BLOCK_RO=m
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+CONFIG_RFD_FTL=m
+CONFIG_SSFDC=m
+# CONFIG_SM_FTL is not set
+CONFIG_MTD_OOPS=m
+CONFIG_MTD_SWAP=m
+# CONFIG_MTD_PARTITIONED_MASTER is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_RAM=m
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=m
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_PHYSMAP_OF is not set
+CONFIG_MTD_PLATRAM=m
+
+#
+# Self-contained MTD device drivers
+#
+CONFIG_MTD_DATAFLASH=m
+# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
+# CONFIG_MTD_DATAFLASH_OTP is not set
+CONFIG_MTD_M25P80=m
+CONFIG_MTD_SST25L=m
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOCG3 is not set
+CONFIG_MTD_NAND_ECC=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_BCH=y
+CONFIG_MTD_NAND_ECC_BCH=y
+# CONFIG_MTD_SM_COMMON is not set
+# CONFIG_MTD_NAND_DENALI_DT is not set
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_OMAP2=m
+# CONFIG_MTD_NAND_OMAP_BCH is not set
+# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_DOCG4 is not set
+CONFIG_MTD_NAND_NANDSIM=m
+# CONFIG_MTD_NAND_BRCMNAND is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_NAND_HISI504 is not set
+CONFIG_MTD_ONENAND=y
+CONFIG_MTD_ONENAND_VERIFY_WRITE=y
+# CONFIG_MTD_ONENAND_GENERIC is not set
+# CONFIG_MTD_ONENAND_OTP is not set
+CONFIG_MTD_ONENAND_2X_PROGRAM=y
+
+#
+# LPDDR & LPDDR2 PCM memory drivers
+#
+CONFIG_MTD_LPDDR=m
+CONFIG_MTD_QINFO_PROBE=m
+# CONFIG_MTD_LPDDR2_NVM is not set
+CONFIG_MTD_SPI_NOR=m
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_UBI=m
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+CONFIG_MTD_UBI_BEB_LIMIT=20
+# CONFIG_MTD_UBI_FASTMAP is not set
+# CONFIG_MTD_UBI_GLUEBI is not set
+CONFIG_MTD_UBI_BLOCK=y
+CONFIG_DTC=y
+CONFIG_OF=y
+# CONFIG_OF_UNITTEST is not set
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_DYNAMIC=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_NET=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_MTD=y
+CONFIG_OF_RESERVED_MEM=y
+CONFIG_OF_RESOLVE=y
+CONFIG_OF_OVERLAY=y
+CONFIG_OF_CONFIGFS=y
+CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+CONFIG_BLK_DEV_NULL_BLK=m
+CONFIG_ZRAM=m
+CONFIG_ZRAM_LZ4_COMPRESS=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_DRBD=m
+# CONFIG_DRBD_FAULT_INJECTION is not set
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_OSD=m
+CONFIG_BLK_DEV_RAM=m
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
+# CONFIG_MG_DISK is not set
+CONFIG_VIRTIO_BLK=m
+CONFIG_BLK_DEV_RBD=m
+
+#
+# Misc devices
+#
+CONFIG_SENSORS_LIS3LV02D=m
+CONFIG_AD525X_DPOT=m
+CONFIG_AD525X_DPOT_I2C=m
+CONFIG_AD525X_DPOT_SPI=m
+# CONFIG_DUMMY_IRQ is not set
+CONFIG_HWLAT_DETECTOR=m
+CONFIG_ICS932S401=m
+CONFIG_ENCLOSURE_SERVICES=m
+CONFIG_APDS9802ALS=m
+CONFIG_ISL29003=m
+CONFIG_ISL29020=m
+CONFIG_SENSORS_TSL2550=m
+CONFIG_SENSORS_BH1780=m
+CONFIG_SENSORS_BH1770=m
+CONFIG_SENSORS_APDS990X=m
+CONFIG_HMC6352=m
+CONFIG_DS1682=m
+CONFIG_TI_DAC7512=m
+# CONFIG_BMP085_I2C is not set
+# CONFIG_BMP085_SPI is not set
+# CONFIG_USB_SWITCH_FSA9480 is not set
+# CONFIG_LATTICE_ECP3_CONFIG is not set
+CONFIG_SRAM=y
+CONFIG_VEXPRESS_SYSCFG=y
+# CONFIG_BONE_CAPEMGR is not set
+# CONFIG_DEV_OVERLAYMGR is not set
+CONFIG_TIEQEP=m
+CONFIG_C2PORT=m
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_AT24=y
+CONFIG_EEPROM_AT25=y
+CONFIG_EEPROM_LEGACY=m
+CONFIG_EEPROM_MAX6875=m
+CONFIG_EEPROM_93CX6=m
+CONFIG_EEPROM_93XX46=m
+
+#
+# Texas Instruments shared transport line discipline
+#
+CONFIG_TI_ST=m
+CONFIG_SENSORS_LIS3_SPI=m
+CONFIG_SENSORS_LIS3_I2C=m
+
+#
+# Altera FPGA firmware download module
+#
+CONFIG_ALTERA_STAPL=m
+
+#
+# Intel MIC Bus Driver
+#
+
+#
+# SCIF Bus Driver
+#
+
+#
+# Intel MIC Host Driver
+#
+
+#
+# Intel MIC Card Driver
+#
+
+#
+# SCIF Driver
+#
+
+#
+# Intel MIC Coprocessor State Management (COSM) Drivers
+#
+
+#
+# Argus cape driver for beaglebone black
+#
+CONFIG_CAPE_BONE_ARGUS=y
+# CONFIG_BEAGLEBONE_PINMUX_HELPER is not set
+# CONFIG_ECHO is not set
+# CONFIG_CXL_BASE is not set
+# CONFIG_CXL_KERNEL_API is not set
+# CONFIG_CXL_EEH is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_NETLINK=y
+# CONFIG_SCSI_MQ_DEFAULT is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+CONFIG_BLK_DEV_SR_VENDOR=y
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+CONFIG_SCSI_ENCLOSURE=m
+CONFIG_SCSI_CONSTANTS=y
+CONFIG_SCSI_LOGGING=y
+CONFIG_SCSI_SCAN_ASYNC=y
+
+#
+# SCSI Transports
+#
+CONFIG_SCSI_SPI_ATTRS=m
+CONFIG_SCSI_FC_ATTRS=m
+CONFIG_SCSI_ISCSI_ATTRS=m
+CONFIG_SCSI_SAS_ATTRS=m
+CONFIG_SCSI_SAS_LIBSAS=m
+CONFIG_SCSI_SAS_ATA=y
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_SCSI_SRP_ATTRS=m
+CONFIG_SCSI_LOWLEVEL=y
+CONFIG_ISCSI_TCP=m
+CONFIG_ISCSI_BOOT_SYSFS=m
+CONFIG_SCSI_UFSHCD=m
+# CONFIG_SCSI_UFSHCD_PLATFORM is not set
+CONFIG_LIBFC=m
+CONFIG_LIBFCOE=m
+# CONFIG_SCSI_DEBUG is not set
+CONFIG_SCSI_VIRTIO=m
+CONFIG_SCSI_DH=y
+CONFIG_SCSI_DH_RDAC=m
+CONFIG_SCSI_DH_HP_SW=m
+CONFIG_SCSI_DH_EMC=m
+CONFIG_SCSI_DH_ALUA=m
+CONFIG_SCSI_OSD_INITIATOR=m
+CONFIG_SCSI_OSD_ULD=m
+CONFIG_SCSI_OSD_DPRINT_SENSE=1
+# CONFIG_SCSI_OSD_DEBUG is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_SATA_PMP=y
+
+#
+# Controllers with non-SFF native interface
+#
+CONFIG_SATA_AHCI_PLATFORM=y
+# CONFIG_AHCI_CEVA is not set
+CONFIG_AHCI_QORIQ=y
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+
+#
+# PATA SFF controllers with BMDMA
+#
+
+#
+# PIO-only SFF controllers
+#
+CONFIG_PATA_PLATFORM=y
+CONFIG_PATA_OF_PLATFORM=y
+
+#
+# Generic fallback / legacy drivers
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID456=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+# CONFIG_MD_CLUSTER is not set
+# CONFIG_BCACHE is not set
+CONFIG_BLK_DEV_DM_BUILTIN=y
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_MQ_DEFAULT is not set
+# CONFIG_DM_DEBUG is not set
+CONFIG_DM_BUFIO=m
+CONFIG_DM_BIO_PRISON=m
+CONFIG_DM_PERSISTENT_DATA=m
+# CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_THIN_PROVISIONING=m
+CONFIG_DM_CACHE=m
+CONFIG_DM_CACHE_MQ=m
+CONFIG_DM_CACHE_SMQ=m
+CONFIG_DM_CACHE_CLEANER=m
+CONFIG_DM_ERA=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_LOG_USERSPACE=m
+CONFIG_DM_RAID=m
+CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_QL=m
+CONFIG_DM_MULTIPATH_ST=m
+CONFIG_DM_DELAY=m
+CONFIG_DM_UEVENT=y
+CONFIG_DM_FLAKEY=m
+CONFIG_DM_VERITY=m
+CONFIG_DM_SWITCH=m
+CONFIG_DM_LOG_WRITES=m
+CONFIG_TARGET_CORE=m
+CONFIG_TCM_IBLOCK=m
+CONFIG_TCM_FILEIO=m
+CONFIG_TCM_PSCSI=m
+CONFIG_TCM_USER2=m
+CONFIG_LOOPBACK_TARGET=m
+CONFIG_TCM_FC=m
+CONFIG_ISCSI_TARGET=m
+CONFIG_NETDEVICES=y
+CONFIG_MII=m
+CONFIG_NET_CORE=y
+CONFIG_BONDING=m
+CONFIG_DUMMY=m
+CONFIG_EQUALIZER=m
+CONFIG_IFB=m
+CONFIG_NET_TEAM=m
+CONFIG_NET_TEAM_MODE_BROADCAST=m
+CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
+CONFIG_NET_TEAM_MODE_RANDOM=m
+CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m
+CONFIG_NET_TEAM_MODE_LOADBALANCE=m
+CONFIG_MACVLAN=m
+CONFIG_MACVTAP=m
+CONFIG_IPVLAN=m
+CONFIG_VXLAN=m
+CONFIG_GENEVE=m
+CONFIG_NETCONSOLE=m
+CONFIG_NETCONSOLE_DYNAMIC=y
+CONFIG_NETPOLL=y
+CONFIG_NET_POLL_CONTROLLER=y
+CONFIG_TUN=m
+# CONFIG_TUN_VNET_CROSS_LE is not set
+CONFIG_VETH=m
+CONFIG_VIRTIO_NET=m
+CONFIG_NLMON=m
+CONFIG_ATM_DRIVERS=y
+CONFIG_ATM_DUMMY=m
+# CONFIG_ATM_TCP is not set
+
+#
+# CAIF transport drivers
+#
+# CONFIG_VHOST_NET is not set
+# CONFIG_VHOST_SCSI is not set
+# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
+
+#
+# Distributed Switch Architecture drivers
+#
+# CONFIG_NET_DSA_MV88E6XXX is not set
+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
+CONFIG_ETHERNET=y
+# CONFIG_ALTERA_TSE is not set
+# CONFIG_NET_VENDOR_ARC is not set
+# CONFIG_NET_VENDOR_AURORA is not set
+CONFIG_NET_CADENCE=y
+# CONFIG_MACB is not set
+CONFIG_NET_VENDOR_BROADCOM=y
+# CONFIG_B44 is not set
+# CONFIG_BCMGENET is not set
+# CONFIG_SYSTEMPORT is not set
+CONFIG_NET_VENDOR_CIRRUS=y
+# CONFIG_CS89x0 is not set
+# CONFIG_DM9000 is not set
+# CONFIG_DNET is not set
+CONFIG_NET_VENDOR_EZCHIP=y
+# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set
+CONFIG_NET_VENDOR_FARADAY=y
+# CONFIG_FTMAC100 is not set
+# CONFIG_FTGMAC100 is not set
+CONFIG_NET_VENDOR_HISILICON=y
+# CONFIG_HIX5HD2_GMAC is not set
+# CONFIG_HIP04_ETH is not set
+# CONFIG_HNS is not set
+# CONFIG_HNS_DSAF is not set
+# CONFIG_HNS_ENET is not set
+CONFIG_NET_VENDOR_INTEL=y
+CONFIG_NET_VENDOR_I825XX=y
+CONFIG_NET_VENDOR_MARVELL=y
+# CONFIG_MVMDIO is not set
+CONFIG_NET_VENDOR_MICREL=y
+# CONFIG_KS8842 is not set
+CONFIG_KS8851=m
+# CONFIG_KS8851_MLL is not set
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_ENC28J60=m
+# CONFIG_ENC28J60_WRITEVERIFY is not set
+CONFIG_ENCX24J600=m
+CONFIG_NET_VENDOR_NATSEMI=y
+CONFIG_NET_VENDOR_8390=y
+# CONFIG_AX88796 is not set
+# CONFIG_ETHOC is not set
+CONFIG_NET_VENDOR_QUALCOMM=y
+# CONFIG_QCA7000 is not set
+CONFIG_NET_VENDOR_RENESAS=y
+CONFIG_NET_VENDOR_ROCKER=y
+CONFIG_NET_VENDOR_SAMSUNG=y
+# CONFIG_SXGBE_ETH is not set
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SMSC=y
+CONFIG_SMC91X=m
+CONFIG_SMC911X=m
+CONFIG_SMSC911X=m
+# CONFIG_SMSC911X_ARCH_HOOKS is not set
+CONFIG_NET_VENDOR_STMICRO=y
+# CONFIG_STMMAC_ETH is not set
+CONFIG_NET_VENDOR_SYNOPSYS=y
+# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set
+CONFIG_NET_VENDOR_TI=y
+CONFIG_TI_DAVINCI_MDIO=y
+CONFIG_TI_DAVINCI_CPDMA=y
+CONFIG_TI_CPSW_PHY_SEL=y
+CONFIG_TI_CPSW_ALE=y
+CONFIG_TI_CPSW=y
+CONFIG_TI_CPTS=y
+CONFIG_NET_VENDOR_VIA=y
+# CONFIG_VIA_RHINE is not set
+# CONFIG_VIA_VELOCITY is not set
+CONFIG_NET_VENDOR_WIZNET=y
+# CONFIG_WIZNET_W5100 is not set
+# CONFIG_WIZNET_W5300 is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_AQUANTIA_PHY is not set
+CONFIG_AT803X_PHY=m
+CONFIG_AMD_PHY=m
+CONFIG_MARVELL_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_VITESSE_PHY=m
+# CONFIG_TERANETICS_PHY is not set
+CONFIG_SMSC_PHY=y
+CONFIG_BCM_NET_PHYLIB=m
+CONFIG_BROADCOM_PHY=m
+# CONFIG_BCM7XXX_PHY is not set
+CONFIG_BCM87XX_PHY=m
+CONFIG_ICPLUS_PHY=m
+CONFIG_REALTEK_PHY=m
+CONFIG_NATIONAL_PHY=m
+CONFIG_STE10XP=m
+CONFIG_LSI_ET1011C_PHY=m
+CONFIG_MICREL_PHY=y
+CONFIG_DP83848_PHY=y
+CONFIG_DP83867_PHY=m
+CONFIG_MICROCHIP_PHY=m
+CONFIG_FIXED_PHY=m
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_MDIO_BUS_MUX_GPIO is not set
+# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
+# CONFIG_MDIO_BCM_UNIMAC is not set
+# CONFIG_MICREL_KS8995MA is not set
+CONFIG_PPP=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_MPPE=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPPOATM=m
+CONFIG_PPPOE=m
+CONFIG_PPTP=m
+CONFIG_PPPOL2TP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_SLIP=m
+CONFIG_SLHC=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+CONFIG_SLIP_MODE_SLIP6=y
+CONFIG_USB_NET_DRIVERS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_RTL8152=m
+CONFIG_USB_LAN78XX=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_AX88179_178A=m
+CONFIG_USB_NET_CDCETHER=m
+CONFIG_USB_NET_CDC_EEM=m
+CONFIG_USB_NET_CDC_NCM=m
+CONFIG_USB_NET_HUAWEI_CDC_NCM=m
+CONFIG_USB_NET_CDC_MBIM=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_SR9700=m
+CONFIG_USB_NET_SR9800=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET_ENABLE=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_EPSON2888=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_NET_CX82310_ETH=m
+CONFIG_USB_NET_KALMIA=m
+CONFIG_USB_NET_QMI_WWAN=m
+CONFIG_USB_HSO=m
+CONFIG_USB_NET_INT51X1=m
+CONFIG_USB_CDC_PHONET=m
+CONFIG_USB_IPHETH=m
+CONFIG_USB_SIERRA_NET=m
+CONFIG_USB_VL600=m
+CONFIG_USB_NET_CH9200=m
+CONFIG_WLAN=y
+CONFIG_LIBERTAS_THINFIRM=m
+# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_AT76C50X_USB=m
+CONFIG_USB_ZD1201=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_RTL8187=m
+CONFIG_RTL8187_LEDS=y
+CONFIG_MAC80211_HWSIM=m
+CONFIG_ATH_COMMON=m
+CONFIG_ATH_CARDS=m
+# CONFIG_ATH_DEBUG is not set
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K_COMMON=m
+CONFIG_ATH9K_BTCOEX_SUPPORT=y
+CONFIG_ATH9K=m
+# CONFIG_ATH9K_AHB is not set
+# CONFIG_ATH9K_DEBUGFS is not set
+# CONFIG_ATH9K_DYNACK is not set
+# CONFIG_ATH9K_WOW is not set
+CONFIG_ATH9K_RFKILL=y
+# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
+CONFIG_ATH9K_PCOEM=y
+CONFIG_ATH9K_HTC=m
+# CONFIG_ATH9K_HTC_DEBUGFS is not set
+CONFIG_CARL9170=m
+CONFIG_CARL9170_LEDS=y
+CONFIG_CARL9170_WPC=y
+# CONFIG_CARL9170_HWRNG is not set
+CONFIG_ATH6KL=m
+CONFIG_ATH6KL_SDIO=m
+CONFIG_ATH6KL_USB=m
+# CONFIG_ATH6KL_DEBUG is not set
+# CONFIG_ATH6KL_TRACING is not set
+CONFIG_AR5523=m
+CONFIG_ATH10K=m
+# CONFIG_ATH10K_DEBUG is not set
+# CONFIG_ATH10K_DEBUGFS is not set
+# CONFIG_ATH10K_TRACING is not set
+CONFIG_WCN36XX=m
+# CONFIG_WCN36XX_DEBUGFS is not set
+CONFIG_B43=m
+CONFIG_B43_BCMA=y
+CONFIG_B43_SSB=y
+CONFIG_B43_BUSES_BCMA_AND_SSB=y
+# CONFIG_B43_BUSES_BCMA is not set
+# CONFIG_B43_BUSES_SSB is not set
+CONFIG_B43_SDIO=y
+CONFIG_B43_BCMA_PIO=y
+CONFIG_B43_PIO=y
+CONFIG_B43_PHY_G=y
+CONFIG_B43_PHY_N=y
+CONFIG_B43_PHY_LP=y
+CONFIG_B43_PHY_HT=y
+CONFIG_B43_LEDS=y
+CONFIG_B43_HWRNG=y
+# CONFIG_B43_DEBUG is not set
+CONFIG_B43LEGACY=m
+CONFIG_B43LEGACY_LEDS=y
+CONFIG_B43LEGACY_HWRNG=y
+CONFIG_B43LEGACY_DEBUG=y
+CONFIG_B43LEGACY_DMA=y
+CONFIG_B43LEGACY_PIO=y
+CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
+# CONFIG_B43LEGACY_DMA_MODE is not set
+# CONFIG_B43LEGACY_PIO_MODE is not set
+CONFIG_BRCMUTIL=m
+CONFIG_BRCMSMAC=m
+CONFIG_BRCMFMAC=m
+CONFIG_BRCMFMAC_PROTO_BCDC=y
+CONFIG_BRCMFMAC_SDIO=y
+CONFIG_BRCMFMAC_USB=y
+# CONFIG_BRCM_TRACING is not set
+# CONFIG_BRCMDBG is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_SDIO=m
+CONFIG_LIBERTAS_SPI=m
+# CONFIG_LIBERTAS_DEBUG is not set
+CONFIG_LIBERTAS_MESH=y
+CONFIG_P54_COMMON=m
+CONFIG_P54_USB=m
+# CONFIG_P54_SPI is not set
+CONFIG_P54_LEDS=y
+CONFIG_RT2X00=m
+CONFIG_RT2500USB=m
+CONFIG_RT73USB=m
+CONFIG_RT2800USB=m
+CONFIG_RT2800USB_RT33XX=y
+CONFIG_RT2800USB_RT35XX=y
+CONFIG_RT2800USB_RT3573=y
+CONFIG_RT2800USB_RT53XX=y
+CONFIG_RT2800USB_RT55XX=y
+CONFIG_RT2800USB_UNKNOWN=y
+CONFIG_RT2800_LIB=m
+CONFIG_RT2X00_LIB_USB=m
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_CRYPTO=y
+CONFIG_RT2X00_LIB_LEDS=y
+# CONFIG_RT2X00_DEBUG is not set
+CONFIG_WL_MEDIATEK=y
+CONFIG_MT7601U=m
+CONFIG_RTL_CARDS=m
+CONFIG_RTL8192CU=m
+CONFIG_RTLWIFI=m
+CONFIG_RTLWIFI_USB=m
+# CONFIG_RTLWIFI_DEBUG is not set
+CONFIG_RTL8192C_COMMON=m
+CONFIG_RTL8XXXU=m
+CONFIG_RTL8XXXU_UNTESTED=y
+CONFIG_WL_TI=y
+CONFIG_WL1251=m
+CONFIG_WL1251_SPI=m
+CONFIG_WL1251_SDIO=m
+CONFIG_WL12XX=m
+CONFIG_WL18XX=m
+CONFIG_WLCORE=m
+CONFIG_WLCORE_SPI=m
+CONFIG_WLCORE_SDIO=m
+CONFIG_WILINK_PLATFORM_DATA=y
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
+CONFIG_MWIFIEX=m
+CONFIG_MWIFIEX_SDIO=m
+CONFIG_MWIFIEX_USB=m
+# CONFIG_CW1200 is not set
+CONFIG_RSI_91X=m
+CONFIG_RSI_DEBUGFS=y
+# CONFIG_RSI_SDIO is not set
+CONFIG_RSI_USB=m
+
+#
+# WiMAX Wireless Broadband devices
+#
+CONFIG_WIMAX_I2400M=m
+CONFIG_WIMAX_I2400M_USB=m
+CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8
+# CONFIG_WAN is not set
+CONFIG_IEEE802154_DRIVERS=m
+CONFIG_IEEE802154_FAKELB=m
+CONFIG_IEEE802154_AT86RF230=m
+# CONFIG_IEEE802154_AT86RF230_DEBUGFS is not set
+CONFIG_IEEE802154_MRF24J40=m
+CONFIG_IEEE802154_CC2520=m
+CONFIG_IEEE802154_ATUSB=m
+# CONFIG_ISDN is not set
+# CONFIG_NVM is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_LEDS=y
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_POLLDEV=m
+CONFIG_INPUT_SPARSEKMAP=m
+CONFIG_INPUT_MATRIXKMAP=m
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ADP5588=m
+CONFIG_KEYBOARD_ADP5589=m
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_QT1070=m
+CONFIG_KEYBOARD_QT2160=m
+CONFIG_KEYBOARD_LKKBD=m
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_KEYBOARD_GPIO_POLLED=m
+CONFIG_KEYBOARD_TCA6416=m
+CONFIG_KEYBOARD_TCA8418=m
+CONFIG_KEYBOARD_MATRIX=m
+CONFIG_KEYBOARD_LM8323=m
+CONFIG_KEYBOARD_LM8333=m
+CONFIG_KEYBOARD_MAX7359=m
+CONFIG_KEYBOARD_MCS=m
+CONFIG_KEYBOARD_MPR121=m
+CONFIG_KEYBOARD_NEWTON=m
+CONFIG_KEYBOARD_OPENCORES=m
+CONFIG_KEYBOARD_SAMSUNG=m
+CONFIG_KEYBOARD_STOWAWAY=m
+CONFIG_KEYBOARD_SUNKBD=m
+CONFIG_KEYBOARD_OMAP4=m
+CONFIG_KEYBOARD_TWL4030=m
+CONFIG_KEYBOARD_XTKBD=m
+CONFIG_KEYBOARD_CAP11XX=m
+CONFIG_KEYBOARD_BCM=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_CYPRESS=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_MOUSE_PS2_SENTELIC=y
+CONFIG_MOUSE_PS2_TOUCHKIT=y
+CONFIG_MOUSE_PS2_FOCALTECH=y
+CONFIG_MOUSE_SERIAL=m
+CONFIG_MOUSE_APPLETOUCH=m
+CONFIG_MOUSE_BCM5974=m
+CONFIG_MOUSE_CYAPA=m
+CONFIG_MOUSE_ELAN_I2C=m
+CONFIG_MOUSE_ELAN_I2C_I2C=y
+# CONFIG_MOUSE_ELAN_I2C_SMBUS is not set
+CONFIG_MOUSE_VSXXXAA=m
+CONFIG_MOUSE_GPIO=m
+CONFIG_MOUSE_SYNAPTICS_I2C=m
+CONFIG_MOUSE_SYNAPTICS_USB=m
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_JOYSTICK_ANALOG=m
+CONFIG_JOYSTICK_A3D=m
+CONFIG_JOYSTICK_ADI=m
+CONFIG_JOYSTICK_COBRA=m
+CONFIG_JOYSTICK_GF2K=m
+CONFIG_JOYSTICK_GRIP=m
+CONFIG_JOYSTICK_GRIP_MP=m
+CONFIG_JOYSTICK_GUILLEMOT=m
+CONFIG_JOYSTICK_INTERACT=m
+CONFIG_JOYSTICK_SIDEWINDER=m
+CONFIG_JOYSTICK_TMDC=m
+CONFIG_JOYSTICK_IFORCE=m
+CONFIG_JOYSTICK_IFORCE_USB=y
+CONFIG_JOYSTICK_IFORCE_232=y
+CONFIG_JOYSTICK_WARRIOR=m
+CONFIG_JOYSTICK_MAGELLAN=m
+CONFIG_JOYSTICK_SPACEORB=m
+CONFIG_JOYSTICK_SPACEBALL=m
+CONFIG_JOYSTICK_STINGER=m
+CONFIG_JOYSTICK_TWIDJOY=m
+CONFIG_JOYSTICK_ZHENHUA=m
+CONFIG_JOYSTICK_AS5011=m
+CONFIG_JOYSTICK_JOYDUMP=m
+CONFIG_JOYSTICK_XPAD=m
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_JOYSTICK_XPAD_LEDS=y
+CONFIG_INPUT_TABLET=y
+CONFIG_TABLET_USB_ACECAD=m
+CONFIG_TABLET_USB_AIPTEK=m
+CONFIG_TABLET_USB_GTCO=m
+CONFIG_TABLET_USB_HANWANG=m
+CONFIG_TABLET_USB_KBTAB=m
+CONFIG_TABLET_SERIAL_WACOM4=m
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_PROPERTIES=y
+CONFIG_TOUCHSCREEN_ADS7846=m
+CONFIG_TOUCHSCREEN_AD7877=m
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+CONFIG_TOUCHSCREEN_AR1021_I2C=m
+CONFIG_TOUCHSCREEN_ATMEL_MXT=m
+CONFIG_TOUCHSCREEN_AUO_PIXCIR=m
+CONFIG_TOUCHSCREEN_BU21013=m
+CONFIG_TOUCHSCREEN_CHIPONE_ICN8318=m
+CONFIG_TOUCHSCREEN_CY8CTMG110=m
+CONFIG_TOUCHSCREEN_CYTTSP_CORE=m
+CONFIG_TOUCHSCREEN_CYTTSP_I2C=m
+CONFIG_TOUCHSCREEN_CYTTSP_SPI=m
+CONFIG_TOUCHSCREEN_CYTTSP4_CORE=m
+CONFIG_TOUCHSCREEN_CYTTSP4_I2C=m
+CONFIG_TOUCHSCREEN_CYTTSP4_SPI=m
+CONFIG_TOUCHSCREEN_DA9052=m
+CONFIG_TOUCHSCREEN_DYNAPRO=m
+CONFIG_TOUCHSCREEN_HAMPSHIRE=m
+CONFIG_TOUCHSCREEN_EETI=m
+CONFIG_TOUCHSCREEN_EGALAX=m
+# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
+CONFIG_TOUCHSCREEN_FT6236=m
+CONFIG_TOUCHSCREEN_EGALAX_I2C=m
+CONFIG_TOUCHSCREEN_FUJITSU=m
+CONFIG_TOUCHSCREEN_GOODIX=m
+CONFIG_TOUCHSCREEN_ILI210X=m
+CONFIG_TOUCHSCREEN_GUNZE=m
+CONFIG_TOUCHSCREEN_ELAN=m
+CONFIG_TOUCHSCREEN_ELO=m
+CONFIG_TOUCHSCREEN_WACOM_W8001=m
+CONFIG_TOUCHSCREEN_WACOM_I2C=m
+CONFIG_TOUCHSCREEN_MAX11801=m
+CONFIG_TOUCHSCREEN_MCS5000=m
+CONFIG_TOUCHSCREEN_MMS114=m
+# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
+CONFIG_TOUCHSCREEN_MTOUCH=m
+CONFIG_TOUCHSCREEN_IMX6UL_TSC=m
+CONFIG_TOUCHSCREEN_INEXIO=m
+CONFIG_TOUCHSCREEN_MK712=m
+CONFIG_TOUCHSCREEN_PENMOUNT=m
+CONFIG_TOUCHSCREEN_EDT_FT5X06=m
+CONFIG_TOUCHSCREEN_TOUCHRIGHT=m
+CONFIG_TOUCHSCREEN_TOUCHWIN=m
+CONFIG_TOUCHSCREEN_TI_AM335X_TSC=m
+CONFIG_TOUCHSCREEN_PIXCIR=m
+CONFIG_TOUCHSCREEN_WDT87XX_I2C=m
+CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_TOUCHSCREEN_MC13783=m
+# CONFIG_TOUCHSCREEN_USB_EGALAX is not set
+# CONFIG_TOUCHSCREEN_USB_PANJIT is not set
+# CONFIG_TOUCHSCREEN_USB_3M is not set
+# CONFIG_TOUCHSCREEN_USB_ITM is not set
+# CONFIG_TOUCHSCREEN_USB_ETURBO is not set
+# CONFIG_TOUCHSCREEN_USB_GUNZE is not set
+# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set
+# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set
+# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set
+# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set
+# CONFIG_TOUCHSCREEN_USB_GOTOP is not set
+# CONFIG_TOUCHSCREEN_USB_JASTEC is not set
+# CONFIG_TOUCHSCREEN_USB_ELO is not set
+# CONFIG_TOUCHSCREEN_USB_E2I is not set
+# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set
+# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set
+# CONFIG_TOUCHSCREEN_USB_NEXIO is not set
+# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set
+CONFIG_TOUCHSCREEN_TOUCHIT213=m
+CONFIG_TOUCHSCREEN_TSC_SERIO=m
+CONFIG_TOUCHSCREEN_TSC200X_CORE=m
+CONFIG_TOUCHSCREEN_TSC2004=m
+CONFIG_TOUCHSCREEN_TSC2005=m
+CONFIG_TOUCHSCREEN_TSC2007=m
+# CONFIG_TOUCHSCREEN_RM_TS is not set
+# CONFIG_TOUCHSCREEN_SILEAD is not set
+# CONFIG_TOUCHSCREEN_SIS_I2C is not set
+CONFIG_TOUCHSCREEN_ST1232=m
+# CONFIG_TOUCHSCREEN_SUR40 is not set
+# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
+CONFIG_TOUCHSCREEN_SX8654=m
+CONFIG_TOUCHSCREEN_TPS6507X=m
+CONFIG_TOUCHSCREEN_ZFORCE=m
+# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set
+CONFIG_TOUCHSCREEN_ROHM_BU21023=m
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_AD714X=m
+CONFIG_INPUT_AD714X_I2C=m
+CONFIG_INPUT_AD714X_SPI=m
+CONFIG_INPUT_BMA150=m
+CONFIG_INPUT_E3X0_BUTTON=m
+CONFIG_INPUT_MC13783_PWRBUTTON=m
+CONFIG_INPUT_MMA8450=m
+CONFIG_INPUT_MPU3050=m
+CONFIG_INPUT_GP2A=m
+# CONFIG_INPUT_GPIO_BEEPER is not set
+CONFIG_INPUT_GPIO_TILT_POLLED=m
+CONFIG_INPUT_ATI_REMOTE2=m
+CONFIG_INPUT_KEYSPAN_REMOTE=m
+CONFIG_INPUT_KXTJ9=m
+CONFIG_INPUT_KXTJ9_POLLED_MODE=y
+CONFIG_INPUT_POWERMATE=m
+CONFIG_INPUT_YEALINK=m
+CONFIG_INPUT_CM109=m
+CONFIG_INPUT_REGULATOR_HAPTIC=m
+CONFIG_INPUT_TPS65218_PWRBUTTON=y
+CONFIG_INPUT_AXP20X_PEK=y
+CONFIG_INPUT_TWL4030_PWRBUTTON=y
+CONFIG_INPUT_TWL4030_VIBRA=y
+CONFIG_INPUT_TWL6040_VIBRA=y
+CONFIG_INPUT_UINPUT=y
+CONFIG_INPUT_PALMAS_PWRBUTTON=y
+CONFIG_INPUT_PCF8574=m
+CONFIG_INPUT_PWM_BEEPER=m
+CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
+CONFIG_INPUT_DA9052_ONKEY=m
+CONFIG_INPUT_DA9055_ONKEY=m
+# CONFIG_INPUT_DA9063_ONKEY is not set
+CONFIG_INPUT_ADXL34X=m
+CONFIG_INPUT_ADXL34X_I2C=m
+CONFIG_INPUT_ADXL34X_SPI=m
+CONFIG_INPUT_IMS_PCU=m
+CONFIG_INPUT_CMA3000=m
+CONFIG_INPUT_CMA3000_I2C=m
+# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set
+CONFIG_INPUT_DRV260X_HAPTICS=m
+# CONFIG_INPUT_DRV2665_HAPTICS is not set
+CONFIG_INPUT_DRV2667_HAPTICS=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+CONFIG_SERIO_ALTERA_PS2=m
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_SERIO_ARC_PS2 is not set
+# CONFIG_SERIO_APBPS2 is not set
+# CONFIG_USERIO is not set
+CONFIG_GAMEPORT=m
+# CONFIG_GAMEPORT_NS558 is not set
+# CONFIG_GAMEPORT_L4 is not set
+
+#
+# Character devices
+#
+CONFIG_TTY=y
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+CONFIG_N_GSM=m
+# CONFIG_TRACE_SINK is not set
+CONFIG_DEVMEM=y
+CONFIG_DEVKMEM=y
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_EARLYCON=y
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST=y
+# CONFIG_SERIAL_KGDB_NMI is not set
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX310X is not set
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_CONSOLE_POLL=y
+CONFIG_SERIAL_OMAP=y
+CONFIG_SERIAL_OMAP_CONSOLE=y
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_SERIAL_BCM63XX is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
+# CONFIG_SERIAL_ST_ASC is not set
+# CONFIG_SERIAL_STM32 is not set
+# CONFIG_SERIAL_MVEBU_UART is not set
+# CONFIG_TTY_PRINTK is not set
+CONFIG_HVC_DRIVER=y
+# CONFIG_HVC_DCC is not set
+CONFIG_VIRTIO_CONSOLE=m
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+CONFIG_HW_RANDOM_OMAP=m
+CONFIG_HW_RANDOM_VIRTIO=m
+CONFIG_HW_RANDOM_TPM=m
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_TCG_TPM=m
+CONFIG_TCG_TIS_I2C_ATMEL=m
+# CONFIG_TCG_TIS_I2C_INFINEON is not set
+# CONFIG_TCG_TIS_I2C_NUVOTON is not set
+# CONFIG_TCG_ATMEL is not set
+# CONFIG_TCG_TIS_ST33ZP24 is not set
+# CONFIG_XILLYBUS is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
+
+#
+# Multiplexer I2C Chip support
+#
+CONFIG_I2C_ARB_GPIO_CHALLENGE=m
+# CONFIG_I2C_MUX_GPIO is not set
+# CONFIG_I2C_MUX_PCA9541 is not set
+CONFIG_I2C_MUX_PCA954x=y
+CONFIG_I2C_MUX_PINCTRL=y
+# CONFIG_I2C_MUX_REG is not set
+# CONFIG_I2C_DEMUX_PINCTRL is not set
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_ALGOPCA=m
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_CBUS_GPIO is not set
+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
+# CONFIG_I2C_EMEV2 is not set
+CONFIG_I2C_GPIO=m
+CONFIG_I2C_OCORES=m
+CONFIG_I2C_OMAP=y
+CONFIG_I2C_PCA_PLATFORM=m
+# CONFIG_I2C_PXA_PCI is not set
+CONFIG_I2C_RK3X=y
+CONFIG_I2C_SIMTEC=m
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+CONFIG_I2C_DIOLAN_U2C=m
+CONFIG_I2C_DLN2=m
+# CONFIG_I2C_PARPORT_LIGHT is not set
+CONFIG_I2C_ROBOTFUZZ_OSIF=m
+CONFIG_I2C_TAOS_EVM=m
+CONFIG_I2C_TINY_USB=m
+CONFIG_I2C_VIPERBOARD=m
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_SLAVE is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_ALTERA is not set
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_CADENCE is not set
+CONFIG_SPI_DLN2=m
+CONFIG_SPI_GPIO=y
+# CONFIG_SPI_FSL_SPI is not set
+# CONFIG_SPI_OC_TINY is not set
+CONFIG_SPI_OMAP24XX=y
+CONFIG_SPI_TI_QSPI=m
+# CONFIG_SPI_PXA2XX_PCI is not set
+CONFIG_SPI_ROCKCHIP=m
+# CONFIG_SPI_SC18IS602 is not set
+# CONFIG_SPI_XCOMM is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_ZYNQMP_GQSPI is not set
+# CONFIG_SPI_DESIGNWARE is not set
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_SPIDEV=y
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPMI is not set
+CONFIG_HSI=m
+CONFIG_HSI_BOARDINFO=y
+
+#
+# HSI controllers
+#
+
+#
+# HSI clients
+#
+# CONFIG_HSI_CHAR is not set
+
+#
+# PPS support
+#
+CONFIG_PPS=y
+# CONFIG_PPS_DEBUG is not set
+# CONFIG_NTP_PPS is not set
+
+#
+# PPS clients support
+#
+# CONFIG_PPS_CLIENT_KTIMER is not set
+CONFIG_PPS_CLIENT_LDISC=m
+CONFIG_PPS_CLIENT_GPIO=m
+
+#
+# PPS generators support
+#
+
+#
+# PTP clock support
+#
+CONFIG_PTP_1588_CLOCK=y
+
+#
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
+#
+CONFIG_PINCTRL=y
+
+#
+# Pin controllers
+#
+CONFIG_PINMUX=y
+CONFIG_PINCONF=y
+CONFIG_GENERIC_PINCONF=y
+# CONFIG_DEBUG_PINCTRL is not set
+CONFIG_PINCTRL_AS3722=y
+# CONFIG_PINCTRL_AMD is not set
+CONFIG_PINCTRL_SINGLE=y
+CONFIG_PINCTRL_TI_IODELAY=y
+CONFIG_PINCTRL_PALMAS=y
+CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_DEVRES=y
+CONFIG_OF_GPIO=y
+CONFIG_GPIOLIB_IRQCHIP=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_OF_HELPER=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_MAX730X=m
+
+#
+# Memory mapped GPIO drivers
+#
+# CONFIG_GPIO_74XX_MMIO is not set
+# CONFIG_GPIO_ALTERA is not set
+# CONFIG_GPIO_DWAPB is not set
+# CONFIG_GPIO_EM is not set
+CONFIG_GPIO_GENERIC_PLATFORM=y
+# CONFIG_GPIO_GRGPIO is not set
+CONFIG_GPIO_OMAP=y
+CONFIG_GPIO_SYSCON=y
+# CONFIG_GPIO_XILINX is not set
+# CONFIG_GPIO_ZEVIO is not set
+# CONFIG_GPIO_ZX is not set
+
+#
+# I2C GPIO expanders
+#
+CONFIG_GPIO_ADP5588=m
+CONFIG_GPIO_ADNP=m
+CONFIG_GPIO_MAX7300=m
+CONFIG_GPIO_MAX732X=m
+CONFIG_GPIO_PCA953X=y
+CONFIG_GPIO_PCA953X_IRQ=y
+CONFIG_GPIO_PCF857X=m
+CONFIG_GPIO_SX150X=y
+
+#
+# MFD GPIO expanders
+#
+CONFIG_GPIO_DA9052=y
+CONFIG_GPIO_DA9055=y
+CONFIG_GPIO_DLN2=m
+CONFIG_GPIO_PALMAS=y
+CONFIG_GPIO_TPS65910=y
+CONFIG_GPIO_TWL4030=y
+CONFIG_GPIO_TWL6040=y
+
+#
+# SPI GPIO expanders
+#
+CONFIG_GPIO_74X164=m
+CONFIG_GPIO_MAX7301=m
+CONFIG_GPIO_MC33880=m
+
+#
+# SPI or I2C GPIO expanders
+#
+CONFIG_GPIO_MCP23S08=m
+
+#
+# USB GPIO expanders
+#
+CONFIG_GPIO_VIPERBOARD=m
+CONFIG_W1=y
+CONFIG_W1_CON=y
+
+#
+# 1-wire Bus Masters
+#
+CONFIG_W1_MASTER_DS2490=m
+CONFIG_W1_MASTER_DS2482=m
+CONFIG_W1_MASTER_DS1WM=m
+CONFIG_W1_MASTER_GPIO=m
+CONFIG_HDQ_MASTER_OMAP=m
+
+#
+# 1-wire Slaves
+#
+CONFIG_W1_SLAVE_THERM=m
+CONFIG_W1_SLAVE_SMEM=m
+CONFIG_W1_SLAVE_DS2408=m
+CONFIG_W1_SLAVE_DS2408_READBACK=y
+CONFIG_W1_SLAVE_DS2413=m
+CONFIG_W1_SLAVE_DS2406=m
+CONFIG_W1_SLAVE_DS2423=m
+CONFIG_W1_SLAVE_DS2431=m
+CONFIG_W1_SLAVE_DS2433=m
+CONFIG_W1_SLAVE_DS2433_CRC=y
+CONFIG_W1_SLAVE_DS2760=m
+CONFIG_W1_SLAVE_DS2780=m
+CONFIG_W1_SLAVE_DS2781=m
+CONFIG_W1_SLAVE_DS28E04=m
+CONFIG_W1_SLAVE_BQ27000=m
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_PDA_POWER is not set
+CONFIG_GENERIC_ADC_BATTERY=m
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2781 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_SBS is not set
+CONFIG_BATTERY_BQ27XXX=m
+CONFIG_BATTERY_BQ27XXX_I2C=y
+CONFIG_BATTERY_BQ27XXX_PLATFORM=y
+CONFIG_BATTERY_DA9052=m
+CONFIG_AXP288_FUEL_GAUGE=m
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_BATTERY_TWL4030_MADC is not set
+CONFIG_BATTERY_RX51=m
+CONFIG_CHARGER_ISP1704=m
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_TWL4030 is not set
+# CONFIG_CHARGER_LP8727 is not set
+CONFIG_CHARGER_GPIO=m
+# CONFIG_CHARGER_MANAGER is not set
+CONFIG_CHARGER_BQ2415X=m
+# CONFIG_CHARGER_BQ24190 is not set
+# CONFIG_CHARGER_BQ24257 is not set
+# CONFIG_CHARGER_BQ24735 is not set
+# CONFIG_CHARGER_BQ25890 is not set
+# CONFIG_CHARGER_SMB347 is not set
+CONFIG_CHARGER_TPS65217=m
+# CONFIG_BATTERY_GAUGE_LTC2941 is not set
+# CONFIG_CHARGER_RT9455 is not set
+CONFIG_AXP20X_POWER=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_RESET_AS3722=y
+# CONFIG_POWER_RESET_BRCMSTB is not set
+CONFIG_POWER_RESET_GPIO=y
+CONFIG_POWER_RESET_GPIO_RESTART=y
+# CONFIG_POWER_RESET_LTC2952 is not set
+CONFIG_POWER_RESET_RESTART=y
+# CONFIG_POWER_RESET_VERSATILE is not set
+CONFIG_POWER_RESET_VEXPRESS=y
+CONFIG_POWER_RESET_SYSCON=y
+CONFIG_POWER_RESET_SYSCON_POWEROFF=y
+CONFIG_POWER_AVS=y
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=m
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+CONFIG_SENSORS_AD7314=m
+CONFIG_SENSORS_AD7414=m
+CONFIG_SENSORS_AD7418=m
+CONFIG_SENSORS_ADM1021=m
+CONFIG_SENSORS_ADM1025=m
+CONFIG_SENSORS_ADM1026=m
+CONFIG_SENSORS_ADM1029=m
+CONFIG_SENSORS_ADM1031=m
+CONFIG_SENSORS_ADM9240=m
+CONFIG_SENSORS_ADT7X10=m
+CONFIG_SENSORS_ADT7310=m
+CONFIG_SENSORS_ADT7410=m
+CONFIG_SENSORS_ADT7411=m
+CONFIG_SENSORS_ADT7462=m
+CONFIG_SENSORS_ADT7470=m
+CONFIG_SENSORS_ADT7475=m
+CONFIG_SENSORS_ASC7621=m
+CONFIG_SENSORS_ATXP1=m
+CONFIG_SENSORS_DS620=m
+CONFIG_SENSORS_DS1621=m
+CONFIG_SENSORS_DA9052_ADC=m
+CONFIG_SENSORS_DA9055=m
+CONFIG_SENSORS_F71805F=m
+CONFIG_SENSORS_F71882FG=m
+CONFIG_SENSORS_F75375S=m
+CONFIG_SENSORS_MC13783_ADC=m
+CONFIG_SENSORS_GL518SM=m
+CONFIG_SENSORS_GL520SM=m
+CONFIG_SENSORS_G760A=m
+CONFIG_SENSORS_G762=m
+CONFIG_SENSORS_GPIO_FAN=y
+CONFIG_SENSORS_HIH6130=m
+CONFIG_SENSORS_IIO_HWMON=m
+CONFIG_SENSORS_IT87=m
+CONFIG_SENSORS_JC42=m
+CONFIG_SENSORS_POWR1220=m
+CONFIG_SENSORS_LINEAGE=m
+CONFIG_SENSORS_LTC2945=m
+CONFIG_SENSORS_LTC4151=m
+CONFIG_SENSORS_LTC4215=m
+CONFIG_SENSORS_LTC4222=m
+CONFIG_SENSORS_LTC4245=m
+CONFIG_SENSORS_LTC4260=m
+CONFIG_SENSORS_LTC4261=m
+CONFIG_SENSORS_MAX1111=m
+CONFIG_SENSORS_MAX16065=m
+CONFIG_SENSORS_MAX1619=m
+CONFIG_SENSORS_MAX1668=m
+CONFIG_SENSORS_MAX197=m
+CONFIG_SENSORS_MAX6639=m
+CONFIG_SENSORS_MAX6642=m
+CONFIG_SENSORS_MAX6650=m
+CONFIG_SENSORS_MAX6697=m
+CONFIG_SENSORS_MAX31790=m
+CONFIG_SENSORS_HTU21=m
+CONFIG_SENSORS_MCP3021=m
+CONFIG_SENSORS_ADCXX=m
+CONFIG_SENSORS_LM63=m
+CONFIG_SENSORS_LM70=m
+CONFIG_SENSORS_LM73=m
+CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM77=m
+CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM80=m
+CONFIG_SENSORS_LM83=m
+CONFIG_SENSORS_LM85=m
+CONFIG_SENSORS_LM87=m
+CONFIG_SENSORS_LM90=m
+CONFIG_SENSORS_LM92=m
+CONFIG_SENSORS_LM93=m
+CONFIG_SENSORS_LM95234=m
+CONFIG_SENSORS_LM95241=m
+CONFIG_SENSORS_LM95245=m
+CONFIG_SENSORS_PC87360=m
+CONFIG_SENSORS_PC87427=m
+CONFIG_SENSORS_NTC_THERMISTOR=m
+CONFIG_SENSORS_NCT6683=m
+CONFIG_SENSORS_NCT6775=m
+CONFIG_SENSORS_NCT7802=m
+CONFIG_SENSORS_NCT7904=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_PMBUS=m
+CONFIG_SENSORS_PMBUS=m
+CONFIG_SENSORS_ADM1275=m
+CONFIG_SENSORS_LM25066=m
+CONFIG_SENSORS_LTC2978=m
+CONFIG_SENSORS_LTC2978_REGULATOR=y
+CONFIG_SENSORS_MAX16064=m
+CONFIG_SENSORS_MAX20751=m
+CONFIG_SENSORS_MAX34440=m
+CONFIG_SENSORS_MAX8688=m
+CONFIG_SENSORS_TPS40422=m
+CONFIG_SENSORS_UCD9000=m
+CONFIG_SENSORS_UCD9200=m
+CONFIG_SENSORS_ZL6100=m
+CONFIG_SENSORS_PWM_FAN=m
+CONFIG_SENSORS_SHT15=m
+CONFIG_SENSORS_SHT21=m
+CONFIG_SENSORS_SHTC1=m
+CONFIG_SENSORS_DME1737=m
+CONFIG_SENSORS_EMC1403=m
+CONFIG_SENSORS_EMC2103=m
+CONFIG_SENSORS_EMC6W201=m
+CONFIG_SENSORS_SMSC47M1=m
+CONFIG_SENSORS_SMSC47M192=m
+CONFIG_SENSORS_SMSC47B397=m
+CONFIG_SENSORS_SCH56XX_COMMON=m
+CONFIG_SENSORS_SCH5627=m
+CONFIG_SENSORS_SCH5636=m
+CONFIG_SENSORS_SMM665=m
+CONFIG_SENSORS_ADC128D818=m
+CONFIG_SENSORS_ADS1015=m
+CONFIG_SENSORS_ADS7828=m
+CONFIG_SENSORS_ADS7871=m
+CONFIG_SENSORS_AMC6821=m
+CONFIG_SENSORS_INA209=m
+CONFIG_SENSORS_INA2XX=m
+# CONFIG_SENSORS_TC74 is not set
+CONFIG_SENSORS_THMC50=m
+CONFIG_SENSORS_TMP102=m
+CONFIG_SENSORS_TMP103=m
+CONFIG_SENSORS_TMP401=m
+CONFIG_SENSORS_TMP421=m
+CONFIG_SENSORS_TWL4030_MADC=m
+# CONFIG_SENSORS_VEXPRESS is not set
+CONFIG_SENSORS_VT1211=m
+CONFIG_SENSORS_W83781D=m
+CONFIG_SENSORS_W83791D=m
+CONFIG_SENSORS_W83792D=m
+CONFIG_SENSORS_W83793=m
+CONFIG_SENSORS_W83795=m
+# CONFIG_SENSORS_W83795_FANCTRL is not set
+CONFIG_SENSORS_W83L785TS=m
+CONFIG_SENSORS_W83L786NG=m
+CONFIG_SENSORS_W83627HF=m
+CONFIG_SENSORS_W83627EHF=m
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_THERMAL_OF=y
+# CONFIG_THERMAL_WRITABLE_TRIPS is not set
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set
+CONFIG_THERMAL_GOV_FAIR_SHARE=y
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_GOV_BANG_BANG=y
+# CONFIG_THERMAL_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
+CONFIG_CPU_THERMAL=y
+CONFIG_CLOCK_THERMAL=y
+CONFIG_DEVFREQ_THERMAL=y
+# CONFIG_THERMAL_EMULATION is not set
+# CONFIG_IMX_THERMAL is not set
+
+#
+# Texas Instruments thermal drivers
+#
+CONFIG_TI_SOC_THERMAL=y
+CONFIG_TI_THERMAL=y
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+
+#
+# Watchdog Device Drivers
+#
+CONFIG_SOFT_WATCHDOG=m
+# CONFIG_DA9052_WATCHDOG is not set
+# CONFIG_DA9055_WATCHDOG is not set
+# CONFIG_DA9063_WATCHDOG is not set
+# CONFIG_GPIO_WATCHDOG is not set
+# CONFIG_XILINX_WATCHDOG is not set
+# CONFIG_CADENCE_WATCHDOG is not set
+# CONFIG_DW_WATCHDOG is not set
+CONFIG_OMAP_WATCHDOG=y
+CONFIG_TWL4030_WATCHDOG=y
+# CONFIG_MAX63XX_WATCHDOG is not set
+# CONFIG_BCM7038_WDT is not set
+# CONFIG_MEN_A21_WDT is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB=m
+CONFIG_SSB_BLOCKIO=y
+CONFIG_SSB_SDIOHOST_POSSIBLE=y
+CONFIG_SSB_SDIOHOST=y
+# CONFIG_SSB_HOST_SOC is not set
+# CONFIG_SSB_SILENT is not set
+# CONFIG_SSB_DEBUG is not set
+# CONFIG_SSB_DRIVER_GPIO is not set
+CONFIG_BCMA_POSSIBLE=y
+
+#
+# Broadcom specific AMBA
+#
+CONFIG_BCMA=m
+CONFIG_BCMA_BLOCKIO=y
+# CONFIG_BCMA_HOST_SOC is not set
+# CONFIG_BCMA_DRIVER_GMAC_CMN is not set
+# CONFIG_BCMA_DRIVER_GPIO is not set
+# CONFIG_BCMA_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_AS3711 is not set
+CONFIG_MFD_AS3722=y
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_MFD_ATMEL_FLEXCOM is not set
+# CONFIG_MFD_ATMEL_HLCDC is not set
+# CONFIG_MFD_BCM590XX is not set
+CONFIG_MFD_AXP20X=y
+# CONFIG_MFD_CROS_EC is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_PMIC_DA903X is not set
+CONFIG_PMIC_DA9052=y
+CONFIG_MFD_DA9052_SPI=y
+CONFIG_MFD_DA9052_I2C=y
+CONFIG_MFD_DA9055=y
+# CONFIG_MFD_DA9062 is not set
+CONFIG_MFD_DA9063=y
+# CONFIG_MFD_DA9150 is not set
+CONFIG_MFD_DLN2=y
+CONFIG_MFD_MC13XXX=m
+CONFIG_MFD_MC13XXX_SPI=m
+CONFIG_MFD_MC13XXX_I2C=m
+# CONFIG_MFD_HI6421_PMIC is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_INTEL_SOC_PMIC is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_88PM800 is not set
+# CONFIG_MFD_88PM805 is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_MAX14577 is not set
+# CONFIG_MFD_MAX77686 is not set
+# CONFIG_MFD_MAX77693 is not set
+# CONFIG_MFD_MAX77843 is not set
+# CONFIG_MFD_MAX8907 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_MENF21BMC is not set
+# CONFIG_EZX_PCAP is not set
+CONFIG_MFD_VIPERBOARD=m
+# CONFIG_MFD_RETU is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_PM8921_CORE is not set
+# CONFIG_MFD_RT5033 is not set
+CONFIG_MFD_RTSX_USB=m
+# CONFIG_MFD_RC5T583 is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MFD_RN5T618 is not set
+CONFIG_MFD_SEC_CORE=y
+# CONFIG_MFD_SI476X_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SKY81452 is not set
+# CONFIG_MFD_SMSC is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_MFD_STMPE is not set
+CONFIG_MFD_SYSCON=y
+CONFIG_MFD_TI_AM335X_TSCADC=m
+# CONFIG_MFD_LP3943 is not set
+# CONFIG_MFD_LP8788 is not set
+CONFIG_MFD_OMAP_USB_HOST=y
+CONFIG_MFD_PALMAS=y
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TPS65090 is not set
+CONFIG_MFD_TPS65217=y
+CONFIG_MFD_TPS65218=y
+# CONFIG_MFD_TPS6586X is not set
+CONFIG_MFD_TPS65910=y
+# CONFIG_MFD_TPS65912 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_MFD_TPS80031 is not set
+CONFIG_TWL4030_CORE=y
+CONFIG_TWL4030_POWER=y
+CONFIG_MFD_TWL4030_AUDIO=y
+CONFIG_TWL6040_CORE=y
+CONFIG_MFD_WL1273_CORE=m
+# CONFIG_MFD_LM3533 is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_MFD_ARIZONA_I2C is not set
+# CONFIG_MFD_ARIZONA_SPI is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+CONFIG_MFD_VEXPRESS_SYSREG=y
+CONFIG_REGULATOR=y
+# CONFIG_REGULATOR_DEBUG is not set
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+CONFIG_REGULATOR_USERSPACE_CONSUMER=y
+CONFIG_REGULATOR_ACT8865=m
+# CONFIG_REGULATOR_AD5398 is not set
+CONFIG_REGULATOR_ANATOP=y
+CONFIG_REGULATOR_AS3722=y
+CONFIG_REGULATOR_AXP20X=y
+CONFIG_REGULATOR_DA9052=y
+# CONFIG_REGULATOR_DA9055 is not set
+CONFIG_REGULATOR_DA9063=y
+# CONFIG_REGULATOR_DA9210 is not set
+# CONFIG_REGULATOR_DA9211 is not set
+CONFIG_REGULATOR_FAN53555=m
+CONFIG_REGULATOR_GPIO=y
+# CONFIG_REGULATOR_ISL9305 is not set
+# CONFIG_REGULATOR_ISL6271A is not set
+# CONFIG_REGULATOR_LP3971 is not set
+# CONFIG_REGULATOR_LP3972 is not set
+# CONFIG_REGULATOR_LP872X is not set
+# CONFIG_REGULATOR_LP8755 is not set
+# CONFIG_REGULATOR_LTC3589 is not set
+# CONFIG_REGULATOR_MAX1586 is not set
+# CONFIG_REGULATOR_MAX8649 is not set
+# CONFIG_REGULATOR_MAX8660 is not set
+# CONFIG_REGULATOR_MAX8952 is not set
+# CONFIG_REGULATOR_MAX8973 is not set
+CONFIG_REGULATOR_MC13XXX_CORE=m
+CONFIG_REGULATOR_MC13783=m
+CONFIG_REGULATOR_MC13892=m
+CONFIG_REGULATOR_MT6311=y
+CONFIG_REGULATOR_PALMAS=y
+CONFIG_REGULATOR_PBIAS=y
+CONFIG_REGULATOR_PFUZE100=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_REGULATOR_S2MPA01=m
+CONFIG_REGULATOR_S2MPS11=m
+CONFIG_REGULATOR_S5M8767=m
+CONFIG_REGULATOR_TI_ABB=y
+# CONFIG_REGULATOR_TPS51632 is not set
+# CONFIG_REGULATOR_TPS62360 is not set
+CONFIG_REGULATOR_TPS65023=y
+CONFIG_REGULATOR_TPS6507X=y
+CONFIG_REGULATOR_TPS65217=y
+CONFIG_REGULATOR_TPS65218=y
+# CONFIG_REGULATOR_TPS6524X is not set
+CONFIG_REGULATOR_TPS65910=y
+CONFIG_REGULATOR_TWL4030=y
+CONFIG_REGULATOR_VEXPRESS=m
+CONFIG_MEDIA_SUPPORT=y
+
+#
+# Multimedia core support
+#
+CONFIG_MEDIA_CAMERA_SUPPORT=y
+# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
+# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
+# CONFIG_MEDIA_RADIO_SUPPORT is not set
+# CONFIG_MEDIA_SDR_SUPPORT is not set
+CONFIG_MEDIA_RC_SUPPORT=y
+CONFIG_MEDIA_CONTROLLER=y
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L2_SUBDEV_API=y
+CONFIG_VIDEO_V4L2=y
+# CONFIG_VIDEO_ADV_DEBUG is not set
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+CONFIG_VIDEO_TUNER=m
+CONFIG_V4L2_MEM2MEM_DEV=m
+CONFIG_VIDEOBUF_GEN=m
+CONFIG_VIDEOBUF_VMALLOC=m
+CONFIG_VIDEOBUF2_CORE=m
+CONFIG_VIDEOBUF2_MEMOPS=m
+CONFIG_VIDEOBUF2_DMA_CONTIG=m
+CONFIG_VIDEOBUF2_VMALLOC=m
+# CONFIG_TTPCI_EEPROM is not set
+
+#
+# Media drivers
+#
+CONFIG_RC_CORE=y
+# CONFIG_RC_MAP is not set
+# CONFIG_RC_DECODERS is not set
+# CONFIG_RC_DEVICES is not set
+CONFIG_MEDIA_USB_SUPPORT=y
+
+#
+# Webcam devices
+#
+CONFIG_USB_VIDEO_CLASS=m
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+CONFIG_USB_GSPCA=m
+CONFIG_USB_M5602=m
+CONFIG_USB_STV06XX=m
+CONFIG_USB_GL860=m
+CONFIG_USB_GSPCA_BENQ=m
+CONFIG_USB_GSPCA_CONEX=m
+CONFIG_USB_GSPCA_CPIA1=m
+CONFIG_USB_GSPCA_DTCS033=m
+CONFIG_USB_GSPCA_ETOMS=m
+CONFIG_USB_GSPCA_FINEPIX=m
+CONFIG_USB_GSPCA_JEILINJ=m
+CONFIG_USB_GSPCA_JL2005BCD=m
+CONFIG_USB_GSPCA_KINECT=m
+CONFIG_USB_GSPCA_KONICA=m
+CONFIG_USB_GSPCA_MARS=m
+CONFIG_USB_GSPCA_MR97310A=m
+CONFIG_USB_GSPCA_NW80X=m
+CONFIG_USB_GSPCA_OV519=m
+CONFIG_USB_GSPCA_OV534=m
+CONFIG_USB_GSPCA_OV534_9=m
+CONFIG_USB_GSPCA_PAC207=m
+CONFIG_USB_GSPCA_PAC7302=m
+CONFIG_USB_GSPCA_PAC7311=m
+CONFIG_USB_GSPCA_SE401=m
+CONFIG_USB_GSPCA_SN9C2028=m
+CONFIG_USB_GSPCA_SN9C20X=m
+CONFIG_USB_GSPCA_SONIXB=m
+CONFIG_USB_GSPCA_SONIXJ=m
+CONFIG_USB_GSPCA_SPCA500=m
+CONFIG_USB_GSPCA_SPCA501=m
+CONFIG_USB_GSPCA_SPCA505=m
+CONFIG_USB_GSPCA_SPCA506=m
+CONFIG_USB_GSPCA_SPCA508=m
+CONFIG_USB_GSPCA_SPCA561=m
+CONFIG_USB_GSPCA_SPCA1528=m
+CONFIG_USB_GSPCA_SQ905=m
+CONFIG_USB_GSPCA_SQ905C=m
+CONFIG_USB_GSPCA_SQ930X=m
+CONFIG_USB_GSPCA_STK014=m
+CONFIG_USB_GSPCA_STK1135=m
+CONFIG_USB_GSPCA_STV0680=m
+CONFIG_USB_GSPCA_SUNPLUS=m
+CONFIG_USB_GSPCA_T613=m
+CONFIG_USB_GSPCA_TOPRO=m
+CONFIG_USB_GSPCA_TOUPTEK=m
+CONFIG_USB_GSPCA_TV8532=m
+CONFIG_USB_GSPCA_VC032X=m
+CONFIG_USB_GSPCA_VICAM=m
+CONFIG_USB_GSPCA_XIRLINK_CIT=m
+CONFIG_USB_GSPCA_ZC3XX=m
+CONFIG_USB_PWC=m
+# CONFIG_USB_PWC_DEBUG is not set
+CONFIG_USB_PWC_INPUT_EVDEV=y
+CONFIG_VIDEO_CPIA2=m
+CONFIG_USB_ZR364XX=m
+CONFIG_USB_STKWEBCAM=m
+CONFIG_USB_S2255=m
+CONFIG_VIDEO_USBTV=m
+
+#
+# Webcam, TV (analog/digital) USB devices
+#
+CONFIG_VIDEO_EM28XX=m
+CONFIG_VIDEO_EM28XX_V4L2=m
+CONFIG_VIDEO_EM28XX_ALSA=m
+CONFIG_VIDEO_EM28XX_RC=m
+CONFIG_V4L_PLATFORM_DRIVERS=y
+CONFIG_SOC_CAMERA=m
+CONFIG_SOC_CAMERA_PLATFORM=m
+# CONFIG_VIDEO_XILINX is not set
+CONFIG_V4L_MEM2MEM_DRIVERS=y
+CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m
+# CONFIG_VIDEO_SH_VEU is not set
+# CONFIG_V4L_TEST_DRIVERS is not set
+
+#
+# Supported MMC/SDIO adapters
+#
+CONFIG_VIDEO_TVEEPROM=m
+CONFIG_CYPRESS_FIRMWARE=m
+
+#
+# Media ancillary drivers (tuners, sensors, i2c, frontends)
+#
+CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
+CONFIG_VIDEO_IR_I2C=y
+
+#
+# Audio decoders, processors and mixers
+#
+CONFIG_VIDEO_MSP3400=m
+
+#
+# RDS decoders
+#
+
+#
+# Video decoders
+#
+CONFIG_VIDEO_SAA711X=m
+CONFIG_VIDEO_TVP5150=m
+
+#
+# Video and audio decoders
+#
+
+#
+# Video encoders
+#
+
+#
+# Camera sensor devices
+#
+CONFIG_VIDEO_MT9V011=m
+
+#
+# Flash devices
+#
+
+#
+# Video improvement chips
+#
+
+#
+# Audio/Video compression chips
+#
+
+#
+# Miscellaneous helper chips
+#
+
+#
+# Sensors used on soc_camera driver
+#
+
+#
+# soc_camera sensor drivers
+#
+CONFIG_SOC_CAMERA_IMX074=m
+CONFIG_SOC_CAMERA_MT9M001=m
+CONFIG_SOC_CAMERA_MT9M111=m
+CONFIG_SOC_CAMERA_MT9T031=m
+CONFIG_SOC_CAMERA_MT9T112=m
+CONFIG_SOC_CAMERA_MT9V022=m
+CONFIG_SOC_CAMERA_OV2640=m
+CONFIG_SOC_CAMERA_OV5642=m
+CONFIG_SOC_CAMERA_OV6650=m
+CONFIG_SOC_CAMERA_OV772X=m
+CONFIG_SOC_CAMERA_OV9640=m
+CONFIG_SOC_CAMERA_OV9740=m
+CONFIG_SOC_CAMERA_RJ54N1=m
+CONFIG_SOC_CAMERA_TW9910=m
+
+#
+# Tools to develop new frontends
+#
+# CONFIG_DVB_DUMMY_FE is not set
+
+#
+# Graphics support
+#
+CONFIG_DRM=y
+CONFIG_DRM_KMS_HELPER=y
+CONFIG_DRM_KMS_FB_HELPER=y
+CONFIG_DRM_FBDEV_EMULATION=y
+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+CONFIG_DRM_TTM=m
+CONFIG_DRM_GEM_CMA_HELPER=y
+CONFIG_DRM_KMS_CMA_HELPER=y
+
+#
+# I2C encoder or helper chips
+#
+CONFIG_DRM_I2C_ADV7511=m
+CONFIG_DRM_I2C_ADIHDMI=m
+CONFIG_DRM_I2C_CH7006=m
+CONFIG_DRM_I2C_SIL164=m
+CONFIG_DRM_I2C_NXP_TDA998X=m
+CONFIG_DRM_VGEM=m
+# CONFIG_DRM_EXYNOS is not set
+CONFIG_DRM_UDL=m
+# CONFIG_DRM_ARMADA is not set
+CONFIG_DRM_TILCDC=y
+CONFIG_DRM_TILCDC_SLAVE_COMPAT=y
+CONFIG_DRM_VIRTIO_GPU=m
+# CONFIG_DRM_FSL_DCU is not set
+CONFIG_DRM_BRIDGE=y
+
+#
+# Display Interface Bridges
+#
+# CONFIG_DRM_NXP_PTN3460 is not set
+# CONFIG_DRM_PARADE_PS8622 is not set
+# CONFIG_DRM_STI is not set
+
+#
+# Frame buffer Devices
+#
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB_CMDLINE=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+CONFIG_FB_SYS_FILLRECT=y
+CONFIG_FB_SYS_COPYAREA=y
+CONFIG_FB_SYS_IMAGEBLIT=y
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+CONFIG_FB_SYS_FOPS=y
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+CONFIG_FB_BACKLIGHT=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_TILEBLITTING=y
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_UVESA is not set
+# CONFIG_FB_OPENCORES is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_SMSCUFX=m
+CONFIG_FB_UDL=m
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_FB_DA8XX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_BROADSHEET is not set
+# CONFIG_FB_AUO_K190X is not set
+CONFIG_FB_SIMPLE=y
+# CONFIG_OMAP2_DSS is not set
+CONFIG_FB_SSD1307=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=m
+# CONFIG_BACKLIGHT_DA9052 is not set
+# CONFIG_BACKLIGHT_PM8941_WLED is not set
+# CONFIG_BACKLIGHT_ADP8860 is not set
+# CONFIG_BACKLIGHT_ADP8870 is not set
+# CONFIG_BACKLIGHT_LM3630A is not set
+# CONFIG_BACKLIGHT_LM3639 is not set
+# CONFIG_BACKLIGHT_LP855X is not set
+# CONFIG_BACKLIGHT_PANDORA is not set
+# CONFIG_BACKLIGHT_TPS65217 is not set
+CONFIG_BACKLIGHT_GPIO=m
+# CONFIG_BACKLIGHT_LV5207LP is not set
+# CONFIG_BACKLIGHT_BD6107 is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEOMODE_HELPERS=y
+CONFIG_HDMI=y
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_LOGO=y
+CONFIG_FB_LOGO_CUSTOM=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+# CONFIG_LOGO_LINUX_CLUT224 is not set
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_DMAENGINE_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_JACK=y
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_PCM_TIMER=y
+# CONFIG_SND_SEQUENCER_OSS is not set
+CONFIG_SND_HRTIMER=m
+CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
+CONFIG_SND_DYNAMIC_MINORS=y
+CONFIG_SND_MAX_CARDS=32
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_PROC_FS=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_VMASTER=y
+CONFIG_SND_RAWMIDI_SEQ=m
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_DUMMY is not set
+CONFIG_SND_ALOOP=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# HD-Audio
+#
+CONFIG_SND_HDA_PREALLOC_SIZE=64
+CONFIG_SND_ARM=y
+CONFIG_SND_SPI=y
+CONFIG_SND_USB=y
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_USB_UA101=m
+CONFIG_SND_USB_CAIAQ=m
+CONFIG_SND_USB_CAIAQ_INPUT=y
+CONFIG_SND_USB_6FIRE=m
+CONFIG_SND_USB_HIFACE=m
+CONFIG_SND_BCD2000=m
+CONFIG_SND_USB_LINE6=m
+CONFIG_SND_USB_POD=m
+CONFIG_SND_USB_PODHD=m
+CONFIG_SND_USB_TONEPORT=m
+CONFIG_SND_USB_VARIAX=m
+CONFIG_SND_SOC=m
+CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
+# CONFIG_SND_ATMEL_SOC is not set
+CONFIG_SND_EDMA_SOC=m
+CONFIG_SND_DAVINCI_SOC_MCASP=m
+CONFIG_SND_DAVINCI_SOC_GENERIC_EVM=m
+CONFIG_SND_AM33XX_SOC_EVM=m
+# CONFIG_SND_DESIGNWARE_I2S is not set
+
+#
+# SoC Audio for Freescale CPUs
+#
+
+#
+# Common SoC Audio options for Freescale CPUs:
+#
+# CONFIG_SND_SOC_FSL_ASRC is not set
+# CONFIG_SND_SOC_FSL_SAI is not set
+CONFIG_SND_SOC_FSL_SSI=m
+CONFIG_SND_SOC_FSL_SPDIF=m
+# CONFIG_SND_SOC_FSL_ESAI is not set
+CONFIG_SND_SOC_IMX_AUDMUX=m
+CONFIG_SND_OMAP_SOC=m
+CONFIG_SND_OMAP_SOC_MCBSP=m
+CONFIG_SND_OMAP_SOC_HDMI_AUDIO=m
+CONFIG_SND_OMAP_SOC_RX51=m
+CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
+
+#
+# Allwinner SoC Audio support
+#
+CONFIG_SND_SUN4I_CODEC=m
+# CONFIG_SND_SOC_XTFPGA_I2S is not set
+CONFIG_SND_SOC_I2C_AND_SPI=m
+
+#
+# CODEC drivers
+#
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_ADAU1701 is not set
+# CONFIG_SND_SOC_AK4104 is not set
+# CONFIG_SND_SOC_AK4554 is not set
+# CONFIG_SND_SOC_AK4613 is not set
+# CONFIG_SND_SOC_AK4642 is not set
+# CONFIG_SND_SOC_AK5386 is not set
+# CONFIG_SND_SOC_ALC5623 is not set
+# CONFIG_SND_SOC_CS35L32 is not set
+# CONFIG_SND_SOC_CS42L51_I2C is not set
+# CONFIG_SND_SOC_CS42L52 is not set
+# CONFIG_SND_SOC_CS42L56 is not set
+# CONFIG_SND_SOC_CS42L73 is not set
+# CONFIG_SND_SOC_CS4265 is not set
+# CONFIG_SND_SOC_CS4270 is not set
+# CONFIG_SND_SOC_CS4271_I2C is not set
+# CONFIG_SND_SOC_CS4271_SPI is not set
+# CONFIG_SND_SOC_CS42XX8_I2C is not set
+# CONFIG_SND_SOC_CS4349 is not set
+# CONFIG_SND_SOC_ES8328 is not set
+# CONFIG_SND_SOC_GTM601 is not set
+# CONFIG_SND_SOC_PCM1681 is not set
+# CONFIG_SND_SOC_PCM1792A is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
+# CONFIG_SND_SOC_PCM512x_SPI is not set
+# CONFIG_SND_SOC_RT5631 is not set
+# CONFIG_SND_SOC_RT5677_SPI is not set
+CONFIG_SND_SOC_SGTL5000=m
+# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
+# CONFIG_SND_SOC_SPDIF is not set
+# CONFIG_SND_SOC_SSM2602_SPI is not set
+# CONFIG_SND_SOC_SSM2602_I2C is not set
+# CONFIG_SND_SOC_SSM4567 is not set
+# CONFIG_SND_SOC_STA32X is not set
+# CONFIG_SND_SOC_STA350 is not set
+# CONFIG_SND_SOC_STI_SAS is not set
+# CONFIG_SND_SOC_TAS2552 is not set
+# CONFIG_SND_SOC_TAS5086 is not set
+# CONFIG_SND_SOC_TAS571X is not set
+# CONFIG_SND_SOC_TFA9879 is not set
+CONFIG_SND_SOC_TLV320AIC23=m
+CONFIG_SND_SOC_TLV320AIC23_I2C=m
+# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
+CONFIG_SND_SOC_TLV320AIC31XX=m
+CONFIG_SND_SOC_TLV320AIC3X=m
+CONFIG_SND_SOC_TS3A227E=m
+CONFIG_SND_SOC_TWL4030=m
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8523 is not set
+# CONFIG_SND_SOC_WM8580 is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8728 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8737 is not set
+# CONFIG_SND_SOC_WM8741 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8770 is not set
+# CONFIG_SND_SOC_WM8776 is not set
+# CONFIG_SND_SOC_WM8804_I2C is not set
+# CONFIG_SND_SOC_WM8804_SPI is not set
+# CONFIG_SND_SOC_WM8903 is not set
+# CONFIG_SND_SOC_WM8962 is not set
+# CONFIG_SND_SOC_WM8978 is not set
+CONFIG_SND_SOC_TPA6130A2=m
+CONFIG_SND_SIMPLE_CARD=m
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID support
+#
+CONFIG_HID=y
+CONFIG_HID_BATTERY_STRENGTH=y
+CONFIG_HIDRAW=y
+CONFIG_UHID=y
+CONFIG_HID_GENERIC=y
+
+#
+# Special HID drivers
+#
+CONFIG_HID_A4TECH=m
+CONFIG_HID_ACRUX=m
+CONFIG_HID_ACRUX_FF=y
+CONFIG_HID_APPLE=m
+CONFIG_HID_APPLEIR=m
+CONFIG_HID_AUREAL=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_BETOP_FF=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CORSAIR=m
+CONFIG_HID_PRODIKEYS=m
+CONFIG_HID_CP2112=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_DRAGONRISE=m
+CONFIG_DRAGONRISE_FF=y
+CONFIG_HID_EMS_FF=m
+CONFIG_HID_ELECOM=m
+CONFIG_HID_ELO=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GEMBIRD=m
+CONFIG_HID_GFRM=m
+CONFIG_HID_HOLTEK=m
+CONFIG_HOLTEK_FF=y
+CONFIG_HID_GT683R=m
+CONFIG_HID_KEYTOUCH=m
+CONFIG_HID_KYE=m
+CONFIG_HID_UCLOGIC=m
+CONFIG_HID_WALTOP=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_ICADE=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_LCPOWER=m
+CONFIG_HID_LENOVO=m
+CONFIG_HID_LOGITECH=y
+CONFIG_HID_LOGITECH_DJ=y
+CONFIG_HID_LOGITECH_HIDPP=y
+CONFIG_LOGITECH_FF=y
+CONFIG_LOGIRUMBLEPAD2_FF=y
+CONFIG_LOGIG940_FF=y
+CONFIG_LOGIWHEELS_FF=y
+CONFIG_HID_MAGICMOUSE=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_MULTITOUCH=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_PANTHERLORD_FF=y
+CONFIG_HID_PENMOUNT=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_PICOLCD=m
+CONFIG_HID_PICOLCD_FB=y
+CONFIG_HID_PICOLCD_BACKLIGHT=y
+CONFIG_HID_PICOLCD_LEDS=y
+CONFIG_HID_PICOLCD_CIR=y
+CONFIG_HID_PLANTRONICS=m
+CONFIG_HID_PRIMAX=m
+CONFIG_HID_ROCCAT=m
+CONFIG_HID_SAITEK=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_SONY_FF=y
+CONFIG_HID_SPEEDLINK=m
+CONFIG_HID_STEELSERIES=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_RMI=m
+CONFIG_HID_GREENASIA=m
+CONFIG_GREENASIA_FF=y
+CONFIG_HID_SMARTJOYPLUS=m
+CONFIG_SMARTJOYPLUS_FF=y
+CONFIG_HID_TIVO=m
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THINGM=m
+CONFIG_HID_THRUSTMASTER=m
+CONFIG_THRUSTMASTER_FF=y
+CONFIG_HID_WACOM=m
+CONFIG_HID_WIIMOTE=m
+CONFIG_HID_XINMO=m
+CONFIG_HID_ZEROPLUS=m
+CONFIG_ZEROPLUS_FF=y
+CONFIG_HID_ZYDACRON=m
+CONFIG_HID_SENSOR_HUB=m
+CONFIG_HID_SENSOR_CUSTOM_SENSOR=m
+
+#
+# USB HID support
+#
+CONFIG_USB_HID=y
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+
+#
+# I2C HID support
+#
+# CONFIG_I2C_HID is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEFAULT_PERSIST=y
+CONFIG_USB_DYNAMIC_MINORS=y
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_ULPI_BUS is not set
+CONFIG_USB_MON=m
+CONFIG_USB_WUSB=m
+CONFIG_USB_WUSB_CBAF=m
+# CONFIG_USB_WUSB_CBAF_DEBUG is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_PLATFORM=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_EHCI_HCD_OMAP=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_FOTG210_HCD is not set
+# CONFIG_USB_MAX3421_HCD is not set
+# CONFIG_USB_OHCI_HCD is not set
+CONFIG_USB_U132_HCD=m
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+CONFIG_USB_HWA_HCD=m
+# CONFIG_USB_HCD_BCMA is not set
+# CONFIG_USB_HCD_SSB is not set
+# CONFIG_USB_HCD_TEST_MODE is not set
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_WDM=m
+CONFIG_USB_TMC=m
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_REALTEK=m
+CONFIG_REALTEK_AUTOPM=y
+CONFIG_USB_STORAGE_DATAFAB=m
+CONFIG_USB_STORAGE_FREECOM=m
+CONFIG_USB_STORAGE_ISD200=m
+CONFIG_USB_STORAGE_USBAT=m
+CONFIG_USB_STORAGE_SDDR09=m
+CONFIG_USB_STORAGE_SDDR55=m
+CONFIG_USB_STORAGE_JUMPSHOT=m
+CONFIG_USB_STORAGE_ALAUDA=m
+CONFIG_USB_STORAGE_ONETOUCH=m
+CONFIG_USB_STORAGE_KARMA=m
+CONFIG_USB_STORAGE_CYPRESS_ATACB=m
+CONFIG_USB_STORAGE_ENE_UB6250=m
+CONFIG_USB_UAS=m
+
+#
+# USB Imaging devices
+#
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USBIP_CORE=m
+CONFIG_USBIP_VHCI_HCD=m
+CONFIG_USBIP_HOST=m
+# CONFIG_USBIP_DEBUG is not set
+CONFIG_USB_MUSB_HDRC=y
+# CONFIG_USB_MUSB_HOST is not set
+# CONFIG_USB_MUSB_GADGET is not set
+CONFIG_USB_MUSB_DUAL_ROLE=y
+
+#
+# Platform Glue Layer
+#
+# CONFIG_USB_MUSB_TUSB6010 is not set
+# CONFIG_USB_MUSB_OMAP2PLUS is not set
+# CONFIG_USB_MUSB_AM35X is not set
+CONFIG_USB_MUSB_DSPS=y
+CONFIG_USB_MUSB_AM335X_CHILD=y
+
+#
+# MUSB DMA mode
+#
+# CONFIG_MUSB_PIO_ONLY is not set
+CONFIG_USB_TI_CPPI41_DMA=y
+CONFIG_USB_DWC3=y
+# CONFIG_USB_DWC3_HOST is not set
+# CONFIG_USB_DWC3_GADGET is not set
+CONFIG_USB_DWC3_DUAL_ROLE=y
+
+#
+# Platform Glue Driver Support
+#
+CONFIG_USB_DWC3_OMAP=m
+CONFIG_USB_DWC2=m
+# CONFIG_USB_DWC2_HOST is not set
+
+#
+# Gadget/Dual-role mode requires USB Gadget support to be enabled
+#
+# CONFIG_USB_DWC2_PERIPHERAL is not set
+CONFIG_USB_DWC2_DUAL_ROLE=y
+# CONFIG_USB_DWC2_DEBUG is not set
+# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
+CONFIG_USB_CHIPIDEA=y
+CONFIG_USB_CHIPIDEA_OF=y
+CONFIG_USB_CHIPIDEA_UDC=y
+CONFIG_USB_CHIPIDEA_HOST=y
+# CONFIG_USB_CHIPIDEA_DEBUG is not set
+# CONFIG_USB_ISP1760 is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_SIMPLE=m
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_CH341=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP210X=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_F81232=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_IUU=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
+# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_METRO=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_MXUPORT=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_OTI6858=m
+CONFIG_USB_SERIAL_QCAUX=m
+CONFIG_USB_SERIAL_QUALCOMM=m
+CONFIG_USB_SERIAL_SPCP8X5=m
+CONFIG_USB_SERIAL_SAFE=m
+# CONFIG_USB_SERIAL_SAFE_PADDED is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_SYMBOL=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_SERIAL_OPTICON=m
+CONFIG_USB_SERIAL_XSENS_MT=m
+CONFIG_USB_SERIAL_WISHBONE=m
+CONFIG_USB_SERIAL_SSU100=m
+CONFIG_USB_SERIAL_QT2=m
+CONFIG_USB_SERIAL_DEBUG=m
+
+#
+# USB Miscellaneous drivers
+#
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_ADUTUX=m
+CONFIG_USB_SEVSEG=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYPRESS_CY7C63=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_FTDI_ELAN=m
+CONFIG_USB_APPLEDISPLAY=m
+CONFIG_USB_SISUSBVGA=m
+CONFIG_USB_SISUSBVGA_CON=y
+CONFIG_USB_LD=m
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_USB_IOWARRIOR=m
+CONFIG_USB_TEST=m
+CONFIG_USB_EHSET_TEST_FIXTURE=m
+CONFIG_USB_ISIGHTFW=m
+CONFIG_USB_YUREX=m
+CONFIG_USB_EZUSB_FX2=m
+CONFIG_USB_HSIC_USB3503=m
+# CONFIG_USB_LINK_LAYER_TEST is not set
+CONFIG_USB_CHAOSKEY=m
+# CONFIG_USB_ATM is not set
+
+#
+# USB Physical Layer drivers
+#
+CONFIG_USB_PHY=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_AM335X_CONTROL_USB=y
+CONFIG_AM335X_PHY_USB=y
+CONFIG_USB_GPIO_VBUS=y
+# CONFIG_USB_ISP1301 is not set
+CONFIG_USB_ULPI=y
+CONFIG_USB_ULPI_VIEWPORT=y
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG is not set
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_DEBUG_FS is not set
+CONFIG_USB_GADGET_VBUS_DRAW=500
+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
+
+#
+# USB Peripheral Controller
+#
+# CONFIG_USB_FUSB300 is not set
+# CONFIG_USB_FOTG210_UDC is not set
+# CONFIG_USB_GR_UDC is not set
+# CONFIG_USB_R8A66597 is not set
+# CONFIG_USB_PXA27X is not set
+# CONFIG_USB_MV_UDC is not set
+# CONFIG_USB_MV_U3D is not set
+# CONFIG_USB_M66592 is not set
+# CONFIG_USB_BDC_UDC is not set
+# CONFIG_USB_NET2272 is not set
+# CONFIG_USB_GADGET_XILINX is not set
+# CONFIG_USB_DUMMY_HCD is not set
+CONFIG_USB_LIBCOMPOSITE=m
+CONFIG_USB_F_ACM=m
+CONFIG_USB_F_SS_LB=m
+CONFIG_USB_U_SERIAL=m
+CONFIG_USB_U_ETHER=m
+CONFIG_USB_F_SERIAL=m
+CONFIG_USB_F_OBEX=m
+CONFIG_USB_F_NCM=m
+CONFIG_USB_F_ECM=m
+CONFIG_USB_F_PHONET=m
+CONFIG_USB_F_SUBSET=m
+CONFIG_USB_F_RNDIS=m
+CONFIG_USB_F_MASS_STORAGE=m
+CONFIG_USB_F_FS=m
+CONFIG_USB_F_UAC2=m
+CONFIG_USB_F_MIDI=m
+CONFIG_USB_F_HID=m
+CONFIG_USB_F_PRINTER=m
+CONFIG_USB_CONFIGFS=m
+CONFIG_USB_CONFIGFS_SERIAL=y
+CONFIG_USB_CONFIGFS_ACM=y
+CONFIG_USB_CONFIGFS_OBEX=y
+CONFIG_USB_CONFIGFS_NCM=y
+CONFIG_USB_CONFIGFS_ECM=y
+CONFIG_USB_CONFIGFS_ECM_SUBSET=y
+CONFIG_USB_CONFIGFS_RNDIS=y
+# CONFIG_USB_CONFIGFS_EEM is not set
+# CONFIG_USB_CONFIGFS_PHONET is not set
+# CONFIG_USB_CONFIGFS_MASS_STORAGE is not set
+# CONFIG_USB_CONFIGFS_F_LB_SS is not set
+# CONFIG_USB_CONFIGFS_F_FS is not set
+# CONFIG_USB_CONFIGFS_F_UAC1 is not set
+# CONFIG_USB_CONFIGFS_F_UAC2 is not set
+# CONFIG_USB_CONFIGFS_F_MIDI is not set
+# CONFIG_USB_CONFIGFS_F_HID is not set
+# CONFIG_USB_CONFIGFS_F_UVC is not set
+# CONFIG_USB_CONFIGFS_F_PRINTER is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_AUDIO=m
+# CONFIG_GADGET_UAC1 is not set
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_ETH_EEM is not set
+CONFIG_USB_G_NCM=m
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FUNCTIONFS=m
+CONFIG_USB_FUNCTIONFS_ETH=y
+CONFIG_USB_FUNCTIONFS_RNDIS=y
+CONFIG_USB_FUNCTIONFS_GENERIC=y
+CONFIG_USB_MASS_STORAGE=m
+# CONFIG_USB_GADGET_TARGET is not set
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_MIDI_GADGET=m
+CONFIG_USB_G_PRINTER=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_NOKIA=m
+CONFIG_USB_G_ACM_MS=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_RNDIS=y
+# CONFIG_USB_G_MULTI_CDC is not set
+CONFIG_USB_G_HID=m
+CONFIG_USB_G_DBGP=m
+# CONFIG_USB_G_DBGP_PRINTK is not set
+CONFIG_USB_G_DBGP_SERIAL=y
+# CONFIG_USB_G_WEBCAM is not set
+CONFIG_USB_LED_TRIG=y
+CONFIG_UWB=m
+CONFIG_UWB_HWA=m
+CONFIG_UWB_I1480U=m
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+CONFIG_SDIO_UART=m
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+# CONFIG_MMC_SDHCI_OF_ARASAN is not set
+# CONFIG_MMC_SDHCI_OF_AT91 is not set
+# CONFIG_MMC_SDHCI_F_SDH30 is not set
+CONFIG_MMC_OMAP=y
+CONFIG_MMC_OMAP_HS=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_PLTFM=y
+CONFIG_MMC_DW_EXYNOS=m
+# CONFIG_MMC_DW_K3 is not set
+CONFIG_MMC_VUB300=m
+CONFIG_MMC_USHC=m
+# CONFIG_MMC_USDHI6ROL0 is not set
+CONFIG_MMC_REALTEK_USB=m
+# CONFIG_MMC_MTK is not set
+CONFIG_MEMSTICK=m
+# CONFIG_MEMSTICK_DEBUG is not set
+
+#
+# MemoryStick drivers
+#
+# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
+CONFIG_MSPRO_BLOCK=m
+# CONFIG_MS_BLOCK is not set
+
+#
+# MemoryStick Host Controller Drivers
+#
+CONFIG_MEMSTICK_REALTEK_USB=m
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+# CONFIG_LEDS_CLASS_FLASH is not set
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_BCM6328 is not set
+# CONFIG_LEDS_BCM6358 is not set
+CONFIG_LEDS_LM3530=m
+CONFIG_LEDS_LM3642=m
+CONFIG_LEDS_PCA9532=m
+CONFIG_LEDS_PCA9532_GPIO=y
+CONFIG_LEDS_GPIO=m
+CONFIG_LEDS_LP3944=m
+CONFIG_LEDS_LP55XX_COMMON=m
+CONFIG_LEDS_LP5521=m
+CONFIG_LEDS_LP5523=m
+CONFIG_LEDS_LP5562=m
+CONFIG_LEDS_LP8501=m
+CONFIG_LEDS_LP8860=m
+CONFIG_LEDS_PCA955X=m
+CONFIG_LEDS_PCA963X=m
+CONFIG_LEDS_DA9052=m
+CONFIG_LEDS_DAC124S085=m
+CONFIG_LEDS_PWM=m
+CONFIG_LEDS_REGULATOR=m
+CONFIG_LEDS_BD2802=m
+CONFIG_LEDS_LT3593=m
+CONFIG_LEDS_MC13783=m
+CONFIG_LEDS_TCA6507=m
+CONFIG_LEDS_TLC591XX=m
+CONFIG_LEDS_LM355x=m
+
+#
+# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
+#
+# CONFIG_LEDS_BLINKM is not set
+# CONFIG_LEDS_SYSCON is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_ONESHOT=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+# CONFIG_LEDS_TRIGGER_CPU is not set
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+CONFIG_LEDS_TRIGGER_TRANSIENT=m
+CONFIG_LEDS_TRIGGER_CAMERA=m
+CONFIG_ACCESSIBILITY=y
+CONFIG_A11Y_BRAILLE_CONSOLE=y
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_SUPPORT=y
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_SYSTOHC=y
+CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABX80X is not set
+CONFIG_RTC_DRV_AS3722=y
+CONFIG_RTC_DRV_DS1307=y
+CONFIG_RTC_DRV_DS1374=m
+CONFIG_RTC_DRV_DS1374_WDT=y
+CONFIG_RTC_DRV_DS1672=m
+CONFIG_RTC_DRV_DS3232=m
+CONFIG_RTC_DRV_HYM8563=m
+CONFIG_RTC_DRV_MAX6900=m
+CONFIG_RTC_DRV_RS5C372=m
+CONFIG_RTC_DRV_ISL1208=m
+CONFIG_RTC_DRV_ISL12022=m
+CONFIG_RTC_DRV_ISL12057=y
+CONFIG_RTC_DRV_X1205=m
+CONFIG_RTC_DRV_PALMAS=y
+CONFIG_RTC_DRV_PCF2127=m
+CONFIG_RTC_DRV_PCF8523=y
+CONFIG_RTC_DRV_PCF8563=y
+CONFIG_RTC_DRV_PCF85063=m
+CONFIG_RTC_DRV_PCF8583=m
+CONFIG_RTC_DRV_M41T80=m
+CONFIG_RTC_DRV_M41T80_WDT=y
+CONFIG_RTC_DRV_BQ32K=m
+CONFIG_RTC_DRV_TWL4030=y
+CONFIG_RTC_DRV_TPS65910=m
+CONFIG_RTC_DRV_S35390A=m
+CONFIG_RTC_DRV_FM3130=m
+CONFIG_RTC_DRV_RX8581=m
+CONFIG_RTC_DRV_RX8025=m
+CONFIG_RTC_DRV_EM3027=m
+CONFIG_RTC_DRV_RV3029C2=m
+CONFIG_RTC_DRV_RV8803=m
+CONFIG_RTC_DRV_S5M=y
+
+#
+# SPI RTC drivers
+#
+CONFIG_RTC_DRV_M41T93=m
+CONFIG_RTC_DRV_M41T94=m
+CONFIG_RTC_DRV_DS1305=m
+CONFIG_RTC_DRV_DS1343=m
+CONFIG_RTC_DRV_DS1347=m
+CONFIG_RTC_DRV_DS1390=m
+CONFIG_RTC_DRV_MAX6902=m
+CONFIG_RTC_DRV_R9701=m
+CONFIG_RTC_DRV_RS5C348=m
+CONFIG_RTC_DRV_DS3234=m
+CONFIG_RTC_DRV_PCF2123=m
+CONFIG_RTC_DRV_RX4581=m
+CONFIG_RTC_DRV_MCP795=m
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=m
+CONFIG_RTC_DRV_DS1286=m
+CONFIG_RTC_DRV_DS1511=m
+CONFIG_RTC_DRV_DS1553=m
+CONFIG_RTC_DRV_DS1685_FAMILY=m
+CONFIG_RTC_DRV_DS1685=y
+# CONFIG_RTC_DRV_DS1689 is not set
+# CONFIG_RTC_DRV_DS17285 is not set
+# CONFIG_RTC_DRV_DS17485 is not set
+# CONFIG_RTC_DRV_DS17885 is not set
+# CONFIG_RTC_DS1685_PROC_REGS is not set
+# CONFIG_RTC_DS1685_SYSFS_REGS is not set
+CONFIG_RTC_DRV_DS1742=m
+CONFIG_RTC_DRV_DS2404=m
+CONFIG_RTC_DRV_DA9052=y
+CONFIG_RTC_DRV_DA9055=m
+CONFIG_RTC_DRV_DA9063=m
+CONFIG_RTC_DRV_STK17TA8=m
+CONFIG_RTC_DRV_M48T86=m
+CONFIG_RTC_DRV_M48T35=m
+CONFIG_RTC_DRV_M48T59=m
+CONFIG_RTC_DRV_MSM6242=m
+CONFIG_RTC_DRV_BQ4802=m
+CONFIG_RTC_DRV_RP5C01=m
+CONFIG_RTC_DRV_V3020=m
+# CONFIG_RTC_DRV_ZYNQMP is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_OMAP=y
+CONFIG_RTC_DRV_MC13XXX=m
+CONFIG_RTC_DRV_SNVS=y
+
+#
+# HID Sensor RTC drivers
+#
+CONFIG_RTC_DRV_HID_SENSOR_TIME=m
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+
+#
+# DMA Devices
+#
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DMA_OF=y
+CONFIG_DMA_OMAP=y
+CONFIG_FSL_EDMA=y
+# CONFIG_INTEL_IDMA64 is not set
+# CONFIG_NBPFAXI_DMA is not set
+CONFIG_TI_CPPI41=y
+CONFIG_TI_DMA_CROSSBAR=y
+CONFIG_TI_EDMA=y
+CONFIG_DW_DMAC_CORE=y
+CONFIG_DW_DMAC=y
+
+#
+# DMA Clients
+#
+CONFIG_ASYNC_TX_DMA=y
+# CONFIG_DMATEST is not set
+# CONFIG_AUXDISPLAY is not set
+CONFIG_UIO=m
+CONFIG_UIO_PDRV_GENIRQ=m
+CONFIG_UIO_DMEM_GENIRQ=m
+CONFIG_UIO_PRUSS=m
+# CONFIG_VFIO is not set
+CONFIG_VIRT_DRIVERS=y
+CONFIG_VIRTIO=y
+
+#
+# Virtio drivers
+#
+CONFIG_VIRTIO_BALLOON=m
+CONFIG_VIRTIO_INPUT=m
+CONFIG_VIRTIO_MMIO=m
+# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+CONFIG_STAGING=y
+# CONFIG_PRISM2_USB is not set
+# CONFIG_COMEDI is not set
+CONFIG_RTLLIB=m
+CONFIG_RTLLIB_CRYPTO_CCMP=m
+CONFIG_RTLLIB_CRYPTO_TKIP=m
+CONFIG_RTLLIB_CRYPTO_WEP=m
+CONFIG_R8712U=m
+CONFIG_R8188EU=m
+CONFIG_88EU_AP_MODE=y
+# CONFIG_R8723AU is not set
+# CONFIG_VT6656 is not set
+
+#
+# IIO staging drivers
+#
+
+#
+# Accelerometers
+#
+CONFIG_ADIS16201=m
+CONFIG_ADIS16203=m
+CONFIG_ADIS16209=m
+CONFIG_ADIS16240=m
+CONFIG_LIS3L02DQ=m
+CONFIG_SCA3000=m
+
+#
+# Analog to digital converters
+#
+CONFIG_AD7606=m
+# CONFIG_AD7606_IFACE_PARALLEL is not set
+CONFIG_AD7606_IFACE_SPI=m
+CONFIG_AD7780=m
+CONFIG_AD7816=m
+CONFIG_AD7192=m
+CONFIG_AD7280=m
+
+#
+# Analog digital bi-direction converters
+#
+CONFIG_ADT7316=m
+CONFIG_ADT7316_SPI=m
+CONFIG_ADT7316_I2C=m
+
+#
+# Capacitance to digital converters
+#
+CONFIG_AD7150=m
+CONFIG_AD7152=m
+CONFIG_AD7746=m
+
+#
+# Direct Digital Synthesis
+#
+CONFIG_AD9832=m
+CONFIG_AD9834=m
+
+#
+# Digital gyroscope sensors
+#
+CONFIG_ADIS16060=m
+
+#
+# Network Analyzer, Impedance Converters
+#
+CONFIG_AD5933=m
+
+#
+# Light sensors
+#
+CONFIG_SENSORS_ISL29018=m
+CONFIG_SENSORS_ISL29028=m
+CONFIG_TSL2583=m
+CONFIG_TSL2x7x=m
+
+#
+# Active energy metering IC
+#
+CONFIG_ADE7753=m
+CONFIG_ADE7754=m
+CONFIG_ADE7758=m
+CONFIG_ADE7759=m
+CONFIG_ADE7854=m
+CONFIG_ADE7854_I2C=m
+CONFIG_ADE7854_SPI=m
+
+#
+# Resolver to digital converters
+#
+CONFIG_AD2S90=m
+CONFIG_AD2S1200=m
+CONFIG_AD2S1210=m
+
+#
+# Triggers - standalone
+#
+
+#
+# Speakup console speech
+#
+CONFIG_SPEAKUP=m
+CONFIG_SPEAKUP_SYNTH_ACNTSA=m
+CONFIG_SPEAKUP_SYNTH_APOLLO=m
+CONFIG_SPEAKUP_SYNTH_AUDPTR=m
+CONFIG_SPEAKUP_SYNTH_BNS=m
+CONFIG_SPEAKUP_SYNTH_DECTLK=m
+CONFIG_SPEAKUP_SYNTH_DECEXT=m
+CONFIG_SPEAKUP_SYNTH_LTLK=m
+CONFIG_SPEAKUP_SYNTH_SOFT=m
+CONFIG_SPEAKUP_SYNTH_SPKOUT=m
+CONFIG_SPEAKUP_SYNTH_TXPRT=m
+CONFIG_SPEAKUP_SYNTH_DUMMY=m
+# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
+# CONFIG_STAGING_MEDIA is not set
+
+#
+# Android
+#
+CONFIG_ASHMEM=y
+CONFIG_ANDROID_TIMED_OUTPUT=y
+CONFIG_ANDROID_TIMED_GPIO=m
+# CONFIG_ANDROID_LOW_MEMORY_KILLER is not set
+CONFIG_SYNC=y
+# CONFIG_SW_SYNC is not set
+CONFIG_ION=y
+# CONFIG_ION_TEST is not set
+# CONFIG_ION_DUMMY is not set
+# CONFIG_STAGING_BOARD is not set
+# CONFIG_WIMAX_GDM72XX is not set
+# CONFIG_LTE_GDM724X is not set
+# CONFIG_MTD_SPINAND_MT29F is not set
+# CONFIG_LUSTRE_FS is not set
+# CONFIG_DGAP is not set
+# CONFIG_GS_FPGABOOT is not set
+# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set
+CONFIG_FB_TFT=m
+CONFIG_FB_TFT_AGM1264K_FL=m
+CONFIG_FB_TFT_BD663474=m
+CONFIG_FB_TFT_HX8340BN=m
+CONFIG_FB_TFT_HX8347D=m
+CONFIG_FB_TFT_HX8353D=m
+CONFIG_FB_TFT_HX8357D=m
+CONFIG_FB_TFT_ILI9163=m
+CONFIG_FB_TFT_ILI9320=m
+CONFIG_FB_TFT_ILI9325=m
+CONFIG_FB_TFT_ILI9340=m
+CONFIG_FB_TFT_ILI9341=m
+CONFIG_FB_TFT_ILI9481=m
+CONFIG_FB_TFT_ILI9486=m
+CONFIG_FB_TFT_PCD8544=m
+CONFIG_FB_TFT_RA8875=m
+CONFIG_FB_TFT_S6D02A1=m
+CONFIG_FB_TFT_S6D1121=m
+CONFIG_FB_TFT_SSD1289=m
+CONFIG_FB_TFT_SSD1305=m
+CONFIG_FB_TFT_SSD1306=m
+CONFIG_FB_TFT_SSD1325=m
+CONFIG_FB_TFT_SSD1331=m
+CONFIG_FB_TFT_SSD1351=m
+CONFIG_FB_TFT_ST7735R=m
+CONFIG_FB_TFT_ST7789V=m
+CONFIG_FB_TFT_TINYLCD=m
+CONFIG_FB_TFT_TLS8204=m
+CONFIG_FB_TFT_UC1611=m
+CONFIG_FB_TFT_UC1701=m
+CONFIG_FB_TFT_UPD161704=m
+CONFIG_FB_TFT_WATTEROTT=m
+CONFIG_FB_FLEX=m
+CONFIG_FB_TFT_FBTFT_DEVICE=m
+# CONFIG_WILC1000_DRIVER is not set
+# CONFIG_MOST is not set
+# CONFIG_CHROME_PLATFORMS is not set
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_HAVE_CLK_PREPARE=y
+CONFIG_COMMON_CLK=y
+
+#
+# Common Clock Framework
+#
+# CONFIG_COMMON_CLK_SI5351 is not set
+# CONFIG_COMMON_CLK_SI514 is not set
+# CONFIG_COMMON_CLK_SI570 is not set
+# CONFIG_COMMON_CLK_CDCE925 is not set
+CONFIG_COMMON_CLK_S2MPS11=m
+CONFIG_CLK_TWL6040=y
+# CONFIG_CLK_QORIQ is not set
+CONFIG_COMMON_CLK_PALMAS=y
+# CONFIG_COMMON_CLK_PWM is not set
+# CONFIG_COMMON_CLK_PXA is not set
+# CONFIG_COMMON_CLK_CDCE706 is not set
+CONFIG_HWSPINLOCK=y
+
+#
+# Hardware Spinlock drivers
+#
+CONFIG_HWSPINLOCK_OMAP=y
+
+#
+# Clock Source drivers
+#
+CONFIG_CLKSRC_OF=y
+CONFIG_CLKSRC_PROBE=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CLKSRC_TI_32K=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+CONFIG_ARM_TIMER_SP804=y
+# CONFIG_ATMEL_PIT is not set
+# CONFIG_SH_TIMER_CMT is not set
+# CONFIG_SH_TIMER_MTU2 is not set
+# CONFIG_SH_TIMER_TMU is not set
+# CONFIG_EM_TIMER_STI is not set
+CONFIG_MAILBOX=y
+CONFIG_OMAP2PLUS_MBOX=y
+CONFIG_OMAP_MBOX_KFIFO_SIZE=256
+# CONFIG_ALTERA_MBOX is not set
+# CONFIG_MAILBOX_TEST is not set
+CONFIG_IOMMU_API=y
+CONFIG_IOMMU_SUPPORT=y
+
+#
+# Generic IOMMU Pagetable Support
+#
+CONFIG_IOMMU_IO_PGTABLE=y
+CONFIG_IOMMU_IO_PGTABLE_LPAE=y
+# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
+CONFIG_OF_IOMMU=y
+CONFIG_OMAP_IOMMU=y
+# CONFIG_OMAP_IOMMU_DEBUG is not set
+CONFIG_ARM_SMMU=y
+
+#
+# Remoteproc drivers
+#
+CONFIG_REMOTEPROC=y
+# CONFIG_STE_MODEM_RPROC is not set
+CONFIG_WKUP_M3_RPROC=y
+
+#
+# Rpmsg drivers
+#
+
+#
+# SOC (System On Chip) specific Drivers
+#
+# CONFIG_SOC_BRCMSTB is not set
+# CONFIG_SUNXI_SRAM is not set
+CONFIG_SOC_TI=y
+CONFIG_PM_DEVFREQ=y
+
+#
+# DEVFREQ Governors
+#
+CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
+CONFIG_DEVFREQ_GOV_PERFORMANCE=y
+# CONFIG_DEVFREQ_GOV_POWERSAVE is not set
+CONFIG_DEVFREQ_GOV_USERSPACE=y
+
+#
+# DEVFREQ Drivers
+#
+# CONFIG_PM_DEVFREQ_EVENT is not set
+CONFIG_EXTCON=y
+
+#
+# Extcon Device Drivers
+#
+# CONFIG_EXTCON_ADC_JACK is not set
+# CONFIG_EXTCON_AXP288 is not set
+CONFIG_EXTCON_GPIO=y
+CONFIG_EXTCON_PALMAS=y
+# CONFIG_EXTCON_RT8973A is not set
+# CONFIG_EXTCON_SM5502 is not set
+CONFIG_EXTCON_USB_GPIO=y
+CONFIG_MEMORY=y
+CONFIG_TI_EMIF=y
+CONFIG_OMAP_GPMC=y
+# CONFIG_OMAP_GPMC_DEBUG is not set
+CONFIG_IIO=m
+CONFIG_IIO_BUFFER=y
+CONFIG_IIO_BUFFER_CB=m
+CONFIG_IIO_KFIFO_BUF=m
+CONFIG_IIO_TRIGGERED_BUFFER=m
+CONFIG_IIO_CONFIGFS=m
+CONFIG_IIO_TRIGGER=y
+CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
+# CONFIG_IIO_SW_TRIGGER is not set
+CONFIG_IIO_TRIGGERED_EVENT=m
+
+#
+# Accelerometers
+#
+CONFIG_BMA180=m
+CONFIG_BMC150_ACCEL=m
+CONFIG_BMC150_ACCEL_I2C=m
+CONFIG_BMC150_ACCEL_SPI=m
+CONFIG_HID_SENSOR_ACCEL_3D=m
+CONFIG_IIO_ST_ACCEL_3AXIS=m
+CONFIG_IIO_ST_ACCEL_I2C_3AXIS=m
+CONFIG_IIO_ST_ACCEL_SPI_3AXIS=m
+CONFIG_KXSD9=m
+CONFIG_KXCJK1013=m
+CONFIG_MMA7455=m
+CONFIG_MMA7455_I2C=m
+CONFIG_MMA7455_SPI=m
+CONFIG_MMA8452=m
+CONFIG_MMA9551_CORE=m
+CONFIG_MMA9551=m
+CONFIG_MMA9553=m
+CONFIG_MXC4005=m
+CONFIG_MXC6255=m
+CONFIG_STK8312=m
+CONFIG_STK8BA50=m
+
+#
+# Analog to digital converters
+#
+CONFIG_AD_SIGMA_DELTA=m
+CONFIG_AD7266=m
+CONFIG_AD7291=m
+CONFIG_AD7298=m
+CONFIG_AD7476=m
+CONFIG_AD7791=m
+CONFIG_AD7793=m
+CONFIG_AD7887=m
+CONFIG_AD7923=m
+CONFIG_AD799X=m
+CONFIG_AXP288_ADC=m
+CONFIG_CC10001_ADC=m
+CONFIG_HI8435=m
+CONFIG_INA2XX_ADC=m
+CONFIG_MAX1027=m
+CONFIG_MAX1363=m
+CONFIG_MCP320X=m
+CONFIG_MCP3422=m
+CONFIG_NAU7802=m
+CONFIG_PALMAS_GPADC=m
+CONFIG_TI_ADC081C=m
+CONFIG_TI_ADC0832=m
+CONFIG_TI_ADC128S052=m
+CONFIG_TI_ADS1015=m
+CONFIG_TI_ADS8688=m
+CONFIG_TI_AM335X_ADC=m
+CONFIG_TWL4030_MADC=m
+CONFIG_TWL6030_GPADC=m
+CONFIG_VF610_ADC=m
+CONFIG_VIPERBOARD_ADC=m
+
+#
+# Amplifiers
+#
+CONFIG_AD8366=m
+
+#
+# Chemical Sensors
+#
+CONFIG_ATLAS_PH_SENSOR=m
+CONFIG_IAQCORE=m
+CONFIG_VZ89X=m
+
+#
+# Hid Sensor IIO Common
+#
+CONFIG_HID_SENSOR_IIO_COMMON=m
+CONFIG_HID_SENSOR_IIO_TRIGGER=m
+CONFIG_IIO_MS_SENSORS_I2C=m
+
+#
+# SSP Sensor Common
+#
+# CONFIG_IIO_SSP_SENSORHUB is not set
+CONFIG_IIO_ST_SENSORS_I2C=m
+CONFIG_IIO_ST_SENSORS_SPI=m
+CONFIG_IIO_ST_SENSORS_CORE=m
+
+#
+# Digital to analog converters
+#
+CONFIG_AD5064=m
+CONFIG_AD5360=m
+CONFIG_AD5380=m
+CONFIG_AD5421=m
+CONFIG_AD5446=m
+CONFIG_AD5449=m
+# CONFIG_AD5592R is not set
+# CONFIG_AD5593R is not set
+CONFIG_AD5504=m
+CONFIG_AD5624R_SPI=m
+CONFIG_AD5686=m
+CONFIG_AD5755=m
+CONFIG_AD5761=m
+CONFIG_AD5764=m
+CONFIG_AD5791=m
+CONFIG_AD7303=m
+CONFIG_M62332=m
+CONFIG_MAX517=m
+CONFIG_MAX5821=m
+CONFIG_MCP4725=m
+CONFIG_MCP4922=m
+# CONFIG_VF610_DAC is not set
+
+#
+# IIO dummy driver
+#
+# CONFIG_IIO_SIMPLE_DUMMY is not set
+
+#
+# Frequency Synthesizers DDS/PLL
+#
+
+#
+# Clock Generator/Distribution
+#
+CONFIG_AD9523=m
+
+#
+# Phase-Locked Loop (PLL) frequency synthesizers
+#
+CONFIG_ADF4350=m
+
+#
+# Digital gyroscope sensors
+#
+CONFIG_ADIS16080=m
+CONFIG_ADIS16130=m
+CONFIG_ADIS16136=m
+CONFIG_ADIS16260=m
+CONFIG_ADXRS450=m
+CONFIG_BMG160=m
+CONFIG_BMG160_I2C=m
+CONFIG_BMG160_SPI=m
+CONFIG_HID_SENSOR_GYRO_3D=m
+CONFIG_IIO_ST_GYRO_3AXIS=m
+CONFIG_IIO_ST_GYRO_I2C_3AXIS=m
+CONFIG_IIO_ST_GYRO_SPI_3AXIS=m
+CONFIG_ITG3200=m
+
+#
+# Health Sensors
+#
+
+#
+# Heart Rate Monitors
+#
+CONFIG_AFE4403=m
+CONFIG_AFE4404=m
+CONFIG_MAX30100=m
+
+#
+# Humidity sensors
+#
+# CONFIG_AM2315 is not set
+CONFIG_DHT11=m
+CONFIG_HDC100X=m
+CONFIG_HTU21=m
+CONFIG_SI7005=m
+CONFIG_SI7020=m
+
+#
+# Inertial measurement units
+#
+CONFIG_ADIS16400=m
+CONFIG_ADIS16480=m
+# CONFIG_BMI160_I2C is not set
+# CONFIG_BMI160_SPI is not set
+CONFIG_KMX61=m
+CONFIG_INV_MPU6050_IIO=m
+CONFIG_INV_MPU6050_I2C=m
+CONFIG_INV_MPU6050_SPI=m
+CONFIG_IIO_ADIS_LIB=m
+CONFIG_IIO_ADIS_LIB_BUFFER=y
+
+#
+# Light sensors
+#
+CONFIG_ADJD_S311=m
+CONFIG_AL3320A=m
+CONFIG_APDS9300=m
+CONFIG_APDS9960=m
+CONFIG_BH1750=m
+# CONFIG_BH1780 is not set
+CONFIG_CM32181=m
+CONFIG_CM3232=m
+CONFIG_CM3323=m
+CONFIG_CM36651=m
+CONFIG_GP2AP020A00F=m
+CONFIG_ISL29125=m
+CONFIG_HID_SENSOR_ALS=m
+CONFIG_HID_SENSOR_PROX=m
+CONFIG_JSA1212=m
+CONFIG_RPR0521=m
+CONFIG_LTR501=m
+# CONFIG_MAX44000 is not set
+CONFIG_OPT3001=m
+CONFIG_PA12203001=m
+CONFIG_STK3310=m
+CONFIG_TCS3414=m
+CONFIG_TCS3472=m
+CONFIG_SENSORS_TSL2563=m
+CONFIG_TSL4531=m
+CONFIG_US5182D=m
+CONFIG_VCNL4000=m
+# CONFIG_VEML6070 is not set
+
+#
+# Magnetometer sensors
+#
+CONFIG_AK8975=m
+CONFIG_AK09911=m
+# CONFIG_BMC150_MAGN_I2C is not set
+# CONFIG_BMC150_MAGN_SPI is not set
+CONFIG_MAG3110=m
+CONFIG_HID_SENSOR_MAGNETOMETER_3D=m
+CONFIG_MMC35240=m
+CONFIG_IIO_ST_MAGN_3AXIS=m
+CONFIG_IIO_ST_MAGN_I2C_3AXIS=m
+CONFIG_IIO_ST_MAGN_SPI_3AXIS=m
+CONFIG_SENSORS_HMC5843=m
+CONFIG_SENSORS_HMC5843_I2C=m
+CONFIG_SENSORS_HMC5843_SPI=m
+
+#
+# Inclinometer sensors
+#
+CONFIG_HID_SENSOR_INCLINOMETER_3D=m
+CONFIG_HID_SENSOR_DEVICE_ROTATION=m
+
+#
+# Triggers - standalone
+#
+CONFIG_IIO_INTERRUPT_TRIGGER=m
+CONFIG_IIO_SYSFS_TRIGGER=m
+
+#
+# Digital potentiometers
+#
+# CONFIG_DS1803 is not set
+# CONFIG_MCP4131 is not set
+CONFIG_MCP4531=m
+CONFIG_TPL0102=m
+
+#
+# Pressure sensors
+#
+CONFIG_BMP280=m
+CONFIG_HID_SENSOR_PRESS=m
+# CONFIG_HP03 is not set
+CONFIG_MPL115=m
+CONFIG_MPL115_I2C=m
+CONFIG_MPL115_SPI=m
+CONFIG_MPL3115=m
+CONFIG_MS5611=m
+CONFIG_MS5611_I2C=m
+CONFIG_MS5611_SPI=m
+CONFIG_MS5637=m
+CONFIG_IIO_ST_PRESS=m
+CONFIG_IIO_ST_PRESS_I2C=m
+CONFIG_IIO_ST_PRESS_SPI=m
+CONFIG_T5403=m
+# CONFIG_HP206C is not set
+
+#
+# Lightning sensors
+#
+CONFIG_AS3935=m
+
+#
+# Proximity sensors
+#
+CONFIG_LIDAR_LITE_V2=m
+CONFIG_SX9500=m
+
+#
+# Temperature sensors
+#
+CONFIG_MLX90614=m
+CONFIG_TMP006=m
+CONFIG_TSYS01=m
+CONFIG_TSYS02D=m
+CONFIG_PWM=y
+CONFIG_PWM_SYSFS=y
+# CONFIG_PWM_FSL_FTM is not set
+CONFIG_PWM_OMAP_DMTIMER=m
+CONFIG_PWM_PCA9685=m
+CONFIG_PWM_TIECAP=m
+CONFIG_PWM_TIEHRPWM=m
+CONFIG_PWM_TIPWMSS=y
+CONFIG_PWM_TWL=m
+CONFIG_PWM_TWL_LED=m
+CONFIG_IRQCHIP=y
+CONFIG_OMAP_IRQCHIP=y
+# CONFIG_IPACK_BUS is not set
+# CONFIG_RESET_CONTROLLER is not set
+# CONFIG_FMC is not set
+
+#
+# PHY Subsystem
+#
+CONFIG_GENERIC_PHY=y
+# CONFIG_PHY_DM816X_USB is not set
+# CONFIG_PHY_PXA_28NM_HSIC is not set
+# CONFIG_PHY_PXA_28NM_USB2 is not set
+CONFIG_OMAP_CONTROL_PHY=y
+CONFIG_OMAP_USB2=y
+CONFIG_TI_PIPE3=m
+# CONFIG_BCM_KONA_USB2_PHY is not set
+CONFIG_PHY_SAMSUNG_USB2=m
+# CONFIG_PHY_EXYNOS4210_USB2 is not set
+# CONFIG_PHY_EXYNOS4X12_USB2 is not set
+# CONFIG_PHY_EXYNOS5250_USB2 is not set
+# CONFIG_POWERCAP is not set
+# CONFIG_MCB is not set
+
+#
+# Performance monitor support
+#
+CONFIG_ARM_PMU=y
+CONFIG_RAS=y
+
+#
+# Android
+#
+CONFIG_ANDROID=y
+CONFIG_ANDROID_BINDER_IPC=y
+CONFIG_ANDROID_BINDER_IPC_32BIT=y
+CONFIG_NVMEM=y
+# CONFIG_STM is not set
+# CONFIG_STM_DUMMY is not set
+# CONFIG_STM_SOURCE_CONSOLE is not set
+# CONFIG_INTEL_TH is not set
+
+#
+# FPGA Configuration Support
+#
+# CONFIG_FPGA is not set
+
+#
+# Firmware Drivers
+#
+CONFIG_ARM_PSCI_FW=y
+# CONFIG_FIRMWARE_MEMMAP is not set
+
+#
+# File systems
+#
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT2=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_EXT4_ENCRYPTION=y
+CONFIG_EXT4_FS_ENCRYPTION=y
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+CONFIG_JFS_SECURITY=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_XFS_FS=y
+CONFIG_XFS_QUOTA=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_XFS_RT=y
+# CONFIG_XFS_WARN is not set
+# CONFIG_XFS_DEBUG is not set
+CONFIG_GFS2_FS=m
+CONFIG_GFS2_FS_LOCKING_DLM=y
+CONFIG_OCFS2_FS=m
+CONFIG_OCFS2_FS_O2CB=m
+CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
+CONFIG_OCFS2_FS_STATS=y
+CONFIG_OCFS2_DEBUG_MASKLOG=y
+# CONFIG_OCFS2_DEBUG_FS is not set
+CONFIG_BTRFS_FS=y
+CONFIG_BTRFS_FS_POSIX_ACL=y
+# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set
+# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
+# CONFIG_BTRFS_DEBUG is not set
+# CONFIG_BTRFS_ASSERT is not set
+CONFIG_NILFS2_FS=m
+CONFIG_F2FS_FS=y
+CONFIG_F2FS_STAT_FS=y
+CONFIG_F2FS_FS_XATTR=y
+CONFIG_F2FS_FS_POSIX_ACL=y
+CONFIG_F2FS_FS_SECURITY=y
+# CONFIG_F2FS_CHECK_FS is not set
+CONFIG_F2FS_FS_ENCRYPTION=y
+# CONFIG_F2FS_IO_TRACE is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_QUOTA=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_PRINT_QUOTA_WARNING=y
+# CONFIG_QUOTA_DEBUG is not set
+CONFIG_QUOTA_TREE=m
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_AUTOFS4_FS=y
+CONFIG_FUSE_FS=y
+CONFIG_CUSE=m
+CONFIG_OVERLAY_FS=y
+
+#
+# Caches
+#
+CONFIG_FSCACHE=m
+CONFIG_FSCACHE_STATS=y
+# CONFIG_FSCACHE_HISTOGRAM is not set
+# CONFIG_FSCACHE_DEBUG is not set
+# CONFIG_FSCACHE_OBJECT_LIST is not set
+CONFIG_CACHEFILES=m
+# CONFIG_CACHEFILES_DEBUG is not set
+# CONFIG_CACHEFILES_HISTOGRAM is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_CHILDREN=y
+CONFIG_KERNFS=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=y
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_ADFS_FS=m
+# CONFIG_ADFS_FS_RW is not set
+CONFIG_AFFS_FS=m
+CONFIG_ECRYPT_FS=m
+CONFIG_ECRYPT_FS_MESSAGING=y
+CONFIG_HFS_FS=m
+CONFIG_HFSPLUS_FS=m
+# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
+CONFIG_BEFS_FS=m
+# CONFIG_BEFS_DEBUG is not set
+CONFIG_BFS_FS=m
+CONFIG_EFS_FS=m
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+CONFIG_JFFS2_FS_SECURITY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_JFFS2_CMODE_NONE is not set
+CONFIG_JFFS2_CMODE_PRIORITY=y
+# CONFIG_JFFS2_CMODE_SIZE is not set
+# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
+CONFIG_UBIFS_FS=m
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_UBIFS_FS_LZO=y
+CONFIG_UBIFS_FS_ZLIB=y
+# CONFIG_UBIFS_ATIME_SUPPORT is not set
+CONFIG_LOGFS=m
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=m
+CONFIG_SQUASHFS_FILE_CACHE=y
+# CONFIG_SQUASHFS_FILE_DIRECT is not set
+CONFIG_SQUASHFS_DECOMP_SINGLE=y
+# CONFIG_SQUASHFS_DECOMP_MULTI is not set
+# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_LZ4=y
+CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_XZ=y
+# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_VXFS_FS=m
+CONFIG_MINIX_FS=m
+CONFIG_OMFS_FS=m
+# CONFIG_HPFS_FS is not set
+CONFIG_QNX4FS_FS=m
+CONFIG_QNX6FS_FS=m
+# CONFIG_QNX6FS_DEBUG is not set
+CONFIG_ROMFS_FS=m
+# CONFIG_ROMFS_BACKED_BY_BLOCK is not set
+# CONFIG_ROMFS_BACKED_BY_MTD is not set
+CONFIG_ROMFS_BACKED_BY_BOTH=y
+CONFIG_ROMFS_ON_BLOCK=y
+CONFIG_ROMFS_ON_MTD=y
+# CONFIG_PSTORE is not set
+CONFIG_SYSV_FS=m
+CONFIG_UFS_FS=m
+# CONFIG_UFS_FS_WRITE is not set
+# CONFIG_UFS_DEBUG is not set
+CONFIG_EXOFS_FS=m
+# CONFIG_EXOFS_DEBUG is not set
+CONFIG_AUFS_FS=m
+CONFIG_AUFS_BRANCH_MAX_127=y
+# CONFIG_AUFS_BRANCH_MAX_511 is not set
+# CONFIG_AUFS_BRANCH_MAX_1023 is not set
+# CONFIG_AUFS_BRANCH_MAX_32767 is not set
+CONFIG_AUFS_SBILIST=y
+# CONFIG_AUFS_HNOTIFY is not set
+CONFIG_AUFS_EXPORT=y
+CONFIG_AUFS_XATTR=y
+# CONFIG_AUFS_FHSM is not set
+# CONFIG_AUFS_RDU is not set
+# CONFIG_AUFS_SHWH is not set
+# CONFIG_AUFS_BR_RAMFS is not set
+# CONFIG_AUFS_BR_FUSE is not set
+CONFIG_AUFS_BR_HFSPLUS=y
+CONFIG_AUFS_BDEV_LOOP=y
+# CONFIG_AUFS_DEBUG is not set
+CONFIG_ORE=m
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V2=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_SWAP=y
+CONFIG_NFS_V4_1=y
+CONFIG_NFS_V4_2=y
+CONFIG_PNFS_FILE_LAYOUT=y
+CONFIG_PNFS_BLOCK=m
+CONFIG_PNFS_OBJLAYOUT=m
+CONFIG_PNFS_FLEXFILE_LAYOUT=m
+CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
+# CONFIG_NFS_V4_1_MIGRATION is not set
+CONFIG_NFS_V4_SECURITY_LABEL=y
+CONFIG_ROOT_NFS=y
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+CONFIG_NFS_USE_KERNEL_DNS=y
+CONFIG_NFS_DEBUG=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V2_ACL=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+# CONFIG_NFSD_PNFS is not set
+CONFIG_NFSD_V4_SECURITY_LABEL=y
+# CONFIG_NFSD_FAULT_INJECTION is not set
+CONFIG_GRACE_PERIOD=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_SUNRPC_BACKCHANNEL=y
+CONFIG_SUNRPC_SWAP=y
+CONFIG_RPCSEC_GSS_KRB5=m
+CONFIG_SUNRPC_DEBUG=y
+CONFIG_CEPH_FS=m
+CONFIG_CEPH_FSCACHE=y
+CONFIG_CEPH_FS_POSIX_ACL=y
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+CONFIG_CIFS_UPCALL=y
+CONFIG_CIFS_XATTR=y
+CONFIG_CIFS_POSIX=y
+CONFIG_CIFS_ACL=y
+CONFIG_CIFS_DEBUG=y
+# CONFIG_CIFS_DEBUG2 is not set
+CONFIG_CIFS_DFS_UPCALL=y
+CONFIG_CIFS_SMB2=y
+# CONFIG_CIFS_SMB311 is not set
+CONFIG_CIFS_FSCACHE=y
+CONFIG_NCP_FS=m
+CONFIG_NCPFS_PACKET_SIGNING=y
+CONFIG_NCPFS_IOCTL_LOCKING=y
+CONFIG_NCPFS_STRONG=y
+CONFIG_NCPFS_NFS_NS=y
+CONFIG_NCPFS_OS2_NS=y
+# CONFIG_NCPFS_SMALLDOS is not set
+CONFIG_NCPFS_NLS=y
+CONFIG_NCPFS_EXTRAS=y
+CONFIG_CODA_FS=m
+CONFIG_AFS_FS=m
+# CONFIG_AFS_DEBUG is not set
+CONFIG_AFS_FSCACHE=y
+CONFIG_9P_FS=m
+CONFIG_9P_FSCACHE=y
+CONFIG_9P_FS_POSIX_ACL=y
+CONFIG_9P_FS_SECURITY=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_MAC_ROMAN=m
+CONFIG_NLS_MAC_CELTIC=m
+CONFIG_NLS_MAC_CENTEURO=m
+CONFIG_NLS_MAC_CROATIAN=m
+CONFIG_NLS_MAC_CYRILLIC=m
+CONFIG_NLS_MAC_GAELIC=m
+CONFIG_NLS_MAC_GREEK=m
+CONFIG_NLS_MAC_ICELAND=m
+CONFIG_NLS_MAC_INUIT=m
+CONFIG_NLS_MAC_ROMANIAN=m
+CONFIG_NLS_MAC_TURKISH=m
+CONFIG_NLS_UTF8=m
+CONFIG_DLM=m
+CONFIG_DLM_DEBUG=y
+
+#
+# Kernel hacking
+#
+
+#
+# printk and dmesg options
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_BOOT_PRINTK_DELAY is not set
+CONFIG_DYNAMIC_DEBUG=y
+
+#
+# Compile-time checks and compiler options
+#
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_INFO_REDUCED is not set
+CONFIG_DEBUG_INFO_SPLIT=y
+CONFIG_DEBUG_INFO_DWARF4=y
+# CONFIG_GDB_SCRIPTS is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_STRIP_ASM_SYMS=y
+# CONFIG_READABLE_ASM is not set
+CONFIG_UNUSED_SYMBOLS=y
+# CONFIG_PAGE_OWNER is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
+CONFIG_DEBUG_KERNEL=y
+
+#
+# Memory Debugging
+#
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_VM is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_HIGHMEM is not set
+# CONFIG_DEBUG_SHIRQ is not set
+
+#
+# Debug Lockups and Hangs
+#
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_ON_OOPS_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+CONFIG_SCHED_DEBUG=y
+CONFIG_SCHED_INFO=y
+CONFIG_SCHEDSTATS=y
+CONFIG_SCHED_STACK_END_CHECK=y
+# CONFIG_DEBUG_TIMEKEEPING is not set
+CONFIG_TIMER_STATS=y
+CONFIG_DEBUG_PREEMPT=y
+
+#
+# Lock Debugging (spinlocks, mutexes, etc...)
+#
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_LIST=y
+# CONFIG_DEBUG_PI_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+
+#
+# RCU Debugging
+#
+# CONFIG_PROVE_RCU is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_TORTURE_TEST is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+# CONFIG_RCU_TRACE is not set
+# CONFIG_RCU_EQS_DEBUG is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+CONFIG_NOTIFIER_ERROR_INJECTION=m
+CONFIG_PM_NOTIFIER_ERROR_INJECT=m
+# CONFIG_OF_RECONFIG_NOTIFIER_ERROR_INJECT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_NOP_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_TRACER_MAX_TRACE=y
+CONFIG_TRACE_CLOCK=y
+CONFIG_RING_BUFFER=y
+CONFIG_EVENT_TRACING=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_TRACING=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+CONFIG_FUNCTION_TRACER=y
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_MISSED_TIMER_OFFSETS_HIST is not set
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_TRACER_SNAPSHOT=y
+# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+CONFIG_STACK_TRACER=y
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_KPROBE_EVENT=y
+CONFIG_UPROBE_EVENT=y
+CONFIG_BPF_EVENTS=y
+CONFIG_PROBE_EVENTS=y
+CONFIG_DYNAMIC_FTRACE=y
+# CONFIG_FUNCTION_PROFILER is not set
+CONFIG_FTRACE_MCOUNT_RECORD=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_TRACEPOINT_BENCHMARK is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_RING_BUFFER_STARTUP_TEST is not set
+# CONFIG_TRACE_ENUM_MAP_FILE is not set
+CONFIG_TRACING_EVENTS_GPIO=y
+
+#
+# Runtime Testing
+#
+# CONFIG_LKDTM is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_KPROBES_SANITY_TEST is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_RBTREE_TEST is not set
+# CONFIG_INTERVAL_TREE_TEST is not set
+# CONFIG_PERCPU_TEST is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_ASYNC_RAID6_TEST is not set
+# CONFIG_TEST_HEXDUMP is not set
+# CONFIG_TEST_STRING_HELPERS is not set
+# CONFIG_TEST_KSTRTOX is not set
+# CONFIG_TEST_PRINTF is not set
+# CONFIG_TEST_RHASHTABLE is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_TEST_LKM is not set
+CONFIG_TEST_USER_COPY=m
+CONFIG_TEST_BPF=m
+CONFIG_TEST_FIRMWARE=m
+# CONFIG_TEST_UDELAY is not set
+# CONFIG_MEMTEST is not set
+CONFIG_TEST_STATIC_KEYS=m
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_KGDB=y
+CONFIG_KGDB_SERIAL_CONSOLE=y
+# CONFIG_KGDB_TESTS is not set
+CONFIG_KGDB_KDB=y
+CONFIG_KDB_DEFAULT_ENABLE=0x1
+CONFIG_KDB_KEYBOARD=y
+CONFIG_KDB_CONTINUE_CATASTROPHIC=0
+# CONFIG_ARM_PTDUMP is not set
+# CONFIG_STRICT_DEVMEM is not set
+CONFIG_ARM_UNWIND=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_LL is not set
+CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
+# CONFIG_DEBUG_UART_8250 is not set
+CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h"
+# CONFIG_ARM_KPROBES_TEST is not set
+# CONFIG_PID_IN_CONTEXTIDR is not set
+# CONFIG_DEBUG_SET_MODULE_RONX is not set
+# CONFIG_CORESIGHT is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_PERSISTENT_KEYRINGS is not set
+# CONFIG_BIG_KEYS is not set
+# CONFIG_TRUSTED_KEYS is not set
+CONFIG_ENCRYPTED_KEYS=y
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITYFS=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_NETWORK_XFRM=y
+CONFIG_SECURITY_PATH=y
+CONFIG_LSM_MMAP_MIN_ADDR=32768
+CONFIG_SECURITY_SELINUX=y
+# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
+# CONFIG_SECURITY_SELINUX_DISABLE is not set
+CONFIG_SECURITY_SELINUX_DEVELOP=y
+CONFIG_SECURITY_SELINUX_AVC_STATS=y
+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
+# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
+# CONFIG_SECURITY_SMACK is not set
+CONFIG_SECURITY_TOMOYO=y
+CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
+CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
+# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set
+CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init"
+CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/sbin/init"
+CONFIG_SECURITY_APPARMOR=y
+CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE=1
+CONFIG_SECURITY_APPARMOR_HASH=y
+CONFIG_SECURITY_YAMA=y
+CONFIG_INTEGRITY=y
+# CONFIG_INTEGRITY_SIGNATURE is not set
+CONFIG_INTEGRITY_AUDIT=y
+# CONFIG_IMA is not set
+# CONFIG_EVM is not set
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
+# CONFIG_DEFAULT_SECURITY_APPARMOR is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_XOR_BLOCKS=y
+CONFIG_ASYNC_CORE=m
+CONFIG_ASYNC_MEMCPY=m
+CONFIG_ASYNC_XOR=m
+CONFIG_ASYNC_PQ=m
+CONFIG_ASYNC_RAID6_RECOV=m
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_RNG_DEFAULT=y
+CONFIG_CRYPTO_PCOMP=m
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_AKCIPHER2=y
+# CONFIG_CRYPTO_RSA is not set
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+# CONFIG_CRYPTO_USER is not set
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+CONFIG_CRYPTO_GF128MUL=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_NULL2=y
+CONFIG_CRYPTO_WORKQUEUE=y
+CONFIG_CRYPTO_CRYPTD=m
+# CONFIG_CRYPTO_MCRYPTD is not set
+CONFIG_CRYPTO_AUTHENC=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_ABLK_HELPER=m
+
+#
+# Authenticated Encryption with Associated Data
+#
+CONFIG_CRYPTO_CCM=m
+CONFIG_CRYPTO_GCM=m
+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
+CONFIG_CRYPTO_SEQIV=y
+CONFIG_CRYPTO_ECHAINIV=m
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_XTS=y
+# CONFIG_CRYPTO_KEYWRAP is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_CMAC=m
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_VMAC=m
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CRC32=m
+CONFIG_CRYPTO_CRCT10DIF=y
+CONFIG_CRYPTO_GHASH=m
+# CONFIG_CRYPTO_POLY1305 is not set
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_RMD128=m
+CONFIG_CRYPTO_RMD160=m
+CONFIG_CRYPTO_RMD256=m
+CONFIG_CRYPTO_RMD320=m
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_WP512=m
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_BLOWFISH_COMMON=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST_COMMON=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SALSA20=m
+# CONFIG_CRYPTO_CHACHA20 is not set
+CONFIG_CRYPTO_SEED=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_ZLIB=m
+CONFIG_CRYPTO_LZO=y
+# CONFIG_CRYPTO_842 is not set
+CONFIG_CRYPTO_LZ4=m
+CONFIG_CRYPTO_LZ4HC=m
+
+#
+# Random Number Generation
+#
+CONFIG_CRYPTO_ANSI_CPRNG=m
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+# CONFIG_CRYPTO_DRBG_HASH is not set
+# CONFIG_CRYPTO_DRBG_CTR is not set
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_USER_API=m
+CONFIG_CRYPTO_USER_API_HASH=m
+CONFIG_CRYPTO_USER_API_SKCIPHER=m
+# CONFIG_CRYPTO_USER_API_RNG is not set
+# CONFIG_CRYPTO_USER_API_AEAD is not set
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_DEV_OMAP_SHAM=m
+CONFIG_CRYPTO_DEV_OMAP_AES=m
+CONFIG_CRYPTO_DEV_OMAP_DES=m
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
+
+#
+# Certificates for signature checking
+#
+# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
+CONFIG_ARM_CRYPTO=y
+CONFIG_CRYPTO_SHA1_ARM=m
+CONFIG_CRYPTO_SHA1_ARM_NEON=m
+# CONFIG_CRYPTO_SHA1_ARM_CE is not set
+# CONFIG_CRYPTO_SHA2_ARM_CE is not set
+CONFIG_CRYPTO_SHA256_ARM=m
+CONFIG_CRYPTO_SHA512_ARM=m
+CONFIG_CRYPTO_AES_ARM=m
+CONFIG_CRYPTO_AES_ARM_BS=m
+# CONFIG_CRYPTO_AES_ARM_CE is not set
+# CONFIG_CRYPTO_GHASH_ARM_CE is not set
+CONFIG_BINARY_PRINTF=y
+
+#
+# Library routines
+#
+CONFIG_RAID6_PQ=y
+CONFIG_BITREVERSE=y
+CONFIG_HAVE_ARCH_BITREVERSE=y
+CONFIG_RATIONAL=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_NET_UTILS=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_IO=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_CRC_CCITT=m
+CONFIG_CRC16=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC32=y
+# CONFIG_CRC32_SELFTEST is not set
+CONFIG_CRC32_SLICEBY8=y
+# CONFIG_CRC32_SLICEBY4 is not set
+# CONFIG_CRC32_SARWATE is not set
+# CONFIG_CRC32_BIT is not set
+CONFIG_CRC7=m
+CONFIG_LIBCRC32C=y
+# CONFIG_CRC8 is not set
+CONFIG_AUDIT_GENERIC=y
+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
+# CONFIG_RANDOM32_SELFTEST is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_LZ4_COMPRESS=m
+CONFIG_LZ4HC_COMPRESS=m
+CONFIG_LZ4_DECOMPRESS=m
+CONFIG_XZ_DEC=y
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+# CONFIG_XZ_DEC_SPARC is not set
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_BCH=y
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+CONFIG_BTREE=y
+CONFIG_ASSOCIATIVE_ARRAY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAS_DMA=y
+CONFIG_DQL=y
+CONFIG_GLOB=y
+# CONFIG_GLOB_SELFTEST is not set
+CONFIG_NLATTR=y
+CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
+CONFIG_LRU_CACHE=m
+CONFIG_CORDIC=m
+CONFIG_DDR=y
+CONFIG_LIBFDT=y
+CONFIG_OID_REGISTRY=y
+CONFIG_FONT_SUPPORT=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+# CONFIG_SG_SPLIT is not set
+CONFIG_ARCH_HAS_SG_CHAIN=y
+CONFIG_VIRTUALIZATION=y

+ 2967 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-001-Bootlogo-GfA.patch

@@ -0,0 +1,2967 @@
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 6e92917..1302223 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -580,6 +580,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
+ 	if (fb_get_color_depth(&info->var, &info->fix) == 1)
+ 		erase &= ~0x400;
+ 	logo_height = fb_prepare_logo(info, ops->rotate);
++	logo_height += 5;
+ 	logo_lines = DIV_ROUND_UP(logo_height, vc->vc_font.height);
+ 	q = (unsigned short *) (vc->vc_origin +
+ 				vc->vc_size_row * rows);
+diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
+index 0705d88..6a60d1ef 100644
+--- a/drivers/video/fbdev/core/fbmem.c
++++ b/drivers/video/fbdev/core/fbmem.c
+@@ -498,8 +498,8 @@ static int fb_show_logo_line(struct fb_info *info, int rotate,
+ 		fb_set_logo(info, logo, logo_new, fb_logo.depth);
+ 	}
+ 
+-	image.dx = 0;
+-	image.dy = y;
++	image.dx = 0 + 5;
++	image.dy = y + 5;
+ 	image.width = logo->width;
+ 	image.height = logo->height;
+ 
+diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig
+index 0037104..fa2c4b9 100644
+--- a/drivers/video/logo/Kconfig
++++ b/drivers/video/logo/Kconfig
+@@ -15,6 +15,10 @@ config FB_LOGO_EXTRA
+ 	depends on FB=y
+ 	default y if SPU_BASE
+ 
++config FB_LOGO_CUSTOM
++	bool "Custom Linux Logo"
++	default n
++
+ config LOGO_LINUX_MONO
+ 	bool "Standard black and white Linux logo"
+ 	default y
+diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile
+index 3b43781..e31313d 100644
+--- a/drivers/video/logo/Makefile
++++ b/drivers/video/logo/Makefile
+@@ -15,6 +15,7 @@ obj-$(CONFIG_LOGO_SUPERH_MONO)		+= logo_superh_mono.o
+ obj-$(CONFIG_LOGO_SUPERH_VGA16)		+= logo_superh_vga16.o
+ obj-$(CONFIG_LOGO_SUPERH_CLUT224)	+= logo_superh_clut224.o
+ obj-$(CONFIG_LOGO_M32R_CLUT224)		+= logo_m32r_clut224.o
++obj-$(CONFIG_FB_LOGO_CUSTOM)		+= logo_custom_clut224.o
+ 
+ obj-$(CONFIG_SPU_BASE)			+= logo_spe_clut224.o
+ 
+diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
+index 10fbfd8..2c8dfc6 100644
+--- a/drivers/video/logo/logo.c
++++ b/drivers/video/logo/logo.c
+@@ -42,6 +42,8 @@ late_initcall(fb_logo_late_init);
+  */
+ const struct linux_logo * __init_refok fb_find_logo(int depth)
+ {
++	extern const struct linux_logo logo_custom_clut224;
++	
+ 	const struct linux_logo *logo = NULL;
+ 
+ 	if (nologo || logos_freed)
+@@ -111,6 +113,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth)
+ 		/* M32R Linux logo */
+ 		logo = &logo_m32r_clut224;
+ #endif
++#ifdef CONFIG_FB_LOGO_CUSTOM
++		/* Custom Linux logo */
++		logo = &logo_custom_clut224;
++#endif
+ 	}
+ 	return logo;
+ }
+diff --git a/drivers/video/logo/logo_custom_clut224.ppm b/drivers/video/logo/logo_custom_clut224.ppm
+new file mode 100644
+index 0000000..f46e5de
+--- /dev/null
++++ b/drivers/video/logo/logo_custom_clut224.ppm
+@@ -0,0 +1,2883 @@
++P3
++179 96
++255
++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 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  24 24 24  24 24 24  39 39 39
++57 57 57  72 72 72  87 87 87  87 87 87  87 87 87  87 87 87
++87 87 87  87 87 87  87 87 87  72 72 72  72 72 72  57 57 57
++39 39 39  24 24 24  24 24 24  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 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 55 55  0 72 72
++0 88 88  0 103 103  0 122 122  0 128 128  0 128 128  0 122 122
++0 103 103  0 103 103  0 72 72  0 40 40  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 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 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  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 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 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  24 24 24
++39 39 39  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  72 72 72  39 39 39
++24 24 24  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 0 0  0 0 0
++0 0 0  0 55 55  0 103 103  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 103 103
++0 40 40  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 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 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  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 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 0  0 0 0  39 39 39  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  24 24 24  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 72 72
++0 122 122  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 122 122  0 55 55  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 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 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  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 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  24 24 24
++57 57 57  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  57 57 57
++24 24 24  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 40 40  0 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  0 103 103  0 40 40  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 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 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  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 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  39 39 39  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  24 24 24  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 72 72  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 72 72
++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 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 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  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 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  24 24 24  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  24 24 24  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 103 103  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 88 88  0 21 21  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 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 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
++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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  24 24 24
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++24 24 24  0 0 0  0 0 0  0 0 0  0 0 0  0 21 21
++0 103 103  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 103 103  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 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 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
++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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  57 57 57  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++72 72 72  0 0 0  0 0 0  0 0 0  0 0 0  0 103 103
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 103 103  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 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 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  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 0 0
++0 0 0  0 0 0  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++0 0 0  0 0 0  0 0 0  0 0 0  0 88 88  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 72 72  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 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 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  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 0 0  57 57 57  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++0 0 0  0 0 0  0 0 0  0 55 55  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 55 55  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 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 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  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
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  39 39 39  0 0 0
++0 0 0  0 0 0  0 21 21  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 122 122  0 21 21
++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 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 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  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  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  57 57 57  0 0 0  0 0 0
++0 0 0  0 21 21  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 103 103
++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 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 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  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  24 24 24  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++72 72 72  57 57 57  39 39 39  39 39 39  39 39 39  24 24 24
++39 39 39  39 39 39  39 39 39  39 39 39  57 57 57  72 72 72
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  0 0 0  0 0 0  0 0 0
++0 0 0  0 103 103  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 88 88  0 55 55  0 21 21  0 21 21  0 21 21  0 40 40
++0 55 55  0 88 88  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 21 21  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 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 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
++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  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  57 57 57  39 39 39  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  39 39 39  57 57 57  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  24 24 24  0 0 0  0 0 0  0 0 0
++0 72 72  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 72 72  0 21 21
++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 21 21  0 88 88  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 55 55
++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 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 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  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  24 24 24  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  57 57 57
++24 24 24  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 0 0  24 24 24
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  0 0 0  0 0 0  0 0 0  0 40 40
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  0 40 40  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 55 55  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 88 88  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 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 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  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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  39 39 39  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  39 39 39  72 72 72  105 105 105  105 105 105
++57 57 57  0 0 0  0 0 0  0 0 0  0 21 21  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 122 122  0 21 21  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 55 55
++0 122 122  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 103 103  0 0 0  0 0 0
++0 0 0  0 0 0  72 72 72  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 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 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  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  24 24 24
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  24 24 24  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 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  24 24 24  57 57 57
++0 0 0  0 0 0  0 0 0  0 0 0  0 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 55 55  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 55 55  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  0 21 21  0 0 0  0 0 0
++0 0 0  57 57 57  105 105 105  72 72 72  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 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 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  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  39 39 39
++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 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 88 88  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 88 88  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 88 88  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 40 40  0 0 0  0 0 0  0 0 0
++39 39 39  105 105 105  105 105 105  105 105 105  57 57 57  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 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 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  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  72 72 72  0 21 21  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 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 55 55  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 103 103
++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 21 21  0 103 103  0 128 128  0 128 128  0 128 128
++0 128 128  0 72 72  0 0 0  0 0 0  0 0 0  0 21 21
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  39 39 39
++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 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 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  0 0 0
++0 0 0  0 0 0  0 0 0  57 57 57  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  57 57 57  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 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 21 21  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 122 122  0 21 21
++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 21 21  0 128 128  0 128 128  0 122 122
++0 103 103  0 0 0  0 0 0  0 0 0  0 0 0  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 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
++0 0 0  0 0 0  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 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 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 40 40  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 0 0  0 55 55  0 128 128  0 122 122
++0 0 0  0 0 0  0 0 0  0 0 0  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 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 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
++0 0 0  0 0 0  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++0 21 21  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 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 88 88  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 72 72  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 0 0  0 0 0  0 0 0  0 72 72  0 21 21
++0 0 0  0 0 0  0 0 0  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  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 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 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  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  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 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 72 72
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 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 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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  24 24 24  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 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 40 40  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 122 122  0 122 122  0 21 21  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  24 24 24  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 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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  24 24 24  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 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 21 21  0 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 40 40  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 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  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 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 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  39 39 39
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  24 24 24  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 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 103 103  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 55 55  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 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  57 57 57  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  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 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 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  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 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 72 72  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 88 88
++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 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  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  57 57 57
++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 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 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  39 39 39  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++72 72 72  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 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 40 40  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  0 21 21
++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 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  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 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  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++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 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 21 21  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 21 21  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 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  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  24 24 24  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 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 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  24 24 24  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  39 39 39
++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 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 103 103  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 55 55  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 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  57 57 57  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  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 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 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  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  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 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 88 88
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 88 88  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 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  72 72 72
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  57 57 57  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 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 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  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  24 24 24  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 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 55 55  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 103 103  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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  39 39 39  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 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 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  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  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 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 21 21  0 122 122  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 122 122  0 21 21  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 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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  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 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 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  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  24 24 24  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 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 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 40 40  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 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  39 39 39  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  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 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 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  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 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 103 103  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 72 72
++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 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 0  0 0 0  72 72 72  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++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 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 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  24 24 24  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 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 72 72  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 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 0
++0 0 0  0 0 0  0 0 0  87 87 87  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 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 0  0 0 0  0 0 0  0 0 0
++0 0 0  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  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 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 40 40  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  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 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 0  0 0 0
++0 0 0  0 0 0  0 0 0  24 24 24  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 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 0  0 0 0  0 0 0
++0 0 0  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  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 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 21 21
++0 122 122  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  0 40 40  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 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 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  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 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 0  0 0 0  0 0 0
++0 0 0  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 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 103 103
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 55 55  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 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 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  57 57 57
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  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 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 0  0 0 0
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 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 72 72  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 88 88  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 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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  57 57 57  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 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 0
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  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 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 55 55  0 122 122  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 103 103  0 21 21  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 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 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  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  24 24 24  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 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
++57 57 57  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 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 21 21  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 21 21  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 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 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  24 24 24  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 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
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++57 57 57  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 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 103 103  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 55 55
++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 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 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  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 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 88 88  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 72 72  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 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 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  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++57 57 57  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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 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 55 55  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 103 103  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 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 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  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 21 21
++0 122 122  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  0 21 21  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 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 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  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  24 24 24  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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 21 21  0 103 103
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 40 40  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 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 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  39 39 39
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 72 72  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 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 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
++57 57 57  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  72 72 72  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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 72 72  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 103 103  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 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 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  0 0 0
++0 0 0  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  39 39 39  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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 40 40  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++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 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 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  0 0 0  0 0 0
++0 0 0  24 24 24  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 21 21  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 122 122  0 40 40
++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 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 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  0 0 0  0 0 0
++0 0 0  0 0 0  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 103 103  0 122 122  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 55 55  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 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 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  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  57 57 57  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 72 72  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 122 122  0 122 122
++0 122 122  0 122 122  0 122 122  0 122 122  0 103 103  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 0 0  0 0 0  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 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
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++57 57 57  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 55 55
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  24 24 24  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 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
++57 57 57  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 21 21  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  24 24 24
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  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 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
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  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 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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 0 0
++0 0 0  0 0 0  0 0 0  0 88 88  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  57 57 57  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 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 21 21  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 0 0
++0 0 0  0 0 0  0 55 55  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  39 39 39
++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 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  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  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 0 0
++0 0 0  0 40 40  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  0 21 21  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 0 0  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  39 39 39  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 103 103  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  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 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  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 72 72
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 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  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  24 24 24  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 40 40  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 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
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  24 24 24  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  57 57 57  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  72 72 72  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 21 21  0 122 122  0 122 122
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 122 122  0 103 103  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 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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  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 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  24 24 24  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 103 103  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 55 55  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  0 21 21
++0 21 21  0 21 21  0 21 21  0 21 21  0 21 21  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 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  57 57 57  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  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 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  72 72 72  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 88 88  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 88 88
++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 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 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  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  72 72 72  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  57 57 57
++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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 55 55  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 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 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  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 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  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++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 21 21  0 122 122  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 21 21  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 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
++39 39 39  39 39 39  39 39 39  39 39 39  39 39 39  39 39 39
++39 39 39  39 39 39  39 39 39  39 39 39  39 39 39  39 39 39
++39 39 39  39 39 39  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 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 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  24 24 24  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 0 0  0 0 0  0 0 0  0 0 0  39 39 39  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++57 57 57  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 21 21
++0 103 103  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 55 55  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 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  57 57 57
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 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 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  39 39 39  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 88 88
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 72 72  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 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  39 39 39  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 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 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  72 72 72
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  57 57 57  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 0 0  0 0 0  0 0 0  0 0 0  39 39 39
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  24 24 24  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 55 55  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 128 128  0 103 103  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 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  24 24 24  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  39 39 39  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 0 0  0 0 0  0 0 0  0 0 0
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 40 40  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 122 122  0 21 21  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 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  87 87 87  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++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 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 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
++24 24 24  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  24 24 24  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 0 0  0 0 0  0 0 0
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  72 72 72  0 0 0  0 0 0
++0 0 0  0 0 0  0 21 21  0 122 122  0 122 122  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 122 122
++0 40 40  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 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  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 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 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  39 39 39  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  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 0 0  0 0 0  0 0 0
++0 0 0  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 87 87  0 0 0
++0 0 0  0 0 0  0 103 103  0 122 122  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 122 122  0 72 72
++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 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  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  72 72 72  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 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 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  57 57 57  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++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 0 0  0 0 0
++0 0 0  0 0 0  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++0 0 0  0 72 72  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 103 103  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 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
++87 87 87  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  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 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 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  87 87 87  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++39 39 39  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 0 0
++0 0 0  0 0 0  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 103 103  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 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  24 24 24  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  39 39 39  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 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 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  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 0 0  0 0 0  0 0 0  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  36 120 120  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 40 40  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  72 72 72  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 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 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  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  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 0 0  0 0 0  0 0 0  0 0 0  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  61 115 115  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 55 55  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 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  57 57 57  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  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 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 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  57 57 57
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  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 0 0  0 0 0  0 0 0  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 109 109  24 123 123
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 88 88  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 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0
++39 39 39  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  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 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 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  0 0 0
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  57 57 57  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 0 0  0 0 0  0 0 0  24 24 24
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 109 109  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 103 103  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  24 24 24  72 72 72
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++24 24 24  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 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 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  0 0 0
++0 0 0  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  24 24 24  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 0 0  0 0 0  0 0 0
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  69 113 113  0 128 128  0 128 128  0 122 122
++0 21 21  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 0 0  0 0 0
++0 0 0  0 0 0  24 24 24  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  39 39 39
++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 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 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  0 0 0  0 0 0
++0 0 0  24 24 24  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 0 0  0 0 0
++0 0 0  39 39 39  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  87 109 109  38 67 67
++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 0 0  0 0 0  0 0 0
++39 39 39  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  39 39 39  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 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 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  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++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 0 0  0 0 0
++0 0 0  0 0 0  39 39 39  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  39 39 39  24 24 24  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  24 24 24  39 39 39  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  39 39 39  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 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 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  0 0 0  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  72 72 72  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++57 57 57  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 0 0
++0 0 0  0 0 0  0 0 0  39 39 39  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++57 57 57  39 39 39  24 24 24  24 24 24  24 24 24  24 24 24
++0 0 0  24 24 24  24 24 24  39 39 39  39 39 39  57 57 57
++87 87 87  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 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 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  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  87 87 87  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  39 39 39  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 0 0  0 0 0  0 0 0  0 0 0  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  24 24 24  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 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 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
++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  24 24 24  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  24 24 24  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 0 0  0 0 0  0 0 0  0 0 0  24 123 123
++87 109 109  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++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 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 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  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  39 39 39
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  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 0 0  0 0 0  0 0 0  0 103 103  0 128 128
++0 128 128  69 113 113  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  72 72 72  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 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 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  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
++57 57 57  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  72 72 72  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 0 0  0 72 72  0 128 128  0 128 128
++0 128 128  0 128 128  36 120 120  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  39 39 39  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 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 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  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  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  57 57 57  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 40 40  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  69 113 113  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  72 72 72  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 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 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
++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  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  24 24 24
++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 21 21  0 122 122  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  36 120 120
++87 109 109  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  87 87 87
++24 24 24  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 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 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  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  24 24 24  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++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 103 103  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  36 120 120  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  39 39 39  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 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 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  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 0 0  0 0 0  0 0 0  57 57 57  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++87 87 87  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 88 88  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 122 122  43 92 92  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  87 87 87  39 39 39  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 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 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  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 0 0  0 0 0
++0 0 0  0 0 0  0 0 0  0 0 0  72 72 72  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  57 57 57  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 55 55
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 103 103  0 0 0  0 0 0  39 39 39
++72 72 72  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  72 72 72
++39 39 39  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 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 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  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 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  87 87 87
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  39 39 39  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 40 40  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 122 122  0 21 21  0 0 0  0 0 0  0 0 0
++0 0 0  0 0 0  39 39 39  87 87 87  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  39 39 39  24 24 24  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 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 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  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 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  24 24 24
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  87 87 87  24 24 24  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 103 103  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 122 122  0 55 55  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  39 39 39
++72 72 72  87 87 87  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  57 57 57
++39 39 39  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 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 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  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 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
++39 39 39  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  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 103 103  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 128 128  0 128 128  0 128 128  0 128 128  0 128 128  0 128 128
++0 72 72  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 21 21  24 24 24  39 39 39  57 57 57
++72 72 72  87 87 87  87 87 87  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  87 87 87  87 87 87  72 72 72
++72 72 72  39 39 39  24 24 24  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 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 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  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 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  72 72 72  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  105 105 105  105 105 105
++105 105 105  105 105 105  105 105 105  105 105 105  72 72 72

+ 17 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-002-disa_pru_no_cild_msg.patch

@@ -0,0 +1,17 @@
+diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c
+index 6559752..9e263b5 100644
+--- a/drivers/uio/uio_pruss.c
++++ b/drivers/uio/uio_pruss.c
+@@ -195,10 +195,10 @@ static int pruss_probe(struct platform_device *pdev)
+ 			"pins are not configured from the driver\n");
+ 	else{
+ 		count = of_get_child_count(pdev->dev.of_node);
+-		if (!count){
++/*		if (!count){
+ 			dev_info(&pdev->dev, "No children\n");
+ 			return -ENODEV;
+-		}
++		}*/
+ 		// Run through all children. They have lables for easy reference.
+ 		for_each_child_of_node(pdev->dev.of_node, child){
+ 			enum of_gpio_flags flags;

+ 1015 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-004-egalax_i2c_touchcontroller.patch

@@ -0,0 +1,1015 @@
+From a12a55f6571c5992f5a88e8bbbaabf442c0be88c Mon Sep 17 00:00:00 2001
+From: Reinhard Russinger <reinhard@russinger.at>
+Date: Wed, 3 May 2017 08:25:31 +0200
+Subject: [PATCH 1/1] add egalax i2c touchcontroller driver
+
+---
+ drivers/input/touchscreen/Kconfig      |  10 +
+ drivers/input/touchscreen/Makefile     |   1 +
+ drivers/input/touchscreen/egalax_i2c.c | 961 +++++++++++++++++++++++++++++++++
+ 3 files changed, 972 insertions(+)
+ create mode 100644 drivers/input/touchscreen/egalax_i2c.c
+
+diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
+index 2fb1f43..01f4776 100644
+--- a/drivers/input/touchscreen/Kconfig
++++ b/drivers/input/touchscreen/Kconfig
+@@ -318,6 +318,16 @@ config TOUCHSCREEN_FT6236
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called ft6236.
+ 
++config TOUCHSCREEN_EGALAX_I2C
++	tristate "EETI eGalax (egalax_i2c) multi-touch panel support for i2C"
++	depends on I2C && OF
++	help
++	  Say Y here to enable support for I2C connected EETI
++	  eGalax multi-touch panels.
++
++	  To compile this driver as a module, choose M here: the
++	  module will be called egalax_i2c.
++
+ config TOUCHSCREEN_FUJITSU
+ 	tristate "Fujitsu serial touchscreen"
+ 	select SERIO
+diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
+index b4373d6..67ed603 100644
+--- a/drivers/input/touchscreen/Makefile
++++ b/drivers/input/touchscreen/Makefile
+@@ -34,6 +34,7 @@ obj-$(CONFIG_TOUCHSCREEN_GUNZE)		+= gunze.o
+ obj-$(CONFIG_TOUCHSCREEN_EETI)		+= eeti_ts.o
+ obj-$(CONFIG_TOUCHSCREEN_ELAN)		+= elants_i2c.o
+ obj-$(CONFIG_TOUCHSCREEN_ELO)		+= elo.o
++obj-$(CONFIG_TOUCHSCREEN_EGALAX_I2C)	+= egalax_i2c.o
+ obj-$(CONFIG_TOUCHSCREEN_EGALAX)	+= egalax_ts.o
+ obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIAL)	+= egalax_ts_serial.o
+ obj-$(CONFIG_TOUCHSCREEN_FT6236)	+= ft6236.o
+diff --git a/drivers/input/touchscreen/egalax_i2c.c b/drivers/input/touchscreen/egalax_i2c.c
+new file mode 100644
+index 0000000..9ee5566
+--- /dev/null
++++ b/drivers/input/touchscreen/egalax_i2c.c
+@@ -0,0 +1,961 @@
++/*
++ *
++ * Touch Screen I2C Driver for EETI Controller
++ *
++ * Copyright (C) 2000-2015  eGalax_eMPIA Technology Inc.
++ * All Rights Reserved.
++ *
++ * 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.
++ *
++ */
++
++#define RELEASE_DATE "2015/04/23"
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/interrupt.h>
++#include <linux/wait.h>
++#include <linux/delay.h>
++#include <linux/i2c.h>
++#include <linux/gpio.h>
++#include <linux/device.h>
++#include <asm/uaccess.h>
++#include <linux/kfifo.h>
++#include <linux/version.h>
++#include <linux/input.h>
++#include <linux/irq.h>
++#include <linux/timer.h>
++#include <linux/proc_fs.h>
++#include <linux/seq_file.h>
++#include <linux/miscdevice.h>
++#include <linux/slab.h>
++#include <linux/poll.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
++#include <linux/input/mt.h>
++#endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
++#include <linux/of_gpio.h>
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
++	#define __devinit 
++	#define __devexit 
++	#define __devexit_p(x) x
++#endif
++
++#ifdef CONFIG_HAS_EARLYSUSPEND
++	#include <linux/earlysuspend.h>
++	static struct early_suspend egalax_early_suspend;
++#endif
++
++// Global define to enable function
++//#define _SWITCH_XY
++//#define _CONVERT_Y
++
++#define MAX_EVENTS		600
++#define MAX_I2C_LEN		64
++#define FIFO_SIZE		8192 //(PAGE_SIZE*2)
++#define MAX_SUPPORT_POINT	16
++#define REPORTID_MOUSE		0x01
++#define REPORTID_VENDOR		0x03
++#define REPORTID_MTOUCH		0x06//0x04
++#define MAX_RESOLUTION		4095
++
++// running mode
++#define MODE_STOP	0
++#define MODE_WORKING	1
++#define MODE_IDLE	2
++#define MODE_SUSPEND	3
++
++struct tagMTContacts {
++	unsigned char ID;
++	signed char Status;
++	unsigned short X;
++	unsigned short Y;
++};
++
++struct _egalax_i2c {
++	struct workqueue_struct *ktouch_wq;
++	struct work_struct work_irq;
++	struct delayed_work delay_work_ioctl;
++	struct mutex mutex_wq;
++	struct i2c_client *client;
++	unsigned char work_state;
++	unsigned char skip_packet;
++	unsigned int ioctl_cmd;
++	int interrupt_gpio;
++};
++
++struct egalax_char_dev
++{
++	int OpenCnts;
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	struct kfifo* pDataKFiFo;
++#else
++	struct kfifo DataKFiFo;
++#endif
++	unsigned char *pFiFoBuf;
++	spinlock_t FiFoLock;
++	struct semaphore sem;
++	wait_queue_head_t fifo_inq;
++};
++
++static struct _egalax_i2c *p_egalax_i2c_dev = NULL;	// allocated in egalax_i2c_probe
++static struct egalax_char_dev *p_char_dev = NULL;	// allocated in init_module
++static atomic_t egalax_char_available = ATOMIC_INIT(1);
++static atomic_t wait_command_ack = ATOMIC_INIT(0);
++static struct input_dev *input_dev = NULL;
++static struct tagMTContacts pContactBuf[MAX_SUPPORT_POINT];
++static unsigned char input_report_buf[MAX_I2C_LEN+2];
++
++#define DBG_MODULE	0x00000001
++#define DBG_CDEV	0x00000002
++#define DBG_PROC	0x00000004
++#define DBG_POINT	0x00000008
++#define DBG_INT		0x00000010
++#define DBG_I2C		0x00000020
++#define DBG_SUSP	0x00000040
++#define DBG_INPUT	0x00000080
++#define DBG_CONST	0x00000100
++#define DBG_IDLE	0x00000200
++#define DBG_WAKEUP	0x00000400
++#define DBG_BUTTON	0x00000800
++static unsigned int DbgLevel = DBG_MODULE|DBG_SUSP;
++
++#define PROC_FS_NAME	"egalax_dbg"
++#define PROC_FS_MAX_LEN	8
++static struct proc_dir_entry *dbgProcFile;
++
++#define EGALAX_DBG(level, fmt, args...)  do{ if( (level&DbgLevel)>0 ) \
++					printk( KERN_DEBUG "[egalax_i2c]: " fmt, ## args); }while(0)
++
++static int egalax_I2C_read(unsigned char *pBuf, unsigned short len)
++{
++	struct i2c_msg xfer;
++	unsigned char cmdbuf[2]={0x27, 0x00};
++
++	if(pBuf==NULL)
++		return -1;
++
++	// Write register first
++	xfer.addr = p_egalax_i2c_dev->client->addr;
++	xfer.flags = 0;
++	xfer.len = 2;
++	xfer.buf = cmdbuf;
++	i2c_transfer(p_egalax_i2c_dev->client->adapter, &xfer, 1);
++
++	// Read device data
++	xfer.addr = p_egalax_i2c_dev->client->addr;
++	xfer.flags = I2C_M_RD;
++	xfer.len = len;
++	xfer.buf = pBuf;
++
++	if(i2c_transfer(p_egalax_i2c_dev->client->adapter, &xfer, 1) != 1) 
++	{
++		EGALAX_DBG(DBG_I2C, " %s: i2c transfer fail\n", __func__);
++		return -EIO;
++	}
++	else
++		EGALAX_DBG(DBG_I2C, " %s: i2c transfer success\n", __func__);
++
++	return 0;
++}
++
++static int egalax_I2C_write(unsigned short reg, unsigned char *pBuf, unsigned short len)
++{
++	unsigned char cmdbuf[4+len];
++	struct i2c_msg xfer;
++
++	if(pBuf==NULL)
++		return -1;
++
++	cmdbuf[0] = reg & 0x00FF;
++	cmdbuf[1] = (reg >> 8) & 0x00FF;
++	cmdbuf[2] = (len+2) & 0x00FF;
++	cmdbuf[3] = ((len+2) >> 8) & 0x00FF;
++	memcpy(cmdbuf+4, pBuf, len);
++
++	// Write data to device
++	xfer.addr = p_egalax_i2c_dev->client->addr;
++	xfer.flags = 0;
++	xfer.len = sizeof(cmdbuf);
++	xfer.buf = cmdbuf;
++
++	if(i2c_transfer(p_egalax_i2c_dev->client->adapter, &xfer, 1) != 1) 
++	{
++		EGALAX_DBG(DBG_I2C, " %s: i2c transfer fail\n", __func__);
++		return -EIO;
++	}
++	else
++		EGALAX_DBG(DBG_I2C, " %s: i2c transfer success\n", __func__);
++
++	return 0;
++}
++
++static int egalax_cdev_open(struct inode *inode, struct file *filp)
++{
++	if( !atomic_dec_and_test(&egalax_char_available) )
++	{
++		atomic_inc(&egalax_char_available);
++		return -EBUSY; // already open
++	}
++
++	p_char_dev->OpenCnts++;
++	filp->private_data = p_char_dev;// Used by the read and write metheds
++
++	EGALAX_DBG(DBG_CDEV, " CDev open done!\n");
++	try_module_get(THIS_MODULE);
++	return 0;
++}
++
++static int egalax_cdev_release(struct inode *inode, struct file *filp)
++{
++	struct egalax_char_dev *cdev = filp->private_data;
++
++	atomic_inc(&egalax_char_available); // release the device
++
++	cdev->OpenCnts--;
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	kfifo_reset( cdev->pDataKFiFo );
++#else
++	kfifo_reset( &cdev->DataKFiFo );
++#endif
++
++	EGALAX_DBG(DBG_CDEV, " CDev release done!\n");
++	module_put(THIS_MODULE);
++	return 0;
++}
++
++static char fifo_read_buf[MAX_I2C_LEN];
++static ssize_t egalax_cdev_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
++{
++	int read_cnt, ret, fifoLen;
++	struct egalax_char_dev *cdev = file->private_data;
++	
++	if( down_interruptible(&cdev->sem) )
++		return -ERESTARTSYS;
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	fifoLen = kfifo_len(cdev->pDataKFiFo);
++#else
++	fifoLen = kfifo_len(&cdev->DataKFiFo);
++#endif
++
++	while( fifoLen<1 ) // nothing to read
++	{
++		up(&cdev->sem); // release the lock
++		if( file->f_flags & O_NONBLOCK )
++			return -EAGAIN;
++
++	#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++		if( wait_event_interruptible(cdev->fifo_inq, kfifo_len( cdev->pDataKFiFo )>0) )
++	#else
++		if( wait_event_interruptible(cdev->fifo_inq, kfifo_len( &cdev->DataKFiFo )>0) )
++	#endif
++		{
++			return -ERESTARTSYS; // signal: tell the fs layer to handle it
++		}
++
++		if( down_interruptible(&cdev->sem) )
++			return -ERESTARTSYS;
++	}
++
++	if(count > MAX_I2C_LEN)
++		count = MAX_I2C_LEN;
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	read_cnt = kfifo_get(cdev->pDataKFiFo, fifo_read_buf, count);
++#else
++	read_cnt = kfifo_out_locked(&cdev->DataKFiFo, fifo_read_buf, count, &cdev->FiFoLock);
++#endif
++	EGALAX_DBG(DBG_CDEV, " \"%s\" reading fifo data count=%d\n", current->comm, read_cnt);
++
++	ret = copy_to_user(buf, fifo_read_buf, read_cnt)?-EFAULT:read_cnt;
++
++	up(&cdev->sem);
++	
++	return ret;
++}
++
++static ssize_t egalax_cdev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
++{
++	struct egalax_char_dev *cdev = file->private_data;
++	int ret=0;
++	char *tmp;
++
++	if( down_interruptible(&cdev->sem) )
++		return -ERESTARTSYS;
++
++	if (count > MAX_I2C_LEN)
++		count = MAX_I2C_LEN;
++
++	tmp = kzalloc(MAX_I2C_LEN, GFP_KERNEL);
++	if(tmp==NULL)
++	{
++		up(&cdev->sem);
++		return -ENOMEM;
++	}
++
++	if(copy_from_user(tmp, buf, count))
++	{
++		up(&cdev->sem);
++		kfree(tmp);
++		return -EFAULT;
++	}
++	
++	ret = egalax_I2C_write(0x0067, tmp, MAX_I2C_LEN);
++
++	up(&cdev->sem);
++	EGALAX_DBG(DBG_CDEV, " I2C writing %zu bytes.\n", count);
++	kfree(tmp);
++
++	return (ret==0?count:-1);
++}
++
++static unsigned int egalax_cdev_poll(struct file *filp, struct poll_table_struct *wait)
++{
++	struct egalax_char_dev *cdev = filp->private_data;
++	unsigned int mask = 0;
++	int fifoLen;
++	
++	down(&cdev->sem);
++	poll_wait(filp, &cdev->fifo_inq,  wait);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	fifoLen = kfifo_len(cdev->pDataKFiFo);
++#else
++	fifoLen = kfifo_len(&cdev->DataKFiFo);
++#endif
++
++	if( fifoLen > 0 )
++		mask |= POLLIN | POLLRDNORM;    /* readable */
++	if( (FIFO_SIZE - fifoLen) > MAX_I2C_LEN )
++		mask |= POLLOUT | POLLWRNORM;   /* writable */
++
++	up(&cdev->sem);
++	return mask;
++}
++
++static int egalax_proc_show(struct seq_file* seqfilp, void *v)
++{
++	seq_printf(seqfilp, "EETI I2C for All Points.\nDebug Level: 0x%08X\nRelease Date: %s\n", DbgLevel, RELEASE_DATE);
++	return 0;
++}
++
++static int egalax_proc_open(struct inode *inode, struct file *filp)
++{
++	EGALAX_DBG(DBG_PROC, " \"%s\" call proc_open\n", current->comm);
++	return single_open(filp, egalax_proc_show, NULL);
++}
++
++static ssize_t egalax_proc_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
++{
++	char procfs_buffer_size = 0; 
++	unsigned char procfs_buf[PROC_FS_MAX_LEN+1] = {0};
++
++	EGALAX_DBG(DBG_PROC, " \"%s\" call proc_write\n", current->comm);
++
++	procfs_buffer_size = count;
++	if(procfs_buffer_size > PROC_FS_MAX_LEN ) 
++		procfs_buffer_size = PROC_FS_MAX_LEN+1;
++	
++	if( copy_from_user(procfs_buf, buf, procfs_buffer_size) ) 
++	{
++		EGALAX_DBG(DBG_PROC, " proc_write faied at copy_from_user\n");
++		return -EFAULT;
++	}
++
++	sscanf(procfs_buf, "%x", &DbgLevel);
++	EGALAX_DBG(DBG_PROC, " Switch Debug Level to 0x%08X\n", DbgLevel);
++
++	return procfs_buffer_size;
++}
++
++#define MAX_POINT_PER_PACKET	5
++#define POINT_STRUCT_SIZE	10
++static int TotalPtsCnt=0, RecvPtsCnt=0;
++static void ProcessReport(unsigned char *buf, struct _egalax_i2c *p_egalax_i2c)
++{
++	unsigned char i, index=0, cnt_down=0, cnt_up=0, shift=0;
++	unsigned char status=0;
++	unsigned short contactID=0, x=0, y=0;
++
++	if(TotalPtsCnt<=0)
++	{
++		if(buf[1]==0 || buf[1]>MAX_SUPPORT_POINT)
++		{
++			EGALAX_DBG(DBG_POINT, " NumsofContacts mismatch, skip packet\n");
++			return;
++		}
++
++		TotalPtsCnt = buf[1];
++		RecvPtsCnt = 0;
++	}
++	else if(buf[1]>0)
++	{
++		TotalPtsCnt = RecvPtsCnt = 0;
++		EGALAX_DBG(DBG_POINT, " NumsofContacts mismatch, skip packet\n");
++		return;
++	}
++
++	while(index<MAX_POINT_PER_PACKET)
++	{
++		shift = index * POINT_STRUCT_SIZE + 2;
++		status = buf[shift] & 0x01;
++		contactID = buf[shift+1];
++		x = ((buf[shift+3]<<8) + buf[shift+2]);
++		y = ((buf[shift+5]<<8) + buf[shift+4]);
++
++		if( contactID>=MAX_SUPPORT_POINT )
++		{
++			TotalPtsCnt = RecvPtsCnt = 0;
++			EGALAX_DBG(DBG_POINT, " Get error ContactID.\n");
++			return;
++		}
++
++		EGALAX_DBG(DBG_POINT, " Get Point[%d] Update: Status=%d X=%d Y=%d\n", contactID, status, x, y);
++
++	#ifdef _SWITCH_XY
++		short tmp = x;
++		x = y;
++		y = tmp;
++	#endif
++	#ifdef _CONVERT_X
++		x = MAX_RESOLUTION-x;
++	#endif
++
++	#ifdef _CONVERT_Y
++		y = MAX_RESOLUTION-y;
++	#endif
++
++		pContactBuf[RecvPtsCnt].ID = contactID;
++		pContactBuf[RecvPtsCnt].Status = status;
++		pContactBuf[RecvPtsCnt].X = x;
++		pContactBuf[RecvPtsCnt].Y = y;
++
++		RecvPtsCnt++;
++		index++;
++
++		// Recv all points, send input report
++		if(RecvPtsCnt==TotalPtsCnt)
++		{
++			for(i=0; i<RecvPtsCnt; i++)
++			{
++			#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
++				input_mt_slot(input_dev, pContactBuf[i].ID);
++				input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, pContactBuf[i].Status);
++				if(pContactBuf[i].Status)
++				{
++					input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, pContactBuf[i].Status);
++					input_report_abs(input_dev, ABS_MT_POSITION_X, pContactBuf[i].X);
++					input_report_abs(input_dev, ABS_MT_POSITION_Y, pContactBuf[i].Y);
++				}
++			#else
++				input_report_abs(input_dev, ABS_MT_TRACKING_ID, pContactBuf[i].ID);
++				input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, pContactBuf[i].Status);
++				input_report_abs(input_dev, ABS_MT_POSITION_X, pContactBuf[i].X);
++				input_report_abs(input_dev, ABS_MT_POSITION_Y, pContactBuf[i].Y);
++				input_report_abs(input_dev, ABS_MT_WIDTH_MAJOR, 0);
++				input_mt_sync(input_dev);
++			#endif
++
++				if(pContactBuf[i].Status)
++					cnt_down++;
++				else
++					cnt_up++;
++			}
++		#ifndef CONFIG_HAS_EARLYSUSPEND //We use this config to distinguish Linux and Android
++			#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)
++			input_mt_report_pointer_emulation(input_dev, true);
++			#endif
++		#endif
++			input_sync(input_dev);
++			EGALAX_DBG(DBG_POINT, " Input sync point data done! (Down:%d Up:%d)\n", cnt_down, cnt_up);
++			
++			TotalPtsCnt = RecvPtsCnt = 0;
++			return;
++		}
++	}
++}
++
++static struct input_dev * allocate_Input_Dev(void)
++{
++	int ret;
++	struct input_dev *pInputDev=NULL;
++
++	pInputDev = input_allocate_device();
++	if(pInputDev == NULL)
++	{
++		EGALAX_DBG(DBG_MODULE, " Failed to allocate input device\n");
++		return NULL;//-ENOMEM;
++	}
++
++	pInputDev->name = "eGalax_Touch_Screen";
++	pInputDev->phys = "I2C";
++	pInputDev->id.bustype = BUS_I2C;
++	pInputDev->id.vendor = 0x0EEF;
++	pInputDev->id.product = 0x0020;
++	pInputDev->id.version = 0x0001;
++	
++	set_bit(EV_ABS, pInputDev->evbit);
++#ifndef CONFIG_HAS_EARLYSUSPEND //We use this config to distinguish Linux and Android
++	set_bit(EV_KEY, pInputDev->evbit);
++	__set_bit(BTN_TOUCH, pInputDev->keybit);
++	input_set_abs_params(pInputDev, ABS_X, 0, MAX_RESOLUTION, 0, 0);
++	input_set_abs_params(pInputDev, ABS_Y, 0, MAX_RESOLUTION, 0, 0);
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
++	__set_bit(INPUT_PROP_DIRECT, pInputDev->propbit);
++	#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
++		input_mt_init_slots(pInputDev, MAX_SUPPORT_POINT, 0);
++	#else
++		input_mt_init_slots(pInputDev, MAX_SUPPORT_POINT);
++	#endif
++	input_set_abs_params(pInputDev, ABS_MT_POSITION_X, 0, MAX_RESOLUTION, 0, 0);
++	input_set_abs_params(pInputDev, ABS_MT_POSITION_Y, 0, MAX_RESOLUTION, 0, 0);
++	input_set_abs_params(pInputDev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
++#else
++	input_set_abs_params(pInputDev, ABS_MT_POSITION_X, 0, MAX_RESOLUTION, 0, 0);
++	input_set_abs_params(pInputDev, ABS_MT_POSITION_Y, 0, MAX_RESOLUTION, 0, 0);
++	input_set_abs_params(pInputDev, ABS_MT_WIDTH_MAJOR, 0, MAX_RESOLUTION, 0, 0); //Size
++	input_set_abs_params(pInputDev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); //Pressure
++	input_set_abs_params(pInputDev, ABS_MT_TRACKING_ID, 0, MAX_SUPPORT_POINT, 0, 0);
++#endif // #if LINUX_VERSION_CODE > KERNEL_VERSION(3,0,0)
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
++	input_set_events_per_packet(pInputDev, MAX_EVENTS);
++#endif
++
++	ret = input_register_device(pInputDev);
++	if(ret) 
++	{
++		EGALAX_DBG(DBG_MODULE, " Unable to register input device.\n");
++		input_free_device(pInputDev);
++		pInputDev = NULL;
++	}
++	
++	return pInputDev;
++}
++
++static int egalax_i2c_measure(struct _egalax_i2c *egalax_i2c)
++{
++	int ret=0, frameLen=0, loop=3, i;
++
++	EGALAX_DBG(DBG_INT, " egalax_i2c_measure\n");
++
++	if( egalax_I2C_read(input_report_buf, MAX_I2C_LEN+2) < 0)
++	{
++		EGALAX_DBG(DBG_I2C, " I2C read input report fail!\n");
++		return -1;
++	}
++	
++	if( DbgLevel&DBG_I2C )
++	{
++		char dbgmsg[(MAX_I2C_LEN+2)*4];
++		for(i=0; i<MAX_I2C_LEN+2; i++)
++			sprintf(dbgmsg+i*4, "[%02X]", input_report_buf[i]);
++		EGALAX_DBG(DBG_I2C, " Buf=%s\n", dbgmsg);
++	}
++
++	frameLen = input_report_buf[0] + (input_report_buf[1]<<8);
++	EGALAX_DBG(DBG_I2C, " I2C read data with Len=%d\n", frameLen);
++
++	if(frameLen==0)
++	{
++		EGALAX_DBG(DBG_MODULE, " Device reset\n");
++		return -1;
++	}
++
++	switch(input_report_buf[2])
++	{
++		case REPORTID_MTOUCH:
++			if( !egalax_i2c->skip_packet && egalax_i2c->work_state==MODE_WORKING )
++				ProcessReport(input_report_buf+2, egalax_i2c);
++			ret = 0;
++			break;
++		case REPORTID_VENDOR:
++			atomic_set(&wait_command_ack, 1);
++			EGALAX_DBG(DBG_I2C, " I2C get vendor command packet\n");
++
++			if( p_char_dev->OpenCnts>0 ) // If someone reading now! put the data into the buffer!
++			{
++				loop=3;
++				do {
++				#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++					ret = wait_event_timeout(p_char_dev->fifo_inq, (FIFO_SIZE-kfifo_len(p_char_dev->pDataKFiFo))>=MAX_I2C_LEN, HZ);
++				#else
++					ret = wait_event_timeout(p_char_dev->fifo_inq, kfifo_avail(&p_char_dev->DataKFiFo)>=MAX_I2C_LEN, HZ);
++				#endif
++				}while(ret<=0 && --loop);
++
++				if(ret>0) // fifo size is ready
++				{
++				#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++					ret = kfifo_put(p_char_dev->pDataKFiFo, input_report_buf+2, MAX_I2C_LEN);
++				#else
++					ret = kfifo_in_locked(&p_char_dev->DataKFiFo, input_report_buf+2, MAX_I2C_LEN, &p_char_dev->FiFoLock);
++				#endif
++
++					wake_up_interruptible( &p_char_dev->fifo_inq );
++				}
++				else
++					EGALAX_DBG(DBG_CDEV, " [Warning] Can't write data because fifo size is overflow.\n");
++			}
++
++			break;
++		default:
++			EGALAX_DBG(DBG_I2C, " I2C read error data with hedaer=%d\n", input_report_buf[2]);
++			ret = -1;
++			break;
++	}
++
++	return ret;
++}
++
++static void egalax_i2c_wq_irq(struct work_struct *work)
++{
++	struct _egalax_i2c *egalax_i2c = container_of(work, struct _egalax_i2c, work_irq);
++	struct i2c_client *client = egalax_i2c->client;
++
++	EGALAX_DBG(DBG_INT, " egalax_i2c_wq run\n");
++
++	/*continue recv data*/
++	while( !gpio_get_value(egalax_i2c->interrupt_gpio) )
++	{
++		egalax_i2c_measure(egalax_i2c);
++		schedule();
++	}
++		
++	if( egalax_i2c->skip_packet > 0 )
++		egalax_i2c->skip_packet = 0;
++
++	enable_irq(client->irq);
++
++	EGALAX_DBG(DBG_INT, " egalax_i2c_wq leave\n");
++}
++
++static irqreturn_t egalax_i2c_interrupt(int irq, void *dev_id)
++{
++	struct _egalax_i2c *egalax_i2c = (struct _egalax_i2c *)dev_id;
++
++	EGALAX_DBG(DBG_INT, " INT with irq:%d\n", irq);
++
++	disable_irq_nosync(irq);
++
++	queue_work(egalax_i2c->ktouch_wq, &egalax_i2c->work_irq);
++
++	return IRQ_HANDLED;
++}
++
++#ifdef CONFIG_HAS_EARLYSUSPEND
++static void egalax_i2c_early_suspend(struct early_suspend *handler)
++{
++	pm_message_t state;
++	state.event = PM_EVENT_SUSPEND;
++
++	EGALAX_DBG(DBG_SUSP, " %s\n", __func__);
++	egalax_i2c_pm_suspend(p_egalax_i2c_dev->client, state);
++}
++
++static void egalax_i2c_early_resume(struct early_suspend *handler)
++{
++	EGALAX_DBG(DBG_SUSP, " %s\n", __func__);
++	egalax_i2c_pm_resume(p_egalax_i2c_dev->client);
++}
++#endif // #ifdef CONFIG_HAS_EARLYSUSPEND
++
++static int __devinit egalax_i2c_probe(struct i2c_client *client, const struct i2c_device_id *idp)
++{
++	int ret;
++	struct device_node *devnode;
++	
++	EGALAX_DBG(DBG_MODULE, " Start probe\n");
++
++	p_egalax_i2c_dev = (struct _egalax_i2c *)kzalloc(sizeof(struct _egalax_i2c), GFP_KERNEL);
++	if (!p_egalax_i2c_dev) 
++	{
++		EGALAX_DBG(DBG_MODULE, " Request memory failed\n");
++		ret = -ENOMEM;
++		goto fail1;
++	}
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
++	devnode = client->dev.of_node;
++	if(devnode) //if use the device tree config
++	{
++		p_egalax_i2c_dev->interrupt_gpio = of_get_named_gpio(devnode, "int-gpios", 0);
++	}
++#else
++	{
++		p_egalax_i2c_dev->interrupt_gpio = irq_to_gpio(client->irq);
++	}
++#endif
++
++	if( !gpio_is_valid(p_egalax_i2c_dev->interrupt_gpio) )
++	{
++		ret = -ENODEV;
++		goto fail1;
++	}
++	ret = gpio_request(p_egalax_i2c_dev->interrupt_gpio, "Touch IRQ");
++	if(ret<0)
++	{
++		EGALAX_DBG(DBG_MODULE, " gpio_request[%d] failed: %d\n", p_egalax_i2c_dev->interrupt_gpio, ret);
++		if(ret!=-EBUSY)
++			goto fail1;
++	}
++	gpio_direction_input(p_egalax_i2c_dev->interrupt_gpio);
++
++	input_dev = allocate_Input_Dev();
++	if(input_dev==NULL)
++	{
++		EGALAX_DBG(DBG_MODULE, " allocate_Input_Dev failed\n");
++		ret = -EINVAL; 
++		goto fail2;
++	}
++	EGALAX_DBG(DBG_MODULE, " Register input device done\n");
++
++	p_egalax_i2c_dev->client = client;
++	mutex_init(&p_egalax_i2c_dev->mutex_wq);
++
++	p_egalax_i2c_dev->ktouch_wq = create_singlethread_workqueue("egalax_touch_wq");
++	INIT_WORK(&p_egalax_i2c_dev->work_irq, egalax_i2c_wq_irq);
++
++	i2c_set_clientdata(client, p_egalax_i2c_dev);
++
++	if( gpio_get_value(p_egalax_i2c_dev->interrupt_gpio) )
++		p_egalax_i2c_dev->skip_packet = 0;
++	else
++		p_egalax_i2c_dev->skip_packet = 1;
++
++	p_egalax_i2c_dev->work_state = MODE_WORKING;
++
++	ret = request_irq(client->irq, egalax_i2c_interrupt, IRQF_TRIGGER_LOW, client->name, p_egalax_i2c_dev);
++	if( ret ) 
++	{
++		EGALAX_DBG(DBG_MODULE, " Request irq(%d) failed\n", client->irq);
++		goto fail3;
++	}
++	EGALAX_DBG(DBG_MODULE, " Request irq(%d) gpio(%d) with result:%d\n", client->irq, p_egalax_i2c_dev->interrupt_gpio, ret);
++
++#ifdef CONFIG_HAS_EARLYSUSPEND
++	egalax_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN;
++	egalax_early_suspend.suspend = egalax_i2c_early_suspend;
++	egalax_early_suspend.resume = egalax_i2c_early_resume;
++	register_early_suspend(&egalax_early_suspend);
++	EGALAX_DBG(DBG_MODULE, " Register early_suspend done\n");
++#endif
++
++	EGALAX_DBG(DBG_MODULE, " I2C probe done\n");
++	return 0;
++
++fail3:
++	i2c_set_clientdata(client, NULL);
++	destroy_workqueue(p_egalax_i2c_dev->ktouch_wq); 
++	free_irq(client->irq, p_egalax_i2c_dev);
++	input_unregister_device(input_dev);
++	input_dev = NULL;
++fail2:
++	gpio_free(p_egalax_i2c_dev->interrupt_gpio);
++fail1:
++	kfree(p_egalax_i2c_dev);
++	p_egalax_i2c_dev = NULL;
++
++	EGALAX_DBG(DBG_MODULE, " I2C probe failed\n");
++	return ret;
++}
++
++static int __devexit egalax_i2c_remove(struct i2c_client *client)
++{
++	struct _egalax_i2c *egalax_i2c = i2c_get_clientdata(client);
++
++	egalax_i2c->work_state = MODE_STOP;
++
++	cancel_work_sync(&egalax_i2c->work_irq);
++
++	if(client->irq)
++	{
++		disable_irq(client->irq);
++		free_irq(client->irq, egalax_i2c);
++	}
++
++	gpio_free(egalax_i2c->interrupt_gpio);
++	
++	if(egalax_i2c->ktouch_wq) 
++		destroy_workqueue(egalax_i2c->ktouch_wq); 
++
++#ifdef CONFIG_HAS_EARLYSUSPEND
++	unregister_early_suspend(&egalax_early_suspend);
++#endif
++
++	if(input_dev)
++	{
++		EGALAX_DBG(DBG_MODULE,  " Unregister input device\n");
++		input_unregister_device(input_dev);
++		input_dev = NULL;
++	}
++
++	i2c_set_clientdata(client, NULL);
++	kfree(egalax_i2c);
++	p_egalax_i2c_dev = NULL;
++
++	return 0;
++}
++
++static const struct i2c_device_id egalax_i2c_idtable[] = { 
++	{ "egalax_i2c", 0 }, 
++	{ } 
++};
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
++static const struct of_device_id egalax_i2c_dt_ids[] = { 
++	{ .compatible = "eeti,egalax_i2c" }, 
++	{ } 
++};
++#endif
++
++MODULE_DEVICE_TABLE(i2c, egalax_i2c_idtable);
++
++static struct i2c_driver egalax_i2c_driver = {
++	.driver = {
++		.name 	= "egalax_i2c",
++		.owner	= THIS_MODULE,
++	#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
++		.of_match_table = egalax_i2c_dt_ids,
++	#endif
++	},
++	.id_table	= egalax_i2c_idtable,
++	.probe		= egalax_i2c_probe,
++	.remove		= __devexit_p(egalax_i2c_remove),
++};
++
++static const struct file_operations egalax_cdev_fops = {
++	.owner	= THIS_MODULE,
++	.read	= egalax_cdev_read,
++	.write	= egalax_cdev_write,
++	.open	= egalax_cdev_open,
++	.release= egalax_cdev_release,
++	.poll	= egalax_cdev_poll,
++};
++
++static const struct file_operations egalax_proc_fops = {
++	.owner		= THIS_MODULE,
++        .open           = egalax_proc_open,
++        .read           = seq_read,
++        .write          = egalax_proc_write,
++        .llseek         = seq_lseek,
++	.release	= single_release,
++};
++
++static struct miscdevice egalax_misc_dev = {
++	.minor = MISC_DYNAMIC_MINOR,
++	.name = "egalax_i2c",
++	.fops = &egalax_cdev_fops,
++};
++
++static void egalax_i2c_ts_exit(void)
++{
++	if(p_char_dev)
++	{
++		if( p_char_dev->pFiFoBuf )
++			kfree(p_char_dev->pFiFoBuf);
++
++		kfree(p_char_dev);
++		p_char_dev = NULL;
++	}
++
++	misc_deregister(&egalax_misc_dev);
++
++	i2c_del_driver(&egalax_i2c_driver);
++
++	remove_proc_entry(PROC_FS_NAME, NULL);
++
++	EGALAX_DBG(DBG_MODULE, " Exit driver done!\n");
++}
++
++static struct egalax_char_dev* setup_chardev(void)
++{
++	struct egalax_char_dev *pCharDev;
++
++	pCharDev = kzalloc(1*sizeof(struct egalax_char_dev), GFP_KERNEL);
++	if(!pCharDev) 
++		goto fail_cdev;
++
++	spin_lock_init( &pCharDev->FiFoLock );
++	pCharDev->pFiFoBuf = kzalloc(sizeof(unsigned char)*FIFO_SIZE, GFP_KERNEL);
++	if(!pCharDev->pFiFoBuf)
++		goto fail_fifobuf;
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
++	pCharDev->pDataKFiFo = kfifo_init(pCharDev->pFiFoBuf, FIFO_SIZE, GFP_KERNEL, &pCharDev->FiFoLock);
++	if( pCharDev->pDataKFiFo==NULL )
++		goto fail_kfifo;
++#else
++	kfifo_init(&pCharDev->DataKFiFo, pCharDev->pFiFoBuf, FIFO_SIZE);
++	if( !kfifo_initialized(&pCharDev->DataKFiFo) )
++		goto fail_kfifo;
++#endif
++	
++	pCharDev->OpenCnts = 0;
++	sema_init(&pCharDev->sem, 1);
++	init_waitqueue_head(&pCharDev->fifo_inq);
++
++	return pCharDev; 
++
++fail_kfifo:
++	kfree(pCharDev->pFiFoBuf);
++fail_fifobuf:
++	kfree(pCharDev);
++fail_cdev:
++	return NULL;
++}
++
++static int egalax_i2c_ts_init(void)
++{
++	int result;
++
++	result = misc_register(&egalax_misc_dev);
++	if(result) 
++	{
++		EGALAX_DBG(DBG_MODULE, " misc device register failed\n");
++		goto fail;
++	}
++
++	p_char_dev = setup_chardev(); // allocate the character device
++	if(!p_char_dev) 
++	{
++		result = -ENOMEM;
++		goto fail;
++	}
++
++	dbgProcFile = proc_create(PROC_FS_NAME, S_IRUGO|S_IWUGO, NULL, &egalax_proc_fops);
++	if (dbgProcFile == NULL) 
++	{
++		remove_proc_entry(PROC_FS_NAME, NULL);
++		EGALAX_DBG(DBG_MODULE, " Could not initialize /proc/%s\n", PROC_FS_NAME);
++	}
++
++	EGALAX_DBG(DBG_MODULE, " Driver init done!\n");
++	return i2c_add_driver(&egalax_i2c_driver);
++
++fail:	
++	egalax_i2c_ts_exit();
++	return result;
++}
++
++module_init(egalax_i2c_ts_init);
++module_exit(egalax_i2c_ts_exit);
++
++MODULE_AUTHOR("EETI <touch_fae@eeti.com>");
++MODULE_DESCRIPTION("egalax all points controller i2c driver");
++MODULE_LICENSE("GPL");
+-- 
+1.9.1
+

+ 828 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-005-edt-ft5x06.patch

@@ -0,0 +1,828 @@
+commit ab28538ebe289c686cf357a6274c3f4a71969ca3
+Author: Reinhard Russinger <reinhard@russinger.at>
+Date:   Thu May 4 06:59:24 2017 +0200
+
+    changes edt-ft5x06 touchcontroller
+
+diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
+index 703e295..e862958 100644
+--- a/drivers/input/touchscreen/edt-ft5x06.c
++++ b/drivers/input/touchscreen/edt-ft5x06.c
+@@ -27,7 +27,6 @@
+ 
+ #include <linux/module.h>
+ #include <linux/ratelimit.h>
+-#include <linux/irq.h>
+ #include <linux/interrupt.h>
+ #include <linux/input.h>
+ #include <linux/i2c.h>
+@@ -35,10 +34,12 @@
+ #include <linux/delay.h>
+ #include <linux/debugfs.h>
+ #include <linux/slab.h>
+-#include <linux/gpio/consumer.h>
++#include <linux/gpio.h>
++#include <linux/of_gpio.h>
+ #include <linux/input/mt.h>
+-#include <linux/input/touchscreen.h>
+-#include <linux/of_device.h>
++#include <linux/input/edt-ft5x06.h>
++
++#define MAX_SUPPORT_POINTS		5
+ 
+ #define WORK_REGISTER_THRESHOLD		0x00
+ #define WORK_REGISTER_REPORT_RATE	0x08
+@@ -53,6 +54,13 @@
+ #define M09_REGISTER_NUM_X		0x94
+ #define M09_REGISTER_NUM_Y		0x95
+ 
++#define M12_REGISTER_THRESHOLD		0x80
++#define M12_REGISTER_GAIN		0x92
++#define M12_REGISTER_OFFSET		0x93
++#define M12_REGISTER_NUM_X		0x94
++#define M12_REGISTER_NUM_Y		0x95
++#define M12_REGISTER_REPORT_RATE	0x88
++
+ #define NO_REGISTER			0xff
+ 
+ #define WORK_REGISTER_OPMODE		0x3c
+@@ -72,6 +80,7 @@
+ enum edt_ver {
+ 	M06,
+ 	M09,
++	M12,
+ };
+ 
+ struct edt_reg_addr {
+@@ -86,12 +95,12 @@ struct edt_reg_addr {
+ struct edt_ft5x06_ts_data {
+ 	struct i2c_client *client;
+ 	struct input_dev *input;
+-	struct touchscreen_properties prop;
+ 	u16 num_x;
+ 	u16 num_y;
+ 
+-	struct gpio_desc *reset_gpio;
+-	struct gpio_desc *wake_gpio;
++	int reset_pin;
++	int irq_pin;
++	int wake_pin;
+ 
+ #if defined(CONFIG_DEBUG_FS)
+ 	struct dentry *debug_dir;
+@@ -105,18 +114,20 @@ struct edt_ft5x06_ts_data {
+ 	int gain;
+ 	int offset;
+ 	int report_rate;
+-	int max_support_points;
+ 
++	u32 invert_x;
++	u32 invert_y;
++	u32 swap_xy;
++	
++	u32 max_x;
++	u32 max_y;
++	
+ 	char name[EDT_NAME_LEN];
+ 
+ 	struct edt_reg_addr reg_addr;
+ 	enum edt_ver version;
+ };
+ 
+-struct edt_i2c_chip_data {
+-	int  max_support_points;
+-};
+-
+ static int edt_ft5x06_ts_readwrite(struct i2c_client *client,
+ 				   u16 wr_len, u8 *wr_buf,
+ 				   u16 rd_len, u8 *rd_buf)
+@@ -173,9 +184,9 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 	struct edt_ft5x06_ts_data *tsdata = dev_id;
+ 	struct device *dev = &tsdata->client->dev;
+ 	u8 cmd;
+-	u8 rdbuf[63];
++	u8 rdbuf[29];
+ 	int i, type, x, y, id;
+-	int offset, tplen, datalen, crclen;
++	int offset, tplen, datalen;
+ 	int error;
+ 
+ 	switch (tsdata->version) {
+@@ -183,14 +194,15 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 		cmd = 0xf9; /* tell the controller to send touch data */
+ 		offset = 5; /* where the actual touch data starts */
+ 		tplen = 4;  /* data comes in so called frames */
+-		crclen = 1; /* length of the crc data */
++		datalen = 26; /* how much bytes to listen for */
+ 		break;
+-
++		
++	case M12:	
+ 	case M09:
+-		cmd = 0x0;
+-		offset = 3;
++		cmd = 0x02;
++		offset = 1;
+ 		tplen = 6;
+-		crclen = 0;
++		datalen = 29;
+ 		break;
+ 
+ 	default:
+@@ -198,7 +210,6 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 	}
+ 
+ 	memset(rdbuf, 0, sizeof(rdbuf));
+-	datalen = tplen * tsdata->max_support_points + offset + crclen;
+ 
+ 	error = edt_ft5x06_ts_readwrite(tsdata->client,
+ 					sizeof(cmd), &cmd,
+@@ -209,8 +220,8 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 		goto out;
+ 	}
+ 
+-	/* M09 does not send header or CRC */
+-	if (tsdata->version == M06) {
++	/* M09 M12 does not send header or CRC */
++	if (tsdata->version == M06)  {
+ 		if (rdbuf[0] != 0xaa || rdbuf[1] != 0xaa ||
+ 			rdbuf[2] != datalen) {
+ 			dev_err_ratelimited(dev,
+@@ -223,7 +234,7 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 			goto out;
+ 	}
+ 
+-	for (i = 0; i < tsdata->max_support_points; i++) {
++	for (i = 0; i < MAX_SUPPORT_POINTS; i++) {
+ 		u8 *buf = &rdbuf[i * tplen + offset];
+ 		bool down;
+ 
+@@ -236,19 +247,32 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
+ 		if (tsdata->version == M06 && type == TOUCH_EVENT_DOWN)
+ 			continue;
+ 
+-		x = ((buf[0] << 8) | buf[1]) & 0x0fff;
+-		y = ((buf[2] << 8) | buf[3]) & 0x0fff;
++		if( tsdata->swap_xy) {
++		  y = ((buf[0] << 8) | buf[1]) & 0x0fff;
++		  x = ((buf[2] << 8) | buf[3]) & 0x0fff;
++		  } else {
++		  x = ((buf[0] << 8) | buf[1]) & 0x0fff;
++		  y = ((buf[2] << 8) | buf[3]) & 0x0fff;
++		  }
+ 		id = (buf[2] >> 4) & 0x0f;
+ 		down = type != TOUCH_EVENT_UP;
+ 
++		if(tsdata->invert_x) {
++  		  x = tsdata->max_x - x; 
++ 		  }
++ 		  
++		if(tsdata->invert_y) {
++  		  y = tsdata->max_y - y; 
++ 		  }
++ 		  
+ 		input_mt_slot(tsdata->input, id);
+ 		input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down);
+ 
+ 		if (!down)
+ 			continue;
+ 
+-		touchscreen_report_pos(tsdata->input, &tsdata->prop, x, y,
+-				       true);
++		input_report_abs(tsdata->input, ABS_MT_POSITION_X, x);
++		input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y);
+ 	}
+ 
+ 	input_mt_report_pointer_emulation(tsdata->input, true);
+@@ -267,15 +291,17 @@ static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata,
+ 	case M06:
+ 		wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc;
+ 		wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
++		wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
+ 		wrbuf[2] = value;
+ 		wrbuf[3] = wrbuf[0] ^ wrbuf[1] ^ wrbuf[2];
+-		return edt_ft5x06_ts_readwrite(tsdata->client, 4,
+-					wrbuf, 0, NULL);
++		return edt_ft5x06_ts_readwrite(tsdata->client, 4, wrbuf, 0, NULL);
++		
++	case M12:
+ 	case M09:
+ 		wrbuf[0] = addr;
+ 		wrbuf[1] = value;
+ 
+-		return edt_ft5x06_ts_readwrite(tsdata->client, 2,
++		return edt_ft5x06_ts_readwrite(tsdata->client, 3,
+ 					wrbuf, 0, NULL);
+ 
+ 	default:
+@@ -309,6 +335,7 @@ static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata,
+ 		}
+ 		break;
+ 
++        case M12:
+ 	case M09:
+ 		wrbuf[0] = addr;
+ 		error = edt_ft5x06_ts_readwrite(tsdata->client, 1,
+@@ -331,9 +358,10 @@ struct edt_ft5x06_attribute {
+ 	u8 limit_high;
+ 	u8 addr_m06;
+ 	u8 addr_m09;
++	u8 addr_m12;
+ };
+ 
+-#define EDT_ATTR(_field, _mode, _addr_m06, _addr_m09,			\
++#define EDT_ATTR(_field, _mode, _addr_m06, _addr_m09, _addr_m12,			\
+ 		_limit_low, _limit_high)				\
+ 	struct edt_ft5x06_attribute edt_ft5x06_attr_##_field = {	\
+ 		.dattr = __ATTR(_field, _mode,				\
+@@ -342,6 +370,7 @@ struct edt_ft5x06_attribute {
+ 		.field_offset = offsetof(struct edt_ft5x06_ts_data, _field), \
+ 		.addr_m06 = _addr_m06,					\
+ 		.addr_m09 = _addr_m09,					\
++		.addr_m12 = _addr_m12,					\
+ 		.limit_low = _limit_low,				\
+ 		.limit_high = _limit_high,				\
+ 	}
+@@ -372,6 +401,10 @@ static ssize_t edt_ft5x06_setting_show(struct device *dev,
+ 		addr = attr->addr_m06;
+ 		break;
+ 
++        case M12:
++		addr = attr->addr_m12;
++		break;
++
+ 	case M09:
+ 		addr = attr->addr_m09;
+ 		break;
+@@ -441,6 +474,10 @@ static ssize_t edt_ft5x06_setting_store(struct device *dev,
+ 		addr = attr->addr_m06;
+ 		break;
+ 
++        case M12:
++		addr = attr->addr_m12;
++		break;
++
+ 	case M09:
+ 		addr = attr->addr_m09;
+ 		break;
+@@ -467,13 +504,13 @@ out:
+ }
+ 
+ static EDT_ATTR(gain, S_IWUSR | S_IRUGO, WORK_REGISTER_GAIN,
+-		M09_REGISTER_GAIN, 0, 31);
++		M09_REGISTER_GAIN, M12_REGISTER_GAIN, 0, 31);
+ static EDT_ATTR(offset, S_IWUSR | S_IRUGO, WORK_REGISTER_OFFSET,
+-		M09_REGISTER_OFFSET, 0, 31);
++		M09_REGISTER_OFFSET, M12_REGISTER_OFFSET, 0, 31);
+ static EDT_ATTR(threshold, S_IWUSR | S_IRUGO, WORK_REGISTER_THRESHOLD,
+-		M09_REGISTER_THRESHOLD, 20, 80);
++		M09_REGISTER_THRESHOLD, M12_REGISTER_THRESHOLD, 1, 255);
+ static EDT_ATTR(report_rate, S_IWUSR | S_IRUGO, WORK_REGISTER_REPORT_RATE,
+-		NO_REGISTER, 3, 14);
++		NO_REGISTER, M12_REGISTER_REPORT_RATE, 3, 14);
+ 
+ static struct attribute *edt_ft5x06_attrs[] = {
+ 	&edt_ft5x06_attr_gain.dattr.attr,
+@@ -508,7 +545,7 @@ static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata)
+ 	}
+ 
+ 	/* mode register is 0x3c when in the work mode */
+-	if (tsdata->version == M09)
++	if ((tsdata->version == M09) || (tsdata->version == M12)) 
+ 		goto m09_out;
+ 
+ 	error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03);
+@@ -545,7 +582,7 @@ err_out:
+ 	return error;
+ 
+ m09_out:
+-	dev_err(&client->dev, "No factory mode support for M09\n");
++	dev_err(&client->dev, "No factory mode support for M09 and M12\n");
+ 	return -EINVAL;
+ 
+ }
+@@ -721,23 +758,46 @@ static void
+ edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata,
+ 			      const char *debugfs_name)
+ {
++	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
++
+ 	tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL);
+ 	if (!tsdata->debug_dir)
+ 		return;
+ 
+ 	debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x);
+ 	debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y);
++	debugfs_create_u32("threshold", S_IRUSR, tsdata->debug_dir, &tsdata->threshold);
++	debugfs_create_u32("gain", S_IRUSR, tsdata->debug_dir, &tsdata->gain);
++	debugfs_create_u32("offset", S_IRUSR, tsdata->debug_dir, &tsdata->offset);
++
+ 
+ 	debugfs_create_file("mode", S_IRUSR | S_IWUSR,
+ 			    tsdata->debug_dir, tsdata, &debugfs_mode_fops);
+ 	debugfs_create_file("raw_data", S_IRUSR,
+ 			    tsdata->debug_dir, tsdata, &debugfs_raw_data_fops);
++			    
++	if (reg_addr->reg_report_rate != NO_REGISTER)
++           debugfs_create_u32("report_rate", S_IRUSR, tsdata->debug_dir, &tsdata->report_rate);
++           
++	debugfs_create_u32("invert_x", S_IRUSR | S_IWUSR,
++			    tsdata->debug_dir, &tsdata->invert_x);
++	debugfs_create_u32("invert_y", S_IRUSR | S_IWUSR,
++			    tsdata->debug_dir, &tsdata->invert_y);
++	debugfs_create_u32("swap_xy", S_IRUSR,
++			    tsdata->debug_dir, &tsdata->swap_xy);
++	debugfs_create_u32("max_x", S_IRUSR,
++			    tsdata->debug_dir, &tsdata->max_x);
++	debugfs_create_u32("max_y", S_IRUSR,
++			    tsdata->debug_dir, &tsdata->max_y);
++
++
+ }
+ 
+ static void
+ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
+ {
+-	debugfs_remove_recursive(tsdata->debug_dir);
++	if (tsdata->debug_dir)
++		debugfs_remove_recursive(tsdata->debug_dir);
+ 	kfree(tsdata->raw_buffer);
+ }
+ 
+@@ -756,6 +816,45 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
+ 
+ #endif /* CONFIG_DEBUGFS */
+ 
++static int edt_ft5x06_ts_reset(struct i2c_client *client,
++			struct edt_ft5x06_ts_data *tsdata)
++{
++	int error;
++
++	if (gpio_is_valid(tsdata->wake_pin)) {
++		error = devm_gpio_request_one(&client->dev,
++					tsdata->wake_pin, GPIOF_OUT_INIT_LOW,
++					"edt-ft5x06 wake");
++		if (error) {
++			dev_err(&client->dev,
++				"Failed to request GPIO %d as wake pin, error %d\n",
++				tsdata->wake_pin, error);
++			return error;
++		}
++
++		msleep(5);
++		gpio_set_value(tsdata->wake_pin, 1);
++	}
++	if (gpio_is_valid(tsdata->reset_pin)) {
++		/* this pulls reset down, enabling the low active reset */
++		error = devm_gpio_request_one(&client->dev,
++					tsdata->reset_pin, GPIOF_OUT_INIT_LOW,
++					"edt-ft5x06 reset");
++		if (error) {
++			dev_err(&client->dev,
++				"Failed to request GPIO %d as reset pin, error %d\n",
++				tsdata->reset_pin, error);
++			return error;
++		}
++
++		msleep(5);
++		gpio_set_value(tsdata->reset_pin, 1);
++		msleep(300);
++	}
++
++	return 0;
++}
++
+ static int edt_ft5x06_ts_identify(struct i2c_client *client,
+ 					struct edt_ft5x06_ts_data *tsdata,
+ 					char *fw_version)
+@@ -771,14 +870,16 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
+ 	 */
+ 	memset(rdbuf, 0, sizeof(rdbuf));
+ 	error = edt_ft5x06_ts_readwrite(client, 1, "\xbb",
+-					EDT_NAME_LEN - 1, rdbuf);
++					EDT_NAME_LEN - 1,
++					rdbuf);
+ 	if (error)
+ 		return error;
+ 
++        printk(KERN_INFO "EDT-TC:: %s ::-----%s----\n", __func__, rdbuf);
+ 	/* if we find something consistent, stay with that assumption
+ 	 * at least M09 won't send 3 bytes here
+ 	 */
+-	if (!(strncasecmp(rdbuf + 1, "EP0", 3))) {
++	if ((strncasecmp(rdbuf + 1, "EP0", 3) == 0) && (strncasecmp(rdbuf + 6, "M12", 3) != 0)) {
+ 		tsdata->version = M06;
+ 
+ 		/* remove last '$' end marker */
+@@ -792,8 +893,24 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
+ 			*p++ = '\0';
+ 		strlcpy(model_name, rdbuf + 1, EDT_NAME_LEN);
+ 		strlcpy(fw_version, p ? p : "", EDT_NAME_LEN);
++	} else if (!(strncasecmp(rdbuf + 6, "M12", 3))) {
++		tsdata->version = M12;
++
++		error = edt_ft5x06_ts_readwrite(client, 1, "\xA6",
++						2, rdbuf);
++		if (error)
++			return error;
++
++		strlcpy(fw_version, rdbuf, 2);
++
++		error = edt_ft5x06_ts_readwrite(client, 1, "\xA8",
++						1, rdbuf);
++		if (error)
++			return error;
++
++		snprintf(model_name, EDT_NAME_LEN, "EP0%i%i0M12",
++			rdbuf[0] >> 4, rdbuf[0] & 0x0F);
+ 	} else {
+-		/* since there are only two versions around (M06, M09) */
+ 		tsdata->version = M09;
+ 
+ 		error = edt_ft5x06_ts_readwrite(client, 1, "\xA6",
+@@ -815,30 +932,58 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
+ 	return 0;
+ }
+ 
+-static void edt_ft5x06_ts_get_defaults(struct device *dev,
+-				       struct edt_ft5x06_ts_data *tsdata)
++#define EDT_ATTR_CHECKSET(name, reg) \
++	if (pdata->name >= edt_ft5x06_attr_##name.limit_low &&		\
++	    pdata->name <= edt_ft5x06_attr_##name.limit_high)		\
++		edt_ft5x06_register_write(tsdata, reg, pdata->name)
++
++#define EDT_GET_PROP(name, reg) {				\
++	u32 val;						\
++	if (of_property_read_u32(np, #name, &val) == 0)		\
++		edt_ft5x06_register_write(tsdata, reg, val);	\
++}
++
++static void edt_ft5x06_ts_get_dt_defaults(struct device_node *np,
++					struct edt_ft5x06_ts_data *tsdata)
+ {
+ 	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
+-	u32 val;
+-	int error;
+ 
+-	error = device_property_read_u32(dev, "threshold", &val);
+-	if (!error) {
+-		edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold, val);
+-		tsdata->threshold = val;
+-	}
++	switch (tsdata->version) {
++	     case M12:
++	      EDT_GET_PROP(threshold_M12, reg_addr->reg_threshold);
++              EDT_GET_PROP(gain_M12, reg_addr->reg_gain);
++              EDT_GET_PROP(offset_M12, reg_addr->reg_offset);
++              break;
++
++	     case M09:
++	      EDT_GET_PROP(threshold_M09, reg_addr->reg_threshold);
++              EDT_GET_PROP(gain_M09, reg_addr->reg_gain);
++              EDT_GET_PROP(offset_M09, reg_addr->reg_offset);
++              break;
++
++	     case M06:
++	      EDT_GET_PROP(threshold_M06, reg_addr->reg_threshold);
++              EDT_GET_PROP(gain_M06, reg_addr->reg_gain);
++              EDT_GET_PROP(offset_M06, reg_addr->reg_offset);
++              break;
++             }
++}
+ 
+-	error = device_property_read_u32(dev, "gain", &val);
+-	if (!error) {
+-		edt_ft5x06_register_write(tsdata, reg_addr->reg_gain, val);
+-		tsdata->gain = val;
+-	}
++static void
++edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata,
++			   const struct edt_ft5x06_platform_data *pdata)
++{
++	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
+ 
+-	error = device_property_read_u32(dev, "offset", &val);
+-	if (!error) {
+-		edt_ft5x06_register_write(tsdata, reg_addr->reg_offset, val);
+-		tsdata->offset = val;
+-	}
++	if (!pdata->use_parameters)
++		return;
++
++	/* pick up defaults from the platform data */
++	EDT_ATTR_CHECKSET(threshold, reg_addr->reg_threshold);
++	EDT_ATTR_CHECKSET(gain, reg_addr->reg_gain);
++	EDT_ATTR_CHECKSET(offset, reg_addr->reg_offset);
++	if (reg_addr->reg_report_rate != NO_REGISTER)
++		EDT_ATTR_CHECKSET(report_rate, reg_addr->reg_report_rate);
+ }
+ 
+ static void
+@@ -855,6 +1000,12 @@ edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata)
+ 						reg_addr->reg_report_rate);
+ 	tsdata->num_x = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_x);
+ 	tsdata->num_y = edt_ft5x06_register_read(tsdata, reg_addr->reg_num_y);
++
++	if(tsdata->max_x == 0)	
++		tsdata->max_x = tsdata->num_x * 64;
++	if(tsdata->max_y == 0)
++		tsdata->max_y = tsdata->num_y * 64;
++	
+ }
+ 
+ static void
+@@ -872,6 +1023,15 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata)
+ 		reg_addr->reg_num_y = WORK_REGISTER_NUM_Y;
+ 		break;
+ 
++        case M12:
++		reg_addr->reg_threshold = M12_REGISTER_THRESHOLD;
++		reg_addr->reg_report_rate = M12_REGISTER_REPORT_RATE;
++		reg_addr->reg_gain = M12_REGISTER_GAIN;
++		reg_addr->reg_offset = M12_REGISTER_OFFSET;
++		reg_addr->reg_num_x = M12_REGISTER_NUM_X;
++		reg_addr->reg_num_y = M12_REGISTER_NUM_Y;
++		break;
++
+ 	case M09:
+ 		reg_addr->reg_threshold = M09_REGISTER_THRESHOLD;
+ 		reg_addr->reg_gain = M09_REGISTER_GAIN;
+@@ -882,13 +1042,48 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata)
+ 	}
+ }
+ 
++#ifdef CONFIG_OF
++static int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
++				struct edt_ft5x06_ts_data *tsdata)
++{
++	struct device_node *np = dev->of_node;
++	/*
++	 * irq_pin is not needed for DT setup.
++	 * irq is associated via 'interrupts' property in DT
++	 */
++	tsdata->irq_pin = -EINVAL;
++	tsdata->reset_pin = of_get_named_gpio(np, "reset-gpios", 0);
++	tsdata->wake_pin = of_get_named_gpio(np, "wake-gpios", 0);
++	
++	tsdata->swap_xy = of_property_read_bool(np, "swap_xy")?1:0;
++	tsdata->invert_x = of_property_read_bool(np, "invert_x")?1:0;
++	tsdata->invert_y = of_property_read_bool(np, "invert_y")?1:0;
++
++	if(of_property_read_u32(np, "max_x", &tsdata->max_x))
++		tsdata->max_x = 0;
++	if(of_property_read_u32(np, "max_y", &tsdata->max_y))
++		tsdata->max_y = 0;
++
++	if(tsdata->swap_xy) {
++         printk(KERN_INFO "EDT-TC:: %s :: SWAP_XY\n", __func__);
++	 }
++	return 0;
++}
++#else
++static inline int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
++					struct edt_ft5x06_ts_data *tsdata)
++{
++	return -ENODEV;
++}
++#endif
++
+ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 					 const struct i2c_device_id *id)
+ {
+-	const struct edt_i2c_chip_data *chip_data;
++	const struct edt_ft5x06_platform_data *pdata =
++						dev_get_platdata(&client->dev);
+ 	struct edt_ft5x06_ts_data *tsdata;
+ 	struct input_dev *input;
+-	unsigned long irq_flags;
+ 	int error;
+ 	char fw_version[EDT_NAME_LEN];
+ 
+@@ -900,43 +1095,32 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 		return -ENOMEM;
+ 	}
+ 
+-	chip_data = of_device_get_match_data(&client->dev);
+-	if (!chip_data)
+-		chip_data = (const struct edt_i2c_chip_data *)id->driver_data;
+-	if (!chip_data || !chip_data->max_support_points) {
+-		dev_err(&client->dev, "invalid or missing chip data\n");
+-		return -EINVAL;
+-	}
+-
+-	tsdata->max_support_points = chip_data->max_support_points;
+-
+-	tsdata->reset_gpio = devm_gpiod_get_optional(&client->dev,
+-						     "reset", GPIOD_OUT_HIGH);
+-	if (IS_ERR(tsdata->reset_gpio)) {
+-		error = PTR_ERR(tsdata->reset_gpio);
+-		dev_err(&client->dev,
+-			"Failed to request GPIO reset pin, error %d\n", error);
+-		return error;
++	if (!pdata) {
++		error = edt_ft5x06_i2c_ts_probe_dt(&client->dev, tsdata);
++		if (error) {
++			dev_err(&client->dev,
++				"DT probe failed and no platform data present\n");
++			return error;
++		}
++	} else {
++		tsdata->reset_pin = pdata->reset_pin;
++		tsdata->irq_pin = pdata->irq_pin;
++		tsdata->wake_pin = -EINVAL;
+ 	}
+ 
+-	tsdata->wake_gpio = devm_gpiod_get_optional(&client->dev,
+-						    "wake", GPIOD_OUT_LOW);
+-	if (IS_ERR(tsdata->wake_gpio)) {
+-		error = PTR_ERR(tsdata->wake_gpio);
+-		dev_err(&client->dev,
+-			"Failed to request GPIO wake pin, error %d\n", error);
++	error = edt_ft5x06_ts_reset(client, tsdata);
++	if (error)
+ 		return error;
+-	}
+ 
+-	if (tsdata->wake_gpio) {
+-		usleep_range(5000, 6000);
+-		gpiod_set_value_cansleep(tsdata->wake_gpio, 1);
+-	}
+-
+-	if (tsdata->reset_gpio) {
+-		usleep_range(5000, 6000);
+-		gpiod_set_value_cansleep(tsdata->reset_gpio, 0);
+-		msleep(300);
++	if (gpio_is_valid(tsdata->irq_pin)) {
++		error = devm_gpio_request_one(&client->dev, tsdata->irq_pin,
++					GPIOF_IN, "edt-ft5x06 irq");
++		if (error) {
++			dev_err(&client->dev,
++				"Failed to request GPIO %d, error %d\n",
++				tsdata->irq_pin, error);
++			return error;
++		}
+ 	}
+ 
+ 	input = devm_input_allocate_device(&client->dev);
+@@ -957,7 +1141,12 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 	}
+ 
+ 	edt_ft5x06_ts_set_regs(tsdata);
+-	edt_ft5x06_ts_get_defaults(&client->dev, tsdata);
++
++	if (!pdata)
++		edt_ft5x06_ts_get_dt_defaults(client->dev.of_node, tsdata);
++	else
++		edt_ft5x06_ts_get_defaults(tsdata, pdata);
++
+ 	edt_ft5x06_ts_get_parameters(tsdata);
+ 
+ 	dev_dbg(&client->dev,
+@@ -968,15 +1157,18 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 	input->id.bustype = BUS_I2C;
+ 	input->dev.parent = &client->dev;
+ 
++	__set_bit(EV_SYN, input->evbit);
++	__set_bit(EV_KEY, input->evbit);
++	__set_bit(EV_ABS, input->evbit);
++	__set_bit(BTN_TOUCH, input->keybit);
++	
++ 	input_set_abs_params(input, ABS_X, 0, tsdata->max_x - 1, 0, 0);
++	input_set_abs_params(input, ABS_Y, 0, tsdata->max_y - 1, 0, 0);
+ 	input_set_abs_params(input, ABS_MT_POSITION_X,
+-			     0, tsdata->num_x * 64 - 1, 0, 0);
++			     0, tsdata->max_x - 1, 0, 0);
+ 	input_set_abs_params(input, ABS_MT_POSITION_Y,
+-			     0, tsdata->num_y * 64 - 1, 0, 0);
+-
+-	touchscreen_parse_properties(input, true, &tsdata->prop);
+-
+-	error = input_mt_init_slots(input, tsdata->max_support_points,
+-				INPUT_MT_DIRECT);
++			     0, tsdata->max_y - 1, 0, 0);
++	error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, 0);
+ 	if (error) {
+ 		dev_err(&client->dev, "Unable to init MT slots.\n");
+ 		return error;
+@@ -985,13 +1177,9 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 	input_set_drvdata(input, tsdata);
+ 	i2c_set_clientdata(client, tsdata);
+ 
+-	irq_flags = irq_get_trigger_type(client->irq);
+-	if (irq_flags == IRQF_TRIGGER_NONE)
+-		irq_flags = IRQF_TRIGGER_FALLING;
+-	irq_flags |= IRQF_ONESHOT;
+-
+-	error = devm_request_threaded_irq(&client->dev, client->irq,
+-					NULL, edt_ft5x06_ts_isr, irq_flags,
++	error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
++					edt_ft5x06_ts_isr,
++					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+ 					client->name, tsdata);
+ 	if (error) {
+ 		dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
+@@ -1011,9 +1199,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
+ 
+ 	dev_dbg(&client->dev,
+ 		"EDT FT5x06 initialized: IRQ %d, WAKE pin %d, Reset pin %d.\n",
+-		client->irq,
+-		tsdata->wake_gpio ? desc_to_gpio(tsdata->wake_gpio) : -1,
+-		tsdata->reset_gpio ? desc_to_gpio(tsdata->reset_gpio) : -1);
++		client->irq, tsdata->wake_pin, tsdata->reset_pin);
+ 
+ 	return 0;
+ 
+@@ -1032,7 +1218,8 @@ static int edt_ft5x06_ts_remove(struct i2c_client *client)
+ 	return 0;
+ }
+ 
+-static int __maybe_unused edt_ft5x06_ts_suspend(struct device *dev)
++#ifdef CONFIG_PM_SLEEP
++static int edt_ft5x06_ts_suspend(struct device *dev)
+ {
+ 	struct i2c_client *client = to_i2c_client(dev);
+ 
+@@ -1042,7 +1229,7 @@ static int __maybe_unused edt_ft5x06_ts_suspend(struct device *dev)
+ 	return 0;
+ }
+ 
+-static int __maybe_unused edt_ft5x06_ts_resume(struct device *dev)
++static int edt_ft5x06_ts_resume(struct device *dev)
+ {
+ 	struct i2c_client *client = to_i2c_client(dev);
+ 
+@@ -1051,31 +1238,22 @@ static int __maybe_unused edt_ft5x06_ts_resume(struct device *dev)
+ 
+ 	return 0;
+ }
++#endif
+ 
+ static SIMPLE_DEV_PM_OPS(edt_ft5x06_ts_pm_ops,
+ 			 edt_ft5x06_ts_suspend, edt_ft5x06_ts_resume);
+ 
+-static const struct edt_i2c_chip_data edt_ft5x06_data = {
+-	.max_support_points = 5,
+-};
+-
+-static const struct edt_i2c_chip_data edt_ft5506_data = {
+-	.max_support_points = 10,
+-};
+-
+ static const struct i2c_device_id edt_ft5x06_ts_id[] = {
+-	{ .name = "edt-ft5x06", .driver_data = (long)&edt_ft5x06_data },
+-	{ .name = "edt-ft5506", .driver_data = (long)&edt_ft5506_data },
++	{ "edt-ft5x06", 0, },
+ 	{ /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id);
+ 
+ #ifdef CONFIG_OF
+ static const struct of_device_id edt_ft5x06_of_match[] = {
+-	{ .compatible = "edt,edt-ft5206", .data = &edt_ft5x06_data },
+-	{ .compatible = "edt,edt-ft5306", .data = &edt_ft5x06_data },
+-	{ .compatible = "edt,edt-ft5406", .data = &edt_ft5x06_data },
+-	{ .compatible = "edt,edt-ft5506", .data = &edt_ft5506_data },
++	{ .compatible = "edt,edt-ft5206", },
++	{ .compatible = "edt,edt-ft5306", },
++	{ .compatible = "edt,edt-ft5406", },
+ 	{ /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match);
+@@ -1083,6 +1261,7 @@ MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match);
+ 
+ static struct i2c_driver edt_ft5x06_ts_driver = {
+ 	.driver = {
++		.owner = THIS_MODULE,
+ 		.name = "edt_ft5x06",
+ 		.of_match_table = of_match_ptr(edt_ft5x06_of_match),
+ 		.pm = &edt_ft5x06_ts_pm_ops,
+diff --git a/include/linux/input/edt-ft5x06.h b/include/linux/input/edt-ft5x06.h
+new file mode 100644
+index 0000000..8a1e0d1
+--- /dev/null
++++ b/include/linux/input/edt-ft5x06.h
+@@ -0,0 +1,24 @@
++#ifndef _EDT_FT5X06_H
++#define _EDT_FT5X06_H
++
++/*
++ * Copyright (c) 2012 Simon Budig, <simon.budig@kernelconcepts.de>
++ *
++ * 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.
++ */
++
++struct edt_ft5x06_platform_data {
++	int irq_pin;
++	int reset_pin;
++
++	/* startup defaults for operational parameters */
++	bool use_parameters;
++	u8 gain;
++	u8 threshold;
++	u8 offset;
++	u8 report_rate;
++};
++
++#endif /* _EDT_FT5X06_H */

+ 62 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-006-RS485_udelay_before_tx.patch

@@ -0,0 +1,62 @@
+diff --git a/Documentation/serial/serial-rs485.txt b/Documentation/serial/serial-rs485.txt
+index 2253b8b45a74..6225a3b759de 100644
+--- a/Documentation/serial/serial-rs485.txt
++++ b/Documentation/serial/serial-rs485.txt
+@@ -73,6 +73,9 @@
+ 	/* Set rts delay before send, if needed: */
+ 	rs485conf.delay_rts_before_send = ...;
+ 
++	/* Set udelay_before_enable_tx, if needed: */
++	rs485conf.udelay_before_enable_tx = ...;
++
+ 	/* Set rts delay after send, if needed: */
+ 	rs485conf.delay_rts_after_send = ...;
+ 
+diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
+index 2c6c06f3d61c..19f51585641b 100644
+--- a/drivers/tty/serial/omap-serial.c
++++ b/drivers/tty/serial/omap-serial.c
+@@ -423,6 +423,8 @@ static void serial_omap_start_tx(struct uart_port *port)
+ 		/* if rts not already enabled */
+ 		res = (port->rs485.flags & SER_RS485_RTS_ON_SEND) ? 1 : 0;
+ 		if (gpio_get_value(up->rts_gpio) != res) {
++			if(port->rs485.udelay_before_enable_tx)
++				udelay(port->rs485.udelay_before_enable_tx);
+ 			gpio_set_value(up->rts_gpio, res);
+ 			if (port->rs485.delay_rts_before_send > 0)
+ 				mdelay(port->rs485.delay_rts_before_send);
+@@ -1545,7 +1547,7 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
+ 				   struct device_node *np)
+ {
+ 	struct serial_rs485 *rs485conf = &up->port.rs485;
+-	u32 rs485_delay[2];
++	u32 rs485_delay[3];
+ 	enum of_gpio_flags flags;
+ 	int ret;
+ 
+@@ -1577,9 +1579,10 @@ static int serial_omap_probe_rs485(struct uart_omap_port *up,
+ 	}
+ 
+ 	if (of_property_read_u32_array(np, "rs485-rts-delay",
+-				    rs485_delay, 2) == 0) {
++				    rs485_delay, 3) == 0) {
+ 		rs485conf->delay_rts_before_send = rs485_delay[0];
+ 		rs485conf->delay_rts_after_send = rs485_delay[1];
++		rs485conf->udelay_before_enable_tx = rs485_delay[2];
+ 	}
+ 
+ 	if (of_property_read_bool(np, "rs485-rx-during-tx"))
+diff --git a/include/uapi/linux/serial.h b/include/uapi/linux/serial.h
+index 5d59c3ebf459..d100bdac93c2 100644
+--- a/include/uapi/linux/serial.h
++++ b/include/uapi/linux/serial.h
+@@ -124,7 +124,8 @@ struct serial_rs485 {
+ #define SER_RS485_RX_DURING_TX		(1 << 4)
+ 	__u32	delay_rts_before_send;	/* Delay before send (milliseconds) */
+ 	__u32	delay_rts_after_send;	/* Delay after send (milliseconds) */
+-	__u32	padding[5];		/* Memory is cheap, new structs
++	__u32   udelay_before_enable_tx;/* Delay before switching to tx direction */
++	__u32	padding[4];		/* Memory is cheap, new structs
+ 					   are a royal PITA .. */
+ };
+ 

+ 13 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-007-am33xx.dtsi_add_operating_points.patch

@@ -0,0 +1,13 @@
+diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
+index 1a499bb..858d21f 100644
+--- a/arch/arm/boot/dts/am33xx.dtsi
++++ b/arch/arm/boot/dts/am33xx.dtsi
+@@ -52,6 +52,8 @@
+ 			 */
+ 			operating-points = <
+ 				/* kHz    uV */
++				1000000	1351000
++				800000	1285000
+ 				720000  1285000
+ 				600000  1225000
+ 				500000  1125000

+ 134 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-020-edt-touch-make-gain-offset-threshold-writeable.patch

@@ -0,0 +1,134 @@
+--- a/drivers/input/touchscreen/edt-ft5x06.c	2017-09-26 15:27:56.685769326 +0200
++++ b/drivers/input/touchscreen/edt-ft5x06.c	2017-09-25 08:00:57.530768619 +0200
+@@ -639,6 +639,111 @@
+ 	return 0;
+ }
+ 
++
++static int edt_ft5x06_debugfs_threshold_get(void *data, u64 *threshold)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++
++	*threshold = (u64)(tsdata->threshold);
++
++	return 0;
++};
++
++static int edt_ft5x06_debugfs_threshold_set(void *data, u64 threshold)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
++	int retval = 0;
++
++/*	if (param > ??????)
++		return -ERANGE;
++*/
++	mutex_lock(&tsdata->mutex);
++	
++	tsdata->threshold = (int)(threshold);
++	edt_ft5x06_register_write(tsdata, reg_addr->reg_threshold,
++				  tsdata->threshold);
++	tsdata->threshold = edt_ft5x06_register_read(tsdata,
++						     reg_addr->reg_threshold);
++
++	mutex_unlock(&tsdata->mutex);
++
++	return retval;
++};
++
++DEFINE_SIMPLE_ATTRIBUTE(debugfs_threshold_fops, edt_ft5x06_debugfs_threshold_get,
++			edt_ft5x06_debugfs_threshold_set, "%llu\n");
++
++
++static int edt_ft5x06_debugfs_gain_get(void *data, u64 *gain)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++
++	*gain = (u64)(tsdata->gain);
++
++	return 0;
++};
++
++static int edt_ft5x06_debugfs_gain_set(void *data, u64 gain)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
++	int retval = 0;
++
++/*	if (param > ??????)
++		return -ERANGE;
++*/
++	mutex_lock(&tsdata->mutex);
++	
++	tsdata->gain = (int)(gain);
++	edt_ft5x06_register_write(tsdata, reg_addr->reg_gain,
++				  tsdata->gain);
++	tsdata->gain = edt_ft5x06_register_read(tsdata,
++						     reg_addr->reg_gain);
++
++	mutex_unlock(&tsdata->mutex);
++
++	return retval;
++};
++
++DEFINE_SIMPLE_ATTRIBUTE(debugfs_gain_fops, edt_ft5x06_debugfs_gain_get,
++			edt_ft5x06_debugfs_gain_set, "%llu\n");
++
++
++static int edt_ft5x06_debugfs_offset_get(void *data, u64 *offset)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++
++	*offset = (u64)(tsdata->offset);
++
++	return 0;
++};
++
++static int edt_ft5x06_debugfs_offset_set(void *data, u64 offset)
++{
++	struct edt_ft5x06_ts_data *tsdata = data;
++	struct edt_reg_addr *reg_addr = &tsdata->reg_addr;
++	int retval = 0;
++
++/*	if (param > ??????)
++		return -ERANGE;
++*/
++	mutex_lock(&tsdata->mutex);
++	
++	tsdata->offset = (int)(offset);
++	edt_ft5x06_register_write(tsdata, reg_addr->reg_offset,
++				  tsdata->offset);
++	tsdata->offset = edt_ft5x06_register_read(tsdata,
++						     reg_addr->reg_offset);
++
++	mutex_unlock(&tsdata->mutex);
++
++	return retval;
++};
++
++DEFINE_SIMPLE_ATTRIBUTE(debugfs_offset_fops, edt_ft5x06_debugfs_offset_get,
++			edt_ft5x06_debugfs_offset_set, "%llu\n");
++
+ static int edt_ft5x06_debugfs_mode_get(void *data, u64 *mode)
+ {
+ 	struct edt_ft5x06_ts_data *tsdata = data;
+@@ -766,10 +871,19 @@
+ 
+ 	debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x);
+ 	debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y);
++
++/*
+ 	debugfs_create_u32("threshold", S_IRUSR, tsdata->debug_dir, &tsdata->threshold);
+ 	debugfs_create_u32("gain", S_IRUSR, tsdata->debug_dir, &tsdata->gain);
+ 	debugfs_create_u32("offset", S_IRUSR, tsdata->debug_dir, &tsdata->offset);
++*/
+ 
++	debugfs_create_file("threshold", S_IRUSR | S_IWUSR,
++			    tsdata->debug_dir, tsdata, &debugfs_threshold_fops);
++	debugfs_create_file("gain", S_IRUSR | S_IWUSR,
++			    tsdata->debug_dir, tsdata, &debugfs_gain_fops);
++	debugfs_create_file("offset", S_IRUSR | S_IWUSR,
++			    tsdata->debug_dir, tsdata, &debugfs_offset_fops);
+ 
+ 	debugfs_create_file("mode", S_IRUSR | S_IWUSR,
+ 			    tsdata->debug_dir, tsdata, &debugfs_mode_fops);

+ 18 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-021-remove_endless_loop_in_rtc-ds1307_driver.patch

@@ -0,0 +1,18 @@
+diff -Naurp a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c
+--- a/drivers/rtc/rtc-ds1307.c	2018-02-19 11:38:04.000000000 +0100
++++ b/drivers/rtc/rtc-ds1307.c	2018-03-08 11:58:06.832574443 +0100
+@@ -1093,11 +1093,11 @@ read_rtc:
+ 		}
+ 
+ 		/* clock halted?  turn it on, so clock can tick. */
+-		if (!(tmp & MCP794XX_BIT_ST)) {
++		if (!(ds1307->regs[3] & 0x20)) { /* check OSC Bit from REG 3 */
++			dev_warn(&client->dev, "OSC NOT RUNNING !SET TIME!\n");
+ 			i2c_smbus_write_byte_data(client, DS1307_REG_SECS,
+ 					MCP794XX_BIT_ST);
+-			dev_warn(&client->dev, "SET TIME!\n");
+-			goto read_rtc;
++//			goto read_rtc; /* dont loop endless osc failure */
+ 		}
+ 
+ 		break;

+ 108 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-022-add-dts-flags-to-atmel-mxt-touch.patch

@@ -0,0 +1,108 @@
+diff -Naurp a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
+--- a/drivers/input/touchscreen/atmel_mxt_ts.c	2018-01-20 11:42:13.000000000 +0100
++++ b/drivers/input/touchscreen/atmel_mxt_ts.c	2018-01-25 09:03:33.876115406 +0100
+@@ -24,6 +24,7 @@
+ #include <linux/i2c.h>
+ #include <linux/platform_data/atmel_mxt_ts.h>
+ #include <linux/input/mt.h>
++#include <linux/input/touchscreen.h>
+ #include <linux/interrupt.h>
+ #include <linux/of.h>
+ #include <linux/slab.h>
+@@ -216,6 +217,9 @@ struct mxt_data {
+ 	unsigned int irq;
+ 	unsigned int max_x;
+ 	unsigned int max_y;
++	bool invert_x;
++	bool invert_y;
++	bool swap_x_y;
+ 	bool xy_switch;
+ 	bool in_bootloader;
+ 	u16 mem_size;
+@@ -257,6 +261,22 @@ struct mxt_data {
+ 	struct completion crc_completion;
+ };
+ 
++static void mxt_apply_prop_to_x_y(const struct mxt_data *data,
++                             int *x, int *y)
++{
++        if (data->invert_x)
++                *x = data->max_x - *x;
++
++        if (data->invert_y)
++                *y = data->max_y - *y;
++
++        if (data->swap_x_y)
++                swap(*x, *y);
++}
++
++
++
++
+ static size_t mxt_obj_size(const struct mxt_object *obj)
+ {
+ 	return obj->size_minus_one + 1;
+@@ -741,6 +761,8 @@ static void mxt_proc_t9_message(struct m
+ 
+ 		/* Touch active */
+ 		input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 1);
++		mxt_apply_prop_to_x_y(data, &x, &y);
++		
+ 		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
+ 		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
+ 		input_report_abs(input_dev, ABS_MT_PRESSURE, amplitude);
+@@ -760,8 +782,8 @@ static void mxt_proc_t100_message(struct
+ 	int id;
+ 	u8 status;
+ 	u8 type = 0;
+-	u16 x;
+-	u16 y;
++	/*u16*/ int x;
++	/*u16*/ int y;
+ 	int distance = 0;
+ 	int tool = 0;
+ 	u8 major = 0;
+@@ -845,6 +867,7 @@ static void mxt_proc_t100_message(struct
+ 			id, type, x, y, major, pressure, orientation);
+ 
+ 		input_mt_report_slot_state(input_dev, tool, 1);
++		mxt_apply_prop_to_x_y(data, &x, &y);
+ 		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
+ 		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
+ 		input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, major);
+@@ -1778,7 +1801,8 @@ static int mxt_initialize_input_device(s
+ 	int error;
+ 	unsigned int num_mt_slots;
+ 	unsigned int mt_flags = 0;
+-
++	struct device_node *np = dev->of_node;
++	
+ 	switch (data->multitouch) {
+ 	case MXT_TOUCH_MULTI_T9:
+ 		num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1;
+@@ -1818,6 +1842,7 @@ static int mxt_initialize_input_device(s
+ 		return -ENOMEM;
+ 	}
+ 
++
+ 	input_dev->name = "Atmel maXTouch Touchscreen";
+ 	input_dev->phys = data->phys;
+ 	input_dev->id.bustype = BUS_I2C;
+@@ -1908,6 +1933,17 @@ static int mxt_initialize_input_device(s
+ 
+ 	data->input_dev = input_dev;
+ 
++	if (np) {
++		data->invert_x = of_property_read_bool(np, "invert_x")?1:0;
++		data->invert_y = of_property_read_bool(np, "invert_y")?1:0;
++        	data->swap_x_y = of_property_read_bool(np, "swap_x_y")?1:0;
++        	
++        	dev_info(dev, "loaded toucscreen properties\n");
++        	dev_info(dev, "touchscreen-inverted-x %d\n", data->invert_x);
++        	dev_info(dev, "touchscreen-inverted-y %d\n", data->invert_y);
++        	dev_info(dev, "touchscreen-swap-x-y %d\n", data->swap_x_y);
++        }
++
+ 	return 0;
+ 
+ err_free_mem:

+ 47 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-023-edt-ft5x06-shared-irq.disabled__patch

@@ -0,0 +1,47 @@
+diff -Naurp a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
+--- a/drivers/input/touchscreen/edt-ft5x06.c	2018-01-30 21:28:53.696245462 +0100
++++ b/drivers/input/touchscreen/edt-ft5x06.c	2018-01-30 21:28:19.220223683 +0100
+@@ -188,6 +188,7 @@ static irqreturn_t edt_ft5x06_ts_isr(int
+ 	int i, type, x, y, id;
+ 	int offset, tplen, datalen;
+ 	int error;
++	
+ 
+ 	switch (tsdata->version) {
+ 	case M06:
+@@ -532,7 +533,7 @@ static int edt_ft5x06_factory_mode(struc
+ 	int ret;
+ 	int error;
+ 
+-	disable_irq(client->irq);
++//	disable_irq(client->irq);
+ 
+ 	if (!tsdata->raw_buffer) {
+ 		tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y *
+@@ -577,7 +578,7 @@ err_out:
+ 	kfree(tsdata->raw_buffer);
+ 	tsdata->raw_buffer = NULL;
+ 	tsdata->factory_mode = false;
+-	enable_irq(client->irq);
++//	enable_irq(client->irq);
+ 
+ 	return error;
+ 
+@@ -634,7 +635,7 @@ static int edt_ft5x06_work_mode(struct e
+ 		edt_ft5x06_register_write(tsdata, reg_addr->reg_report_rate,
+ 				  tsdata->report_rate);
+ 
+-	enable_irq(client->irq);
++//	enable_irq(client->irq);
+ 
+ 	return 0;
+ }
+@@ -1293,7 +1294,7 @@ static int edt_ft5x06_ts_probe(struct i2
+ 
+ 	error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
+ 					edt_ft5x06_ts_isr,
+-					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
++					IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED,
+ 					client->name, tsdata);
+ 	if (error) {
+ 		dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");

+ 65 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-024-edt-ft5x06-fix-report-rate-for-M09.patch

@@ -0,0 +1,65 @@
+diff -Naurp a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
+--- a/drivers/input/touchscreen/edt-ft5x06.c	2018-02-13 23:46:04.845194636 +0100
++++ b/drivers/input/touchscreen/edt-ft5x06.c	2018-02-13 23:45:01.705110745 +0100
+@@ -53,6 +53,7 @@
+ #define M09_REGISTER_OFFSET		0x93
+ #define M09_REGISTER_NUM_X		0x94
+ #define M09_REGISTER_NUM_Y		0x95
++#define M09_REGISTER_REPORT_RATE	0x88
+ 
+ #define M12_REGISTER_THRESHOLD		0x80
+ #define M12_REGISTER_GAIN		0x92
+@@ -510,7 +511,7 @@ static EDT_ATTR(offset, S_IWUSR | S_IRUG
+ static EDT_ATTR(threshold, S_IWUSR | S_IRUGO, WORK_REGISTER_THRESHOLD,
+ 		M09_REGISTER_THRESHOLD, M12_REGISTER_THRESHOLD, 1, 255);
+ static EDT_ATTR(report_rate, S_IWUSR | S_IRUGO, WORK_REGISTER_REPORT_RATE,
+-		NO_REGISTER, M12_REGISTER_REPORT_RATE, 3, 14);
++		M09_REGISTER_REPORT_RATE, M12_REGISTER_REPORT_RATE, 3, 14);
+ 
+ static struct attribute *edt_ft5x06_attrs[] = {
+ 	&edt_ft5x06_attr_gain.dattr.attr,
+@@ -530,7 +531,7 @@ static int edt_ft5x06_factory_mode(struc
+ 	struct i2c_client *client = tsdata->client;
+ 	int retries = EDT_SWITCH_MODE_RETRIES;
+ 	int ret;
+-	int error;
++	int error = 0;
+ 
+ 	disable_irq(client->irq);
+ 
+@@ -570,7 +571,8 @@ static int edt_ft5x06_factory_mode(struc
+ 		error = -EIO;
+ 		goto err_out;
+ 	}
+-
++	
++	printk(KERN_INFO "EDT-TC: %s: set to factory mode\n", __func__);
+ 	return 0;
+ 
+ err_out:
+@@ -891,7 +893,8 @@ edt_ft5x06_ts_prepare_debugfs(struct edt
+ 			    tsdata->debug_dir, tsdata, &debugfs_raw_data_fops);
+ 			    
+ 	if (reg_addr->reg_report_rate != NO_REGISTER)
+-           debugfs_create_u32("report_rate", S_IRUSR, tsdata->debug_dir, &tsdata->report_rate);
++           debugfs_create_u32("report_rate", S_IRUSR, tsdata->debug_dir, 
++           	&tsdata->report_rate);
+            
+ 	debugfs_create_u32("invert_x", S_IRUSR | S_IWUSR,
+ 			    tsdata->debug_dir, &tsdata->invert_x);
+@@ -989,7 +992,6 @@ static int edt_ft5x06_ts_identify(struct
+ 	if (error)
+ 		return error;
+ 
+-        printk(KERN_INFO "EDT-TC:: %s ::-----%s----\n", __func__, rdbuf);
+ 	/* if we find something consistent, stay with that assumption
+ 	 * at least M09 won't send 3 bytes here
+ 	 */
+@@ -1148,6 +1150,7 @@ edt_ft5x06_ts_set_regs(struct edt_ft5x06
+ 
+ 	case M09:
+ 		reg_addr->reg_threshold = M09_REGISTER_THRESHOLD;
++		reg_addr->reg_report_rate = M09_REGISTER_REPORT_RATE;
+ 		reg_addr->reg_gain = M09_REGISTER_GAIN;
+ 		reg_addr->reg_offset = M09_REGISTER_OFFSET;
+ 		reg_addr->reg_num_x = M09_REGISTER_NUM_X;

+ 20 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-025-edt-ft5x06-fix-M9-M12-registercount-on-write.patch

@@ -0,0 +1,20 @@
+diff -Naurp a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
+--- a/drivers/input/touchscreen/edt-ft5x06.c	2018-02-20 20:55:48.828441552 +0100
++++ b/drivers/input/touchscreen/edt-ft5x06.c	2018-02-20 20:55:02.332357749 +0100
+@@ -292,7 +292,6 @@ static int edt_ft5x06_register_write(str
+ 	case M06:
+ 		wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc;
+ 		wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
+-		wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f;
+ 		wrbuf[2] = value;
+ 		wrbuf[3] = wrbuf[0] ^ wrbuf[1] ^ wrbuf[2];
+ 		return edt_ft5x06_ts_readwrite(tsdata->client, 4, wrbuf, 0, NULL);
+@@ -302,7 +301,7 @@ static int edt_ft5x06_register_write(str
+ 		wrbuf[0] = addr;
+ 		wrbuf[1] = value;
+ 
+-		return edt_ft5x06_ts_readwrite(tsdata->client, 3,
++		return edt_ft5x06_ts_readwrite(tsdata->client, 2,
+ 					wrbuf, 0, NULL);
+ 
+ 	default:

+ 39 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-026-gpio-pca953x-sitara-i2c-quirks.patch

@@ -0,0 +1,39 @@
+diff -Naurp a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
+--- a/drivers/gpio/gpio-pca953x.c	2018-03-05 08:25:33.000000000 +0100
++++ b/drivers/gpio/gpio-pca953x.c	2018-03-10 21:16:09.597556913 +0100
+@@ -123,10 +123,16 @@ static int pca953x_read_single(struct pc
+ 
+ 	ret = i2c_smbus_read_byte_data(chip->client,
+ 				(reg << bank_shift) + offset);
++
++	if (ret < 0) { /* only one retry due to i2c quirks */
++		/*dev_err(&chip->client->dev, "retry failed reading (single) register\n");*/
++		ret = i2c_smbus_read_byte_data(chip->client,
++				(reg << bank_shift) + offset);
++	}
+ 	*val = ret;
+ 
+ 	if (ret < 0) {
+-		dev_err(&chip->client->dev, "failed reading register\n");
++		dev_err(&chip->client->dev, "failed reading (single) register\n");
+ 		return ret;
+ 	}
+ 
+@@ -207,7 +213,7 @@ static int pca953x_read_regs(struct pca9
+ 		val[1] = (u16)ret >> 8;
+ 	}
+ 	if (ret < 0) {
+-		dev_err(&chip->client->dev, "failed reading register\n");
++		dev_err(&chip->client->dev, "failed reading (regs) register\n");
+ 		return ret;
+ 	}
+ 
+@@ -315,7 +321,7 @@ static int pca953x_gpio_get_value(struct
+ 		 * do unless gpio_*_value_cansleep() calls become different
+ 		 * from their nonsleeping siblings (and report faults).
+ 		 */
+-		return 0;
++		return 1;
+ 	}
+ 
+ 	return (reg_val & (1u << (off % BANK_SZ))) ? 1 : 0;

+ 28 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-027-input_events_add_IN1-IN4.patch

@@ -0,0 +1,28 @@
+diff -Naurp a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
+--- a/include/linux/mod_devicetable.h	2018-02-19 11:38:07.000000000 +0100
++++ b/include/linux/mod_devicetable.h	2018-05-04 21:39:09.862508306 +0200
+@@ -291,7 +291,7 @@ struct pcmcia_device_id {
+ #define INPUT_DEVICE_ID_LED_MAX		0x0f
+ #define INPUT_DEVICE_ID_SND_MAX		0x07
+ #define INPUT_DEVICE_ID_FF_MAX		0x7f
+-#define INPUT_DEVICE_ID_SW_MAX		0x0f
++#define INPUT_DEVICE_ID_SW_MAX		0x13
+ 
+ #define INPUT_DEVICE_ID_MATCH_BUS	1
+ #define INPUT_DEVICE_ID_MATCH_VENDOR	2
+diff a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
+--- a/include/uapi/linux/input-event-codes.h	2018-02-19 11:38:08.000000000 +0100
++++ b/include/uapi/linux/input-event-codes.h	2018-05-04 21:36:45.066395759 +0200
+@@ -749,7 +749,11 @@
+ #define SW_ROTATE_LOCK		0x0c  /* set = rotate locked/disabled */
+ #define SW_LINEIN_INSERT	0x0d  /* set = inserted */
+ #define SW_MUTE_DEVICE		0x0e  /* set = device disabled */
+-#define SW_MAX			0x0f
++#define SW_IO1			0x0f
++#define SW_IO2			0x10
++#define SW_IO3			0x11
++#define SW_IO4			0x12
++#define SW_MAX			0x13
+ #define SW_CNT			(SW_MAX+1)
+ 
+ /*

+ 3583 - 0
board/GfA/Display001/linux_4.4.145_bone23/linux-030-atmel_mxt_ts_backport.patch

@@ -0,0 +1,3583 @@
+diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
+index 700ae2f..2979cf3 100644
+--- a/drivers/input/touchscreen/atmel_mxt_ts.c
++++ b/drivers/input/touchscreen/atmel_mxt_ts.c
+@@ -4,6 +4,7 @@
+  * Copyright (C) 2010 Samsung Electronics Co.Ltd
+  * Copyright (C) 2011-2014 Atmel Corporation
+  * Copyright (C) 2012 Google, Inc.
++ * Copyright (C) 2016 Zodiac Inflight Innovations
+  *
+  * Author: Joonyoung Shim <jy0922.shim@samsung.com>
+  *
+@@ -22,16 +23,22 @@
+ #include <linux/delay.h>
+ #include <linux/firmware.h>
+ #include <linux/i2c.h>
+-#include <linux/platform_data/atmel_mxt_ts.h>
+ #include <linux/input/mt.h>
+-#include <linux/input/touchscreen.h>
+ #include <linux/interrupt.h>
+ #include <linux/of.h>
++#include <linux/property.h>
+ #include <linux/slab.h>
++#include <linux/gpio/consumer.h>
+ #include <asm/unaligned.h>
++#include <media/v4l2-device.h>
++#include <media/v4l2-ioctl.h>
++#include <media/videobuf2-v4l2.h>
++#include <media/videobuf2-vmalloc.h>
+ 
+ /* Firmware files */
+ #define MXT_FW_NAME		"maxtouch.fw"
++
++/* Configuration file */
+ #define MXT_CFG_NAME		"maxtouch.cfg"
+ #define MXT_CFG_MAGIC		"OBP_RAW V1"
+ 
+@@ -41,35 +48,62 @@
+ #define MXT_INFO_CHECKSUM_SIZE	3
+ #define MXT_MAX_BLOCK_WRITE	256
+ 
+-/* Object types */
+-#define MXT_DEBUG_DIAGNOSTIC_T37	37
++/* Objects */
+ #define MXT_GEN_MESSAGE_T5		5
+ #define MXT_GEN_COMMAND_T6		6
+ #define MXT_GEN_POWER_T7		7
+ #define MXT_GEN_ACQUIRE_T8		8
+-#define MXT_GEN_DATASOURCE_T53		53
+ #define MXT_TOUCH_MULTI_T9		9
++#define MXT_PROCI_KEYTHRESHOLD_T14	14
+ #define MXT_TOUCH_KEYARRAY_T15		15
++#define MXT_SPT_COMMSCONFIG_T18		18
++#define MXT_SPT_GPIOPWM_T19		19
+ #define MXT_TOUCH_PROXIMITY_T23		23
+ #define MXT_TOUCH_PROXKEY_T52		52
+ #define MXT_PROCI_GRIPFACE_T20		20
+ #define MXT_PROCG_NOISE_T22		22
+ #define MXT_PROCI_ONETOUCH_T24		24
++#define MXT_SPT_SELFTEST_T25		25
+ #define MXT_PROCI_TWOTOUCH_T27		27
++#define MXT_SPT_CTECONFIG_T28		28
++#define MXT_DEBUG_DIAGNOSTIC_T37	37
++#define MXT_SPT_USERDATA_T38		38
+ #define MXT_PROCI_GRIP_T40		40
+ #define MXT_PROCI_PALM_T41		41
+ #define MXT_PROCI_TOUCHSUPPRESSION_T42	42
+-#define MXT_PROCI_STYLUS_T47		47
+-#define MXT_PROCG_NOISESUPPRESSION_T48	48
+-#define MXT_SPT_COMMSCONFIG_T18		18
+-#define MXT_SPT_GPIOPWM_T19		19
+-#define MXT_SPT_SELFTEST_T25		25
+-#define MXT_SPT_CTECONFIG_T28		28
+-#define MXT_SPT_USERDATA_T38		38
+ #define MXT_SPT_DIGITIZER_T43		43
+ #define MXT_SPT_MESSAGECOUNT_T44	44
+ #define MXT_SPT_CTECONFIG_T46		46
+-#define MXT_TOUCH_MULTITOUCHSCREEN_T100 100
++#define MXT_PROCI_STYLUS_T47		47
++#define MXT_PROCG_NOISESUPPRESSION_T48	48
++#define MXT_GEN_DATASOURCE_T53		53
++#define MXT_PROCI_SHIELDLESS_T56	56
++#define MXT_SPT_TIMER_T61		61
++#define MXT_PROCI_LENSBENDING_T65	65
++#define MXT_SPT_SERIALDATACOMMAND_T68	68
++#define MXT_SPT_DYNAMICCONFIGURATIONCONTROLLER_T70 70
++#define MXT_SPT_DYNAMICCONFIGURATIONCONTAINER_T71  71
++#define MXT_NOISESUPPRESSION_T72		   72
++#define MXT_SPT_CTESCANCONFIG_T77		   77
++#define MXT_PROCI_GLOVEDETECTION_T78		   78
++#define MXT_SPT_TOUCHEVENTTRIGGER_T79		   79
++#define MXT_PROCI_RETRANSMISSIONCOMPENSATION_T80   80
++#define MXT_PROCG_NOISESUPACTIVESTYLUS_T86	   86
++#define MXT_PROCI_SYMBOLGESTUREPROCESSOR_T92	   92
++#define MXT_PROCI_TOUCHSEQUENCELOGGER_T93	   93
++#define MXT_TOUCH_MULTITOUCHSCREEN_T100 	   100
++#define MXT_SPT_AUXTOUCHCONFIG_T104		   104
++#define MXT_PROCG_NOISESUPSELFCAP_T108		   108
++#define MXT_SPT_SELFCAPGLOBALCONFIG_T109	   109
++#define MXT_PROCI_ACTIVESTYLUS_T107		   107
++#define MXT_SPT_CAPTUNINGPARAMS_T110		   110
++#define MXT_SPT_SELFCAPCONFIG_T111		   111
++#define MXT_PROCI_SELFCAPGRIPSUPPRESSION_T112	   112
++#define MXT_SPT_PROXMEASURECONFIG_T113		   113
++#define MXT_ACTIVESTYLUSMEASCONFIG_T114		   114
++#define MXT_SPT_DATACONTAINERCTRL_T118		   118
++#define MXT_PROCI_HOVERGESTUREPROCESSOR_T129	   129
++#define MXT_SPT_SELCAPVOLTAGEMODE_T133		   133
+ 
+ /* MXT_GEN_MESSAGE_T5 object */
+ #define MXT_RPTID_NOMSG		0xff
+@@ -82,12 +116,12 @@
+ #define MXT_COMMAND_DIAGNOSTIC	5
+ 
+ /* Define for T6 status byte */
+-#define MXT_T6_STATUS_RESET	(1 << 7)
+-#define MXT_T6_STATUS_OFL	(1 << 6)
+-#define MXT_T6_STATUS_SIGERR	(1 << 5)
+-#define MXT_T6_STATUS_CAL	(1 << 4)
+-#define MXT_T6_STATUS_CFGERR	(1 << 3)
+-#define MXT_T6_STATUS_COMSERR	(1 << 2)
++#define MXT_T6_STATUS_RESET	BIT(7)
++#define MXT_T6_STATUS_OFL	BIT(6)
++#define MXT_T6_STATUS_SIGERR	BIT(5)
++#define MXT_T6_STATUS_CAL	BIT(4)
++#define MXT_T6_STATUS_CFGERR	BIT(3)
++#define MXT_T6_STATUS_COMSERR	BIT(2)
+ 
+ /* MXT_GEN_POWER_T7 field */
+ struct t7_config {
+@@ -100,18 +134,20 @@ struct t7_config {
+ 
+ /* MXT_TOUCH_MULTI_T9 field */
+ #define MXT_T9_CTRL		0
++#define MXT_T9_XSIZE		3
++#define MXT_T9_YSIZE		4
+ #define MXT_T9_ORIENT		9
+ #define MXT_T9_RANGE		18
+ 
+ /* MXT_TOUCH_MULTI_T9 status */
+-#define MXT_T9_UNGRIP		(1 << 0)
+-#define MXT_T9_SUPPRESS		(1 << 1)
+-#define MXT_T9_AMP		(1 << 2)
+-#define MXT_T9_VECTOR		(1 << 3)
+-#define MXT_T9_MOVE		(1 << 4)
+-#define MXT_T9_RELEASE		(1 << 5)
+-#define MXT_T9_PRESS		(1 << 6)
+-#define MXT_T9_DETECT		(1 << 7)
++#define MXT_T9_UNGRIP		BIT(0)
++#define MXT_T9_SUPPRESS		BIT(1)
++#define MXT_T9_AMP		BIT(2)
++#define MXT_T9_VECTOR		BIT(3)
++#define MXT_T9_MOVE		BIT(4)
++#define MXT_T9_RELEASE		BIT(5)
++#define MXT_T9_PRESS		BIT(6)
++#define MXT_T9_DETECT		BIT(7)
+ 
+ struct t9_range {
+ 	__le16 x;
+@@ -119,36 +155,70 @@ struct t9_range {
+ } __packed;
+ 
+ /* MXT_TOUCH_MULTI_T9 orient */
+-#define MXT_T9_ORIENT_SWITCH	(1 << 0)
++#define MXT_T9_ORIENT_SWITCH	BIT(0)
++#define MXT_T9_ORIENT_INVERTX	BIT(1)
++#define MXT_T9_ORIENT_INVERTY	BIT(2)
+ 
+ /* MXT_SPT_COMMSCONFIG_T18 */
+ #define MXT_COMMS_CTRL		0
+ #define MXT_COMMS_CMD		1
+ 
++/* MXT_DEBUG_DIAGNOSTIC_T37 */
++#define MXT_DIAGNOSTIC_PAGEUP	0x01
++#define MXT_DIAGNOSTIC_DELTAS	0x10
++#define MXT_DIAGNOSTIC_REFS	0x11
++#define MXT_DIAGNOSTIC_SIZE	128
++
++#define MXT_FAMILY_1386			160
++#define MXT1386_COLUMNS			3
++#define MXT1386_PAGES_PER_COLUMN	8
++
++struct t37_debug {
++#ifdef CONFIG_TOUCHSCREEN_ATMEL_MXT_T37
++	u8 mode;
++	u8 page;
++	u8 data[MXT_DIAGNOSTIC_SIZE];
++#endif
++};
++
+ /* Define for MXT_GEN_COMMAND_T6 */
+ #define MXT_BOOT_VALUE		0xa5
+ #define MXT_RESET_VALUE		0x01
+ #define MXT_BACKUP_VALUE	0x55
++#define MXT_BACKUP_W_STOP	0x33
++
++/* Define for MXT_PROCI_TOUCHSUPPRESSION_T42 */
++#define MXT_T42_MSG_TCHSUP	BIT(0)
+ 
+ /* T100 Multiple Touch Touchscreen */
+ #define MXT_T100_CTRL		0
+ #define MXT_T100_CFG1		1
+ #define MXT_T100_TCHAUX		3
++#define MXT_T100_XSIZE		9
+ #define MXT_T100_XRANGE		13
++#define MXT_T100_YSIZE		20
+ #define MXT_T100_YRANGE		24
++#define MXT_T100_AUX_OFFSET	6
++#define MXT_RSVD_RPTIDS		2
++#define MXT_MIN_RPTID_SEC	18
+ 
+ #define MXT_T100_CFG_SWITCHXY	BIT(5)
++#define MXT_T100_CFG_INVERTY	BIT(6)
++#define MXT_T100_CFG_INVERTX	BIT(7)
+ 
+ #define MXT_T100_TCHAUX_VECT	BIT(0)
+ #define MXT_T100_TCHAUX_AMPL	BIT(1)
+ #define MXT_T100_TCHAUX_AREA	BIT(2)
+-
+ #define MXT_T100_DETECT		BIT(7)
+-#define MXT_T100_TYPE_MASK	0x70
++
++#define MXT_T100_TYPE_MASK		0x70
++#define MXT_T100_ENABLE_BIT_MASK	0x01
++
+ 
+ enum t100_type {
+ 	MXT_T100_TYPE_FINGER		= 1,
+ 	MXT_T100_TYPE_PASSIVE_STYLUS	= 2,
++	MXT_T100_TYPE_ACTIVE_STYLUS	= 3,
+ 	MXT_T100_TYPE_HOVERING_FINGER	= 4,
+ 	MXT_T100_TYPE_GLOVE		= 5,
+ 	MXT_T100_TYPE_LARGE_TOUCH	= 6,
+@@ -160,13 +230,27 @@ enum t100_type {
+ #define MXT_TOUCH_MAJOR_DEFAULT		1
+ #define MXT_PRESSURE_DEFAULT		1
+ 
++/* Gen2 Active Stylus */
++#define MXT_T107_STYLUS_STYAUX		42
++#define MXT_T107_STYLUS_STYAUX_PRESSURE	BIT(0)
++#define MXT_T107_STYLUS_STYAUX_PEAK	BIT(4)
++
++#define MXT_T107_STYLUS_HOVER		BIT(0)
++#define MXT_T107_STYLUS_TIPSWITCH	BIT(1)
++#define MXT_T107_STYLUS_BUTTON0		BIT(2)
++#define MXT_T107_STYLUS_BUTTON1		BIT(3)
++
+ /* Delay times */
+ #define MXT_BACKUP_TIME		50	/* msec */
++#define MXT_RESET_GPIO_TIME	20	/* msec */
++#define MXT_RESET_INVALID_CHG	100	/* msec */
+ #define MXT_RESET_TIME		200	/* msec */
+ #define MXT_RESET_TIMEOUT	3000	/* msec */
+ #define MXT_CRC_TIMEOUT		1000	/* msec */
++#define MXT_FW_FLASH_TIME	1000	/* msec */
+ #define MXT_FW_RESET_TIME	3000	/* msec */
+ #define MXT_FW_CHG_TIMEOUT	300	/* msec */
++#define MXT_BOOTLOADER_WAIT	3000	/* msec */
+ 
+ /* Command to unlock bootloader */
+ #define MXT_UNLOCK_CMD_MSB	0xaa
+@@ -180,14 +264,16 @@ enum t100_type {
+ #define MXT_FRAME_CRC_PASS	0x04
+ #define MXT_APP_CRC_FAIL	0x40	/* valid 7 8 bit only */
+ #define MXT_BOOT_STATUS_MASK	0x3f
+-#define MXT_BOOT_EXTENDED_ID	(1 << 5)
++#define MXT_BOOT_EXTENDED_ID	BIT(5)
+ #define MXT_BOOT_ID_MASK	0x1f
+ 
+ /* Touchscreen absolute values */
+ #define MXT_MAX_AREA		0xff
+-
+ #define MXT_PIXELS_PER_MM	20
+ 
++/* Debug message size max */
++#define DEBUG_MSG_MAX		200
++
+ struct mxt_info {
+ 	u8 family_id;
+ 	u8 variant_id;
+@@ -206,26 +292,84 @@ struct mxt_object {
+ 	u8 num_report_ids;
+ } __packed;
+ 
++struct mxt_dbg {
++	u16 t37_address;
++	u16 diag_cmd_address;
++	struct t37_debug *t37_buf;
++	unsigned int t37_pages;
++	unsigned int t37_nodes;
++
++	struct v4l2_device v4l2;
++	struct v4l2_pix_format format;
++	struct video_device vdev;
++	struct vb2_queue queue;
++	struct mutex lock;
++	int input;
++};
++
++enum v4l_dbg_inputs {
++	MXT_V4L_INPUT_DELTAS,
++	MXT_V4L_INPUT_REFS,
++	MXT_V4L_INPUT_MAX,
++};
++
++static const struct v4l2_file_operations mxt_video_fops = {
++	.owner = THIS_MODULE,
++	.open = v4l2_fh_open,
++	.release = vb2_fop_release,
++	.unlocked_ioctl = video_ioctl2,
++	.read = vb2_fop_read,
++	.mmap = vb2_fop_mmap,
++	.poll = vb2_fop_poll,
++};
++
++enum mxt_suspend_mode {
++	MXT_SUSPEND_DEEP_SLEEP	= 0,
++	MXT_SUSPEND_T9_CTRL	= 1,
++};
++
++/* Config update context */
++struct mxt_cfg {
++	u8 *raw;
++	size_t raw_size;
++	off_t raw_pos;
++
++	u8 *mem;
++	size_t mem_size;
++	int start_ofs;
++
++	struct mxt_info info;
++};
++
+ /* Each client has this additional data */
+ struct mxt_data {
+ 	struct i2c_client *client;
+ 	struct input_dev *input_dev;
++	struct input_dev *input_dev_sec;
+ 	char phys[64];		/* device physical location */
+-	const struct mxt_platform_data *pdata;
+ 	struct mxt_object *object_table;
+-	struct mxt_info info;
++	struct mxt_info *info;
++	void *raw_info_block;
+ 	unsigned int irq;
+ 	unsigned int max_x;
+ 	unsigned int max_y;
+-	bool invert_x;
+-	bool invert_y;
+-	bool swap_x_y;
++	bool invertx;
++	bool inverty;
+ 	bool xy_switch;
++	u8 xsize;
++	u8 ysize;
+ 	bool in_bootloader;
+ 	u16 mem_size;
+ 	u8 t100_aux_ampl;
+ 	u8 t100_aux_area;
+ 	u8 t100_aux_vect;
++	struct bin_attribute mem_access_attr;
++	bool debug_enabled;
++	bool debug_v2_enabled;
++	u8 *debug_msg_data;
++	u16 debug_msg_count;
++	struct bin_attribute debug_msg_attr;
++	struct mutex debug_msg_lock;
+ 	u8 max_reportid;
+ 	u32 config_crc;
+ 	u32 info_crc;
+@@ -233,10 +377,16 @@ struct mxt_data {
+ 	u8 *msg_buf;
+ 	u8 t6_status;
+ 	bool update_input;
++	bool update_input_sec;
+ 	u8 last_message_count;
+ 	u8 num_touchids;
+ 	u8 multitouch;
+ 	struct t7_config t7_cfg;
++	unsigned long t15_keystatus;
++	u8 stylus_aux_pressure;
++	u8 stylus_aux_peak;
++	struct mxt_dbg dbg;
++	struct gpio_desc *reset_gpio;
+ 
+ 	/* Cached parameters from object table */
+ 	u16 T5_address;
+@@ -244,12 +394,52 @@ struct mxt_data {
+ 	u8 T6_reportid;
+ 	u16 T6_address;
+ 	u16 T7_address;
++	u16 T14_address;
++	u16 T71_address;
+ 	u8 T9_reportid_min;
+ 	u8 T9_reportid_max;
+-	u8 T19_reportid;
++	u8 T15_reportid_min;
++	u8 T15_reportid_max;
++	u16 T18_address;
++	u8 T19_reportid_min;
++	u8 T24_reportid_min;
++	u8 T24_reportid_max;
++	u8 T25_reportid_min;
++	u8 T27_reportid_min;
++	u8 T27_reportid_max;
++	u8 T42_reportid_min;
++	u8 T42_reportid_max;
+ 	u16 T44_address;
++	u8 T46_reportid_min;	
++	u8 T48_reportid_min;
++	u8 T56_reportid_min;
++	u8 T61_reportid_min;
++	u8 T61_reportid_max;
++	u8 T65_reportid_min;
++	u8 T65_reportid_max;
++	u8 T68_reportid_min;
++	u8 T70_reportid_min;
++	u8 T70_reportid_max;
++	u8 T72_reportid_min;
++	u8 T80_reportid_min;
++	u8 T80_reportid_max;
++	u16 T92_address;
++	u8 T92_reportid_min;
++	u16 T93_address;
++	u8 T93_reportid_min;
+ 	u8 T100_reportid_min;
+ 	u8 T100_reportid_max;
++	u16 T107_address;
++	u8 T108_reportid_min;
++	u8 T109_reportid_min;
++	u8 T112_reportid_min;
++	u8 T112_reportid_max;
++	u8 T129_reportid_min;
++	u8 T133_reportid_min;
++	
++	/* Cached instance parameter */
++	u8 T100_instances;
++	u8 T15_instances;
+ 
+ 	/* for fw update in bootloader */
+ 	struct completion bl_completion;
+@@ -259,23 +449,24 @@ struct mxt_data {
+ 
+ 	/* for config update handling */
+ 	struct completion crc_completion;
+-};
+ 
+-static void mxt_apply_prop_to_x_y(const struct mxt_data *data,
+-                             int *x, int *y)
+-{
+-        if (data->invert_x)
+-                *x = data->max_x - *x;
++	u32 *t19_keymap;
++	unsigned int t19_num_keys;
+ 
+-        if (data->invert_y)
+-                *y = data->max_y - *y;
++	u32 *t15_keymap;
++	unsigned int t15_num_keys;
+ 
+-        if (data->swap_x_y)
+-                swap(*x, *y);
+-}
++	enum mxt_suspend_mode suspend_mode;
+ 
++	/* Indicates whether device is updating configuration */
++	bool sysfs_updating_config;
+ 
++};
+ 
++struct mxt_vb2_buffer {
++	struct vb2_buffer	vb;
++	struct list_head	list;
++};
+ 
+ static size_t mxt_obj_size(const struct mxt_object *obj)
+ {
+@@ -298,6 +489,7 @@ static bool mxt_object_readable(unsigned int type)
+ 	case MXT_TOUCH_KEYARRAY_T15:
+ 	case MXT_TOUCH_PROXIMITY_T23:
+ 	case MXT_TOUCH_PROXKEY_T52:
++	case MXT_TOUCH_MULTITOUCHSCREEN_T100:
+ 	case MXT_PROCI_GRIPFACE_T20:
+ 	case MXT_PROCG_NOISE_T22:
+ 	case MXT_PROCI_ONETOUCH_T24:
+@@ -314,6 +506,16 @@ static bool mxt_object_readable(unsigned int type)
+ 	case MXT_SPT_USERDATA_T38:
+ 	case MXT_SPT_DIGITIZER_T43:
+ 	case MXT_SPT_CTECONFIG_T46:
++	case MXT_PROCI_SHIELDLESS_T56:
++	case MXT_SPT_TIMER_T61:
++	case MXT_PROCI_LENSBENDING_T65:
++	case MXT_SPT_DYNAMICCONFIGURATIONCONTROLLER_T70:
++	case MXT_SPT_DYNAMICCONFIGURATIONCONTAINER_T71:
++	case MXT_NOISESUPPRESSION_T72:
++	case MXT_PROCI_GLOVEDETECTION_T78:
++	case MXT_SPT_TOUCHEVENTTRIGGER_T79:
++	case MXT_PROCI_RETRANSMISSIONCOMPENSATION_T80:
++
+ 		return true;
+ 	default:
+ 		return false;
+@@ -326,6 +528,136 @@ static void mxt_dump_message(struct mxt_data *data, u8 *message)
+ 		data->T5_msg_size, message);
+ }
+ 
++static void mxt_debug_msg_enable(struct mxt_data *data)
++{
++	struct device *dev = &data->client->dev;
++
++	if (data->debug_v2_enabled)
++		return;
++
++	mutex_lock(&data->debug_msg_lock);
++
++	data->debug_msg_data = kcalloc(DEBUG_MSG_MAX,
++				data->T5_msg_size, GFP_KERNEL);
++	if (!data->debug_msg_data)
++		return;
++
++	data->debug_v2_enabled = true;
++	mutex_unlock(&data->debug_msg_lock);
++
++	dev_dbg(dev, "Enabled message output\n");
++}
++
++static void mxt_debug_msg_disable(struct mxt_data *data)
++{
++	struct device *dev = &data->client->dev;
++
++	if (!data->debug_v2_enabled)
++		return;
++
++	data->debug_v2_enabled = false;
++
++	mutex_lock(&data->debug_msg_lock);
++	kfree(data->debug_msg_data);
++	data->debug_msg_data = NULL;
++	data->debug_msg_count = 0;
++	mutex_unlock(&data->debug_msg_lock);
++	dev_dbg(dev, "Disabled message output\n");
++}
++
++static void mxt_debug_msg_add(struct mxt_data *data, u8 *msg)
++{
++	struct device *dev = &data->client->dev;
++
++	mutex_lock(&data->debug_msg_lock);
++
++	if (!data->debug_msg_data) {
++		dev_err(dev, "No buffer!\n");
++		return;
++	}
++
++	if (data->debug_msg_count < DEBUG_MSG_MAX) {
++		memcpy(data->debug_msg_data +
++		       data->debug_msg_count * data->T5_msg_size,
++		       msg,
++		       data->T5_msg_size);
++		data->debug_msg_count++;
++	} else {
++		dev_dbg(dev, "Discarding %u messages\n", data->debug_msg_count);
++		data->debug_msg_count = 0;
++	}
++
++	mutex_unlock(&data->debug_msg_lock);
++
++	sysfs_notify(&data->client->dev.kobj, NULL, "debug_notify");
++}
++
++static ssize_t mxt_debug_msg_write(struct file *filp, struct kobject *kobj,
++	struct bin_attribute *bin_attr, char *buf, loff_t off,
++	size_t count)
++{
++	return -EIO;
++}
++
++static ssize_t mxt_debug_msg_read(struct file *filp, struct kobject *kobj,
++	struct bin_attribute *bin_attr, char *buf, loff_t off, size_t bytes)
++{
++	struct device *dev = container_of(kobj, struct device, kobj);
++	struct mxt_data *data = dev_get_drvdata(dev);
++	int count;
++	size_t bytes_read;
++
++	if (!data->debug_msg_data) {
++		dev_err(dev, "No buffer!\n");
++		return 0;
++	}
++
++	count = bytes / data->T5_msg_size;
++
++	if (count > DEBUG_MSG_MAX)
++		count = DEBUG_MSG_MAX;
++
++	mutex_lock(&data->debug_msg_lock);
++
++	if (count > data->debug_msg_count)
++		count = data->debug_msg_count;
++
++	bytes_read = count * data->T5_msg_size;
++
++	memcpy(buf, data->debug_msg_data, bytes_read);
++	data->debug_msg_count = 0;
++
++	mutex_unlock(&data->debug_msg_lock);
++
++	return bytes_read;
++}
++
++static int mxt_debug_msg_init(struct mxt_data *data)
++{
++	sysfs_bin_attr_init(&data->debug_msg_attr);
++	data->debug_msg_attr.attr.name = "debug_msg";
++	data->debug_msg_attr.attr.mode = 0666;
++	data->debug_msg_attr.read = mxt_debug_msg_read;
++	data->debug_msg_attr.write = mxt_debug_msg_write;
++	data->debug_msg_attr.size = data->T5_msg_size * DEBUG_MSG_MAX;
++
++	if (sysfs_create_bin_file(&data->client->dev.kobj,
++				  &data->debug_msg_attr) < 0) {
++		dev_err(&data->client->dev, "Failed to create %s\n",
++			data->debug_msg_attr.attr.name);
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static void mxt_debug_msg_remove(struct mxt_data *data)
++{
++	if (data->debug_msg_attr.attr.name)
++		sysfs_remove_bin_file(&data->client->dev.kobj,
++				      &data->debug_msg_attr);
++}
++
+ static int mxt_wait_for_completion(struct mxt_data *data,
+ 				   struct completion *comp,
+ 				   unsigned int timeout_ms)
+@@ -373,13 +705,21 @@ static int mxt_bootloader_write(struct mxt_data *data,
+ {
+ 	int ret;
+ 	struct i2c_msg msg;
++	u8 *data_buf;
++
++	data_buf = kmalloc(count, GFP_KERNEL);
++	if (!data_buf)
++		return -ENOMEM;
++	
++	memcpy(&data_buf[0], val, count);
+ 
+ 	msg.addr = data->bootloader_addr;
+ 	msg.flags = data->client->flags & I2C_M_TEN;
+ 	msg.len = count;
+-	msg.buf = (u8 *)val;
++	msg.buf = data_buf;
+ 
+ 	ret = i2c_transfer(data->client->adapter, &msg, 1);
++
+ 	if (ret == 1) {
+ 		ret = 0;
+ 	} else {
+@@ -395,12 +735,13 @@ static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry)
+ {
+ 	u8 appmode = data->client->addr;
+ 	u8 bootloader;
++	u8 family_id = data->info ? data->info->family_id : 0;
+ 
+ 	switch (appmode) {
+ 	case 0x4a:
+ 	case 0x4b:
+ 		/* Chips after 1664S use different scheme */
+-		if (retry || data->info.family_id >= 0xa2) {
++		if (retry || family_id >= 0xa2) {
+ 			bootloader = appmode - 0x24;
+ 			break;
+ 		}
+@@ -420,6 +761,9 @@ static int mxt_lookup_bootloader_address(struct mxt_data *data, bool retry)
+ 	}
+ 
+ 	data->bootloader_addr = bootloader;
++
++	dev_info(&data->client->dev, "Bootloader address: %x\n", bootloader);
++
+ 	return 0;
+ }
+ 
+@@ -621,13 +965,12 @@ static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)
+ 	return __mxt_write_reg(client, reg, 1, &val);
+ }
+ 
+-static struct mxt_object *
+-mxt_get_object(struct mxt_data *data, u8 type)
++static struct mxt_object *mxt_get_object(struct mxt_data *data, u8 type)
+ {
+ 	struct mxt_object *object;
+ 	int i;
+ 
+-	for (i = 0; i < data->info.object_num; i++) {
++	for (i = 0; i < data->info->object_num; i++) {
+ 		object = data->object_table + i;
+ 		if (object->type == type)
+ 			return object;
+@@ -643,13 +986,13 @@ static void mxt_proc_t6_messages(struct mxt_data *data, u8 *msg)
+ 	u8 status = msg[1];
+ 	u32 crc = msg[2] | (msg[3] << 8) | (msg[4] << 16);
+ 
+-	complete(&data->crc_completion);
+-
+ 	if (crc != data->config_crc) {
+ 		data->config_crc = crc;
+ 		dev_dbg(dev, "T6 Config Checksum: 0x%06X\n", crc);
+ 	}
+ 
++	complete(&data->crc_completion);
++
+ 	/* Detect reset */
+ 	if (status & MXT_T6_STATUS_RESET)
+ 		complete(&data->reset_completion);
+@@ -687,15 +1030,14 @@ static int mxt_write_object(struct mxt_data *data,
+ static void mxt_input_button(struct mxt_data *data, u8 *message)
+ {
+ 	struct input_dev *input = data->input_dev;
+-	const struct mxt_platform_data *pdata = data->pdata;
+ 	int i;
+ 
+-	for (i = 0; i < pdata->t19_num_keys; i++) {
+-		if (pdata->t19_keymap[i] == KEY_RESERVED)
++	for (i = 0; i < data->t19_num_keys; i++) {
++		if (data->t19_keymap[i] == KEY_RESERVED)
+ 			continue;
+ 
+ 		/* Active-low switch */
+-		input_report_key(input, pdata->t19_keymap[i],
++		input_report_key(input, data->t19_keymap[i],
+ 				 !(message[1] & BIT(i)));
+ 	}
+ }
+@@ -703,8 +1045,14 @@ static void mxt_input_button(struct mxt_data *data, u8 *message)
+ static void mxt_input_sync(struct mxt_data *data)
+ {
+ 	input_mt_report_pointer_emulation(data->input_dev,
+-					  data->pdata->t19_num_keys);
+-	input_sync(data->input_dev);
++					  data->t19_num_keys);
++	
++	if (data->update_input) 
++		input_sync(data->input_dev);
++	
++	if (data->update_input_sec)
++		input_sync(data->input_dev_sec);
++	
+ }
+ 
+ static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
+@@ -717,6 +1065,7 @@ static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
+ 	int y;
+ 	int area;
+ 	int amplitude;
++	int tool;
+ 
+ 	id = message[0] - data->T9_reportid_min;
+ 	status = message[1];
+@@ -759,10 +1108,20 @@ static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
+ 			mxt_input_sync(data);
+ 		}
+ 
++		/* A size of zero indicates touch is from a linked T47 Stylus */
++		if (area == 0) {
++			area = MXT_TOUCH_MAJOR_DEFAULT;
++			tool = MT_TOOL_PEN;
++		} else {
++			tool = MT_TOOL_FINGER;
++		}
++
++		/* if active, pressure must be non-zero */
++		if (!amplitude)
++			amplitude = MXT_PRESSURE_DEFAULT;
++
+ 		/* Touch active */
+-		input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, 1);
+-		mxt_apply_prop_to_x_y(data, &x, &y);
+-		
++		input_mt_report_slot_state(input_dev, tool, 1);
+ 		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
+ 		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
+ 		input_report_abs(input_dev, ABS_MT_PRESSURE, amplitude);
+@@ -779,27 +1138,38 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ {
+ 	struct device *dev = &data->client->dev;
+ 	struct input_dev *input_dev = data->input_dev;
+-	int id;
++	struct input_dev *input_dev_sec = data->input_dev_sec;
++	int id = 0;
++	int id_sec = 0;
+ 	u8 status;
+ 	u8 type = 0;
+-	/*u16*/ int x;
+-	/*u16*/ int y;
++	u16 x;
++	u16 y;
+ 	int distance = 0;
+ 	int tool = 0;
+ 	u8 major = 0;
+ 	u8 pressure = 0;
+ 	u8 orientation = 0;
++	bool hover = false;
++	
++	/* Determine id of touch messages only */
++	id = (message[0] - data->T100_reportid_min - MXT_RSVD_RPTIDS);
++	
++	if (id >= MXT_MIN_RPTID_SEC) {
++		id_sec = (message[0] - data->T100_reportid_min - MXT_MIN_RPTID_SEC - 
++			MXT_RSVD_RPTIDS);
++	}
+ 
+-	id = message[0] - data->T100_reportid_min - 2;
+-
+-	/* ignore SCRSTATUS events */
+-	if (id < 0)
++	/* Skip SCRSTATUS events */
++	if (id < 0 || id_sec < 0)
+ 		return;
+ 
+ 	status = message[1];
+ 	x = get_unaligned_le16(&message[2]);
+ 	y = get_unaligned_le16(&message[4]);
+-
++	
++	/* Get other auxdata[] bytes if present */
++	
+ 	if (status & MXT_T100_DETECT) {
+ 		type = (status & MXT_T100_TYPE_MASK) >> 4;
+ 
+@@ -807,6 +1177,7 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ 		case MXT_T100_TYPE_HOVERING_FINGER:
+ 			tool = MT_TOOL_FINGER;
+ 			distance = MXT_DISTANCE_HOVERING;
++			hover = true;
+ 
+ 			if (data->t100_aux_vect)
+ 				orientation = message[data->t100_aux_vect];
+@@ -817,6 +1188,7 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ 		case MXT_T100_TYPE_GLOVE:
+ 			tool = MT_TOOL_FINGER;
+ 			distance = MXT_DISTANCE_ACTIVE_TOUCH;
++			hover = false;
+ 
+ 			if (data->t100_aux_area)
+ 				major = message[data->t100_aux_area];
+@@ -831,6 +1203,8 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ 
+ 		case MXT_T100_TYPE_PASSIVE_STYLUS:
+ 			tool = MT_TOOL_PEN;
++			distance = MXT_DISTANCE_ACTIVE_TOUCH;
++			hover = false;
+ 
+ 			/*
+ 			 * Passive stylus is reported with size zero so
+@@ -843,6 +1217,30 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ 
+ 			break;
+ 
++		case MXT_T100_TYPE_ACTIVE_STYLUS:
++			/* Report input buttons */
++			input_report_key(input_dev, BTN_STYLUS,
++					 message[6] & MXT_T107_STYLUS_BUTTON0);
++			input_report_key(input_dev, BTN_STYLUS2,
++					 message[6] & MXT_T107_STYLUS_BUTTON1);
++
++			/* stylus in range, but position unavailable */
++			if (!(message[6] & MXT_T107_STYLUS_HOVER))
++				break;
++
++			tool = MT_TOOL_PEN;
++			distance = MXT_DISTANCE_ACTIVE_TOUCH;
++			major = MXT_TOUCH_MAJOR_DEFAULT;
++
++			if (!(message[6] & MXT_T107_STYLUS_TIPSWITCH)) {
++				hover = true;
++				distance = MXT_DISTANCE_HOVERING;
++			} else if (data->stylus_aux_pressure) {
++				pressure = message[data->stylus_aux_pressure];
++			}
++
++			break;
++
+ 		case MXT_T100_TYPE_LARGE_TOUCH:
+ 			/* Ignore suppressed touch */
+ 			break;
+@@ -857,42 +1255,169 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
+ 	 * Values reported should be non-zero if tool is touching the
+ 	 * device
+ 	 */
+-	if (!pressure && type != MXT_T100_TYPE_HOVERING_FINGER)
++	if (!pressure && !hover)
+ 		pressure = MXT_PRESSURE_DEFAULT;
+ 
+-	input_mt_slot(input_dev, id);
+-
++	if (id >= MXT_MIN_RPTID_SEC) {
++		input_mt_slot(input_dev_sec, id_sec);
++	} else {
++		input_mt_slot(input_dev, id);
++	}
++		
+ 	if (status & MXT_T100_DETECT) {
+-		dev_dbg(dev, "[%u] type:%u x:%u y:%u a:%02X p:%02X v:%02X\n",
++		
++		if (id >= MXT_MIN_RPTID_SEC) {
++			dev_dbg(dev, "id:[%u] type:%u x:%u y:%u a:%02X p:%02X v:%02X\n",
++			id_sec, type, x, y, major, pressure, orientation);
++		} else {
++			dev_dbg(dev, "id:[%u] type:%u x:%u y:%u a:%02X p:%02X v:%02X\n",
+ 			id, type, x, y, major, pressure, orientation);
++		}
++		
++		if (id >= MXT_MIN_RPTID_SEC) {	
++			input_mt_report_slot_state(input_dev_sec, tool, 1);
++		  	input_report_abs(input_dev_sec, ABS_MT_POSITION_X, x);
++		  	input_report_abs(input_dev_sec, ABS_MT_POSITION_Y, y);
++		  	input_report_abs(input_dev_sec, ABS_MT_TOUCH_MAJOR, major);
++		  	input_report_abs(input_dev_sec, ABS_MT_PRESSURE, pressure);
++		  	input_report_abs(input_dev_sec, ABS_MT_DISTANCE, distance);
++		  	input_report_abs(input_dev_sec, ABS_MT_ORIENTATION, orientation);
++			
++			if (id == MXT_MIN_RPTID_SEC) {
++				input_report_abs(input_dev_sec, ABS_X, x);
++				input_report_abs(input_dev_sec, ABS_Y, y);
++				input_report_key(input_dev_sec, BTN_TOUCH, 1);
++			}
++		} else {
++		  	input_mt_report_slot_state(input_dev, tool, 1);
++		  	input_report_abs(input_dev, ABS_MT_POSITION_X, x);
++		  	input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
++		  	input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, major);
++		  	input_report_abs(input_dev, ABS_MT_PRESSURE, pressure);
++		  	input_report_abs(input_dev, ABS_MT_DISTANCE, distance);
++		  	input_report_abs(input_dev, ABS_MT_ORIENTATION, orientation);
++		}
++	} else {
++		 
++		if (id >= MXT_MIN_RPTID_SEC){
++			dev_dbg(dev, "[%u] release\n", id_sec);
+ 
+-		input_mt_report_slot_state(input_dev, tool, 1);
+-		mxt_apply_prop_to_x_y(data, &x, &y);
+-		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
+-		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
+-		input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, major);
+-		input_report_abs(input_dev, ABS_MT_PRESSURE, pressure);
+-		input_report_abs(input_dev, ABS_MT_DISTANCE, distance);
+-		input_report_abs(input_dev, ABS_MT_ORIENTATION, orientation);
++			/* close out slot */
++			input_mt_report_slot_state(input_dev_sec, 0, 0);
++
++			/* Set BTN_TOUCH to 0 */
++			if (id == MXT_MIN_RPTID_SEC)
++				input_report_key(input_dev_sec, BTN_TOUCH, 0);
++
++		} else {
++			dev_dbg(dev, "[%u] release\n", id);
++
++			/* close out slot */
++		  	input_mt_report_slot_state(input_dev, 0, 0);
++		}
++	}
++	
++	if (id >= MXT_MIN_RPTID_SEC) {
++		data->update_input_sec = true;
+ 	} else {
+-		dev_dbg(dev, "[%u] release\n", id);
++		data->update_input = true;
++	}
++}
+ 
+-		/* close out slot */
+-		input_mt_report_slot_state(input_dev, 0, 0);
++static void mxt_proc_t15_messages(struct mxt_data *data, u8 *msg)
++{
++	struct input_dev *input_dev = data->input_dev;
++	struct device *dev = &data->client->dev;
++	int key;
++	bool curr_state, new_state;
++	bool sync = false;
++	unsigned long keystates = le32_to_cpu(msg[2]);
++
++	for (key = 0; key < data->t15_num_keys; key++) {
++		curr_state = test_bit(key, &data->t15_keystatus);
++		new_state = test_bit(key, &keystates);
++
++		if (!curr_state && new_state) {
++			dev_dbg(dev, "T15 key press: %u\n", key);
++			__set_bit(key, &data->t15_keystatus);
++			input_event(input_dev, EV_KEY,
++				    data->t15_keymap[key], 1);
++			sync = true;
++		} else if (curr_state && !new_state) {
++			dev_dbg(dev, "T15 key release: %u\n", key);
++			__clear_bit(key, &data->t15_keystatus);
++			input_event(input_dev, EV_KEY,
++				    data->t15_keymap[key], 0);
++			sync = true;
++		}
+ 	}
+ 
+-	data->update_input = true;
++	if (sync)
++		input_sync(input_dev);
++}
++
++static void mxt_proc_t42_messages(struct mxt_data *data, u8 *msg)
++{
++	struct device *dev = &data->client->dev;
++	u8 status = msg[1];
++
++	if (status & MXT_T42_MSG_TCHSUP)
++		dev_info(dev, "T42 suppress\n");
++	else
++		dev_info(dev, "T42 normal\n");
++}
++
++static int mxt_proc_t48_messages(struct mxt_data *data, u8 *msg)
++{
++	struct device *dev = &data->client->dev;
++	u8 status, state;
++
++	status = msg[1];
++	state  = msg[4];
++
++	dev_dbg(dev, "T48 state %d status %02X %s%s%s%s%s\n", state, status,
++		status & 0x01 ? "FREQCHG " : "",
++		status & 0x02 ? "APXCHG " : "",
++		status & 0x04 ? "ALGOERR " : "",
++		status & 0x10 ? "STATCHG " : "",
++		status & 0x20 ? "NLVLCHG " : "");
++
++	return 0;
++}
++
++static void mxt_proc_t92_messages(struct mxt_data *data, u8 *msg)
++{
++	struct device *dev = &data->client->dev;
++	u8 status = msg[1];
++
++	dev_info(dev, "T92 long stroke LSTR=%d %d\n",
++		 (status & 0x80) ? 1 : 0,
++		 status & 0x0F);
++}
++
++static void mxt_proc_t93_messages(struct mxt_data *data, u8 *msg)
++{
++	struct device *dev = &data->client->dev;
++	u8 status = msg[1];
++
++	dev_info(dev, "T93 report double tap %d\n", status);
+ }
+ 
+ static int mxt_proc_message(struct mxt_data *data, u8 *message)
+ {
+ 	u8 report_id = message[0];
++	bool dump = data->debug_enabled;
+ 
+ 	if (report_id == MXT_RPTID_NOMSG)
+ 		return 0;
+ 
+ 	if (report_id == data->T6_reportid) {
+ 		mxt_proc_t6_messages(data, message);
++	} else if (report_id >= data->T42_reportid_min
++		   && report_id <= data->T42_reportid_max) {
++		mxt_proc_t42_messages(data, message);
++	} else if (report_id == data->T48_reportid_min) {
++		mxt_proc_t48_messages(data, message);
+ 	} else if (!data->input_dev) {
+ 		/*
+ 		 * Do not report events if input device
+@@ -905,13 +1430,26 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message)
+ 	} else if (report_id >= data->T100_reportid_min &&
+ 		   report_id <= data->T100_reportid_max) {
+ 		mxt_proc_t100_message(data, message);
+-	} else if (report_id == data->T19_reportid) {
++	} else if (report_id == data->T19_reportid_min) {
+ 		mxt_input_button(data, message);
+ 		data->update_input = true;
++	} else if (report_id >= data->T15_reportid_min
++		   && report_id <= data->T15_reportid_max) {
++		mxt_proc_t15_messages(data, message);
++	} else if (report_id == data->T92_reportid_min) {
++		mxt_proc_t92_messages(data, message);
++	} else if (report_id == data->T93_reportid_min) {
++		mxt_proc_t93_messages(data, message);
+ 	} else {
+ 		mxt_dump_message(data, message);
+ 	}
+ 
++	if (dump)
++		mxt_dump_message(data, message);
++
++	if (data->debug_v2_enabled)
++		mxt_debug_msg_add(data, message);
++
+ 	return 1;
+ }
+ 
+@@ -993,9 +1531,14 @@ static irqreturn_t mxt_process_messages_t44(struct mxt_data *data)
+ 	}
+ 
+ end:
+-	if (data->update_input) {
++	if (data->update_input || data->update_input_sec) {
+ 		mxt_input_sync(data);
+-		data->update_input = false;
++		
++		if (data->update_input)
++			data->update_input = false;
++		
++		if (data->update_input_sec)
++			data->update_input_sec = false;
+ 	}
+ 
+ 	return IRQ_HANDLED;
+@@ -1016,9 +1559,14 @@ static int mxt_process_messages_until_invalid(struct mxt_data *data)
+ 			return 0;
+ 	} while (--tries);
+ 
+-	if (data->update_input) {
++	if (data->update_input || data->update_input_sec ) {
+ 		mxt_input_sync(data);
+-		data->update_input = false;
++		
++		if(data->update_input)
++			data->update_input = false;
++		
++		if(data->update_input_sec)
++			data->update_input_sec = false;
+ 	}
+ 
+ 	dev_err(dev, "CHG pin isn't cleared\n");
+@@ -1056,9 +1604,14 @@ static irqreturn_t mxt_process_messages(struct mxt_data *data)
+ update_count:
+ 	data->last_message_count = total_handled;
+ 
+-	if (data->update_input) {
++	if (data->update_input || data->update_input_sec) {
+ 		mxt_input_sync(data);
+-		data->update_input = false;
++		
++		if(data->update_input)
++			data->update_input = false;
++		
++		if(data->update_input_sec)
++			data->update_input_sec = false;
+ 	}
+ 
+ 	return IRQ_HANDLED;
+@@ -1145,7 +1698,7 @@ static int mxt_soft_reset(struct mxt_data *data)
+ 		return ret;
+ 
+ 	/* Ignore CHG line for 100ms after reset */
+-	msleep(100);
++	msleep(MXT_RESET_INVALID_CHG);
+ 
+ 	mxt_acquire_irq(data);
+ 
+@@ -1214,12 +1767,7 @@ static u32 mxt_calculate_crc(u8 *base, off_t start_off, off_t end_off)
+ 	return crc;
+ }
+ 
+-static int mxt_prepare_cfg_mem(struct mxt_data *data,
+-			       const struct firmware *cfg,
+-			       unsigned int data_pos,
+-			       unsigned int cfg_start_ofs,
+-			       u8 *config_mem,
+-			       size_t config_mem_size)
++static int mxt_prepare_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg)
+ {
+ 	struct device *dev = &data->client->dev;
+ 	struct mxt_object *object;
+@@ -1230,9 +1778,9 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
+ 	u16 reg;
+ 	u8 val;
+ 
+-	while (data_pos < cfg->size) {
++	while (cfg->raw_pos < cfg->raw_size) {
+ 		/* Read type, instance, length */
+-		ret = sscanf(cfg->data + data_pos, "%x %x %x%n",
++		ret = sscanf(cfg->raw + cfg->raw_pos, "%x %x %x%n",
+ 			     &type, &instance, &size, &offset);
+ 		if (ret == 0) {
+ 			/* EOF */
+@@ -1241,20 +1789,20 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
+ 			dev_err(dev, "Bad format: failed to parse object\n");
+ 			return -EINVAL;
+ 		}
+-		data_pos += offset;
++		cfg->raw_pos += offset;
+ 
+ 		object = mxt_get_object(data, type);
+ 		if (!object) {
+ 			/* Skip object */
+ 			for (i = 0; i < size; i++) {
+-				ret = sscanf(cfg->data + data_pos, "%hhx%n",
++				ret = sscanf(cfg->raw + cfg->raw_pos, "%hhx%n",
+ 					     &val, &offset);
+ 				if (ret != 1) {
+ 					dev_err(dev, "Bad format in T%d at %d\n",
+ 						type, i);
+ 					return -EINVAL;
+ 				}
+-				data_pos += offset;
++				cfg->raw_pos += offset;
+ 			}
+ 			continue;
+ 		}
+@@ -1289,7 +1837,7 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
+ 		reg = object->start_address + mxt_obj_size(object) * instance;
+ 
+ 		for (i = 0; i < size; i++) {
+-			ret = sscanf(cfg->data + data_pos, "%hhx%n",
++			ret = sscanf(cfg->raw + cfg->raw_pos, "%hhx%n",
+ 				     &val,
+ 				     &offset);
+ 			if (ret != 1) {
+@@ -1297,15 +1845,15 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
+ 					type, i);
+ 				return -EINVAL;
+ 			}
+-			data_pos += offset;
++			cfg->raw_pos += offset;
+ 
+ 			if (i > mxt_obj_size(object))
+ 				continue;
+ 
+-			byte_offset = reg + i - cfg_start_ofs;
++			byte_offset = reg + i - cfg->start_ofs;
+ 
+-			if (byte_offset >= 0 && byte_offset < config_mem_size) {
+-				*(config_mem + byte_offset) = val;
++			if (byte_offset >= 0 && byte_offset < cfg->mem_size) {
++				*(cfg->mem + byte_offset) = val;
+ 			} else {
+ 				dev_err(dev, "Bad object: reg:%d, T%d, ofs=%d\n",
+ 					reg, object->type, byte_offset);
+@@ -1317,22 +1865,21 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
+ 	return 0;
+ }
+ 
+-static int mxt_upload_cfg_mem(struct mxt_data *data, unsigned int cfg_start,
+-			      u8 *config_mem, size_t config_mem_size)
++static int mxt_upload_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg)
+ {
+ 	unsigned int byte_offset = 0;
+ 	int error;
+ 
+ 	/* Write configuration as blocks */
+-	while (byte_offset < config_mem_size) {
+-		unsigned int size = config_mem_size - byte_offset;
++	while (byte_offset < cfg->mem_size) {
++		unsigned int size = cfg->mem_size - byte_offset;
+ 
+ 		if (size > MXT_MAX_BLOCK_WRITE)
+ 			size = MXT_MAX_BLOCK_WRITE;
+ 
+ 		error = __mxt_write_reg(data->client,
+-					cfg_start + byte_offset,
+-					size, config_mem + byte_offset);
++					cfg->start_ofs + byte_offset,
++					size, cfg->mem + byte_offset);
+ 		if (error) {
+ 			dev_err(&data->client->dev,
+ 				"Config write error, ret=%d\n", error);
+@@ -1366,65 +1913,76 @@ static int mxt_init_t7_power_cfg(struct mxt_data *data);
+  *   <SIZE> - 2-byte object size as hex
+  *   <CONTENTS> - array of <SIZE> 1-byte hex values
+  */
+-static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
++static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw)
+ {
+ 	struct device *dev = &data->client->dev;
+-	struct mxt_info cfg_info;
++	struct mxt_cfg cfg;
+ 	int ret;
+ 	int offset;
+-	int data_pos;
+ 	int i;
+-	int cfg_start_ofs;
+ 	u32 info_crc, config_crc, calculated_crc;
+-	u8 *config_mem;
+-	size_t config_mem_size;
++	u16 crc_start = 0;
++
++	/* Make zero terminated copy of the OBP_RAW file */
++	cfg.raw = kmemdup(fw->data, fw->size + 1, GFP_KERNEL);
++	if (!cfg.raw)
++		return -ENOMEM;
++	cfg.raw[fw->size] = '\0';
++	
++	cfg.raw_size = fw->size;
+ 
+ 	mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1);
+ 
+-	if (strncmp(cfg->data, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) {
++	if (strncmp(cfg.raw, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) {
+ 		dev_err(dev, "Unrecognised config file\n");
+-		return -EINVAL;
++		ret = -EINVAL;
++		goto release_raw;
+ 	}
+ 
+-	data_pos = strlen(MXT_CFG_MAGIC);
++	cfg.raw_pos = strlen(MXT_CFG_MAGIC);
+ 
+ 	/* Load information block and check */
+ 	for (i = 0; i < sizeof(struct mxt_info); i++) {
+-		ret = sscanf(cfg->data + data_pos, "%hhx%n",
+-			     (unsigned char *)&cfg_info + i,
++		ret = sscanf(cfg.raw + cfg.raw_pos, "%hhx%n",
++			     (unsigned char *)&cfg.info + i,
+ 			     &offset);
+ 		if (ret != 1) {
+ 			dev_err(dev, "Bad format\n");
+-			return -EINVAL;
++			ret = -EINVAL;
++			goto release_raw;
+ 		}
+ 
+-		data_pos += offset;
++		cfg.raw_pos += offset;
+ 	}
+ 
+-	if (cfg_info.family_id != data->info.family_id) {
++	if (cfg.info.family_id != data->info->family_id) {
+ 		dev_err(dev, "Family ID mismatch!\n");
+-		return -EINVAL;
++		ret = -EINVAL;
++		goto release_raw;
+ 	}
+ 
+-	if (cfg_info.variant_id != data->info.variant_id) {
++	if (cfg.info.variant_id != data->info->variant_id) {
+ 		dev_err(dev, "Variant ID mismatch!\n");
+-		return -EINVAL;
++		ret = -EINVAL;
++		goto release_raw;
+ 	}
+ 
+ 	/* Read CRCs */
+-	ret = sscanf(cfg->data + data_pos, "%x%n", &info_crc, &offset);
++	ret = sscanf(cfg.raw + cfg.raw_pos, "%x%n", &info_crc, &offset);
+ 	if (ret != 1) {
+ 		dev_err(dev, "Bad format: failed to parse Info CRC\n");
+-		return -EINVAL;
++		ret = -EINVAL;
++		goto release_raw;
+ 	}
+-	data_pos += offset;
++	cfg.raw_pos += offset;
+ 
+-	ret = sscanf(cfg->data + data_pos, "%x%n", &config_crc, &offset);
++	ret = sscanf(cfg.raw + cfg.raw_pos, "%x%n", &config_crc, &offset);
+ 	if (ret != 1) {
+ 		dev_err(dev, "Bad format: failed to parse Config CRC\n");
+-		return -EINVAL;
++		ret = -EINVAL;
++		goto release_raw;
+ 	}
+-	data_pos += offset;
++	cfg.raw_pos += offset;
+ 
+ 	/*
+ 	 * The Info Block CRC is calculated over mxt_info and the object
+@@ -1436,7 +1994,7 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
+ 		if (config_crc == 0 || data->config_crc == 0) {
+ 			dev_info(dev, "CRC zero, attempting to apply config\n");
+ 		} else if (config_crc == data->config_crc) {
+-			dev_dbg(dev, "Config CRC 0x%06X: OK\n",
++			dev_info(dev, "Config CRC 0x%06X: OK. No update required.\n",
+ 				 data->config_crc);
+ 			return 0;
+ 		} else {
+@@ -1449,40 +2007,48 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
+ 			 data->info_crc, info_crc);
+ 	}
+ 
++	/* Stop T70 Dynamic Configuration before calculation of CRC */
++
++	mxt_update_crc(data, MXT_COMMAND_BACKUPNV, MXT_BACKUP_W_STOP);
++
+ 	/* Malloc memory to store configuration */
+-	cfg_start_ofs = MXT_OBJECT_START +
+-			data->info.object_num * sizeof(struct mxt_object) +
++	cfg.start_ofs = MXT_OBJECT_START +
++			data->info->object_num * sizeof(struct mxt_object) +
+ 			MXT_INFO_CHECKSUM_SIZE;
+-	config_mem_size = data->mem_size - cfg_start_ofs;
+-	config_mem = kzalloc(config_mem_size, GFP_KERNEL);
+-	if (!config_mem) {
+-		dev_err(dev, "Failed to allocate memory\n");
+-		return -ENOMEM;
++	cfg.mem_size = data->mem_size - cfg.start_ofs;
++	cfg.mem = kzalloc(cfg.mem_size, GFP_KERNEL);
++	if (!cfg.mem) {
++		ret = -ENOMEM;
++		goto release_raw;
+ 	}
+ 
+-	ret = mxt_prepare_cfg_mem(data, cfg, data_pos, cfg_start_ofs,
+-				  config_mem, config_mem_size);
++	ret = mxt_prepare_cfg_mem(data, &cfg);
+ 	if (ret)
+ 		goto release_mem;
+ 
++
+ 	/* Calculate crc of the received configs (not the raw config file) */
+-	if (data->T7_address < cfg_start_ofs) {
+-		dev_err(dev, "Bad T7 address, T7addr = %x, config offset %x\n",
+-			data->T7_address, cfg_start_ofs);
+-		ret = 0;
+-		goto release_mem;
+-	}
++	
++	if (data->T14_address)
++		crc_start = data->T14_address;
++	else if (data->T71_address)
++		crc_start = data->T71_address;
++	else if (data->T7_address)
++		crc_start = data->T7_address;
++	else
++		dev_warn(dev, "Could not find CRC start\n");
+ 
+-	calculated_crc = mxt_calculate_crc(config_mem,
+-					   data->T7_address - cfg_start_ofs,
+-					   config_mem_size);
++	if (crc_start > cfg.start_ofs) {
++		calculated_crc = mxt_calculate_crc(cfg.mem,
++						   crc_start - cfg.start_ofs,
++						   cfg.mem_size);
+ 
+-	if (config_crc > 0 && config_crc != calculated_crc)
+-		dev_warn(dev, "Config CRC error, calculated=%06X, file=%06X\n",
+-			 calculated_crc, config_crc);
++		if (config_crc > 0 && config_crc != calculated_crc)
++			dev_warn(dev, "Config CRC in file inconsistent, calculated=%06X, file=%06X\n",
++				 calculated_crc, config_crc);
++	}
+ 
+-	ret = mxt_upload_cfg_mem(data, cfg_start_ofs,
+-				 config_mem, config_mem_size);
++	ret = mxt_upload_cfg_mem(data, &cfg);
+ 	if (ret)
+ 		goto release_mem;
+ 
+@@ -1497,25 +2063,13 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
+ 	/* T7 config may have changed */
+ 	mxt_init_t7_power_cfg(data);
+ 
++release_raw:
++	kfree(cfg.raw);
+ release_mem:
+-	kfree(config_mem);
++	kfree(cfg.mem);
+ 	return ret;
+ }
+ 
+-static int mxt_get_info(struct mxt_data *data)
+-{
+-	struct i2c_client *client = data->client;
+-	struct mxt_info *info = &data->info;
+-	int error;
+-
+-	/* Read 7-byte info block starting at address 0 */
+-	error = __mxt_read_reg(client, 0, sizeof(*info), info);
+-	if (error)
+-		return error;
+-
+-	return 0;
+-}
+-
+ static void mxt_free_input_device(struct mxt_data *data)
+ {
+ 	if (data->input_dev) {
+@@ -1526,60 +2080,65 @@ static void mxt_free_input_device(struct mxt_data *data)
+ 
+ static void mxt_free_object_table(struct mxt_data *data)
+ {
+-	kfree(data->object_table);
++#ifdef CONFIG_TOUCHSCREEN_ATMEL_MXT_T37
++	video_unregister_device(&data->dbg.vdev);
++	v4l2_device_unregister(&data->dbg.v4l2);
++#endif
+ 	data->object_table = NULL;
++	data->info = NULL;
++	kfree(data->raw_info_block);
++	data->raw_info_block = NULL;
+ 	kfree(data->msg_buf);
+ 	data->msg_buf = NULL;
+ 	data->T5_address = 0;
+ 	data->T5_msg_size = 0;
+ 	data->T6_reportid = 0;
+ 	data->T7_address = 0;
++	data->T14_address = 0;
++	data->T71_address = 0;
+ 	data->T9_reportid_min = 0;
+ 	data->T9_reportid_max = 0;
+-	data->T19_reportid = 0;
++	data->T15_reportid_min = 0;
++	data->T15_reportid_max = 0;
++	data->T18_address = 0;
++	data->T19_reportid_min = 0;
++	data->T42_reportid_min = 0;
++	data->T42_reportid_max = 0;
+ 	data->T44_address = 0;
++	data->T48_reportid_min = 0;
++	data->T92_reportid_min = 0;
++	data->T92_address = 0;
++	data->T93_reportid_min = 0;
++	data->T93_address = 0;
+ 	data->T100_reportid_min = 0;
+ 	data->T100_reportid_max = 0;
+ 	data->max_reportid = 0;
+ }
+ 
+-static int mxt_get_object_table(struct mxt_data *data)
++static int mxt_parse_object_table(struct mxt_data *data,
++				  struct mxt_object *object_table)
+ {
+ 	struct i2c_client *client = data->client;
+-	size_t table_size;
+-	struct mxt_object *object_table;
+-	int error;
+ 	int i;
+ 	u8 reportid;
+ 	u16 end_address;
+-
+-	table_size = data->info.object_num * sizeof(struct mxt_object);
+-	object_table = kzalloc(table_size, GFP_KERNEL);
+-	if (!object_table) {
+-		dev_err(&data->client->dev, "Failed to allocate memory\n");
+-		return -ENOMEM;
+-	}
+-
+-	error = __mxt_read_reg(client, MXT_OBJECT_START, table_size,
+-			object_table);
+-	if (error) {
+-		kfree(object_table);
+-		return error;
+-	}
++	u8 num_instances;
+ 
+ 	/* Valid Report IDs start counting from 1 */
+ 	reportid = 1;
+ 	data->mem_size = 0;
+-	for (i = 0; i < data->info.object_num; i++) {
++	for (i = 0; i < data->info->object_num; i++) {
+ 		struct mxt_object *object = object_table + i;
+ 		u8 min_id, max_id;
+ 
+ 		le16_to_cpus(&object->start_address);
+ 
++		num_instances = mxt_obj_instances(object);
++		
+ 		if (object->num_report_ids) {
+ 			min_id = reportid;
+ 			reportid += object->num_report_ids *
+-					mxt_obj_instances(object);
++					num_instances;
+ 			max_id = reportid - 1;
+ 		} else {
+ 			min_id = 0;
+@@ -1594,8 +2153,8 @@ static int mxt_get_object_table(struct mxt_data *data)
+ 
+ 		switch (object->type) {
+ 		case MXT_GEN_MESSAGE_T5:
+-			if (data->info.family_id == 0x80 &&
+-			    data->info.version < 0x20) {
++			if (data->info->family_id == 0x80 &&
++			    data->info->version < 0x20) {
+ 				/*
+ 				 * On mXT224 firmware versions prior to V2.0
+ 				 * read and discard unused CRC byte otherwise
+@@ -1615,25 +2174,114 @@ static int mxt_get_object_table(struct mxt_data *data)
+ 		case MXT_GEN_POWER_T7:
+ 			data->T7_address = object->start_address;
+ 			break;
++		case MXT_PROCI_KEYTHRESHOLD_T14:
++			data->T14_address = object->start_address;
++			break;
++		case MXT_SPT_DYNAMICCONFIGURATIONCONTAINER_T71:
++			data->T71_address = object->start_address;
++			break;
+ 		case MXT_TOUCH_MULTI_T9:
+ 			data->multitouch = MXT_TOUCH_MULTI_T9;
++			/* Only handle messages from first T9 instance */
+ 			data->T9_reportid_min = min_id;
+-			data->T9_reportid_max = max_id;
+-			data->num_touchids = object->num_report_ids
+-						* mxt_obj_instances(object);
++			data->T9_reportid_max = min_id +
++						object->num_report_ids - 1;
++			data->num_touchids = object->num_report_ids;
++			break;
++		case MXT_TOUCH_KEYARRAY_T15:
++			data->T15_reportid_min = min_id;
++			data->T15_reportid_max = max_id;
++			data->T15_instances = num_instances;
++			break;
++		case MXT_SPT_COMMSCONFIG_T18:
++			data->T18_address = object->start_address;
++			break;
++		case MXT_SPT_GPIOPWM_T19:
++			data->T19_reportid_min = min_id;
++			break;
++		case MXT_PROCI_ONETOUCH_T24:
++			data->T24_reportid_min = min_id;
++			data->T24_reportid_max = max_id;
++			break;
++		case MXT_SPT_SELFTEST_T25:
++			data->T25_reportid_min = min_id;
++			break;
++		case MXT_PROCI_TWOTOUCH_T27:
++			data->T27_reportid_min = min_id;
++			data->T27_reportid_max = max_id;
++			break;
++		case MXT_PROCI_TOUCHSUPPRESSION_T42:
++			data->T42_reportid_min = min_id;
++			data->T42_reportid_max = max_id;
+ 			break;
+ 		case MXT_SPT_MESSAGECOUNT_T44:
+ 			data->T44_address = object->start_address;
+ 			break;
+-		case MXT_SPT_GPIOPWM_T19:
+-			data->T19_reportid = min_id;
++		case MXT_SPT_CTECONFIG_T46:
++			data->T46_reportid_min = min_id;
++			break;
++		case MXT_PROCG_NOISESUPPRESSION_T48:
++			data->T48_reportid_min = min_id;
++			break;
++		case MXT_PROCI_SHIELDLESS_T56:
++			data->T56_reportid_min = min_id;
++			break;
++		case MXT_SPT_TIMER_T61:
++			data->T61_reportid_min = min_id;
++			data->T61_reportid_max = max_id;
++			break;
++		case MXT_PROCI_LENSBENDING_T65:
++			data->T65_reportid_min = min_id;
++			data->T65_reportid_max = max_id;
++			break;
++		case MXT_SPT_SERIALDATACOMMAND_T68:
++			data->T68_reportid_min = min_id;
++			break;
++			case MXT_SPT_DYNAMICCONFIGURATIONCONTROLLER_T70:
++			data->T70_reportid_min = min_id;
++			data->T70_reportid_max = max_id;
++			break;
++		case MXT_NOISESUPPRESSION_T72:
++			data->T72_reportid_min = min_id;
++			break;
++		case MXT_PROCI_RETRANSMISSIONCOMPENSATION_T80:
++			data->T80_reportid_min = min_id;
++			data->T80_reportid_max = max_id;
++			break;				
++		case MXT_PROCI_SYMBOLGESTUREPROCESSOR_T92:
++			data->T92_reportid_min = min_id;
++			data->T92_address = object->start_address;
++			break;
++		case MXT_PROCI_TOUCHSEQUENCELOGGER_T93:
++			data->T93_reportid_min = min_id;
++			data->T93_address = object->start_address;
+ 			break;
+ 		case MXT_TOUCH_MULTITOUCHSCREEN_T100:
+ 			data->multitouch = MXT_TOUCH_MULTITOUCHSCREEN_T100;
+ 			data->T100_reportid_min = min_id;
+ 			data->T100_reportid_max = max_id;
++			data->T100_instances = num_instances;
+ 			/* first two report IDs reserved */
+-			data->num_touchids = object->num_report_ids - 2;
++			data->num_touchids = object->num_report_ids - MXT_RSVD_RPTIDS;
++			break;
++		case MXT_PROCI_ACTIVESTYLUS_T107:
++			data->T107_address = object->start_address;
++			break;
++		case MXT_PROCG_NOISESUPSELFCAP_T108:
++			data->T108_reportid_min = min_id;
++			break;
++		case MXT_SPT_SELFCAPGLOBALCONFIG_T109:
++			data->T109_reportid_min = min_id;
++			break;
++		case MXT_PROCI_SELFCAPGRIPSUPPRESSION_T112:
++			data->T112_reportid_min = min_id;
++			data->T112_reportid_max = max_id;
++			break;
++		case MXT_SPT_SELCAPVOLTAGEMODE_T133:
++			data->T133_reportid_min = min_id;
++			break;
++		case MXT_PROCI_HOVERGESTUREPROCESSOR_T129:
++			data->T129_reportid_min = min_id;
+ 			break;
+ 		}
+ 
+@@ -1646,28 +2294,106 @@ static int mxt_get_object_table(struct mxt_data *data)
+ 
+ 	/* Store maximum reportid */
+ 	data->max_reportid = reportid;
+-
++	
+ 	/* If T44 exists, T5 position has to be directly after */
+ 	if (data->T44_address && (data->T5_address != data->T44_address + 1)) {
+ 		dev_err(&client->dev, "Invalid T44 position\n");
+-		error = -EINVAL;
+-		goto free_object_table;
++		return -EINVAL;
+ 	}
+ 
+ 	data->msg_buf = kcalloc(data->max_reportid,
+ 				data->T5_msg_size, GFP_KERNEL);
+-	if (!data->msg_buf) {
+-		dev_err(&client->dev, "Failed to allocate message buffer\n");
++	if (!data->msg_buf)
++		return -ENOMEM;
++
++	return 0;
++}
++
++static int mxt_read_info_block(struct mxt_data *data)
++{
++	struct i2c_client *client = data->client;
++	int error;
++	size_t size;
++	void *id_buf, *buf;
++	uint8_t num_objects;
++	u32 calculated_crc;
++	u8 *crc_ptr;
++
++	/* If info block already allocated, free it */
++	if (data->raw_info_block)
++		mxt_free_object_table(data);
++
++	/* Read 7-byte ID information block starting at address 0 */
++	size = sizeof(struct mxt_info);
++	id_buf = kzalloc(size, GFP_KERNEL);
++	if (!id_buf)
++		return -ENOMEM;
++
++	error = __mxt_read_reg(client, 0, size, id_buf);
++	if (error)
++		goto err_free_mem;
++
++	/* Resize buffer to give space for rest of info block */
++	num_objects = ((struct mxt_info *)id_buf)->object_num;
++	size += (num_objects * sizeof(struct mxt_object))
++		+ MXT_INFO_CHECKSUM_SIZE;
++
++	buf = krealloc(id_buf, size, GFP_KERNEL);
++	if (!buf) {
+ 		error = -ENOMEM;
+-		goto free_object_table;
++		goto err_free_mem;
++	}
++	id_buf = buf;
++
++	/* Read rest of info block */
++	error = __mxt_read_reg(client, MXT_OBJECT_START,
++			       size - MXT_OBJECT_START,
++			       id_buf + MXT_OBJECT_START);
++	if (error)
++		goto err_free_mem;
++
++	/* Extract & calculate checksum */
++	crc_ptr = id_buf + size - MXT_INFO_CHECKSUM_SIZE;
++	data->info_crc = crc_ptr[0] | (crc_ptr[1] << 8) | (crc_ptr[2] << 16);
++
++	calculated_crc = mxt_calculate_crc(id_buf, 0,
++					   size - MXT_INFO_CHECKSUM_SIZE);
++
++	/*
++	 * CRC mismatch can be caused by data corruption due to I2C comms
++	 * issue or else device is not using Object Based Protocol (eg i2c-hid)
++	 */
++	if ((data->info_crc == 0) || (data->info_crc != calculated_crc)) {
++		dev_err(&client->dev,
++			"Info Block CRC error calculated=0x%06X read=0x%06X\n",
++			calculated_crc, data->info_crc);
++		error = -EIO;
++		goto err_free_mem;
++	}
++
++	data->raw_info_block = id_buf;
++	data->info = (struct mxt_info *)id_buf;
++
++	dev_info(&client->dev,
++		 "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n",
++		 data->info->family_id, data->info->variant_id,
++		 data->info->version >> 4, data->info->version & 0xf,
++		 data->info->build, data->info->object_num);
++
++	/* Parse object table information */
++	error = mxt_parse_object_table(data, id_buf + MXT_OBJECT_START);
++	if (error) {
++		dev_err(&client->dev, "Error %d parsing object table\n", error);
++		mxt_free_object_table(data);
++		goto err_free_mem;
+ 	}
+ 
+-	data->object_table = object_table;
++	data->object_table = (struct mxt_object *)(id_buf + MXT_OBJECT_START);
+ 
+ 	return 0;
+ 
+-free_object_table:
+-	mxt_free_object_table(data);
++err_free_mem:
++	kfree(id_buf);
+ 	return error;
+ }
+ 
+@@ -1684,6 +2410,18 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
+ 		return -EINVAL;
+ 
+ 	error = __mxt_read_reg(client,
++			       object->start_address + MXT_T9_XSIZE,
++			       sizeof(data->xsize), &data->xsize);
++	if (error)
++		return error;
++
++	error = __mxt_read_reg(client,
++			       object->start_address + MXT_T9_YSIZE,
++			       sizeof(data->ysize), &data->ysize);
++	if (error)
++		return error;
++
++	error = __mxt_read_reg(client,
+ 			       object->start_address + MXT_T9_RANGE,
+ 			       sizeof(range), &range);
+ 	if (error)
+@@ -1699,11 +2437,61 @@ static int mxt_read_t9_resolution(struct mxt_data *data)
+ 		return error;
+ 
+ 	data->xy_switch = orient & MXT_T9_ORIENT_SWITCH;
++	data->invertx = orient & MXT_T9_ORIENT_INVERTX;
++	data->inverty = orient & MXT_T9_ORIENT_INVERTY;
++
++	return 0;
++}
++
++static int mxt_set_up_active_stylus(struct input_dev *input_dev,
++				    struct mxt_data *data)
++{
++	struct i2c_client *client = data->client;
++	int error;
++	struct mxt_object *object;
++	u8 styaux;
++	int aux;
++	u8 ctrl;
++
++	object = mxt_get_object(data, MXT_PROCI_ACTIVESTYLUS_T107);
++	if (!object)
++		return 0;
++
++	error = __mxt_read_reg(client, object->start_address, 1, &ctrl);
++	if (error)
++		return error;
++
++	/* Check enable bit */
++	if (!(ctrl & 0x01))
++		return 0;
++
++	error = __mxt_read_reg(client,
++			       object->start_address + MXT_T107_STYLUS_STYAUX,
++			       1, &styaux);
++	if (error)
++		return error;
++
++	/* map aux bits */
++	aux = 7;
++
++	if (styaux & MXT_T107_STYLUS_STYAUX_PRESSURE)
++		data->stylus_aux_pressure = aux++;
++
++	if (styaux & MXT_T107_STYLUS_STYAUX_PEAK)
++		data->stylus_aux_peak = aux++;
++
++	input_set_capability(input_dev, EV_KEY, BTN_STYLUS);
++	input_set_capability(input_dev, EV_KEY, BTN_STYLUS2);
++	input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE, 0, MT_TOOL_MAX, 0, 0);
++
++	dev_dbg(&client->dev,
++		"T107 active stylus, aux map pressure:%u peak:%u\n",
++		data->stylus_aux_pressure, data->stylus_aux_peak);
+ 
+ 	return 0;
+ }
+ 
+-static int mxt_read_t100_config(struct mxt_data *data)
++static int mxt_read_t100_config(struct mxt_data *data, u8 instance)
+ {
+ 	struct i2c_client *client = data->client;
+ 	int error;
+@@ -1711,14 +2499,28 @@ static int mxt_read_t100_config(struct mxt_data *data)
+ 	u16 range_x, range_y;
+ 	u8 cfg, tchaux;
+ 	u8 aux;
++	u16 obj_size = 0;
++	u8 T100_enable;
+ 
+ 	object = mxt_get_object(data, MXT_TOUCH_MULTITOUCHSCREEN_T100);
+ 	if (!object)
+ 		return -EINVAL;
+-
++	
++	if (instance == 2) {
++		T100_enable = object->start_address + mxt_obj_size(object) + MXT_T100_CTRL;
++		
++		if ((T100_enable & MXT_T100_ENABLE_BIT_MASK) == 0x01 ){
++			obj_size = mxt_obj_size(object);
++		} else {
++			dev_info(&client->dev, "T100 secondary input device not enabled\n");
++			
++			return 1;
++		}	
++	}
++				
+ 	/* read touchscreen dimensions */
+ 	error = __mxt_read_reg(client,
+-			       object->start_address + MXT_T100_XRANGE,
++			       object->start_address + obj_size + MXT_T100_XRANGE,
+ 			       sizeof(range_x), &range_x);
+ 	if (error)
+ 		return error;
+@@ -1726,30 +2528,44 @@ static int mxt_read_t100_config(struct mxt_data *data)
+ 	data->max_x = get_unaligned_le16(&range_x);
+ 
+ 	error = __mxt_read_reg(client,
+-			       object->start_address + MXT_T100_YRANGE,
++			       object->start_address + obj_size + MXT_T100_YRANGE,
+ 			       sizeof(range_y), &range_y);
+ 	if (error)
+ 		return error;
+ 
+ 	data->max_y = get_unaligned_le16(&range_y);
+ 
++	error = __mxt_read_reg(client,
++			       object->start_address + obj_size + MXT_T100_XSIZE,
++			       sizeof(data->xsize), &data->xsize);
++	if (error)
++		return error;
++
++	error = __mxt_read_reg(client,
++			       object->start_address + obj_size + MXT_T100_YSIZE,
++			       sizeof(data->ysize), &data->ysize);
++	if (error)
++		return error;
++
+ 	/* read orientation config */
+ 	error =  __mxt_read_reg(client,
+-				object->start_address + MXT_T100_CFG1,
++				object->start_address + obj_size + MXT_T100_CFG1,
+ 				1, &cfg);
+ 	if (error)
+ 		return error;
+ 
+ 	data->xy_switch = cfg & MXT_T100_CFG_SWITCHXY;
++	data->invertx = cfg & MXT_T100_CFG_INVERTX;
++	data->inverty = cfg & MXT_T100_CFG_INVERTY;
+ 
+ 	/* allocate aux bytes */
+ 	error =  __mxt_read_reg(client,
+-				object->start_address + MXT_T100_TCHAUX,
++				object->start_address + obj_size+ MXT_T100_TCHAUX,
+ 				1, &tchaux);
+ 	if (error)
+ 		return error;
+ 
+-	aux = 6;
++	aux = MXT_T100_AUX_OFFSET;
+ 
+ 	if (tchaux & MXT_T100_TCHAUX_VECT)
+ 		data->t100_aux_vect = aux++;
+@@ -1763,7 +2579,7 @@ static int mxt_read_t100_config(struct mxt_data *data)
+ 	dev_dbg(&client->dev,
+ 		"T100 aux mappings vect:%u ampl:%u area:%u\n",
+ 		data->t100_aux_vect, data->t100_aux_ampl, data->t100_aux_area);
+-
++				
+ 	return 0;
+ }
+ 
+@@ -1773,7 +2589,6 @@ static void mxt_input_close(struct input_dev *dev);
+ static void mxt_set_up_as_touchpad(struct input_dev *input_dev,
+ 				   struct mxt_data *data)
+ {
+-	const struct mxt_platform_data *pdata = data->pdata;
+ 	int i;
+ 
+ 	input_dev->name = "Atmel maXTouch Touchpad";
+@@ -1787,21 +2602,136 @@ static void mxt_set_up_as_touchpad(struct input_dev *input_dev,
+ 	input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
+ 			  MXT_PIXELS_PER_MM);
+ 
+-	for (i = 0; i < pdata->t19_num_keys; i++)
+-		if (pdata->t19_keymap[i] != KEY_RESERVED)
++	for (i = 0; i < data->t19_num_keys; i++)
++		if (data->t19_keymap[i] != KEY_RESERVED)
+ 			input_set_capability(input_dev, EV_KEY,
+-					     pdata->t19_keymap[i]);
++					     data->t19_keymap[i]);
++}
++
++static int mxt_init_secondary_input(struct mxt_data *data)
++{
++	struct device *dev = &data->client->dev;
++	struct input_dev *input_dev_sec;
++	unsigned int num_mt_slots;
++	unsigned int mt_flags = 0;
++	int error;
++	
++	switch (data->multitouch) {
++	case MXT_TOUCH_MULTITOUCHSCREEN_T100:
++		num_mt_slots = data->num_touchids; 
++		error = mxt_read_t100_config(data, 2);
++		if (error) {
++			dev_info(dev, "Failed to read T100 config\n");
++			return -ENXIO;
++		}
++		break;
++
++	default:
++		dev_err(dev, "Invalid multitouch object\n");
++		return -EINVAL;
++	}
++
++	/* Handle default values and orientation switch */
++	if (data->max_x == 0)
++		data->max_x = 1023;
++
++	if (data->max_y == 0)
++		data->max_y = 1023;
++
++	if (data->xy_switch)
++		swap(data->max_x, data->max_y);
++
++	dev_info(dev, "Secondary touchscreen size {x,y} = {%u,%u}\n", data->max_x, data->max_y);
++
++	/* Register input device */
++	input_dev_sec = input_allocate_device();
++	if (!input_dev_sec)
++		return -ENOMEM;
++
++	input_dev_sec->name = "maXTouch Secondary Touchscreen";
++	input_dev_sec->phys = data->phys;
++	input_dev_sec->id.bustype = BUS_I2C;
++	input_dev_sec->dev.parent = dev;
++	input_dev_sec->open = mxt_input_open;
++	input_dev_sec->close = mxt_input_close;
++
++	input_set_capability(input_dev_sec, EV_KEY, BTN_TOUCH);
++
++	/* For single touch */
++	input_set_abs_params(input_dev_sec, ABS_X, 0, data->max_x, 0, 0);
++	input_set_abs_params(input_dev_sec, ABS_Y, 0, data->max_y, 0, 0);
++
++	if ((data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
++	     data->t100_aux_ampl)) {
++		input_set_abs_params(input_dev_sec, ABS_PRESSURE, 0, 255, 0, 0);
++	}
++
++	mt_flags |= INPUT_MT_DIRECT;
++
++	/* For multi touch */
++	error = input_mt_init_slots(input_dev_sec, num_mt_slots, mt_flags);
++	if (error) {
++		dev_err(dev, "Error %d initialising slots\n", error);
++		goto err_free_mem;
++	}
++
++	if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100) {
++		input_set_abs_params(input_dev_sec, ABS_MT_TOOL_TYPE,
++				     0, MT_TOOL_MAX, 0, 0);
++		input_set_abs_params(input_dev_sec, ABS_MT_DISTANCE,
++				     MXT_DISTANCE_ACTIVE_TOUCH,
++				     MXT_DISTANCE_HOVERING,
++				     0, 0);
++	}
++
++	input_set_abs_params(input_dev_sec, ABS_MT_POSITION_X,
++			     0, data->max_x, 0, 0);
++	input_set_abs_params(input_dev_sec, ABS_MT_POSITION_Y,
++			     0, data->max_y, 0, 0);
++
++	if ((data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
++	     data->t100_aux_area)) {
++		input_set_abs_params(input_dev_sec, ABS_MT_TOUCH_MAJOR,
++				     0, MXT_MAX_AREA, 0, 0);
++	}
++
++	if ((data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
++	     data->t100_aux_ampl)) {
++		input_set_abs_params(input_dev_sec, ABS_MT_PRESSURE,
++				     0, 255, 0, 0);
++	}
++
++	if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
++	    data->t100_aux_vect) {
++		input_set_abs_params(input_dev_sec, ABS_MT_ORIENTATION,
++				     0, 255, 0, 0);
++	}
++
++	input_set_drvdata(input_dev_sec, data);
++
++	error = input_register_device(input_dev_sec);
++	if (error) {
++		dev_err(dev, "Error %d registering input device\n", error);
++		goto err_free_mem;
++	}
++
++	data->input_dev_sec = input_dev_sec;
++
++	return 0;
++
++err_free_mem:
++	input_free_device(input_dev_sec);
++	return error;
+ }
+ 
+ static int mxt_initialize_input_device(struct mxt_data *data)
+ {
+-	const struct mxt_platform_data *pdata = data->pdata;
+ 	struct device *dev = &data->client->dev;
+ 	struct input_dev *input_dev;
+ 	int error;
+ 	unsigned int num_mt_slots;
+ 	unsigned int mt_flags = 0;
+-	struct device_node *np = dev->of_node;
++	int i;
+ 	
+ 	switch (data->multitouch) {
+ 	case MXT_TOUCH_MULTI_T9:
+@@ -1812,8 +2742,8 @@ static int mxt_initialize_input_device(struct mxt_data *data)
+ 		break;
+ 
+ 	case MXT_TOUCH_MULTITOUCHSCREEN_T100:
+-		num_mt_slots = data->num_touchids;
+-		error = mxt_read_t100_config(data);
++		num_mt_slots = (data->num_touchids);
++		error = mxt_read_t100_config(data, 1);
+ 		if (error)
+ 			dev_warn(dev, "Failed to read T100 config\n");
+ 		break;
+@@ -1833,15 +2763,12 @@ static int mxt_initialize_input_device(struct mxt_data *data)
+ 	if (data->xy_switch)
+ 		swap(data->max_x, data->max_y);
+ 
+-	dev_info(dev, "Touchscreen size X%uY%u\n", data->max_x, data->max_y);
++	dev_info(dev, "Touchscreen size {x,y} = {%u,%u}\n", data->max_x, data->max_y);
+ 
+ 	/* Register input device */
+ 	input_dev = input_allocate_device();
+-	if (!input_dev) {
+-		dev_err(dev, "Failed to allocate memory\n");
++	if (!input_dev)
+ 		return -ENOMEM;
+-	}
+-
+ 
+ 	input_dev->name = "Atmel maXTouch Touchscreen";
+ 	input_dev->phys = data->phys;
+@@ -1863,7 +2790,7 @@ static int mxt_initialize_input_device(struct mxt_data *data)
+ 	}
+ 
+ 	/* If device has buttons we assume it is a touchpad */
+-	if (pdata->t19_num_keys) {
++	if (data->t19_num_keys) {
+ 		mxt_set_up_as_touchpad(input_dev, data);
+ 		mt_flags |= INPUT_MT_POINTER;
+ 	} else {
+@@ -1905,22 +2832,28 @@ static int mxt_initialize_input_device(struct mxt_data *data)
+ 				     0, 255, 0, 0);
+ 	}
+ 
+-	if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
+-	    data->t100_aux_vect) {
++	if (data->multitouch == MXT_TOUCH_MULTI_T9 ||
++	    (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
++	    data->t100_aux_vect)) {
+ 		input_set_abs_params(input_dev, ABS_MT_ORIENTATION,
+ 				     0, 255, 0, 0);
+ 	}
+ 
++	/* For T107 Active Stylus */
+ 	if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
+-	    data->t100_aux_ampl) {
+-		input_set_abs_params(input_dev, ABS_MT_PRESSURE,
+-				     0, 255, 0, 0);
++	    data->T107_address) {
++		error = mxt_set_up_active_stylus(input_dev, data);
++		if (error)
++			dev_warn(dev, "Failed to read T107 config\n");
+ 	}
+ 
+-	if (data->multitouch == MXT_TOUCH_MULTITOUCHSCREEN_T100 &&
+-	    data->t100_aux_vect) {
+-		input_set_abs_params(input_dev, ABS_MT_ORIENTATION,
+-				     0, 255, 0, 0);
++	/* For T15 Key Array */
++	if (data->T15_reportid_min) {
++		data->t15_keystatus = 0;
++
++		for (i = 0; i < data->t15_num_keys; i++)
++			input_set_capability(input_dev, EV_KEY,
++					data->t15_keymap[i]);
+ 	}
+ 
+ 	input_set_drvdata(input_dev, data);
+@@ -1933,17 +2866,6 @@ static int mxt_initialize_input_device(struct mxt_data *data)
+ 
+ 	data->input_dev = input_dev;
+ 
+-	if (np) {
+-		data->invert_x = of_property_read_bool(np, "invert_x")?1:0;
+-		data->invert_y = of_property_read_bool(np, "invert_y")?1:0;
+-        	data->swap_x_y = of_property_read_bool(np, "swap_x_y")?1:0;
+-        	
+-        	dev_info(dev, "loaded toucscreen properties\n");
+-        	dev_info(dev, "touchscreen-inverted-x %d\n", data->invert_x);
+-        	dev_info(dev, "touchscreen-inverted-y %d\n", data->invert_y);
+-        	dev_info(dev, "touchscreen-swap-x-y %d\n", data->swap_x_y);
+-        }
+-
+ 	return 0;
+ 
+ err_free_mem:
+@@ -1951,6 +2873,8 @@ err_free_mem:
+ 	return error;
+ }
+ 
++static int mxt_sysfs_init(struct mxt_data *data);
++static void mxt_sysfs_remove(struct mxt_data *data);
+ static int mxt_configure_objects(struct mxt_data *data,
+ 				 const struct firmware *cfg);
+ 
+@@ -1967,7 +2891,7 @@ static int mxt_initialize(struct mxt_data *data)
+ 	int error;
+ 
+ 	while (1) {
+-		error = mxt_get_info(data);
++		error = mxt_read_info_block(data);
+ 		if (!error)
+ 			break;
+ 
+@@ -1998,31 +2922,21 @@ static int mxt_initialize(struct mxt_data *data)
+ 		msleep(MXT_FW_RESET_TIME);
+ 	}
+ 
+-	/* Get object table information */
+-	error = mxt_get_object_table(data);
+-	if (error) {
+-		dev_err(&client->dev, "Error %d reading object table\n", error);
+-		return error;
+-	}
+-
+ 	error = mxt_acquire_irq(data);
+ 	if (error)
+-		goto err_free_object_table;
++		return error;
+ 
++	/* Only works when driver compiled as module */
+ 	error = request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME,
+ 					&client->dev, GFP_KERNEL, data,
+ 					mxt_config_cb);
+ 	if (error) {
+ 		dev_err(&client->dev, "Failed to invoke firmware loader: %d\n",
+ 			error);
+-		goto err_free_object_table;
++		return error;
+ 	}
+ 
+ 	return 0;
+-
+-err_free_object_table:
+-	mxt_free_object_table(data);
+-	return error;
+ }
+ 
+ static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep)
+@@ -2042,7 +2956,7 @@ static int mxt_set_t7_power_cfg(struct mxt_data *data, u8 sleep)
+ 	if (error)
+ 		return error;
+ 
+-	dev_dbg(dev, "Set T7 ACTV:%d IDLE:%d\n",
++	dev_dbg(dev, "Set T7 ACTV:%d IDLE:%d\n",	
+ 		new_config->active, new_config->idle);
+ 
+ 	return 0;
+@@ -2079,48 +2993,478 @@ recheck:
+ 	return 0;
+ }
+ 
+-static int mxt_configure_objects(struct mxt_data *data,
+-				 const struct firmware *cfg)
++#ifdef CONFIG_TOUCHSCREEN_ATMEL_MXT_T37
++static u16 mxt_get_debug_value(struct mxt_data *data, unsigned int x,
++			       unsigned int y)
+ {
+-	struct device *dev = &data->client->dev;
+-	struct mxt_info *info = &data->info;
+-	int error;
+-
+-	error = mxt_init_t7_power_cfg(data);
+-	if (error) {
+-		dev_err(dev, "Failed to initialize power cfg\n");
+-		return error;
++	struct mxt_info *info = data->info;
++	struct mxt_dbg *dbg = &data->dbg;
++	unsigned int ofs, page;
++	unsigned int col = 0;
++	unsigned int col_width;
++
++	if (info->family_id == MXT_FAMILY_1386) {
++		col_width = info->matrix_ysize / MXT1386_COLUMNS;
++		col = y / col_width;
++		y = y % col_width;
++	} else {
++		col_width = info->matrix_ysize;
+ 	}
+ 
+-	if (cfg) {
+-		error = mxt_update_cfg(data, cfg);
+-		if (error)
+-			dev_warn(dev, "Error %d updating config\n", error);
+-	}
++	ofs = (y + (x * col_width)) * sizeof(u16);
++	page = ofs / MXT_DIAGNOSTIC_SIZE;
++	ofs %= MXT_DIAGNOSTIC_SIZE;
+ 
+-	if (data->multitouch) {
+-		error = mxt_initialize_input_device(data);
+-		if (error)
+-			return error;
+-	} else {
+-		dev_warn(dev, "No touch object detected\n");
+-	}
++	if (info->family_id == MXT_FAMILY_1386)
++		page += col * MXT1386_PAGES_PER_COLUMN;
+ 
+-	dev_info(dev,
+-		 "Family: %u Variant: %u Firmware V%u.%u.%02X Objects: %u\n",
+-		 info->family_id, info->variant_id, info->version >> 4,
+-		 info->version & 0xf, info->build, info->object_num);
++	return get_unaligned_le16(&dbg->t37_buf[page].data[ofs]);
++}
++
++static int mxt_convert_debug_pages(struct mxt_data *data, u16 *outbuf)
++{
++	struct mxt_dbg *dbg = &data->dbg;
++	unsigned int x = 0;
++	unsigned int y = 0;
++	unsigned int i, rx, ry;
++
++	for (i = 0; i < dbg->t37_nodes; i++) {
++		/* Handle orientation */
++		rx = data->xy_switch ? y : x;
++		ry = data->xy_switch ? x : y;
++		rx = data->invertx ? (data->xsize - 1 - rx) : rx;
++		ry = data->inverty ? (data->ysize - 1 - ry) : ry;
++
++		outbuf[i] = mxt_get_debug_value(data, rx, ry);
++
++		/* Next value */
++		if (++x >= (data->xy_switch ? data->ysize : data->xsize)) {
++			x = 0;
++			y++;
++		}
++	}
+ 
+ 	return 0;
+ }
+ 
+-/* Firmware Version is returned as Major.Minor.Build */
+-static ssize_t mxt_fw_version_show(struct device *dev,
+-				   struct device_attribute *attr, char *buf)
++static int mxt_read_diagnostic_debug(struct mxt_data *data, u8 mode,
++				     u16 *outbuf)
+ {
+-	struct mxt_data *data = dev_get_drvdata(dev);
+-	struct mxt_info *info = &data->info;
+-	return scnprintf(buf, PAGE_SIZE, "%u.%u.%02X\n",
++	struct mxt_dbg *dbg = &data->dbg;
++	int retries = 0;
++	int page;
++	int ret;
++	u8 cmd = mode;
++	struct t37_debug *p;
++	u8 cmd_poll;
++
++	for (page = 0; page < dbg->t37_pages; page++) {
++		p = dbg->t37_buf + page;
++
++		ret = mxt_write_reg(data->client, dbg->diag_cmd_address,
++				    cmd);
++		if (ret)
++			return ret;
++
++		retries = 0;
++		msleep(20);
++wait_cmd:
++		/* Read back command byte */
++		ret = __mxt_read_reg(data->client, dbg->diag_cmd_address,
++				     sizeof(cmd_poll), &cmd_poll);
++		if (ret)
++			return ret;
++
++		/* Field is cleared once the command has been processed */
++		if (cmd_poll) {
++			if (retries++ > 100)
++				return -EINVAL;
++
++			msleep(20);
++			goto wait_cmd;
++		}
++
++		/* Read T37 page */
++		ret = __mxt_read_reg(data->client, dbg->t37_address,
++				     sizeof(struct t37_debug), p);
++		if (ret)
++			return ret;
++
++		if (p->mode != mode || p->page != page) {
++			dev_err(&data->client->dev, "T37 page mismatch\n");
++			return -EINVAL;
++		}
++
++		dev_dbg(&data->client->dev, "%s page:%d retries:%d\n",
++			__func__, page, retries);
++
++		/* For remaining pages, write PAGEUP rather than mode */
++		cmd = MXT_DIAGNOSTIC_PAGEUP;
++	}
++
++	return mxt_convert_debug_pages(data, outbuf);
++}
++
++static int mxt_queue_setup(struct vb2_queue *q,
++		       unsigned int *nbuffers, unsigned int *nplanes,
++		       unsigned int sizes[], struct device *alloc_devs[])
++{
++	struct mxt_data *data = q->drv_priv;
++	size_t size = data->dbg.t37_nodes * sizeof(u16);
++
++	if (*nplanes)
++		return sizes[0] < size ? -EINVAL : 0;
++
++	*nplanes = 1;
++	sizes[0] = size;
++
++	return 0;
++}
++
++static void mxt_buffer_queue(struct vb2_buffer *vb)
++{
++	struct mxt_data *data = vb2_get_drv_priv(vb->vb2_queue);
++	u16 *ptr;
++	int ret;
++	u8 mode;
++
++	ptr = vb2_plane_vaddr(vb, 0);
++	if (!ptr) {
++		dev_err(&data->client->dev, "Error acquiring frame ptr\n");
++		goto fault;
++	}
++
++	switch (data->dbg.input) {
++	case MXT_V4L_INPUT_DELTAS:
++	default:
++		mode = MXT_DIAGNOSTIC_DELTAS;
++		break;
++
++	case MXT_V4L_INPUT_REFS:
++		mode = MXT_DIAGNOSTIC_REFS;
++		break;
++	}
++
++	ret = mxt_read_diagnostic_debug(data, mode, ptr);
++	if (ret)
++		goto fault;
++
++	vb2_set_plane_payload(vb, 0, data->dbg.t37_nodes * sizeof(u16));
++	vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
++	return;
++
++fault:
++	vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
++}
++
++/* V4L2 structures */
++static const struct vb2_ops mxt_queue_ops = {
++	.queue_setup		= mxt_queue_setup,
++	.buf_queue		= mxt_buffer_queue,
++	.wait_prepare		= vb2_ops_wait_prepare,
++	.wait_finish		= vb2_ops_wait_finish,
++};
++
++static const struct vb2_queue mxt_queue = {
++	.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
++	.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ,
++	.buf_struct_size = sizeof(struct mxt_vb2_buffer),
++	.ops = &mxt_queue_ops,
++	.mem_ops = &vb2_vmalloc_memops,
++	.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
++	.min_buffers_needed = 1,
++};
++
++static int mxt_vidioc_querycap(struct file *file, void *priv,
++				 struct v4l2_capability *cap)
++{
++	struct mxt_data *data = video_drvdata(file);
++
++	strlcpy(cap->driver, "atmel_mxt_ts", sizeof(cap->driver));
++	strlcpy(cap->card, "atmel_mxt_ts touch", sizeof(cap->card));
++	snprintf(cap->bus_info, sizeof(cap->bus_info),
++		 "I2C:%s", dev_name(&data->client->dev));
++	return 0;
++}
++
++static int mxt_vidioc_enum_input(struct file *file, void *priv,
++				   struct v4l2_input *i)
++{
++	if (i->index >= MXT_V4L_INPUT_MAX)
++		return -EINVAL;
++
++	i->type = V4L2_INPUT_TYPE_TOUCH;
++
++	switch (i->index) {
++	case MXT_V4L_INPUT_REFS:
++		strlcpy(i->name, "Mutual Capacitance References",
++			sizeof(i->name));
++		break;
++	case MXT_V4L_INPUT_DELTAS:
++		strlcpy(i->name, "Mutual Capacitance Deltas", sizeof(i->name));
++		break;
++	}
++
++	return 0;
++}
++
++static int mxt_set_input(struct mxt_data *data, unsigned int i)
++{
++	struct v4l2_pix_format *f = &data->dbg.format;
++
++	if (i >= MXT_V4L_INPUT_MAX)
++		return -EINVAL;
++
++	if (i == MXT_V4L_INPUT_DELTAS)
++		f->pixelformat = V4L2_TCH_FMT_DELTA_TD16;
++	else
++		f->pixelformat = V4L2_TCH_FMT_TU16;
++
++	f->width = data->xy_switch ? data->ysize : data->xsize;
++	f->height = data->xy_switch ? data->xsize : data->ysize;
++	f->field = V4L2_FIELD_NONE;
++	f->colorspace = V4L2_COLORSPACE_RAW;
++	f->bytesperline = f->width * sizeof(u16);
++	f->sizeimage = f->width * f->height * sizeof(u16);
++
++	data->dbg.input = i;
++
++	return 0;
++}
++
++static int mxt_vidioc_s_input(struct file *file, void *priv, unsigned int i)
++{
++	return mxt_set_input(video_drvdata(file), i);
++}
++
++static int mxt_vidioc_g_input(struct file *file, void *priv, unsigned int *i)
++{
++	struct mxt_data *data = video_drvdata(file);
++
++	*i = data->dbg.input;
++
++	return 0;
++}
++
++static int mxt_vidioc_fmt(struct file *file, void *priv, struct v4l2_format *f)
++{
++	struct mxt_data *data = video_drvdata(file);
++
++	f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++	f->fmt.pix = data->dbg.format;
++
++	return 0;
++}
++
++static int mxt_vidioc_enum_fmt(struct file *file, void *priv,
++				 struct v4l2_fmtdesc *fmt)
++{
++	if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
++		return -EINVAL;
++
++	switch (fmt->index) {
++	case 0:
++		fmt->pixelformat = V4L2_TCH_FMT_TU16;
++		break;
++
++	case 1:
++		fmt->pixelformat = V4L2_TCH_FMT_DELTA_TD16;
++		break;
++
++	default:
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static int mxt_vidioc_g_parm(struct file *file, void *fh,
++			     struct v4l2_streamparm *a)
++{
++	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
++		return -EINVAL;
++
++	a->parm.capture.readbuffers = 1;
++	a->parm.capture.timeperframe.numerator = 1;
++	a->parm.capture.timeperframe.denominator = 10;
++	return 0;
++}
++
++static const struct v4l2_ioctl_ops mxt_video_ioctl_ops = {
++	.vidioc_querycap        = mxt_vidioc_querycap,
++
++	.vidioc_enum_fmt_vid_cap = mxt_vidioc_enum_fmt,
++	.vidioc_s_fmt_vid_cap   = mxt_vidioc_fmt,
++	.vidioc_g_fmt_vid_cap   = mxt_vidioc_fmt,
++	.vidioc_try_fmt_vid_cap	= mxt_vidioc_fmt,
++	.vidioc_g_parm		= mxt_vidioc_g_parm,
++
++	.vidioc_enum_input      = mxt_vidioc_enum_input,
++	.vidioc_g_input         = mxt_vidioc_g_input,
++	.vidioc_s_input         = mxt_vidioc_s_input,
++
++	.vidioc_reqbufs         = vb2_ioctl_reqbufs,
++	.vidioc_create_bufs     = vb2_ioctl_create_bufs,
++	.vidioc_querybuf        = vb2_ioctl_querybuf,
++	.vidioc_qbuf            = vb2_ioctl_qbuf,
++	.vidioc_dqbuf           = vb2_ioctl_dqbuf,
++	.vidioc_expbuf          = vb2_ioctl_expbuf,
++
++	.vidioc_streamon        = vb2_ioctl_streamon,
++	.vidioc_streamoff       = vb2_ioctl_streamoff,
++};
++
++static const struct video_device mxt_video_device = {
++	.name = "Atmel maxTouch",
++	.fops = &mxt_video_fops,
++	.ioctl_ops = &mxt_video_ioctl_ops,
++	.release = video_device_release_empty,
++	.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TOUCH |
++		       V4L2_CAP_READWRITE | V4L2_CAP_STREAMING,
++};
++
++static void mxt_debug_init(struct mxt_data *data)
++{
++	struct mxt_info *info = data->info;
++	struct mxt_dbg *dbg = &data->dbg;
++	struct mxt_object *object;
++	int error;
++
++	object = mxt_get_object(data, MXT_GEN_COMMAND_T6);
++	if (!object)
++		goto error;
++
++	dbg->diag_cmd_address = object->start_address + MXT_COMMAND_DIAGNOSTIC;
++
++	object = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37);
++	if (!object)
++		goto error;
++
++	if (mxt_obj_size(object) != sizeof(struct t37_debug)) {
++		dev_warn(&data->client->dev, "Bad T37 size");
++		goto error;
++	}
++
++	dbg->t37_address = object->start_address;
++
++	/* Calculate size of data and allocate buffer */
++	dbg->t37_nodes = data->xsize * data->ysize;
++
++	if (info->family_id == MXT_FAMILY_1386)
++		dbg->t37_pages = MXT1386_COLUMNS * MXT1386_PAGES_PER_COLUMN;
++	else
++		dbg->t37_pages = DIV_ROUND_UP(data->xsize *
++					      info->matrix_ysize *
++					      sizeof(u16),
++					      sizeof(dbg->t37_buf->data));
++
++	dbg->t37_buf = devm_kmalloc_array(&data->client->dev, dbg->t37_pages,
++					  sizeof(struct t37_debug), GFP_KERNEL);
++	if (!dbg->t37_buf)
++		goto error;
++
++	/* init channel to zero */
++	mxt_set_input(data, 0);
++
++	/* register video device */
++	snprintf(dbg->v4l2.name, sizeof(dbg->v4l2.name), "%s", "atmel_mxt_ts");
++	error = v4l2_device_register(&data->client->dev, &dbg->v4l2);
++	if (error)
++		goto error;
++
++	/* initialize the queue */
++	mutex_init(&dbg->lock);
++	dbg->queue = mxt_queue;
++	dbg->queue.drv_priv = data;
++	dbg->queue.lock = &dbg->lock;
++	dbg->queue.dev = &data->client->dev;
++
++	error = vb2_queue_init(&dbg->queue);
++	if (error)
++		goto error_unreg_v4l2;
++
++	dbg->vdev = mxt_video_device;
++	dbg->vdev.v4l2_dev = &dbg->v4l2;
++	dbg->vdev.lock = &dbg->lock;
++	dbg->vdev.vfl_dir = VFL_DIR_RX;
++	dbg->vdev.queue = &dbg->queue;
++	video_set_drvdata(&dbg->vdev, data);
++
++	error = video_register_device(&dbg->vdev, VFL_TYPE_TOUCH, -1);
++	if (error)
++		goto error_unreg_v4l2;
++
++	return;
++
++error_unreg_v4l2:
++	v4l2_device_unregister(&dbg->v4l2);
++error:
++	dev_warn(&data->client->dev, "Error initializing T37\n");
++}
++#else
++static void mxt_debug_init(struct mxt_data *data)
++{
++}
++#endif
++
++static int mxt_configure_objects(struct mxt_data *data,
++				 const struct firmware *cfg)
++{
++	struct device *dev = &data->client->dev;
++	int error;
++
++	error = mxt_init_t7_power_cfg(data);
++	if (error) {
++		dev_err(dev, "Failed to initialize power cfg\n");
++		return error;
++	}
++
++	if (cfg) {
++		error = mxt_update_cfg(data, cfg);
++		if (error)
++			dev_warn(dev, "Error %d updating config\n", error);
++	}
++	
++	if (!data->sysfs_updating_config) {
++		if (data->multitouch) {
++			dev_info(dev, "Registering devices\n");
++			error = mxt_initialize_input_device(data);
++			if (error)
++				return error;
++			
++			if (data->T100_instances > 1) {
++			    error = mxt_init_secondary_input(data);
++			    if (error)
++				    dev_warn(dev, "Error %d registering secondary device\n", error);
++			}
++		} else {
++			dev_warn(dev, "No touch object detected\n");
++		}
++	}
++	
++	data->sysfs_updating_config = false;
++	
++	mxt_debug_init(data);
++
++	return 0;
++}
++
++/* Configuration crc check sum is returned as hex xxxxxx */
++static ssize_t mxt_config_crc_show(struct device *dev,
++		struct device_attribute *attr, char *buf)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++
++	return scnprintf(buf, PAGE_SIZE, "%06x\n", data->config_crc);
++}
++
++/* Firmware Version is returned as Major.Minor.Build */
++static ssize_t mxt_fw_version_show(struct device *dev,
++				   struct device_attribute *attr, char *buf)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++	struct mxt_info *info = data->info;
++	return scnprintf(buf, PAGE_SIZE, "%u.%u.%02X\n",
+ 			 info->version >> 4, info->version & 0xf, info->build);
+ }
+ 
+@@ -2129,7 +3473,7 @@ static ssize_t mxt_hw_version_show(struct device *dev,
+ 				   struct device_attribute *attr, char *buf)
+ {
+ 	struct mxt_data *data = dev_get_drvdata(dev);
+-	struct mxt_info *info = &data->info;
++	struct mxt_info *info = data->info;
+ 	return scnprintf(buf, PAGE_SIZE, "%u.%u\n",
+ 			 info->family_id, info->variant_id);
+ }
+@@ -2168,7 +3512,7 @@ static ssize_t mxt_object_show(struct device *dev,
+ 		return -ENOMEM;
+ 
+ 	error = 0;
+-	for (i = 0; i < data->info.object_num; i++) {
++	for (i = 0; i < data->info->object_num; i++) {
+ 		object = data->object_table + i;
+ 
+ 		if (!mxt_object_readable(object->type))
+@@ -2232,12 +3576,19 @@ static int mxt_load_fw(struct device *dev, const char *fn)
+ 	if (ret) {
+ 		dev_err(dev, "Unable to open firmware %s\n", fn);
+ 		return ret;
+-	}
++	} else {
++
++		dev_info(dev, "Opened firmware file: %s\n", fn);
++	}  
+ 
+ 	/* Check for incorrect enc file */
+ 	ret = mxt_check_firmware_format(dev, fw);
+-	if (ret)
++
++	if (ret) {
+ 		goto release_firmware;
++	} else {
++		dev_info(dev, "File format is okay\n");		
++	}
+ 
+ 	if (!data->in_bootloader) {
+ 		/* Change to the bootloader mode */
+@@ -2245,18 +3596,21 @@ static int mxt_load_fw(struct device *dev, const char *fn)
+ 
+ 		ret = mxt_t6_command(data, MXT_COMMAND_RESET,
+ 				     MXT_BOOT_VALUE, false);
+-		if (ret)
++		if (ret) {
+ 			goto release_firmware;
++		} else {
++			dev_info(dev, "Sent bootloader command.\n");
++		}
+ 
+ 		msleep(MXT_RESET_TIME);
+ 
+ 		/* Do not need to scan since we know family ID */
+ 		ret = mxt_lookup_bootloader_address(data, 0);
+-		if (ret)
++		if (ret) {
+ 			goto release_firmware;
+-
+-		mxt_free_input_device(data);
+-		mxt_free_object_table(data);
++		} else {
++			dev_info(dev, "Found bootloader I2C address\n");
++		}	
+ 	} else {
+ 		enable_irq(data->irq);
+ 	}
+@@ -2289,7 +3643,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)
+ 		frame_size += 2;
+ 
+ 		/* Write one frame to device */
+-		ret = mxt_bootloader_write(data, fw->data + pos, frame_size);
++		ret = mxt_bootloader_write(data, &fw->data[pos], frame_size);
+ 		if (ret)
+ 			goto disable_irq;
+ 
+@@ -2310,17 +3664,16 @@ static int mxt_load_fw(struct device *dev, const char *fn)
+ 			frame++;
+ 		}
+ 
+-		if (frame % 50 == 0)
+-			dev_dbg(dev, "Sent %d frames, %d/%zd bytes\n",
++		if (pos >= fw->size) {
++			dev_info(dev, "Sent %u frames, %zu bytes\n",
++				frame, fw->size);
++		}
++		else if (frame % 50 == 0) {
++			dev_info(dev, "Sent %u frames, %d/%zu bytes\n",
+ 				frame, pos, fw->size);
++		}
+ 	}
+ 
+-	/* Wait for flash. */
+-	ret = mxt_wait_for_completion(data, &data->bl_completion,
+-				      MXT_FW_RESET_TIME);
+-	if (ret)
+-		goto disable_irq;
+-
+ 	dev_dbg(dev, "Sent %d frames, %d bytes\n", frame, pos);
+ 
+ 	/*
+@@ -2328,7 +3681,13 @@ static int mxt_load_fw(struct device *dev, const char *fn)
+ 	 * the CHG line after bootloading has finished, so ignore potential
+ 	 * errors.
+ 	 */
+-	mxt_wait_for_completion(data, &data->bl_completion, MXT_FW_RESET_TIME);
++
++	msleep(MXT_BOOTLOADER_WAIT);	/* Wait for chip to leave bootloader*/
++	
++	ret = mxt_wait_for_completion(data, &data->bl_completion,
++				      MXT_BOOTLOADER_WAIT);
++	if (ret)
++		goto disable_irq;
+ 
+ 	data->in_bootloader = false;
+ 
+@@ -2345,32 +3704,204 @@ static ssize_t mxt_update_fw_store(struct device *dev,
+ {
+ 	struct mxt_data *data = dev_get_drvdata(dev);
+ 	int error;
+-
++	
+ 	error = mxt_load_fw(dev, MXT_FW_NAME);
+ 	if (error) {
+ 		dev_err(dev, "The firmware update failed(%d)\n", error);
+ 		count = error;
+ 	} else {
+ 		dev_info(dev, "The firmware update succeeded\n");
++	}
++	
++	data->sysfs_updating_config = true;		
++	
++	msleep(MXT_FW_FLASH_TIME);
++	
++	error = mxt_acquire_irq(data);
++	if (error)
++		return error;
++	
++	/* Only works when driver compiled as module */
++	error = request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME,
++					dev, GFP_KERNEL, data,
++					mxt_config_cb);
++	if (error) {
++		dev_err(dev, "Failed to invoke firmware loader: %d\n",
++			error);
++		return error;
++		
++	}
++	
++	return count;
++}
+ 
+-		error = mxt_initialize(data);
+-		if (error)
+-			return error;
++static ssize_t mxt_update_cfg_store(struct device *dev,
++		struct device_attribute *attr,
++		const char *buf, size_t count)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++	const struct firmware *cfg;
++	int ret;
++
++	ret = request_firmware(&cfg, MXT_CFG_NAME, dev);
++	if (ret < 0) {
++		dev_err(dev, "Failure to request config file %s\n",
++			MXT_CFG_NAME);
++		ret = -ENOENT;
++		goto out;
++	} else {
++		dev_info(dev, "Found configuration file: %s\n",
++			MXT_CFG_NAME);
+ 	}
++	
++	data->sysfs_updating_config = true;
+ 
+-	return count;
++	if (data->suspend_mode == MXT_SUSPEND_DEEP_SLEEP) {
++		mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
++	}
++
++	ret = mxt_configure_objects(data, cfg);
++	if (ret)
++		goto release;
++
++	ret = count;
++
++release:
++	release_firmware(cfg);
++out:
++	return ret;
++}
++
++static ssize_t mxt_debug_enable_show(struct device *dev,
++	struct device_attribute *attr, char *buf)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++	char c;
++
++	c = data->debug_enabled ? '1' : '0';
++	return scnprintf(buf, PAGE_SIZE, "%c\n", c);
++}
++
++static ssize_t mxt_debug_notify_show(struct device *dev,
++	struct device_attribute *attr, char *buf)
++{
++	return sprintf(buf, "0\n");
++}
++
++static ssize_t mxt_debug_v2_enable_store(struct device *dev,
++	struct device_attribute *attr, const char *buf, size_t count)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++	u8 i;
++	ssize_t ret;
++
++	if (kstrtou8(buf, 0, &i) == 0 && i < 2) {
++		if (i == 1)
++			mxt_debug_msg_enable(data);
++		else
++			mxt_debug_msg_disable(data);
++
++		ret = count;
++	} else {
++		dev_dbg(dev, "debug_enabled write error\n");
++		ret = -EINVAL;
++	}
++
++	return ret;
++}
++
++static ssize_t mxt_debug_enable_store(struct device *dev,
++	struct device_attribute *attr, const char *buf, size_t count)
++{
++	struct mxt_data *data = dev_get_drvdata(dev);
++	u8 i;
++	ssize_t ret;
++
++	if (kstrtou8(buf, 0, &i) == 0 && i < 2) {
++		data->debug_enabled = (i == 1);
++
++		dev_dbg(dev, "%s\n", i ? "debug enabled" : "debug disabled");
++		ret = count;
++	} else {
++		dev_dbg(dev, "debug_enabled write error\n");
++		ret = -EINVAL;
++	}
++
++	return ret;
++}
++
++static int mxt_check_mem_access_params(struct mxt_data *data, loff_t off,
++				       size_t *count)
++{
++	if (off >= data->mem_size)
++		return -EIO;
++
++	if (off + *count > data->mem_size)
++		*count = data->mem_size - off;
++
++	if (*count > MXT_MAX_BLOCK_WRITE)
++		*count = MXT_MAX_BLOCK_WRITE;
++
++	return 0;
++}
++
++static ssize_t mxt_mem_access_read(struct file *filp, struct kobject *kobj,
++	struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)
++{
++	struct device *dev = container_of(kobj, struct device, kobj);
++	struct mxt_data *data = dev_get_drvdata(dev);
++	int ret = 0;
++
++	ret = mxt_check_mem_access_params(data, off, &count);
++	if (ret < 0)
++		return ret;
++
++	if (count > 0)
++		ret = __mxt_read_reg(data->client, off, count, buf);
++
++	return ret == 0 ? count : ret;
++}
++
++static ssize_t mxt_mem_access_write(struct file *filp, struct kobject *kobj,
++	struct bin_attribute *bin_attr, char *buf, loff_t off,
++	size_t count)
++{
++	struct device *dev = container_of(kobj, struct device, kobj);
++	struct mxt_data *data = dev_get_drvdata(dev);
++	int ret = 0;
++
++	ret = mxt_check_mem_access_params(data, off, &count);
++	if (ret < 0)
++		return ret;
++
++	if (count > 0)
++		ret = __mxt_write_reg(data->client, off, count, buf);
++
++	return ret == 0 ? count : ret;
+ }
+ 
+ static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL);
+ static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL);
+ static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL);
++static DEVICE_ATTR(update_cfg, S_IWUSR, NULL, mxt_update_cfg_store);
++static DEVICE_ATTR(config_crc, S_IRUGO, mxt_config_crc_show, NULL);
+ static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
++static DEVICE_ATTR(debug_enable, S_IWUSR | S_IRUSR, mxt_debug_enable_show,
++		   mxt_debug_enable_store);
++static DEVICE_ATTR(debug_v2_enable, S_IWUSR | S_IRUSR, NULL,
++		   mxt_debug_v2_enable_store);
++static DEVICE_ATTR(debug_notify, S_IRUGO, mxt_debug_notify_show, NULL);
+ 
+ static struct attribute *mxt_attrs[] = {
+ 	&dev_attr_fw_version.attr,
+ 	&dev_attr_hw_version.attr,
+ 	&dev_attr_object.attr,
++	&dev_attr_update_cfg.attr,
++	&dev_attr_config_crc.attr,
+ 	&dev_attr_update_fw.attr,
++	&dev_attr_debug_enable.attr,
++	&dev_attr_debug_v2_enable.attr,
++	&dev_attr_debug_notify.attr,
+ 	NULL
+ };
+ 
+@@ -2378,9 +3909,54 @@ static const struct attribute_group mxt_attr_group = {
+ 	.attrs = mxt_attrs,
+ };
+ 
++static int mxt_sysfs_init(struct mxt_data *data)
++{
++	struct i2c_client *client = data->client;
++	int error;
++
++	error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);
++	if (error) {
++		dev_err(&client->dev, "Failure %d creating sysfs group\n",
++			error);
++		return error;
++	}
++
++	sysfs_bin_attr_init(&data->mem_access_attr);
++	data->mem_access_attr.attr.name = "mem_access";
++	data->mem_access_attr.attr.mode = S_IRUGO | S_IWUSR;
++	data->mem_access_attr.read = mxt_mem_access_read;
++	data->mem_access_attr.write = mxt_mem_access_write;
++	data->mem_access_attr.size = data->mem_size;
++
++	error = sysfs_create_bin_file(&client->dev.kobj,
++				  &data->mem_access_attr);
++	if (error) {
++		dev_err(&client->dev, "Failed to create %s\n",
++			data->mem_access_attr.attr.name);
++		goto err_remove_sysfs_group;
++	}
++
++	return 0;
++
++err_remove_sysfs_group:
++	sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
++	return error;
++}
++
++static void mxt_sysfs_remove(struct mxt_data *data)
++{
++	struct i2c_client *client = data->client;
++
++	if (data->mem_access_attr.attr.name)
++		sysfs_remove_bin_file(&client->dev.kobj,
++				      &data->mem_access_attr);
++
++	sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
++}
++
+ static void mxt_start(struct mxt_data *data)
+ {
+-	switch (data->pdata->suspend_mode) {
++	switch (data->suspend_mode) {
+ 	case MXT_SUSPEND_T9_CTRL:
+ 		mxt_soft_reset(data);
+ 
+@@ -2398,12 +3974,11 @@ static void mxt_start(struct mxt_data *data)
+ 		mxt_t6_command(data, MXT_COMMAND_CALIBRATE, 1, false);
+ 		break;
+ 	}
+-
+ }
+ 
+ static void mxt_stop(struct mxt_data *data)
+ {
+-	switch (data->pdata->suspend_mode) {
++	switch (data->suspend_mode) {
+ 	case MXT_SUSPEND_T9_CTRL:
+ 		/* Touch disable */
+ 		mxt_write_object(data,
+@@ -2433,131 +4008,75 @@ static void mxt_input_close(struct input_dev *dev)
+ 	mxt_stop(data);
+ }
+ 
+-#ifdef CONFIG_OF
+-static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
++static int mxt_parse_device_properties(struct mxt_data *data)
+ {
+-	struct mxt_platform_data *pdata;
+-	struct device_node *np = client->dev.of_node;
++	static const char keymap_property[] = "linux,gpio-keymap";
++	struct device *dev = &data->client->dev;
+ 	u32 *keymap;
+-	int proplen, ret;
+-
+-	if (!np)
+-		return ERR_PTR(-ENOENT);
+-
+-	pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
+-	if (!pdata)
+-		return ERR_PTR(-ENOMEM);
++	int n_keys;
++	int error;
+ 
+-	if (of_find_property(np, "linux,gpio-keymap", &proplen)) {
+-		pdata->t19_num_keys = proplen / sizeof(u32);
++	if (device_property_present(dev, keymap_property)) {
++		n_keys = device_property_read_u32_array(dev, keymap_property,
++							NULL, 0);
++		if (n_keys <= 0) {
++			error = n_keys < 0 ? n_keys : -EINVAL;
++			dev_err(dev, "invalid/malformed '%s' property: %d\n",
++				keymap_property, error);
++			return error;
++		}
+ 
+-		keymap = devm_kzalloc(&client->dev,
+-				pdata->t19_num_keys * sizeof(keymap[0]),
+-				GFP_KERNEL);
++		keymap = devm_kmalloc_array(dev, n_keys, sizeof(*keymap),
++					    GFP_KERNEL);
+ 		if (!keymap)
+-			return ERR_PTR(-ENOMEM);
++			return -ENOMEM;
+ 
+-		ret = of_property_read_u32_array(np, "linux,gpio-keymap",
+-						 keymap, pdata->t19_num_keys);
+-		if (ret)
+-			dev_warn(&client->dev,
+-				 "Couldn't read linux,gpio-keymap: %d\n", ret);
++		error = device_property_read_u32_array(dev, keymap_property,
++						       keymap, n_keys);
++		if (error) {
++			dev_err(dev, "failed to parse '%s' property: %d\n",
++				keymap_property, error);
++			return error;
++		}
+ 
+-		pdata->t19_keymap = keymap;
++		data->t19_keymap = keymap;
++		data->t19_num_keys = n_keys;
+ 	}
+ 
+-	pdata->suspend_mode = MXT_SUSPEND_DEEP_SLEEP;
+-
+-	return pdata;
+-}
+-#else
+-static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
+-{
+-	return ERR_PTR(-ENOENT);
++	return 0;
+ }
+-#endif
+-
+-#ifdef CONFIG_ACPI
+-
+-struct mxt_acpi_platform_data {
+-	const char *hid;
+-	struct mxt_platform_data pdata;
+-};
+-
+-static unsigned int samus_touchpad_buttons[] = {
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	BTN_LEFT
+-};
+ 
+-static struct mxt_acpi_platform_data samus_platform_data[] = {
++static const struct dmi_system_id chromebook_T9_suspend_dmi[] = {
+ 	{
+-		/* Touchpad */
+-		.hid	= "ATML0000",
+-		.pdata	= {
+-			.t19_num_keys	= ARRAY_SIZE(samus_touchpad_buttons),
+-			.t19_keymap	= samus_touchpad_buttons,
+-		},
+-	},
+-	{
+-		/* Touchscreen */
+-		.hid	= "ATML0001",
+-	},
+-	{ }
+-};
+-
+-static unsigned int chromebook_tp_buttons[] = {
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	KEY_RESERVED,
+-	BTN_LEFT
+-};
+-
+-static struct mxt_acpi_platform_data chromebook_platform_data[] = {
+-	{
+-		/* Touchpad */
+-		.hid	= "ATML0000",
+-		.pdata	= {
+-			.t19_num_keys	= ARRAY_SIZE(chromebook_tp_buttons),
+-			.t19_keymap	= chromebook_tp_buttons,
+-		},
+-	},
+-	{
+-		/* Touchscreen */
+-		.hid	= "ATML0001",
+-	},
+-	{ }
+-};
+-
+-static const struct dmi_system_id mxt_dmi_table[] = {
+-	{
+-		/* 2015 Google Pixel */
+-		.ident = "Chromebook Pixel 2",
+ 		.matches = {
+ 			DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
+-			DMI_MATCH(DMI_PRODUCT_NAME, "Samus"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "Link"),
+ 		},
+-		.driver_data = samus_platform_data,
+ 	},
+ 	{
+-		/* Other Google Chromebooks */
+-		.ident = "Chromebook",
+ 		.matches = {
+-			DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "Peppy"),
+ 		},
+-		.driver_data = chromebook_platform_data,
+ 	},
+ 	{ }
+ };
+ 
+-static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
++static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ {
+-	struct acpi_device *adev;
+-	const struct dmi_system_id *system_id;
+-	const struct mxt_acpi_platform_data *acpi_pdata;
++	struct mxt_data *data;
++	int error;
++
++	/*
++	 * Ignore devices that do not have device properties attached to
++	 * them, as we need help determining whether we are dealing with
++	 * touch screen or touchpad.
++	 *
++	 * So far on x86 the only users of Atmel touch controllers are
++	 * Chromebooks, and chromeos_laptop driver will ensure that
++	 * necessary properties are provided (if firmware does not do that).
++	 */
++	if (!device_property_present(&client->dev, "compatible"))
++		return -ENXIO;
+ 
+ 	/*
+ 	 * Ignore ACPI devices representing bootloader mode.
+@@ -2569,79 +4088,17 @@ static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
+ 	 * application mode addresses were all above 0x40, so we'll use it
+ 	 * as a threshold.
+ 	 */
+-	if (client->addr < 0x40)
+-		return ERR_PTR(-ENXIO);
+-
+-	adev = ACPI_COMPANION(&client->dev);
+-	if (!adev)
+-		return ERR_PTR(-ENOENT);
+-
+-	system_id = dmi_first_match(mxt_dmi_table);
+-	if (!system_id)
+-		return ERR_PTR(-ENOENT);
++	if (ACPI_COMPANION(&client->dev) && client->addr < 0x40)
++		return -ENXIO;
+ 
+-	acpi_pdata = system_id->driver_data;
+-	if (!acpi_pdata)
+-		return ERR_PTR(-ENOENT);
+-
+-	while (acpi_pdata->hid) {
+-		if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid))
+-			return &acpi_pdata->pdata;
+-
+-		acpi_pdata++;
+-	}
+-
+-	return ERR_PTR(-ENOENT);
+-}
+-#else
+-static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client)
+-{
+-	return ERR_PTR(-ENOENT);
+-}
+-#endif
+-
+-static const struct mxt_platform_data *
+-mxt_get_platform_data(struct i2c_client *client)
+-{
+-	const struct mxt_platform_data *pdata;
+-
+-	pdata = dev_get_platdata(&client->dev);
+-	if (pdata)
+-		return pdata;
+-
+-	pdata = mxt_parse_dt(client);
+-	if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
+-		return pdata;
+-
+-	pdata = mxt_parse_acpi(client);
+-	if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT)
+-		return pdata;
+-
+-	dev_err(&client->dev, "No platform data specified\n");
+-	return ERR_PTR(-EINVAL);
+-}
+-
+-static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
+-{
+-	struct mxt_data *data;
+-	const struct mxt_platform_data *pdata;
+-	int error;
+-
+-	pdata = mxt_get_platform_data(client);
+-	if (IS_ERR(pdata))
+-		return PTR_ERR(pdata);
+-
+-	data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
+-	if (!data) {
+-		dev_err(&client->dev, "Failed to allocate memory\n");
++	data = devm_kzalloc(&client->dev, sizeof(struct mxt_data), GFP_KERNEL);
++	if (!data)
+ 		return -ENOMEM;
+-	}
+ 
+ 	snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
+ 		 client->adapter->nr, client->addr);
+ 
+ 	data->client = client;
+-	data->pdata = pdata;
+ 	data->irq = client->irq;
+ 	i2c_set_clientdata(client, data);
+ 
+@@ -2649,48 +4106,78 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
+ 	init_completion(&data->reset_completion);
+ 	init_completion(&data->crc_completion);
+ 
+-	error = request_threaded_irq(client->irq, NULL, mxt_interrupt,
+-				     pdata->irqflags | IRQF_ONESHOT,
+-				     client->name, data);
++	data->suspend_mode = dmi_check_system(chromebook_T9_suspend_dmi) ?
++		MXT_SUSPEND_T9_CTRL : MXT_SUSPEND_DEEP_SLEEP;
++
++	error = mxt_parse_device_properties(data);
++	if (error)
++		return error;
++
++	data->reset_gpio = devm_gpiod_get_optional(&client->dev,
++						   "reset", GPIOD_OUT_LOW);
++	if (IS_ERR(data->reset_gpio)) {
++		error = PTR_ERR(data->reset_gpio);
++		dev_err(&client->dev, "Failed to get reset gpio: %d\n", error);
++		return error;
++	} else {
++		dev_dbg(&client->dev, "Got Reset GPIO\n");
++	  }
++
++	error = devm_request_threaded_irq(&client->dev, client->irq,
++					  NULL, mxt_interrupt, IRQF_ONESHOT,
++					  client->name, data);
+ 	if (error) {
+ 		dev_err(&client->dev, "Failed to register interrupt\n");
+-		goto err_free_mem;
++		return error;
+ 	}
+ 
+ 	disable_irq(client->irq);
+ 
++	if(!(IS_ERR(data->reset_gpio))) {
++		gpiod_direction_output(data->reset_gpio, 1);	/* GPIO in device tree is active-low */
++		dev_dbg(&client->dev, "Direction is ouput\n");
++	}
++	
++	if(!(IS_ERR(data->reset_gpio))) {
++		dev_info(&client->dev, "Resetting chip\n");
++		msleep(MXT_RESET_GPIO_TIME);
++		gpiod_set_value(data->reset_gpio, 1);
++		msleep(MXT_RESET_INVALID_CHG);
++		gpiod_set_value(data->reset_gpio, 0);
++	}
++
+ 	error = mxt_initialize(data);
+ 	if (error)
+-		goto err_free_irq;
++		return error;
+ 
+-	error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);
+-	if (error) {
+-		dev_err(&client->dev, "Failure %d creating sysfs group\n",
+-			error);
+-		goto err_free_object;
+-	}
++	/* Removed the mxt_sys_init and mxt_debug_msg_init */
++	/* out of mxt_initialize to avoid duplicate inits */
++
++	error = mxt_sysfs_init(data);
++	if (error)
++		return error;
++
++	error = mxt_debug_msg_init(data);
++	if (error)
++		return error;
++
++	mutex_init(&data->debug_msg_lock);
+ 
+ 	return 0;
+ 
+-err_free_object:
+-	mxt_free_input_device(data);
+-	mxt_free_object_table(data);
+-err_free_irq:
+-	free_irq(client->irq, data);
+-err_free_mem:
+-	kfree(data);
+-	return error;
+ }
+ 
+ static int mxt_remove(struct i2c_client *client)
+ {
+ 	struct mxt_data *data = i2c_get_clientdata(client);
+ 
++	mxt_debug_msg_remove(data);	
++	mxt_sysfs_remove(data);
++
++	disable_irq(data->irq);
+ 	sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
+-	free_irq(data->irq, data);
+ 	mxt_free_input_device(data);
+ 	mxt_free_object_table(data);
+-	kfree(data);
+ 
+ 	return 0;
+ }
+@@ -2737,6 +4224,11 @@ static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume);
+ 
+ static const struct of_device_id mxt_of_match[] = {
+ 	{ .compatible = "atmel,maxtouch", },
++	/* Compatibles listed below are deprecated */
++	{ .compatible = "atmel,qt602240_ts", },
++	{ .compatible = "atmel,atmel_mxt_ts", },
++	{ .compatible = "atmel,atmel_mxt_tp", },
++	{ .compatible = "atmel,mXT224", },
+ 	{},
+ };
+ MODULE_DEVICE_TABLE(of, mxt_of_match);
+@@ -2763,7 +4255,7 @@ MODULE_DEVICE_TABLE(i2c, mxt_id);
+ static struct i2c_driver mxt_driver = {
+ 	.driver = {
+ 		.name	= "atmel_mxt_ts",
+-		.of_match_table = of_match_ptr(mxt_of_match),
++		.of_match_table = mxt_of_match,
+ 		.acpi_match_table = ACPI_PTR(mxt_acpi_id),
+ 		.pm	= &mxt_pm_ops,
+ 	},

BIN
board/GfA/Display001/rootfs/usr/sbin/fbvncserver


+ 0 - 45
board/GfA/Display001/rootfs/var/GfA/WebVnc/index.vnc

@@ -1,45 +0,0 @@
-<!-- index.vnc - default html page for Java VNC viewer applet.  On any file
-     ending in .vnc, the HTTP server embedded in Xvnc will substitute the
-     following variables when preceded by a dollar: USER, DESKTOP, DISPLAY,
-     APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT, PARAMS.  Use two dollar
-     signs ($$) to get a dollar sign in the generated html. -->
-
-<HTML>
-<head> 
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-</head> 
-<APPLET CODE=VncViewer.class ARCHIVE=java-applet/VncViewer.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name=PORT value=$PORT>
-<param name="Open New Window" value=yes>
-</APPLET>
-<br/>
-<br/>
-
-If the above Java applet does not work, you can also try the new JavaScript-only <a href="http://kanaka.github.com/noVNC/">noVNC</a> viewer. You will need a HTML5-capable browser though.
-<script language="JavaScript">
-    <!--
-    function start_novnc(){
-	var host = document.location.hostname;
-	// If there are at least two colons in there, it is likely an IPv6 address. Check for square brackets and add them if missing.
-	if(host.search(/^.*:.*:.*$/) != -1) {
-	   if(host.charAt(0) != "[")
-	      host = "[" + host;
-	   if(host.charAt(host.length-1) != "]")
-	      host = host + "]";
-	}
-	open("novnc/vnc_auto.html?host=" + host + "&port=$PORT&true_color=1");
-    }
-    -->
-</script>
-<form name="novnc_button_form">
-  <input type="button" name="novnc_button" value="Click here to connect using noVNC" onClick='start_novnc()'>
-</form>
-
-<br/>
-<br/>
-<br/>
-<A href="http://libvncserver.sf.net/">LibVNCServer/LibVNCClient Homepage</A>
-</HTML>

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/VncViewer.jar


+ 0 - 141
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/javaviewer.pseudo_proxy.patch

@@ -1,141 +0,0 @@
-diff -ru vnc_javasrc/OptionsFrame.java proxy_vnc_javasrc/OptionsFrame.java
---- vnc_javasrc/OptionsFrame.java	Fri Jul  5 08:17:23 2002
-+++ proxy_vnc_javasrc/OptionsFrame.java	Thu Aug 22 23:24:44 2002
-@@ -70,6 +70,12 @@
- 
-   Label[] labels = new Label[names.length];
-   Choice[] choices = new Choice[names.length];
-+
-+  Label proxyHostLabel;
-+  TextField proxyHostEdit;
-+  Label proxyPortLabel;
-+  TextField proxyPortEdit;
-+  
-   Button closeButton;
-   VncViewer viewer;
- 
-@@ -93,6 +99,9 @@
-   boolean shareDesktop;
-   boolean viewOnly;
- 
-+  String proxyHost;
-+  int proxyPort;
-+
-   //
-   // Constructor.  Set up the labels and choices from the names and values
-   // arrays.
-@@ -126,6 +135,32 @@
-       }
-     }
- 
-+    // TODO: find a way to set these to defaults from browser
-+    proxyPort = viewer.readIntParameter("Use Proxy Port", -1);
-+    if(proxyPort>-1) {
-+      proxyHost = viewer.readParameter("Use Proxy Host", false);
-+      if(proxyHost == null)
-+	proxyHost = viewer.host;
-+
-+      proxyHostLabel = new Label("Proxy Host");
-+      gbc.gridwidth = 1;
-+      gridbag.setConstraints(proxyHostLabel,gbc);
-+      add(proxyHostLabel);
-+      proxyHostEdit = new TextField();
-+      gbc.gridwidth = GridBagConstraints.REMAINDER;
-+      gridbag.setConstraints(proxyHostEdit,gbc);
-+      add(proxyHostEdit);
-+    
-+      proxyPortLabel = new Label("Proxy Port");
-+      gbc.gridwidth = 1;
-+      gridbag.setConstraints(proxyPortLabel,gbc);
-+      add(proxyPortLabel);
-+      proxyPortEdit = new TextField();
-+      gbc.gridwidth = GridBagConstraints.REMAINDER;
-+      gridbag.setConstraints(proxyPortEdit,gbc);
-+      add(proxyPortEdit);
-+    }
-+    
-     closeButton = new Button("Close");
-     gbc.gridwidth = GridBagConstraints.REMAINDER;
-     gridbag.setConstraints(closeButton, gbc);
-@@ -161,6 +196,11 @@
-       }
-     }
- 
-+    if(proxyPort>-1) {
-+      proxyPortEdit.setText(Integer.toString(proxyPort));
-+      proxyHostEdit.setText(proxyHost);
-+    }
-+
-     // Make the booleans and encodings array correspond to the state of the GUI
- 
-     setEncodings();
-@@ -361,8 +401,12 @@
-   //
- 
-   public void actionPerformed(ActionEvent evt) {
--    if (evt.getSource() == closeButton)
-+    if (evt.getSource() == closeButton) {
-       setVisible(false);
-+      proxyHost = proxyHostEdit.getText();
-+      proxyPort = Integer.parseInt(proxyPortEdit.getText());
-+      System.err.println("proxy is " + proxyHost + ":" + proxyPort);
-+    }
-   }
- 
-   //
-diff -ru vnc_javasrc/RfbProto.java proxy_vnc_javasrc/RfbProto.java
---- vnc_javasrc/RfbProto.java	Sun Aug  4 18:39:35 2002
-+++ proxy_vnc_javasrc/RfbProto.java	Thu Aug 22 22:53:53 2002
-@@ -119,12 +119,51 @@
-     viewer = v;
-     host = h;
-     port = p;
--    sock = new Socket(host, port);
-+    if(viewer.options.proxyPort>-1)
-+      sock = new Socket(viewer.options.proxyHost, viewer.options.proxyPort);
-+    else
-+      sock = new Socket(host, port);
-     is = new DataInputStream(new BufferedInputStream(sock.getInputStream(),
- 						     16384));
-     os = sock.getOutputStream();
-+    if(viewer.options.proxyPort>-1)
-+      negotiateProxy(host,port);
-   }
- 
-+  // this is inefficient as hell, but only used once per connection
-+  String readLine() {
-+    byte[] ba = new byte[1];
-+    String s = new String("");
-+
-+    ba[0]=0;
-+    try {
-+      while(ba[0] != 0xa) {
-+	ba[0] = (byte)is.readUnsignedByte();
-+	s += new String(ba);
-+      }
-+    } catch(Exception e) {
-+      e.printStackTrace();
-+    }
-+    return s;
-+  }
-+
-+  void negotiateProxy(String realHost,int realPort) throws IOException {
-+    String line;
-+
-+    // this would be the correct way, but we want to trick strict proxies.
-+    // line = "CONNECT " + realHost + ":" + realPort + " HTTP/1.1\r\nHost: " + realHost + ":" + realPort + "\r\n\r\n";
-+    line = "GET " + realHost + ":" + realPort + "/proxied.connection HTTP/1.0\r\nPragma: No-Cache\r\nProxy-Connection: Keep-Alive\r\n\r\n";
-+    os.write(line.getBytes());
-+
-+    line = readLine();
-+    System.err.println("Proxy said: " + line);
-+    if(!(line.substring(0,7)+line.substring(8,12)).equalsIgnoreCase("HTTP/1. 200")) {
-+      IOException e = new IOException(line);
-+      throw e;
-+    }
-+    while(!line.equals("\r\n") && !line.equals("\n"))
-+      line = readLine();
-+  }    
- 
-   void close() {
-     try {

+ 0 - 382
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile

@@ -1,382 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# webclients/java-applet/ssl/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-pkgdatadir = $(datadir)/LibVNCServer
-pkgincludedir = $(includedir)/LibVNCServer
-pkglibdir = $(libdir)/LibVNCServer
-pkglibexecdir = $(libexecdir)/LibVNCServer
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-unknown-linux-gnu
-host_triplet = arm-buildroot-linux-gnueabihf
-subdir = webclients/java-applet/ssl
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/rfbconfig.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run aclocal-1.11
-AMTAR = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run tar
-AM_DEFAULT_VERBOSITY = 0
-AR = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ar
-AS = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-as
-AUTOCONF = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run automake-1.11
-AVAHI_CFLAGS = 
-AVAHI_LIBS = 
-AWK = gawk
-CC = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-gcc
-CCDEPMODE = depmode=none
-CFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -pipe -Os -g2 -Wall -I/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include
-CPP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-cpp
-CPPFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
-CRYPT_LIBS = -lcrypt
-CXX = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-g++
-CXXCPP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-g++ -E
-CXXDEPMODE = depmode=none
-CXXFLAGS = -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  -pipe -Os -g2
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = dlltool
-ECHO = echo
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /bin/grep -E
-EXEEXT = 
-F77 = 
-FFLAGS = 
-GNUTLS_CFLAGS = 
-GNUTLS_LIBS = 
-GREP = /bin/grep
-GTK_CFLAGS = 
-GTK_LIBS = 
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-JPEG_LDFLAGS = 
-LDFLAGS = 
-LIBGCRYPT_CFLAGS = -I/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/include
-LIBGCRYPT_CONFIG = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/bin/libgcrypt-config
-LIBGCRYPT_LIBS = -L/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib -lgcrypt -lgpg-error
-LIBOBJS =  ${LIBOBJDIR}lstat$U.o ${LIBOBJDIR}stat$U.o
-LIBS = -lnsl -lpthread -lz -lpng -ljpeg -lresolv -lssl -lcrypto -L/home/ru/BUILDROOTTEST/buildroot/output/host/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib -lgcrypt -lgpg-error
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LN_S = ln -s
-LTLIBOBJS =  ${LIBOBJDIR}lstat$U.lo ${LIBOBJDIR}stat$U.lo
-MAKEINFO = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/missing --run makeinfo
-MKDIR_P = /bin/mkdir -p
-OBJDUMP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-objdump
-OBJEXT = o
-PACKAGE = LibVNCServer
-PACKAGE_BUGREPORT = http://sourceforge.net/projects/libvncserver
-PACKAGE_NAME = LibVNCServer
-PACKAGE_STRING = LibVNCServer 0.9.9
-PACKAGE_TARNAME = libvncserver
-PACKAGE_URL = 
-PACKAGE_VERSION = 0.9.9
-PATH_SEPARATOR = :
-PKG_CONFIG = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-RANLIB = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ranlib
-RPMSOURCEDIR = NOT-FOUND
-SDL_CFLAGS = 
-SDL_LIBS = 
-SET_MAKE = 
-SHELL = /bin/bash
-SSL_LIBS = -lssl -lcrypto
-STRIP = /home/ru/BUILDROOTTEST/buildroot/output/host/usr/bin/arm-buildroot-linux-gnueabihf-strip
-SYSTEM_LIBVNCSERVER_CFLAGS = 
-SYSTEM_LIBVNCSERVER_LIBS = 
-VERSION = 0.9.9
-WSOCKLIB = 
-XMKMF = 
-X_CFLAGS = 
-X_EXTRA_LIBS = 
-X_LIBS = 
-X_PRE_LIBS = 
-abs_builddir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/webclients/java-applet/ssl
-abs_srcdir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/webclients/java-applet/ssl
-abs_top_builddir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9
-abs_top_srcdir = /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9
-ac_ct_CC = 
-ac_ct_CXX = 
-ac_ct_F77 = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-unknown-linux-gnu
-build_alias = x86_64-unknown-linux-gnu
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = unknown
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = /usr
-host = arm-buildroot-linux-gnueabihf
-host_alias = arm-buildroot-linux-gnueabihf
-host_cpu = arm
-host_os = linux-gnueabihf
-host_vendor = buildroot
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/ru/BUILDROOTTEST/buildroot/output/build/libvncserver-0.9.9/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = /var
-mandir = ${datarootdir}/man
-mkdir_p = /bin/mkdir -p
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-prefix = /usr
-program_transform_name = s&^&&
-psdir = ${docdir}
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = .
-sysconfdir = /etc
-target_alias = arm-buildroot-linux-gnueabihf
-top_build_prefix = ../../../
-top_builddir = ../../..
-top_srcdir = ../../..
-with_ffmpeg = 
-EXTRA_DIST = VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:

+ 0 - 2
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.am

@@ -1,2 +0,0 @@
-EXTRA_DIST=VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
-

+ 0 - 382
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/Makefile.in

@@ -1,382 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = webclients/java-applet/ssl
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/rfbconfig.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AVAHI_CFLAGS = @AVAHI_CFLAGS@
-AVAHI_LIBS = @AVAHI_LIBS@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CRYPT_LIBS = @CRYPT_LIBS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
-GNUTLS_LIBS = @GNUTLS_LIBS@
-GREP = @GREP@
-GTK_CFLAGS = @GTK_CFLAGS@
-GTK_LIBS = @GTK_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-JPEG_LDFLAGS = @JPEG_LDFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
-LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
-LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-RANLIB = @RANLIB@
-RPMSOURCEDIR = @RPMSOURCEDIR@
-SDL_CFLAGS = @SDL_CFLAGS@
-SDL_LIBS = @SDL_LIBS@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SSL_LIBS = @SSL_LIBS@
-STRIP = @STRIP@
-SYSTEM_LIBVNCSERVER_CFLAGS = @SYSTEM_LIBVNCSERVER_CFLAGS@
-SYSTEM_LIBVNCSERVER_LIBS = @SYSTEM_LIBVNCSERVER_LIBS@
-VERSION = @VERSION@
-WSOCKLIB = @WSOCKLIB@
-XMKMF = @XMKMF@
-X_CFLAGS = @X_CFLAGS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-with_ffmpeg = @with_ffmpeg@
-EXTRA_DIST = VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc ultraproxy.vnc
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu webclients/java-applet/ssl/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:

+ 0 - 338
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/README

@@ -1,338 +0,0 @@
-This directory contains a patched Java applet VNC viewer that is SSL
-enabled.
-
-The patches in the *.patch files are relative to the source tarball:
-
-	tightvnc-1.3dev7_javasrc.tar.gz  
-
-currently (4/06) available here:
-
-   http://prdownloads.sourceforge.net/vnc-tight/tightvnc-1.3dev7_javasrc.tar.gz?download
-
-It also includes some simple patches to:
-
-	- fix richcursor colors
-
-	- make the Java Applet cursor (not the cursor drawn to the canvas
-	  framebuffer) invisible when it is inside the canvas.
-
-	- allow Tab (and some other) keystrokes to be sent to the vnc
-	  server instead of doing widget traversal.
-
-
-This SSL applet should work with any VNC viewer that has an SSL tunnel in
-front of it.  It has been tested on x11vnc and using the stunnel tunnel
-to other VNC servers.
-
-By default this Vnc Viewer will only do SSL.  To do unencrypted traffic
-see the "DisableSSL" applet parameter (e.g. set it to Yes in index.vnc).
-
-Proxies: they are a general problem with java socket applets (a socket
-connection does not go through the proxy).  See the info in the proxy.vnc
-file for a workaround.  It uses SignedVncViewer.jar which is simply
-a signed version of VncViewer.jar.  The basic idea is the user clicks
-"Yes" to trust the applet and then it can connect directly to the proxy
-and issue a CONNECT request.
-
-This applet has been tested on versions 1.4.2 and 1.5.0 of the Sun
-Java plugin.  It may not work on older releases or different vendor VM's.
-Send full Java Console output for failures.
-
----------------------------------------------------------------
-Tips:
-
-When doing single-port proxy connections (e.g. both VNC and HTTPS
-thru port 5900) it helps to move through the 'do you trust this site'
-dialogs quickly.   x11vnc has to wait to see if the traffic is VNC or
-HTTP and this can cause timeouts if you don't move thru them quickly.
-
-You may have to restart your browser completely if it gets into a
-weird state.  For one case we saw the JVM requesting VncViewer.class
-even when no such file exists.
-
-
----------------------------------------------------------------
-Extras:
-
-ss_vncviewer (not Java):
-
-        Wrapper script for native VNC viewer to connect to x11vnc in
-        SSL mode.  Script launches stunnel(8) and then connects to it
-        via localhost which in turn is then redirected to x11vnc via an
-        SSL tunnel.  stunnel(8) must be installed and available in PATH.
-
-
-Running Java SSL VncViewer from the command line:
-
-	From this directory:
-
-	java -cp ./VncViewer.jar VncViewer HOST <thehost> PORT <theport>
-
-	substitute <thehost> and <theport> with the actual values.
-	You can add any other parameters, e.g.: ignoreProxy yes
-
----------------------------------------------------------------
-UltraVNC:
-
-The UltraVNC java viewer has also been patched to support SSL.  Various
-bugs in the UltraVNC java viewer were also fixed.  This viewer can be
-useful because is support UltraVNC filetransfer, and so it works on
-Unix, etc.
-
-UltraViewerSSL.jar
-SignedUltraViewerSSL.jar
-ultra.vnc
-ultraproxy.vnc
-ultravnc-102-JavaViewer-ssl-etc.patch
-
----------------------------------------------------------------
-Applet Parameters:
-
-Some additional applet parameters can be set via the URL, e.g.
-
-	http://host:5800/?param=value
-	http://host:5800/ultra.vnc?param=value
-	https://host:5900/ultra.vnc?param=value
-
-etc.  If running java from command line as show above, it comes
-in as java ... VncViewer param value ... 
-
-There is a limitation with libvncserver that param and value can
-only be alphanumeric, underscore, "+" (for space), or "."
-
-We have added some applet parameters to the stock VNC java
-viewers.  Here are the applet parameters:
-
-Both TightVNC and UltraVNC Java viewers:
-
-  HOST
-	string, default: none.
-	The Hostname to connect to.
-	
-  PORT
-	number, default: 0
-	The VNC server port to connect to.
-
-  Open New Window
-	yes/no, default: no
-	Run applet in separate frame.
-
-  Show Controls
-	yes/no, default: yes
-	Show Controls button panel.
-
-  Show Offline Desktop
-	yes/no, default: no
-	Do we continue showing desktop on remote disconnect?
-
-  Defer screen updates
-	number, default: 20
-	Milliseconds delay
-
-  Defer cursor updates
-	number, default: 10
-	Milliseconds delay
-
-  Defer update requests
-	number, default: 50
-	Milliseconds delay
-
-  PASSWORD
-	string, default: none
-	VNC session password in plain text.
-
-  ENCPASSWORD
-	string, default: none
-	VNC session password in encrypted in DES with KNOWN FIXED
-	key.  It is a hex string.  This is like the ~/.vnc/passwd format.
-  
-  
-  The following are added by x11vnc and/or ssvnc project
-  
-  VNCSERVERPORT
-	number, default: 0
-	Like PORT, but if there is a firewall this is the Actual VNC
-	server port.  PORT might be a redir port on the firewall.
-
-  DisableSSL
-	yes/no, default: no
-	Do unencrypted connection, no SSL. 
-
-  httpsPort
-	number, default: none
-	When checking for proxy, use this at the url port number.
-
-  CONNECT
-	string, default: none
-	Sets to host:port for the CONNECT line to a Web proxy. 
-	The Web proxy should connect us to it.
-
-  GET
-	yes/no, default: no
-	Set to do a special HTTP GET (/request.https.vnc.connection)
-	to the vnc server that will cause it to switch to VNC instead.
-	This is to speedup/make more robust, the single port HTTPS and VNC
-	mode of x11vnc (e.g. both services thru port 5900, etc) 
-	
-  urlPrefix
-	string, default: none
-	set to a string that will be prefixed to all URL's when contacting
-	the VNC server.  Idea is a special proxy will use this to indicate
-	internal hostname, etc.
-
-  oneTimeKey
-	string, default: none
-	set a special hex "key" to correspond to an SSL X.509 cert+key.
-	See the 'onetimekey' helper script.  Can also be PROMPT to prompt
-	the user to paste the hex key string in.
-
-	This provides a Client-Side cert+key that the client will use to
-	authenticate itself by SSL To the VNC Server.
-
-	This is to try to work around the problem that the Java applet
-	cannot keep an SSL keystore on disk, etc.  E.g. if they log
-	into an HTTPS website via password they are authenticated and
-	encrypted, then the website can safely put oneTimeKey=... on the
-	URL.  The Vncviewer authenticates the VNC server with this key.
-
-	Note that there is currently a problem in that if x11vnc requires
-	Client Certificates the user cannot download the index.vnc HTML
-	and VncViewer.jar from the same x11vnc.  Those need to come from
-	a different x11vnc or from a web server.
-
-	Note that the HTTPS website can also put the VNC Password
-	(e.g. a temporary/one-time one) in the parameter PASSWORD.
-	The Java Applet will automatically supply this VNC password
-	instead of prompting.
-
-  serverCert
-	string, default: none
-	set a special hex "cert" to correspond to an SSL X.509 cert
-	See the 'onetimekey -certonly' helper script.
-
-	This provides a Server-Side cert that the client will authenticate
-	the VNC Server against by SSL.
-
-	This is to try to work around the problem that the Java applet
-	cannot keep an SSL keystore on disk, etc.  E.g. if they log
-	into an HTTPS website via password they are authenticated and
-	encrypted, then the website can safely put serverCert=... on the
-	URL.
-
-	Of course the VNC Server is sending this string to the Java
-	Applet, so this is only reasonable security if the VNC Viewer
-	already trusts the HTTPS retrieval of the URL + serverCert param
-	that it gets.  This should be done over HTTPS not HTTP.
-
-  proxyHost
-	string, default: none
-	Do not try to guess the proxy's hostname, use the value in
-	proxyHost.  Does not imply forceProxy (below.)
-
-  proxyPort
-	string, default: none
-	Do not try to guess the proxy's port number, use the value in
-	proxyPort.  Does not imply forceProxy (below.)
-
-  forceProxy
-	yes/no, default: no
-	Assume there is a proxy and force its use.
-
-	If a string other than "yes" or "no" is given, it implies "yes"
-	and uses the string for proxyHost and proxyPort (see above).
-	In this case the string must be of the form "hostname+port".
-	Note that it is "+" and not ":" before the port number.
-
-  ignoreProxy
-	yes/no, default: no
-	Don't check for a proxy, assume there is none.
-
-  trustAllVncCerts
-	yes/no, default: no
-	Automatically trust any cert received from the VNC server
-	(obviously this could be dangerous and lead to man in the
-	middle attack).  Do not ask the user to verify any of these
-	certs from the VNC server.
-
-  trustUrlVncCert
-	yes/no, default: no
-	Automatically trust any cert that the web browsers has accepted.
-	E.g. the user said "Yes" or "Continue" to a web browser dialog
-	regarding a certificate.  If we get the same cert (chain) from
-	the VNC server we trust it without prompting the user.
-
-  debugCerts
-	yes/no, default: no
-	Print out every cert in the Server, TrustUrl, TrustAll chains.
-
-
-TightVNC Java viewer only:
-
-  Offer Relogin
-	yes/no, default: yes
-	"Offer Relogin" set to "No" disables "Login again" 
-
-  SocketFactory
-	string, default: none
-	set Java Socket class factory.
-
-UltraVNC Java viewer only:
-
-  None.
-
-  The following are added by x11vnc and/or ssvnc project
-  
-  ftpDropDown
-	string, default: none
-	Sets the file transfer "drives" dropdown to the "." separated
-	list.  Use "+" for space. The default is
-
-		My+Documents.Desktop.Home
-
-	for 3 entries in the dropdown in addition to the "drives"
-	(e.g. C:\)  These items should be expanded properly by the VNC
-	Server.  x11vnc will prepend $HOME to them, which is normally
-	what one wants.  To include a "/" use "_2F_".  Another example:
-
-		Home.Desktop.bin_2F_linux
-
-	If an item is prefixed with "TOP_" then the item is inserted at
-	the top of the drop down rather than being appended to the end.
-	E.g. to try to initially load the user homedir instead of /:
-
-		TOP_Home.My+Documents.Desktop
-
-	If ftpDropDown is set to the empty string, "", then no special
-	locations, [Desktop] etc., are placed in the drop down.  Only the
-	ultravnc "drives" will appear.
-
-  ftpOnly
-	yes/no, default: no
-	The VNC viewer only shows the filetransfer panel, no desktop
-	is displayed.
-
-  graftFtp
-	yes/no, default: no
-	As ftpOnly, the VNC viewer only shows the filetransfer panel,
-	no desktop is displayed, however it is "grafted" onto an existing
-	SSVNC unix vncviewer.  The special SSVNC vncviewer merges the two
-	channels.
-
-  dsmActive
-	yes/no, default: no
-	Special usage mode with the SSVNC unix vncviewer.  The UltraVNC
-	DSM encryption is active.  Foolishly, UltraVNC DSM encryption
-	*MODIFIES* the VNC protocol when active (it is not a pure tunnel).
-	This option indicates to modify the VNC protocol to make this work. 
-	Usually only used with graftFtp and SSVNC unix vncviewer.
-
-  delayAuthPanel
-	yes/no, default: no
-	This is another special usage mode with the SSVNC unix vncviewer.
-	A login panel is delayed (not shown at startup.)  Could be useful
-	for non SSVNC usage too.
-
-  ignoreMSLogonCheck
-	yes/no, default: no
-	Similar to delayAuthPanel, do not put up a popup asking for
-	Windows username, etc.

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/SignedUltraViewerSSL.jar


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/SignedVncViewer.jar


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/UltraViewerSSL.jar


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/VncViewer.jar


+ 0 - 26
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/index.vnc

@@ -1,26 +0,0 @@
-<!-- 
-     index.vnc - default HTML page for TightVNC Java viewer applet, to be
-     used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
-     Xvnc will substitute the following variables when preceded by a dollar:
-     USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
-     PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
-     HTML page.
-
-     NOTE: the $PARAMS variable is not supported by the standard VNC, so
-     make sure you have TightVNC on the server side, if you're using this
-     variable.
--->
-
-<HTML>
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-<APPLET CODE=VncViewer.class ARCHIVE=VncViewer.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name=PORT value=$PORT>
-<param name="Open New Window" value=yes>
-$PARAMS
-</APPLET>
-<BR>
-<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
-</HTML>

+ 0 - 65
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/onetimekey

@@ -1,65 +0,0 @@
-#!/bin/sh
-#
-# usage: onetimekey path/to/mycert.pem
-#        onetimekey -certonly path/to/mycert.pem
-#
-# Takes an openssl cert+key pem file and turns into a long string
-# for the x11vnc SSL VNC Java Viewer.
-#
-# The Java applet URL parameter can be  oneTimeKey=<str> where str is
-# the output of this program, or can be oneTimeKey=PROMPT in which
-# case the applet will ask you to paste in the string.
-#
-# The problem trying to be solved here is it is difficult to get
-# the Java applet to have or use a keystore with the key saved
-# in it.  Also, as the name implies, an HTTPS server can create
-# a one time key to send to the applet (the user has already
-# logged in via password to the HTTPS server).
-#
-# Note oneTimeKey is to provide a CLIENT Certificate for the viewer
-# to authenticate itself to the VNC Server.
-#
-# There is also the serverCert=<str> Applet parameter.  This is
-# a cert to authenticate the VNC server against.  To create that
-# string with this tool specify -certonly as the first argument.
-
-certonly=""
-if [ "X$1" = "X-certonly" ]; then
-	shift
-	certonly=1
-fi
-
-in=$1
-der=/tmp/1time$$.der
-touch $der
-chmod 600 $der
-
-openssl pkcs8 -topk8 -nocrypt -in "$in" -out "$der" -outform der
-
-pbinhex=/tmp/pbinhex.$$
-cat > $pbinhex <<END
-#!/usr/bin/perl
-
-\$str = '';
-while (1) {
-        \$c = getc(STDIN);
-        last if \$c eq '';
-        \$str .= sprintf("%02x", unpack("C", \$c));
-}
-
-print "\$str\n";
-END
-
-chmod 700 $pbinhex 
-
-str1=`$pbinhex < "$der"`
-rm -f "$der"
-
-n=`grep -n 'BEGIN CERTIFICATE' $in | awk -F: '{print $1}' | head -1`
-str2=`tail +$n $in | $pbinhex`
-if [ "X$certonly" = "X1" ]; then
-	echo "$str2"
-else
-	echo "$str1,$str2"
-fi
-rm -f $pbinhex

+ 0 - 73
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/proxy.vnc

@@ -1,73 +0,0 @@
-<!-- 
-     index.vnc - default HTML page for TightVNC Java viewer applet, to be
-     used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
-     Xvnc will substitute the following variables when preceded by a dollar:
-     USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
-     PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
-     HTML page.
-
-     NOTE: the $PARAMS variable is not supported by the standard VNC, so
-     make sure you have TightVNC on the server side, if you're using this
-     variable.
--->
-
-<!--
-The idea behind using the signed applet in SignedVncViewer.jar for
-firewall proxies:
-
-Java socket applets and http proxies do not get along well.
-
-Java security allows the applet to connect back via a socket to the
-originating host, but the browser/plugin Proxy settings are not used for
-socket connections (only http and the like).  So the socket connection
-fails in the proxy environment.
-
-The applet is not allowed to open a socket connection to the proxy (since
-that would let it connect to just about any host, e.g. CONNECT method).
-
-This is indpendent of SSL but of course fails for that socket connection
-as well.  I.e. this is a problem for non-SSL VNC Viewers as well.
-
-Solution?  Sign the applet and have the user click on "Yes" that they
-fully trust the applet.  Then the applet can connect to any host via
-sockets, in particular the proxy.  It next issues the request
-
-	CONNECT host:port HTTP/1.1
-	Host: host:port
-
-and if the proxy supports the CONNECT method we are finally connected to
-the VNC server.
-
-For SSL connections, SSL is layered on top of this socket.  However note
-this scheme will work for non-SSL applet proxy tunnelling as well.
-
-It should be able to get non-SSL VNC connections to work via GET
-command but that has not been done yet.
-
-Note that some proxies only allow CONNECT to only these the ports 443
-(HTTPS) and 563 (SNEWS).  So you would have to run the VNC server on
-those ports.
-
-SignedVncViewer.jar is just a signed version of VncViewer.jar
-
-The URL to use for this file:  https://host:port/proxy.vnc
-
-Note VNCSERVERPORT, we assume $PARAMS will have the correct PORT setting
-(e.g. 563), not the one libvncserver puts in....
-
--->
-
-
-<HTML>
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-<APPLET CODE=VncViewer.class ARCHIVE=SignedVncViewer.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name=VNCSERVERPORT value=$PORT>
-<param name="Open New Window" value=yes>
-$PARAMS
-</APPLET>
-<BR>
-<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
-</HTML>

+ 0 - 3676
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ss_vncviewer

@@ -1,3676 +0,0 @@
-#!/bin/sh
-#
-# ss_vncviewer:  wrapper for vncviewer to use an stunnel SSL tunnel
-#                or an SSH tunnel.
-#
-# Copyright (c) 2006-2009 by Karl J. Runge <runge@karlrunge.com>
-#
-# ss_vncviewer 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.
-# 
-# ss_vncviewer is distributed in the hope that 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 ss_vncviewer; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
-# or see <http://www.gnu.org/licenses/>.
-# 
-# 
-# You must have stunnel(8) installed on the system and in your PATH
-# (however, see the -ssh option below, in which case you will need ssh(1)
-# installed)  Note: stunnel is usually installed in an "sbin" subdirectory.
-#
-# You should have "x11vnc -ssl ..." or "x11vnc -stunnel ..." 
-# already running as the VNC server on the remote machine.
-# (or use stunnel on the server side for any other VNC server)
-#
-#
-# Usage: ss_vncviewer [cert-args] host:display <vncviewer-args>
-#
-# e.g.:  ss_vncviewer snoopy:0
-#        ss_vncviewer snoopy:0 -encodings "copyrect tight zrle hextile"
-#
-# [cert-args] can be:
-#
-#	-verify /path/to/cacert.pem		
-#	-mycert /path/to/mycert.pem		
-#	-crl    /path/to/my_crl.pem  (or directory)
-#	-proxy  host:port
-#
-# -verify specifies a CA cert PEM file (or a self-signed one) for
-#         authenticating the VNC server.
-#
-# -mycert specifies this client's cert+key PEM file for the VNC server to
-#	  authenticate this client. 
-#
-# -proxy  try host:port as a Web proxy to use the CONNECT method
-#         to reach the VNC server (e.g. your firewall requires a proxy).
-#
-#         For the "double proxy" case use -proxy host1:port1,host2:port2
-#         (the first CONNECT is done through host1:port1 to host2:port2
-#         and then a 2nd CONNECT to the destination VNC server.)
-#
-#         Use socks://host:port, socks4://host:port, or socks5://host,port
-#         to force usage of a SOCKS proxy.  Also repeater://host:port and
-#         sslrepeater://host:port.
-#
-# -showcert  Only fetch the certificate using the 'openssl s_client'
-#            command (openssl(1) must in installed).  On ssvnc 1.0.27 and
-#            later the bundled command 'ultravnc_dsm_helper' is used.
-#
-#    See http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-ca for details on
-#    SSL certificates with VNC.
-#
-# A few other args (not related to SSL and certs):
-#
-# -2nd    Run the vncviewer a 2nd time if the first connections fails.
-#
-# -ssh    Use ssh instead of stunnel SSL.  ssh(1) must be installed and you
-#         must be able to log into the remote machine via ssh.
-#
-#         In this case "host:display" may be of the form "user@host:display"
-#         where "user@host" is used for the ssh login (see ssh(1) manpage).
-#
-#         If -proxy is supplied it can be of the forms: "gwhost" "gwhost:port"
-#         "user@gwhost" or "user@gwhost:port".  "gwhost" is an incoming ssh 
-#         gateway machine (the VNC server is not running there), an ssh -L
-#         redir is used to "host" in "host:display" from "gwhost". Any "user@"
-#         part must be in the -proxy string (not in "host:display").
-#
-#         Under -proxy use "gwhost:port" if connecting to any ssh port
-#         other than the default (22).  (even for the non-gateway case,
-#         -proxy must be used to specify a non-standard ssh port)
-#
-#         A "double ssh" can be specified via a -proxy string with the two
-#         hosts separated by a comma:
-#
-#             [user1@]host1[:port1],[user2@]host2[:port2]
-#
-#         in which case a ssh to host1 and thru it via a -L redir a 2nd
-#         ssh is established to host2.  
-#
-#         Examples:
-#
-#         ss_vncviewer -ssh bob@bobs-home.net:0
-#         ss_vncviewer -ssh -sshcmd 'x11vnc -localhost' bob@bobs-home.net:0
-#
-#         ss_vncviewer -ssh -proxy fred@mygate.com:2022 mymachine:0
-#         ss_vncviewer -ssh -proxy bob@bobs-home.net:2222 localhost:0
-#
-#         ss_vncviewer -ssh -proxy fred@gw-host,fred@peecee localhost:0
-#
-# -sshcmd cmd   Run "cmd" via ssh instead of the default "sleep 15"
-#               e.g. -sshcmd 'x11vnc -display :0 -localhost -rfbport 5900'
-#
-# -sshargs "args"  pass "args" to the ssh process, e.g. -L/-R port redirs.
-#
-# -sshssl Tunnel the SSL connection thru a SSH connection.  The tunnel as
-#         under -ssh is set up and the SSL connection goes thru it.  Use
-#         this if you want to have and end-to-end SSL connection but must
-#         go thru a SSH gateway host (e.g. not the vnc server).  Or use
-#         this if you need to tunnel additional services via -R and -L 
-#         (see -sshargs above).
-#
-#         ss_vncviewer -sshssl -proxy fred@mygate.com mymachine:0
-#
-# -listen (or -reverse) set up a reverse connection.
-#
-# -alpha  turn on cursor alphablending hack if you are using the
-#         enhanced tightvnc vncviewer.
-#
-# -grab   turn on XGrabServer hack if you are using the enhanced tightvnc
-#         vncviewer (e.g. for fullscreen mode in some windowmanagers like
-#         fvwm that do not otherwise work in fullscreen mode)
-#
-#
-# set VNCVIEWERCMD to whatever vncviewer command you want to use.
-#
-VNCIPCMD=${VNCVIEWERCMD:-vncip}
-VNCVIEWERCMD=${VNCVIEWERCMD:-vncviewer}
-if [ "X$SSVNC_TURBOVNC" != "X" ]; then
-	if echo "$VNCVIEWERCMD" | grep '\.turbovnc' > /dev/null; then
-		:
-	else
-		if type "$VNCVIEWERCMD.turbovnc" > /dev/null 2>/dev/null; then
-			VNCVIEWERCMD="$VNCVIEWERCMD.turbovnc"
-		fi
-	fi
-fi
-#
-# Same for STUNNEL, e.g. set it to /path/to/stunnel or stunnel4, etc.
-#
-
-# turn on verbose debugging output
-if [ "X$SS_DEBUG" != "X" -a "X$SS_DEBUG" != "X0" ]; then
-	set -xv 
-fi
-
-PATH=$PATH:/usr/sbin:/usr/local/sbin:/dist/sbin; export PATH
-
-localhost="localhost"
-if uname | grep Darwin >/dev/null; then
-	localhost="127.0.0.1"
-fi
-
-# work out which stunnel to use (debian installs as stunnel4)
-stunnel_set_here=""
-if [ "X$STUNNEL" = "X" ]; then
-	check_stunnel=1
-	if [ "X$SSVNC_BASEDIRNAME" != "X" ]; then
-		if [ -x "$SSVNC_BASEDIRNAME/stunnel" ]; then
-			type stunnel > /dev/null 2>&1
-			if [ $? = 0 ]; then
-				# found ours
-				STUNNEL=stunnel
-				check_stunnel=0
-			fi
-		fi
-	fi
-	if [ "X$check_stunnel" = "X1" ]; then
-		type stunnel4 > /dev/null 2>&1
-		if [ $? = 0 ]; then
-			STUNNEL=stunnel4
-		else
-			STUNNEL=stunnel
-		fi
-	fi
-	stunnel_set_here=1
-fi
-
-help() {
-	tail -n +2 "$0" | sed -e '/^$/ q'
-}
-
-secondtry=""
-gotalpha=""
-use_ssh=""
-use_sshssl=""
-direct_connect=""
-ssh_sleep=15
-
-# sleep longer in -listen mode:
-if echo "$*" | grep '.*-listen' > /dev/null; then
-	ssh_sleep=1800
-fi
-
-
-ssh_cmd=""
-# env override of ssh_cmd:
-if [ "X$SS_VNCVIEWER_SSH_CMD" != "X" ]; then
-	ssh_cmd="$SS_VNCVIEWER_SSH_CMD"
-fi
-
-ssh_args=""
-showcert=""
-reverse=""
-
-ciphers=""
-anondh="ALL:RC4+RSA:+SSLv2:@STRENGTH"
-anondh_set=""
-stunnel_debug="6"
-if [ "X$SS_DEBUG" != "X" -o "X$SSVNC_VENCRYPT_DEBUG" != "X" -o "X$SSVNC_STUNNEL_DEBUG" != "X" ]; then
-	stunnel_debug="7"
-fi
-
-if [ "X$1" = "X-viewerflavor" ]; then
-	# special case, try to guess which viewer:
-	#
-	if echo "$VNCVIEWERCMD" | egrep -i '^(xmessage|sleep )' > /dev/null; then
-		echo "unknown"
-		exit 0
-	fi
-	if echo "$VNCVIEWERCMD" | grep -i chicken.of > /dev/null; then
-		echo "cotvnc"
-		exit 0
-	fi
-	if echo "$VNCVIEWERCMD" | grep -i ultra > /dev/null; then
-		echo "ultravnc"
-		exit 0
-	fi
-	# OK, run it for help output...
-	str=`$VNCVIEWERCMD -h 2>&1 | head -n 5`
-	if echo "$str" | grep -i 'TightVNC.viewer' > /dev/null; then
-		echo "tightvnc"
-	elif echo "$str" | grep -i 'VNC viewer version 3' > /dev/null; then
-		echo "realvnc3"
-	elif echo "$str" | grep -i 'VNC viewer .*Edition 4' > /dev/null; then
-		echo "realvnc4"
-	elif echo "$str" | grep -i 'RealVNC.Ltd' > /dev/null; then
-		echo "realvnc4"
-	else
-		echo "unknown"
-	fi
-	exit 0
-fi
-if [ "X$1" = "X-viewerhelp" ]; then
-	$VNCVIEWERCMD -h 2>&1
-	exit 0
-fi
-
-# grab our cmdline options:
-while [ "X$1" != "X" ]
-do
-    case $1 in 
-	"-verify")	shift; verify="$1"
-                ;;
-	"-mycert")	shift; mycert="$1"
-                ;;
-	"-crl")		shift; crl="$1"
-                ;;
-	"-proxy")	shift; proxy="$1"
-                ;;
-	"-ssh")		use_ssh=1
-                ;;
-	"-sshssl")	use_ssh=1
-			use_sshssl=1
-                ;;
-	"-sshcmd")	shift; ssh_cmd="$1"
-                ;;
-	"-sshargs")	shift; ssh_args="$1"
-                ;;
-	"-anondh")	ciphers="ciphers=$anondh"
-			ULTRAVNC_DSM_HELPER_SHOWCERT_ADH=1
-			export ULTRAVNC_DSM_HELPER_SHOWCERT_ADH
-			anondh_set=1
-                ;;
-	"-ciphers")	shift; ciphers="ciphers=$1"
-                ;;
-	"-alpha")	gotalpha=1
-                ;;
-	"-showcert")	showcert=1
-                ;;
-	"-listen")	reverse=1
-                ;;
-	"-reverse")	reverse=1
-                ;;
-	"-2nd")		secondtry=1
-                ;;
-	"-grab")	VNCVIEWER_GRAB_SERVER=1; export VNCVIEWER_GRAB_SERVER
-                ;;
-	"-x11cursor")	VNCVIEWER_X11CURSOR=1; export VNCVIEWER_X11CURSOR
-                ;;
-	"-rawlocal")	VNCVIEWER_RAWLOCAL=1; export VNCVIEWER_RAWLOCAL
-                ;;
-	"-scale")	shift; SSVNC_SCALE="$1"; export SSVNC_SCALE
-                ;;
-	"-onelisten")	SSVNC_LISTEN_ONCE=1; export SSVNC_LISTEN_ONCE
-                ;;
-	"-sendclipboard")	VNCVIEWER_SEND_CLIPBOARD=1; export VNCVIEWER_SEND_CLIPBOARD
-                ;;
-	"-sendalways")	VNCVIEWER_SEND_ALWAYS=1; export VNCVIEWER_SEND_ALWAYS
-                ;;
-	"-recvtext")	shift; VNCVIEWER_RECV_TEXT="$1"; export VNCVIEWER_RECV_TEXT
-                ;;
-	"-escape")	shift; VNCVIEWER_ESCAPE="$1"; export VNCVIEWER_ESCAPE
-                ;;
-	"-ssvnc_encodings")	shift; VNCVIEWER_ENCODINGS="$1"; export VNCVIEWER_ENCODINGS
-                ;;
-	"-ssvnc_extra_opts")	shift; VNCVIEWERCMD_EXTRA_OPTS="$1"; export VNCVIEWERCMD_EXTRA_OPTS
-                ;;
-	"-rfbversion")	shift; VNCVIEWER_RFBVERSION="$1"; export VNCVIEWER_RFBVERSION
-                ;;
-	"-nobell")	VNCVIEWER_NOBELL=1; export VNCVIEWER_NOBELL
-                ;;
-	"-popupfix")	VNCVIEWER_POPUP_FIX=1; export VNCVIEWER_POPUP_FIX
-                ;;
-	"-realvnc4")	VNCVIEWER_IS_REALVNC4=1; export VNCVIEWER_IS_REALVNC4
-                ;;
-	"-h"*)	help; exit 0
-                ;;
-	"--h"*)	help; exit 0
-                ;;
-	*)	break
-                ;;
-    esac
-    shift
-done
-
-# maxconn is something we added to stunnel, this disables it:
-if [ "X$SS_VNCVIEWER_NO_MAXCONN" != "X" ]; then
-	STUNNEL_EXTRA_OPTS=`echo "$STUNNEL_EXTRA_OPTS" | sed -e 's/maxconn/#maxconn/'`
-elif echo "$VNCVIEWERCMD" | egrep -i '^(xmessage|sleep )' > /dev/null; then
-	STUNNEL_EXTRA_OPTS=`echo "$STUNNEL_EXTRA_OPTS" | sed -e 's/maxconn/#maxconn/'`
-elif [ "X$reverse" != "X" ]; then
-	STUNNEL_EXTRA_OPTS=`echo "$STUNNEL_EXTRA_OPTS" | sed -e 's/maxconn/#maxconn/'`
-else
-	# new way (our patches).  other than the above, we set these:
-	if [ "X$SKIP_STUNNEL_ONCE" = "X" ]; then
-		STUNNEL_ONCE=1; export STUNNEL_ONCE
-	fi
-	if [ "X$SKIP_STUNNEL_MAX_CLIENTS" = "X" ]; then
-		STUNNEL_MAX_CLIENTS=1; export STUNNEL_MAX_CLIENTS
-	fi
-fi
-# always set this one:
-if [ "X$SKIP_STUNNEL_NO_SYSLOG" = "X" ]; then
-	STUNNEL_NO_SYSLOG=1; export STUNNEL_NO_SYSLOG
-fi
-
-# this is the -t ssh option (gives better keyboard response thru SSH tunnel)
-targ="-t"
-if [ "X$SS_VNCVIEWER_NO_T" != "X" ]; then
-	targ=""
-fi
-
-# set the alpha blending env. hack: 
-if [ "X$gotalpha" = "X1" ]; then
-	VNCVIEWER_ALPHABLEND=1
-	export VNCVIEWER_ALPHABLEND
-else
-	NO_ALPHABLEND=1
-	export NO_ALPHABLEND
-fi
-
-if [ "X$reverse" != "X" ]; then
-	ssh_sleep=1800
-	if [ "X$proxy" != "X" ]; then
-		# check proxy usage under reverse connection:
-		if [ "X$use_ssh" = "X" -a "X$use_sshssl" = "X" ]; then
-			echo ""
-			if echo "$proxy" | egrep -i "(repeater|vencrypt)://" > /dev/null; then
-				:
-			else
-				echo "*Warning*: SSL -listen and a Web proxy does not make sense."
-				sleep 2
-			fi
-		elif echo "$proxy" | grep "," > /dev/null; then
-			:
-		else
-			echo ""
-			echo "*Warning*: -listen and a single proxy/gateway does not make sense."
-			sleep 2
-		fi
-
-		# we now try to PPROXY_LOOP_THYSELF, set this var to disable that.
-		#SSVNC_LISTEN_ONCE=1; export SSVNC_LISTEN_ONCE
-	fi
-fi
-if [ "X$ssh_cmd" = "X" ]; then
-	# if no remote ssh cmd, sleep a bit:
-	ssh_cmd="sleep $ssh_sleep"
-fi
-
-# this should be a host:display:
-#
-orig="$1"
-shift
-
-dL="-L"
-if uname -sr | egrep 'SunOS 5\.[5-8]' > /dev/null; then
-	dL="-h"
-fi
-
-have_uvnc_dsm_helper_showcert=""
-if [ "X$showcert" = "X1" -a "X$SSVNC_USE_S_CLIENT" = "X" -a "X$reverse" = "X" ]; then
-	if type ultravnc_dsm_helper >/dev/null 2>&1; then
-		if ultravnc_dsm_helper -help 2>&1 | grep -w showcert >/dev/null; then
-			have_uvnc_dsm_helper_showcert=1
-		fi
-	fi
-fi
-have_uvnc_dsm_helper_ipv6=""
-if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then
-	if type ultravnc_dsm_helper >/dev/null 2>&1; then
-		if ultravnc_dsm_helper -help 2>&1 | grep -iw ipv6 >/dev/null; then
-			have_uvnc_dsm_helper_ipv6=1
-		fi
-	fi
-fi
-
-rchk() {
-	# a kludge to set $RANDOM if we are not bash:
-	if [ "X$BASH_VERSION" = "X" ]; then
-		RANDOM=`date +%S``sh -c 'echo $$'``ps -elf 2>&1 | sum 2>&1 | awk '{print $1}'`
-	fi
-}
-rchk
-
-# a portable, but not absolutely safe, tmp file creator
-mytmp() {
-	tf=$1
-	if type mktemp > /dev/null 2>&1; then
-		# if we have mktemp(1), use it:
-		tf2="$tf.XXXXXX"
-		tf2=`mktemp "$tf2"`
-		if [ "X$tf2" != "X" -a -f "$tf2" ]; then
-			if [ "X$DEBUG_MKTEMP" != "X" ]; then
-				echo "mytmp-mktemp: $tf2" 1>&2
-			fi
-			echo "$tf2"
-			return
-		fi
-	fi
-	# fallback to multiple cmds:
-	rm -rf "$tf" || exit 1
-	if [ -d "$tf" ]; then
-		echo "tmp file $tf still exists as a directory."
-		exit 1
-	elif [ $dL "$tf" ]; then
-		echo "tmp file $tf still exists as a symlink."
-		exit 1
-	elif [ -f "$tf" ]; then
-		echo "tmp file $tf still exists."
-		exit 1
-	fi
-	touch "$tf" || exit 1
-	chmod 600 "$tf" || exit 1
-	rchk
-	if [ "X$DEBUG_MKTEMP" != "X" ]; then
-		echo "mytmp-touch: $tf" 1>&2
-	fi
-	echo "$tf"
-}
-
-# set up special case of ultravnc single click III mode:
-if echo "$proxy" | egrep "^sslrepeater://" > /dev/null; then
-	pstr=`echo "$proxy" | sed -e 's,sslrepeater://,,'`
-	pstr1=`echo "$pstr" | sed -e 's/+.*$//'`
-	pstr2=`echo "$pstr" | sed -e 's/^[^+]*+//'`
-	SSVNC_REPEATER="SCIII=$pstr2"; export SSVNC_REPEATER
-	orig=$pstr1
-	echo
-	echo "reset: SSVNC_REPEATER=$SSVNC_REPEATER orig=$orig proxy=''"
-	proxy=""
-fi
-if echo "$proxy" | egrep "vencrypt://" > /dev/null; then
-	vtmp="/tmp/ss_handshake${RANDOM}.$$.txt"
-	vtmp=`mytmp "$vtmp"`
-	SSVNC_PREDIGESTED_HANDSHAKE="$vtmp"
-	export SSVNC_PREDIGESTED_HANDSHAKE
-	if [ "X$SSVNC_USE_OURS" = "X" ]; then
-		NEED_VENCRYPT_VIEWER_BRIDGE=1
-	fi
-fi
-if [ "X$SSVNC_USE_OURS" = "X" ]; then
-	VNCVIEWERCMD_EXTRA_OPTS=""
-fi
-
-
-# check -ssh and -mycert/-verify conflict:
-if [ "X$use_ssh" = "X1" -a "X$use_sshssl" = "X" ]; then
-	if [ "X$mycert" != "X" -o "X$verify" != "X" ]; then
-		echo "-mycert and -verify cannot be used in -ssh mode" 
-		exit 1
-	fi
-fi
-
-# direct mode Vnc:// means show no warnings.
-# direct mode vnc:// will show warnings.
-if echo "$orig" | grep '^V[Nn][Cc]://' > /dev/null; then
-	SSVNC_NO_ENC_WARN=1
-	export SSVNC_NO_ENC_WARN
-	orig=`echo "$orig" | sed -e 's/^...:/vnc:/'`
-fi
-
-# interprest the pseudo URL proto:// strings:
-if echo "$orig" | grep '^vnc://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vnc://,,'`
-	verify=""
-	mycert=""
-	crl=""
-	use_ssh=""
-	use_sshssl=""
-	direct_connect=1
-elif echo "$orig" | grep '^vncs://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vncs://,,'`
-elif echo "$orig" | grep '^vncssl://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vncssl://,,'`
-elif echo "$orig" | grep '^vnc+ssl://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vnc.ssl://,,'`
-elif echo "$orig" | grep '^vncssh://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vncssh://,,'`
-	use_ssh=1
-elif echo "$orig" | grep '^vnc+ssh://' > /dev/null; then
-	orig=`echo "$orig" | sed -e 's,vnc.ssh://,,'`
-	use_ssh=1
-fi
-
-if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then
-        verify=""
-        mycert=""
-        crl=""
-        use_ssh=""
-        use_sshssl=""
-        direct_connect=1
-	if echo "$SSVNC_ULTRA_DSM" | grep 'noultra:' > /dev/null; then
-		SSVNC_NO_ULTRA_DSM=1; export SSVNC_NO_ULTRA_DSM
-	fi
-fi
-
-# rsh mode is an internal/secret thing only I use.
-rsh=""
-if echo "$orig" | grep '^rsh://' > /dev/null; then
-	use_ssh=1
-	rsh=1
-	orig=`echo "$orig" | sed -e 's,rsh://,,'`
-elif echo "$orig" | grep '^rsh:' > /dev/null; then
-	use_ssh=1
-	rsh=1
-	orig=`echo "$orig" | sed -e 's,rsh:,,'`
-fi
-
-# play around with host:display port:
-if echo "$orig" | grep ':[0-9][0-9]*$' > /dev/null; then
-	:
-else
-	# add or assume :0 if no ':'
-	if [ "X$reverse" = "X" ]; then
-		orig="$orig:0"
-	elif [ "X$orig" = "X" ]; then
-		orig=":0"
-	fi
-fi
-
-# extract host and disp number:
-
-# try to see if it is ipv6 address:
-ipv6=0
-if echo "$orig" | grep '\[' > /dev/null; then
-	# ipv6 [fe80::219:dbff:fee5:3f92%eth1]:5900
-	host=`echo "$orig" | sed -e 's/\].*$//' -e 's/\[//'`
-	disp=`echo "$orig" | sed -e 's/^.*\]://'`
-	ipv6=1
-elif echo "$orig" | grep ':..*:' > /dev/null; then
-	# ipv6 fe80::219:dbff:fee5:3f92%eth1:5900
-	host=`echo "$orig" | sed -e 's/:[^:]*$//'`
-	disp=`echo "$orig" | sed -e 's/^.*://'`
-	ipv6=1
-else
-	# regular host:port
-	host=`echo "$orig" | awk -F: '{print $1}'`
-	disp=`echo "$orig" | awk -F: '{print $2}'`
-fi
-
-if [ "X$reverse" != "X" -a "X$STUNNEL_LISTEN" = "X" -a "X$host" != "X" ]; then
-	STUNNEL_LISTEN=$host
-	echo "set STUNNEL_LISTEN=$STUNNEL_LISTEN"
-fi
-
-if [ "X$host" = "X" ]; then
-	host=$localhost
-fi
-
-if [ "X$SSVNC_IPV6" = "X0" ]; then
-	# disable checking for it.
-	ipv6=0
-#elif [ "X$reverse" != "X" -a "X$ipv6" = "X1" ]; then
-#	ipv6=0
-elif [ "X$ipv6" = "X1" ]; then
-	:
-elif echo "$host" | grep '^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' > /dev/null; then
-	:
-else
-	# regular hostname, can't be sure...
-	gout=""
-	if type getent > /dev/null 2>/dev/null; then
-		gout=`getent hosts "$host" 2>/dev/null`
-	fi
-	if echo "$gout" | grep ':.*:' > /dev/null; then
-		if echo "$gout" | grep '^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' > /dev/null; then
-			:
-		else
-			echo "ipv6: "`echo "$gout" | grep ':.*:' | head -n 1`
-			ipv6=1
-		fi
-	fi
-	if [ "X$ipv6" = "X0" ]; then
-		hout=""
-		if type host > /dev/null 2>/dev/null; then
-			host "$host" >/dev/null 2>&1
-			host "$host" >/dev/null 2>&1
-			hout=`host "$host" 2>/dev/null`
-		fi
-		if echo "$hout" | grep -i 'has ipv6 address' > /dev/null; then
-			if echo "$hout" | grep -i 'has address' > /dev/null; then
-				:
-			else
-				echo "ipv6: "`echo "$hout" | grep -i 'has ipv6 address' | head -n 1`
-				ipv6=1
-			fi
-		fi
-	fi
-	if [ "X$ipv6" = "X0" ]; then
-		dout=""
-		if type dig > /dev/null 2>/dev/null; then
-		dout=`dig -t any "$host" 2>/dev/null`
-		fi
-		if echo "$dout" | grep -i "^$host" | grep '[ 	]AAAA[ 	]' > /dev/null; then
-			if echo "$dout" | grep -i "^$host" | grep '[ 	]A[ 	]' > /dev/null; then
-				:
-			else
-				echo "ipv6: "`echo "$dout" | grep -i '[ 	]AAAA[ 	]' | head -n 1`
-				ipv6=1
-			fi
-		fi
-	fi
-	if [ "X$ipv6" = "X0" ]; then
-		sout=`env LOOKUP="$host" \
-		      perl -e '	eval {use Socket};  exit 0 if $@;
-				eval {use Socket6}; exit 0 if $@;
-				@res = getaddrinfo($ENV{LOOKUP}, "daytime", AF_UNSPEC, SOCK_STREAM);
-				$ipv4 = 0;
-				$ipv6 = 0;
-				$ip6 = "";
-				while (scalar(@res) >= 5) {
-					($family, $socktype, $proto, $saddr, $canon, @res) = @res;
-					$ipv4 = 1 if $family == AF_INET;
-					$ipv6 = 1 if $family == AF_INET6;
-					if ($family == AF_INET6 && $ip6 eq "") {
-						my ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV);
-						$ip6 = $host;
-					}
-				}
-				if (! $ipv4 && $ipv6) {
-					print "AF_INET6_ONLY: $ENV{LOOKUP}: $ip6\n";
-				}
-				exit 0;
-			' 2>/dev/null`
-		if echo "$sout" | grep AF_INET6_ONLY > /dev/null; then
-			echo "$sout"
-			ipv6=1
-		fi
-	fi
-fi
-if [ "X$ipv6" = "X1" ]; then
-	echo "ipv6: addr=$host disp=$disp"
-fi
-if [ "X$disp" = "X" ]; then
-	port=""	# probably -listen mode.
-elif [ $disp -lt 0 ]; then
-	# negative means use |n| without question:
-	port=`expr 0 - $disp`
-elif [ $disp -lt 200 ]; then
-	# less than 200 means 5900+n
-	if [ "X$reverse" = "X" ]; then
-		port=`expr $disp + 5900`
-	else
-		port=`expr $disp + 5500`
-	fi
-else
-	# otherwise use the number directly, e.g. 443, 2345
-	port=$disp
-fi
-
-if [ "X$ipv6" = "X1" -a "X$direct_connect" = "X1" ]; then
-	if [ "X$proxy" = "X" -a "X$reverse" = "X" ]; then
-		if [ "X$SSVNC_ULTRA_DSM" != "X" -a "X$have_uvnc_dsm_helper_ipv6" = "X1" ]; then
-			:
-		elif [ "X$SSVNC_NO_IPV6_PROXY" != "X" ]; then
-			:
-		elif [ "X$SSVNC_NO_IPV6_PROXY_DIRECT" != "X" ]; then
-			:
-		elif [ "X$SSVNC_USE_OURS" = "X1" ]; then
-			# requires 1.0.27 and later ssvncviewer binary
-			:
-		else
-			proxy="ipv6://$host:$port"
-			echo "direct connect: set proxy=$proxy"
-		fi
-	fi
-fi
-
-# (possibly) tell the vncviewer to only listen on lo: 
-if [ "X$reverse" != "X" ]; then
-	if [ "X$direct_connect" = "X" -o "X$proxy" != "X" -o "X$STUNNEL_LISTEN" != "X" ]; then
-		VNCVIEWER_LISTEN_LOCALHOST=1
-		export VNCVIEWER_LISTEN_LOCALHOST
-	fi
-fi
-
-# try to find an open listening port via netstat(1):
-inuse=""
-if uname | grep Linux > /dev/null; then
-	inuse=`netstat -ant | egrep 'LISTEN|WAIT|ESTABLISH|CLOSE' | awk '{print $4}' | sed 's/^.*://'`
-elif uname | grep SunOS > /dev/null; then
-	inuse=`netstat -an -f inet -P tcp | egrep 'LISTEN|WAIT|ESTABLISH|CLOSE' | awk '{print $1}' | sed 's/^.*\.//'`
-elif uname | egrep -i 'bsd|darwin' > /dev/null; then
-	inuse=`netstat -ant -f inet | egrep 'LISTEN|WAIT|ESTABLISH|CLOSE' | awk '{print $4}' | sed 's/^.*\.//'`
-# add others...
-fi
-
-# this is a crude attempt for unique ports tags, etc.
-date_sec=`date +%S`
-
-# these are special cases of no vnc, e.g. sleep or xmessage.
-# these are for using ssvnc as a general port redirector.
-if echo "$VNCVIEWERCMD" | grep '^sleep[ 	][ 	]*[0-9][0-9]*' > /dev/null; then
-	if [ "X$SS_VNCVIEWER_LISTEN_PORT" = "X" ]; then
-		p=`echo "$VNCVIEWERCMD" | awk '{print $3}'`
-		if [ "X$p" != "X" ]; then
-			SS_VNCVIEWER_LISTEN_PORT=$p
-		fi
-	fi
-	p2=`echo "$VNCVIEWERCMD" | awk '{print $2}'`
-	VNCVIEWERCMD="eval sleep $p2; echo Local "
-elif echo "$VNCVIEWERCMD" | grep '^xmessage[ 	][ 	]*[0-9][0-9]*' > /dev/null; then
-	if [ "X$SS_VNCVIEWER_LISTEN_PORT" = "X" ]; then
-		p=`echo "$VNCVIEWERCMD" | awk '{print $2}'`
-		SS_VNCVIEWER_LISTEN_PORT=$p
-	fi
-fi
-
-# utility to find a free port to listen on.
-findfree() {
-	try0=$1
-	try=$try0
-	use0=""
-
-	if [ "X$SS_VNCVIEWER_LISTEN_PORT" != "X" ]; then
-		echo "$SS_VNCVIEWER_LISTEN_PORT"
-		return	
-	fi
-	if [ $try -ge 6000 ]; then
-		fmax=`expr $try + 1000`
-	else
-		fmax=6000
-	fi
-
-	while [ $try -lt $fmax ]
-	do
-		if [ "X$inuse" = "X" ]; then
-			break
-		fi
-		if echo "$inuse" | grep -w $try > /dev/null; then
-			:
-		else
-			use0=$try
-			break
-		fi
-		try=`expr $try + 1`
-	done
-	if [ "X$use0" = "X" ]; then
-		use0=`expr $date_sec + $try0`
-	fi
-
-	echo $use0
-}
-
-# utility for exiting; kills some helper processes,
-# removes files, etc.
-final() {
-	echo ""
-	if [ "X$tmp_cfg" != "X" ]; then
-		rm -f $tmp_cfg
-	fi
-	if [ "X$SS_VNCVIEWER_RM" != "X" ]; then
-		rm -f $SS_VNCVIEWER_RM 2>/dev/null
-	fi
-	if [ "X$tcert" != "X" ]; then
-		rm -f $tcert
-	fi
-	if [ "X$pssh" != "X" ]; then
-		echo "Terminating background ssh process"
-		echo kill -TERM "$pssh"
-		kill -TERM "$pssh" 2>/dev/null
-		sleep 1
-		kill -KILL "$pssh" 2>/dev/null
-		pssh=""
-	fi
-	if [ "X$stunnel_pid" != "X" ]; then
-		echo "Terminating background stunnel process"
-		echo kill -TERM "$stunnel_pid"
-		kill -TERM "$stunnel_pid" 2>/dev/null
-		sleep 1
-		kill -KILL "$stunnel_pid" 2>/dev/null
-		stunnel_pid=""
-	fi
-	if [ "X$dsm_pid" != "X" ]; then
-		echo "Terminating background ultravnc_dsm_helper process"
-		echo kill -TERM "$dsm_pid"
-		kill -TERM "$dsm_pid" 2>/dev/null
-		sleep 1
-		kill -KILL "$dsm_pid" 2>/dev/null
-		stunnel_pid=""
-	fi
-	if [ "X$tail_pid" != "X" ]; then
-		kill -TERM $tail_pid
-	fi
-	if [ "X$tail_pid2" != "X" ]; then
-		kill -TERM $tail_pid2
-	fi
-}
-
-if [ "X$reverse" = "X" ]; then
-	# normal connections try 5930-5999:
-	if [ "X$showcert" = "X" ]; then
-		use=`findfree 5930`
-	else
-		# move away from normal place for (possibly many) -showcert
-		pstart=`date +%S`
-		pstart=`expr 6130 + $pstart + $pstart`
-		use=`findfree $pstart`
-	fi
-	if [ $use -ge 5900 ]; then
-		N=`expr $use - 5900`
-	else
-		N=$use
-	fi
-else
-	# reverse connections:
-	p2=`expr $port + 30`
-	use=`findfree $p2`
-	if [ $use -ge 5500 ]; then
-		N=`expr $use - 5500`
-	else
-		N=$use
-	fi
-fi
-
-# this is for my special use of ss_vncip -> vncip viewer.
-if echo "$0" | grep vncip > /dev/null; then
-	VNCVIEWERCMD="$VNCIPCMD"
-fi
-
-if echo "$VNCVIEWERCMD" | egrep -i '^(xmessage|sleep )' > /dev/null; then
-	:
-elif [ "X$VNCVIEWERCMD_EXTRA_OPTS" != "X" ]; then
-	VNCVIEWERCMD="$VNCVIEWERCMD $VNCVIEWERCMD_EXTRA_OPTS"
-fi
-
-# trick for the undocumented rsh://host:port method.
-rsh_setup() {
-	if echo "$ssh_host" | grep '@' > /dev/null; then
-		ul=`echo "$ssh_host" | awk -F@ '{print $1}'`
-		ul="-l $ul"
-		ssh_host=`echo "$ssh_host" | awk -F@ '{print $2}'`
-	else
-		ul=""
-	fi
-	ssh_cmd=`echo "$ssh_cmd" | sed -e 's/ -localhost/ /g'`
-}
-
-# trick for the undocumented rsh://host:port method.
-rsh_viewer() {
-	trap "final" 0 2 15
-	if [ "X$PORT" = "X" ]; then
-		exit 1
-	elif [ $PORT -ge 5900 ]; then
-		vdpy=`expr $PORT - 5900`
-	else
-		vdpy=":$PORT"
-	fi
-	stty sane
-	echo "$VNCVIEWERCMD" "$@" $ssh_host:$vdpy
-	echo ""
-	$VNCVIEWERCMD "$@" $ssh_host:$vdpy
-	if [ $? != 0 ]; then
-		sleep 2
-		$VNCVIEWERCMD "$@" $ssh_host:$vdpy
-	fi
-}
-
-check_perl() {
-	if type "$1" > /dev/null 2>&1; then
-		:
-	elif [ ! -x "$1" ]; then
-		echo ""
-		echo "*******************************************************"
-		echo "** Problem finding the Perl command '$1': **"
-		echo ""
-		type "perl"
-		echo ""
-		echo "** Perhaps you need to install the Perl package. **"
-		echo "*******************************************************"
-		echo ""
-		sleep 5
-	fi
-}
-
-# this is the PPROXY tool.  used only here for now... 
-pcode() {
-	tf=$1
-	PPROXY_PROXY=$proxy; export PPROXY_PROXY
-	PPROXY_DEST="$host:$port"; export PPROXY_DEST
-	check_perl /usr/bin/perl
-
-	cod='#!/usr/bin/perl
-
-# A hack to glue stunnel to a Web or SOCKS proxy, UltraVNC repeater for
-# client connections.
-# Also acts as a VeNCrypt bridge (by redirecting to stunnel.)
-
-use IO::Socket::INET;
-
-my $have_inet6 = "";
-eval "use IO::Socket::INET6;";
-$have_inet6 = 1 if $@ eq "";
-
-#my $have_sock6 = "";
-#eval "use Socket; use Socket6;";
-#$have_sock6 = 1 if $@ eq "";
-
-if (exists $ENV{PPROXY_LOOP_THYSELF}) {
-	# used for reverse vnc, run a repeating outer loop.
-	print STDERR "PPROXY_LOOP: $ENV{PPROXY_LOOP_THYSELF}\n";
-	my $rm = $ENV{PPROXY_REMOVE};
-	my $lp = $ENV{PPROXY_LOOP_THYSELF};
-	delete $ENV{PPROXY_REMOVE};
-	delete $ENV{PPROXY_LOOP_THYSELF};
-	$ENV{PPROXY_LOOP_THYSELF_MASTER} = $$;
-	my $pid = $$;
-	my $dbg = 0;
-	my $c = 0;
-	use POSIX ":sys_wait_h";
-	while (1) {
-		$pid = fork();
-		last if ! defined $pid;
-		if ($pid eq "0") {
-			last;
-		}
-		$c++;
-		print STDERR "\nPPROXY_LOOP: pid=$$ child=$pid count=$c\n";
-		while (1) {
-			waitpid(-1, WNOHANG);
-			fsleep(0.25);
-			if (! kill 0, $pid) {
-				print STDERR "PPROXY_LOOP: child=$pid gone.\n";
-				last;
-			}
-			print STDERR "PPROXY_LOOP: child=$pid alive.\n" if $dbg;
-			if (! -f $lp) {
-				print STDERR "PPROXY_LOOP: flag file $lp gone, killing $pid\n";
-				kill TERM, $pid;
-				fsleep(0.1);
-				wait;
-				last;
-			}
-			print STDERR "PPROXY_LOOP: file exists $lp\n" if $dbg;
-		}
-		last if ! -f $lp;
-		fsleep(0.25);
-	}
-	if ($pid ne "0") {
-		unlink($0) if $rm;
-		exit 0;
-	}
-}
-
-if (exists $ENV{PPROXY_SLEEP} && $ENV{PPROXY_SLEEP} > 0) {
-	print STDERR "PPROXY_PID: $$\n";
-	sleep $ENV{PPROXY_SLEEP};
-}
-
-foreach my $var (qw(
-		PPROXY_DEST
-		PPROXY_KILLPID
-		PPROXY_LISTEN
-		PPROXY_PROXY
-		PPROXY_REMOVE
-		PPROXY_REPEATER
-		PPROXY_REVERSE
-		PPROXY_SLEEP
-		PPROXY_SOCKS
-		PPROXY_VENCRYPT
-		PPROXY_VENCRYPT_VIEWER_BRIDGE
-    )) {
-	if (0 || $ENV{SS_DEBUG} || $ENV{SSVNC_VENCRYPT_DEBUG}) {
-		print STDERR "$var: $ENV{$var}\n";
-	}
-} 
-
-if ($ENV{PPROXY_SOCKS} ne "" && $ENV{PPROXY_PROXY} !~ m,^socks5?://,i) {
-	if ($ENV{PPROXY_SOCKS} eq "5") {
-		$ENV{PPROXY_PROXY} = "socks5://$ENV{PPROXY_PROXY}";
-	} else {
-		$ENV{PPROXY_PROXY} = "socks://$ENV{PPROXY_PROXY}";
-	}
-}
-
-my $rfbSecTypeAnonTls  = 18;
-my $rfbSecTypeVencrypt = 19;
-
-my $rfbVencryptPlain        = 256;
-my $rfbVencryptTlsNone      = 257;
-my $rfbVencryptTlsVnc       = 258;
-my $rfbVencryptTlsPlain     = 259;
-my $rfbVencryptX509None     = 260;
-my $rfbVencryptX509Vnc      = 261;
-my $rfbVencryptX509Plain    = 262;
-
-my $handshake_file = "";
-if (exists $ENV{SSVNC_PREDIGESTED_HANDSHAKE})  {
-	$handshake_file = $ENV{SSVNC_PREDIGESTED_HANDSHAKE};
-}
-
-my $have_gettimeofday = 0;
-eval "use Time::HiRes;";
-if ($@ eq "") {
-	$have_gettimeofday = 1;
-}
-sub gettime {
-	my $t = "0.0";
-	if ($have_gettimeofday) {
-		$t = Time::HiRes::gettimeofday();
-	}
-	return $t;
-}
-
-my $listen_handle = "";
-my $sock = "";
-my $parent = $$;
-
-my $initial_data = "";
-
-if ($ENV{PPROXY_VENCRYPT_VIEWER_BRIDGE}) {
-	my ($from, $to) = split(/,/, $ENV{PPROXY_VENCRYPT_VIEWER_BRIDGE});
-	do_vencrypt_viewer_bridge($from, $to);
-	exit 0;
-}
-
-my ($first, $second, $third) = split(/,/, $ENV{PPROXY_PROXY}, 3);
-my ($mode_1st, $mode_2nd, $mode_3rd) = ("", "", "");
-
-($first, $mode_1st) = url_parse($first);
-
-my ($proxy_host, $proxy_port) = ($first, "");
-if ($proxy_host =~ /^(.*):(\d+)$/) {
-	$proxy_host = $1;
-	$proxy_port = $2;
-}
-my $connect = $ENV{PPROXY_DEST};
-
-if ($second ne "") {
-	($second, $mode_2nd) = url_parse($second);
-}
-
-if ($third ne "") {
-	($third, $mode_3rd) = url_parse($third);
-}
-
-
-print STDERR "\n";
-print STDERR "PPROXY v0.4: a tool for Web, SOCKS, and UltraVNC proxies and for\n";
-print STDERR "PPROXY v0.4: IPv6 and VNC VeNCrypt bridging.\n";
-print STDERR "proxy_host:       $proxy_host\n";
-print STDERR "proxy_port:       $proxy_port\n";
-print STDERR "proxy_connect:    $connect\n";
-print STDERR "pproxy_params:    $ENV{PPROXY_PROXY}\n";
-print STDERR "pproxy_listen:    $ENV{PPROXY_LISTEN}\n";
-print STDERR "pproxy_reverse:   $ENV{PPROXY_REVERSE}\n";
-print STDERR "io_socket_inet6:  $have_inet6\n";
-print STDERR "\n";
-if (! $have_inet6) {
-	print STDERR "PPROXY: To enable IPv6 connections, install the IO::Socket::INET6 perl module.\n\n";
-}
-
-if (1) {
-	print STDERR "pproxy 1st: $first\t- $mode_1st\n";
-	print STDERR "pproxy 2nd: $second\t- $mode_2nd\n";
-	print STDERR "pproxy 3rd: $third\t- $mode_3rd\n";
-	print STDERR "\n";
-}
-
-sub pdie {
-	my $msg = shift;
-	kill_proxy_pids();
-	die "$msg";
-}
-
-if ($ENV{PPROXY_REVERSE} ne "") {
-	my ($rhost, $rport) = ($ENV{PPROXY_REVERSE}, "");
-	if ($rhost =~ /^(.*):(\d+)$/) {
-		$rhost = $1;
-		$rport = $2;
-	}
-	$rport = 5900 unless $rport;
-	my $emsg = "";
-	$listen_handle = IO::Socket::INET->new(
-		PeerAddr => $rhost,
-		PeerPort => $rport,
-		Proto => "tcp"
-	);
-	$emsg = $!;
-	if (! $listen_handle && $have_inet6) {
-		eval {$listen_handle = IO::Socket::INET6->new(
-			PeerAddr => $rhost,
-			PeerPort => $rport,
-			Proto => "tcp"
-		);};
-		$emsg .= " / $!";
-	}
-	if (! $listen_handle) {
-		pdie "pproxy: $emsg -- PPROXY_REVERSE\n";
-	}
-	print STDERR "PPROXY_REVERSE: connected to $rhost $rport\n";
-
-} elsif ($ENV{PPROXY_LISTEN} ne "") {
-	my $listen_sock = "";
-	my $maxtry = 12;
-	my $sleep = 5;
-	my $p2 = "";
-	my $emsg = "";
-	for (my $i=0; $i < $maxtry; $i++)  {
-		my ($if, $p) = ("", $ENV{PPROXY_LISTEN});
-		if ($p =~ /^(.*):(\d+)$/) {
-			$if = $1;
-			$p = $2;
-		}
-		$p2 = "*:$p";
-		if ($if eq "") {
-			$if = "localhost";
-		}
-		print STDERR "pproxy interface: $if\n";
-
-		$emsg = "";
-		if (($if eq "INADDR_ANY6" || $if eq "::") && $have_inet6) {
-			eval {$listen_sock = IO::Socket::INET6->new(
-				Listen    => 2,
-				ReuseAddr => 1,
-				Domain    => AF_INET6,
-				LocalAddr => "::",
-				LocalPort => $p,
-				Proto     => "tcp"
-			);};
-			$p2 = ":::$p";
-		} elsif ($if =~ /^INADDR_ANY/) {
-			$listen_sock = IO::Socket::INET->new(
-				Listen    => 2,
-				ReuseAddr => 1,
-				LocalPort => $p,
-				Proto     => "tcp"
-			);
-		} elsif (($if eq "INADDR_LOOPBACK6" || $if eq "::1") && $have_inet6) {
-			$p2 = "::1:$p";
-			eval {$listen_sock = IO::Socket::INET6->new(
-				Listen    => 2,
-				ReuseAddr => 1,
-				Domain    => AF_INET6,
-				LocalAddr => "::1",
-				LocalPort => $p,
-				Proto     => "tcp"
-			);};
-			$p2 = "::1:$p";
-		} else {
-			$p2 = "$if:$p";
-			$listen_sock = IO::Socket::INET->new(
-				Listen    => 2,
-				ReuseAddr => 1,
-				LocalAddr => $if,
-				LocalPort => $p,
-				Proto     => "tcp"
-			);
-			$emsg = $!;
-			
-			if (! $listen_sock && $have_inet6) {
-				print STDERR "PPROXY_LISTEN: retry with INET6\n";
-				eval {$listen_sock = IO::Socket::INET6->new(
-					Listen    => 2,
-					ReuseAddr => 1,
-					Domain    => AF_INET6,
-					LocalAddr => $if,
-					LocalPort => $p,
-					Proto     => "tcp"
-				);};
-				$emsg .= " / $!";
-			}
-		}
-		if (! $listen_sock) {
-			if ($i < $maxtry - 1) {
-				warn "pproxy: $emsg $!\n";
-				warn "Could not listen on port $p2, retrying in $sleep seconds... (Ctrl-C to quit)\n";
-				sleep $sleep;
-			}
-		} else {
-			last;
-		}
-	}
-	if (! $listen_sock) {
-		pdie "pproxy: $emsg -- PPROXY_LISTEN\n";
-	}
-	print STDERR "pproxy: listening on $p2\n";
-	my $ip;
-	($listen_handle, $ip) = $listen_sock->accept();
-	my $err = $!;
-	close $listen_sock;
-	if (! $listen_handle) {
-		pdie "pproxy: $err\n";
-	}
-
-	if ($ENV{PPROXY_LOOP_THYSELF_MASTER}) {
-		my $sml = $ENV{SSVNC_MULTIPLE_LISTEN}; 
-		if ($sml ne "" && $sml ne "0") {
-			setpgrp(0, 0);
-			if (fork()) {
-				close $viewer_sock;
-				wait;
-				exit 0;
-			}
-			if (fork()) {
-				close $viewer_sock;
-				exit 0;
-			}
-			setpgrp(0, 0);
-			$parent = $$;
-		}
-	}
-}
-
-$sock = IO::Socket::INET->new(
-	PeerAddr => $proxy_host,
-	PeerPort => $proxy_port,
-	Proto => "tcp"
-);
-
-my $err = "";
-
-if (! $sock && $have_inet6) {
-	$err = $!;
-
-	print STDERR "pproxy: $!\n";
-
-	eval {$sock = IO::Socket::INET6->new(
-		PeerAddr => $proxy_host,
-		PeerPort => $proxy_port,
-		Proto => "tcp"
-	);};
-	$err .= " / $!";
-}
-
-if (! $sock && ($proxy_host =~ /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i || $proxy_host =~ /^::ffff:([\da-f]+:[\da-f]+)$/i)) {
-	print STDERR "pproxy: $!\n";
-	my $ipv4_addr = $1;
-	if ($ipv4_addr =~ /:/) {
-		my ($a, $b) = split(/:/, $ipv4_addr);
-		$a = hex($a);
-		$b = hex($b);
-		$ipv4_addr  = sprintf("%d.", ($a & 0xff00) >> 8);
-		$ipv4_addr .= sprintf("%d.", ($a & 0x00ff));
-		$ipv4_addr .= sprintf("%d.", ($b & 0xff00) >> 8);
-		$ipv4_addr .= sprintf("%d",  ($b & 0x00ff));
-	}
-
-	print STDERR "pproxy: re-trying with ipv4 addr: $ipv4_addr\n";
-
-	eval {$sock = IO::Socket::INET->new(
-		PeerAddr => $ipv4_addr,
-		PeerPort => $proxy_port,
-		Proto => "tcp"
-	);};
-	$err .= " / $!";
-}
-
-if (! $sock) {
-	unlink($0) if $ENV{PPROXY_REMOVE};
-	pdie "pproxy: $err\n";
-}
-
-unlink($0) if $ENV{PPROXY_REMOVE};
-
-if ($ENV{PPROXY_PROXY} =~ /^vencrypt:/ && $ENV{PPROXY_VENCRYPT_REVERSE}) {
-	print STDERR "\nPPROXY: vencrypt+reverse: swapping listen socket with connect socket.\n";
-	my $tmp_swap = $sock;
-	$sock = $listen_handle;
-	$listen_handle = $tmp_swap;
-}
-
-$cur_proxy = $first;
-setmode($mode_1st);
-
-if ($second ne "") {
-	connection($second, 1);
-
-	setmode($mode_2nd);
-	$cur_proxy = $second;
-
-	if ($third ne "") {
-		connection($third, 2);
-		setmode($mode_3rd);
-		$cur_proxy = $third;
-		connection($connect, 3);
-	} else {
-		connection($connect, 2);
-	}
-} else {
-	connection($connect, 1);
-}
-
-sub kill_proxy_pids() {
-	if ($ENV{PPROXY_VENCRYPT_VIEWER_BRIDGE}) {
-		return;
-	}
-	if ($ENV{PPROXY_KILLPID}) {
-		foreach my $p (split(/,/, $ENV{PPROXY_KILLPID})) {
-			if ($p =~ /^(\+|-)/) {
-				$p = $parent + $p;
-			}
-			print STDERR "kill TERM, $p (PPROXY_KILLPID)\n";
-			kill "TERM", $p;
-		}
-	}
-}
-
-sub xfer {
-	my($in, $out) = @_;
-	$RIN = $WIN = $EIN = "";
-	$ROUT = "";
-	vec($RIN, fileno($in), 1) = 1;
-	vec($WIN, fileno($in), 1) = 1;
-	$EIN = $RIN | $WIN;
-
-	while (1) {
-		my $nf = 0;
-		while (! $nf) {
-			$nf = select($ROUT=$RIN, undef, undef, undef);
-		}
-		my $len = sysread($in, $buf, 8192);
-		if (! defined($len)) {
-			next if $! =~ /^Interrupted/;
-			print STDERR "pproxy[$$]: $!\n";
-			last;
-		} elsif ($len == 0) {
-			print STDERR "pproxy[$$]: Input is EOF.\n";
-			last;
-		}
-		my $offset = 0;
-		my $quit = 0;
-		while ($len) {
-			my $written = syswrite($out, $buf, $len, $offset);
-			if (! defined $written) {
-				print STDERR "pproxy[$$]: Output is EOF. $!\n";
-				$quit = 1;
-				last;
-			}
-			$len -= $written;
-			$offset += $written;
-		}
-		last if $quit;
-	}
-	close($out);
-	close($in);
-	print STDERR "pproxy[$$]: finished xfer.\n";
-}
-
-sub handler {
-	print STDERR "pproxy[$$]: got SIGTERM.\n";
-	close $listen_handle if $listen_handle;
-	close $sock if $sock;
-	exit;
-}
-
-sub xfer_both {
-	$child = fork;
-
-	if (! defined $child) {
-		kill_proxy_pids();
-		exit 1;
-	}
-
-	$SIG{TERM} = "handler";
-
-	if ($child) {
-		if ($listen_handle) {
-			print STDERR "pproxy parent[$$]  listen_handle -> socket\n";
-			xfer($listen_handle, $sock);
-		} else {
-			print STDERR "pproxy parent[$$]  STDIN -> socket\n";
-			xfer(STDIN, $sock);
-		}
-		select(undef, undef, undef, 0.25);
-		if (kill 0, $child) {
-			select(undef, undef, undef, 0.9);
-			if (kill 0, $child) {
-				print STDERR "pproxy[$$]: kill TERM child $child\n";
-				kill "TERM", $child;
-			} else {
-				print STDERR "pproxy[$$]: child  $child gone.\n";
-			}
-		}
-	} else {
-		select(undef, undef, undef, 0.05);
-		if ($listen_handle) {
-			print STDERR "pproxy child [$$]  socket -> listen_handle\n";
-			if ($initial_data ne "") {
-				my $len = length $initial_data;
-				print STDERR "pproxy child [$$]  sending initial_data, length $len\n\n";
-				syswrite($listen_handle, $initial_data, $len);
-			} else {
-				print STDERR "\n";
-			}
-			xfer($sock, $listen_handle);
-		} else {
-			print STDERR "pproxy child [$$]  socket -> STDOUT\n";
-			if ($initial_data ne "") {
-				my $len = length $initial_data;
-				print STDERR "pproxy child [$$]  sending initial_data, length $len\n\n";
-				syswrite(STDOUT, $initial_data, $len);
-			} else {
-				print STDERR "\n";
-			}
-			xfer($sock, STDOUT);
-		}
-		select(undef, undef, undef, 0.25);
-		if (kill 0, $parent) {
-			select(undef, undef, undef, 0.8);
-			if (kill 0, $parent) {
-				print STDERR "pproxy[$$]: kill TERM parent $parent\n";
-				kill "TERM", $parent;
-			} else {
-				print STDERR "pproxy[$$]: parent $parent gone.\n";
-			}
-		}
-	}
-
-	kill_proxy_pids();
-}
-
-xfer_both();
-
-exit;
-
-sub fsleep {
-	select(undef, undef, undef, shift);
-}
-
-sub url_parse {
-	my $hostport = shift;
-	my $mode = "http";
-	if ($hostport =~ m,^socks4?://(\S*)$,i) {
-		$mode = "socks4";
-		$hostport = $1;
-	} elsif ($hostport =~ m,^socks5://(\S*)$,i) {
-		$mode = "socks5";
-		$hostport = $1;
-	} elsif ($hostport =~ m,^https?://(\S*)$,i) {
-		$mode = "http";
-		$hostport = $1;
-	} elsif ($hostport =~ m,^ipv6://(\S*)$,i) {
-		$mode = "ipv6";
-		$hostport = $1;
-	} elsif ($hostport =~ m,^repeater://(\S*)\+(\S*)$,i) {
-		# ultravnc repeater proxy.
-		$hostport = $1;
-		$mode = "repeater:$2";
-		if ($hostport !~ /:\d+$/) {
-			$hostport .= ":5900";
-		}
-	} elsif ($hostport =~ m,^vencrypt://(\S*)$,i) {
-		# vencrypt handshake.
-		$hostport = $1;
-		my $m = "connect";
-		if ($hostpost =~ /^(\S+)\+(\S+)$/) {
-			$hostport = $1;
-			$mode = $2;
-		}
-		$mode = "vencrypt:$m";
-		if ($hostport !~ /:\d+$/) {
-			$hostport .= ":5900";
-		}
-	}
-	return ($hostport, $mode);
-}
-
-sub setmode {
-	my $mode = shift;
-	$ENV{PPROXY_REPEATER} = "";
-	$ENV{PPROXY_VENCRYPT} = "";
-	if ($mode =~ /^socks/) {
-		if ($mode =~ /^socks5/) {
-			$ENV{PPROXY_SOCKS} = 5;
-		} else {
-			$ENV{PPROXY_SOCKS} = 1;
-		}
-	} elsif ($mode =~ /^ipv6/i) {
-		$ENV{PPROXY_SOCKS} = 0;
-	} elsif ($mode =~ /^repeater:(.*)/) {
-		$ENV{PPROXY_REPEATER} = $1;
-		$ENV{PPROXY_SOCKS} = "";
-	} elsif ($mode =~ /^vencrypt:(.*)/) {
-		$ENV{PPROXY_VENCRYPT} = $1;
-		$ENV{PPROXY_SOCKS} = "";
-	} else {
-		$ENV{PPROXY_SOCKS} = "";
-	}
-}
-
-sub connection {
-	my ($CONNECT, $w) = @_;
-
-	my $con = "";
-	my $msg = "";
-
-	if ($ENV{PPROXY_SOCKS} eq "5") {
-		# SOCKS5
-		my ($h, $p) = ($CONNECT, "");
-		if ($h =~ /^(.*):(\d+)$/) {
-			$h = $1;
-			$p = $2;
-		}
-		$con .= pack("C", 0x05);
-		$con .= pack("C", 0x01);
-		$con .= pack("C", 0x00);
-
-		$msg = "SOCKS5 via $cur_proxy to $h:$p\n\n";
-		print STDERR "proxy_request$w: $msg";
-
-		syswrite($sock, $con, length($con));
-
-		my ($n1, $n2, $n3, $n4, $n5, $n6);
-		my ($r1, $r2, $r3, $r4, $r5, $r6);
-		my ($s1, $s2, $s3, $s4, $s5, $s6);
-
-		$n1 = sysread($sock, $r1, 1);
-		$n2 = sysread($sock, $r2, 1);
-
-		$s1 = unpack("C", $r1);
-		$s2 = unpack("C", $r2);
-		if ($s1 != 0x05 || $s2 != 0x00) {
-			print STDERR "SOCKS5 fail s1=$s1 s2=$s2 n1=$n1 n2=$n2\n";
-			close $sock;
-			exit(1);
-		}
-
-		$con = "";
-		$con .= pack("C", 0x05);
-		$con .= pack("C", 0x01);
-		$con .= pack("C", 0x00);
-		$con .= pack("C", 0x03);
-		$con .= pack("C", length($h));
-		$con .= $h;
-		$con .= pack("C", $p >> 8);
-		$con .= pack("C", $p & 0xff);
-
-		syswrite($sock, $con, length($con));
-
-		$n1 = sysread($sock, $r1, 1);
-		$n2 = sysread($sock, $r2, 1);
-		$n3 = sysread($sock, $r3, 1);
-		$n4 = sysread($sock, $r4, 1);
-		$s1 = unpack("C", $r1);
-		$s2 = unpack("C", $r2);
-		$s3 = unpack("C", $r3);
-		$s4 = unpack("C", $r4);
-
-		if ($s4 == 0x1) {
-			sysread($sock, $r5, 4 + 2);
-		} elsif ($s4 == 0x3) {
-			sysread($sock, $r5, 1);
-			$s5 = unpack("C", $r5);
-			sysread($sock, $r6, $s5 + 2);
-		} elsif ($s4 == 0x4) {
-			sysread($sock, $r5, 16 + 2);
-		}
-
-		if ($s1 != 0x5 || $s2 != 0x0 || $s3 != 0x0) {
-			print STDERR "SOCKS5 failed: s1=$s1 s2=$s2 s3=$s3 s4=$s4 n1=$n1 n2=$n2 n3=$n3 n4=$n4\n";
-			close $sock;
-			exit(1);
-		}
-
-	} elsif ($ENV{PPROXY_SOCKS} eq "1") {
-		# SOCKS4 SOCKS4a
-		my ($h, $p) = ($CONNECT, "");
-		if ($h =~ /^(.*):(\d+)$/) {
-			$h = $1;
-			$p = $2;
-		}
-		$con .= pack("C", 0x04);
-		$con .= pack("C", 0x01);
-		$con .= pack("n", $p);
-
-		my $SOCKS_4a = 0;
-		if ($h eq "localhost" || $h eq "127.0.0.1") {
-			$con .= pack("C", 127);
-			$con .= pack("C", 0);
-			$con .= pack("C", 0);
-			$con .= pack("C", 1);
-		} elsif ($h =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
-			$con .= pack("C", $1);
-			$con .= pack("C", $2);
-			$con .= pack("C", $3);
-			$con .= pack("C", $4);
-		} else {
-			$con .= pack("C", 0);
-			$con .= pack("C", 0);
-			$con .= pack("C", 0);
-			$con .= pack("C", 3);
-			$SOCKS_4a = 1;
-		}
-
-		$con .= "nobody";
-		$con .= pack("C", 0);
-
-		$msg = "SOCKS4 via $cur_proxy to $h:$p\n\n";
-		if ($SOCKS_4a) {
-			$con .= $h;
-			$con .= pack("C", 0);
-			$msg =~ s/SOCKS4/SOCKS4a/;
-		}
-		print STDERR "proxy_request$w: $msg";
-		syswrite($sock, $con, length($con));
-
-		my $ok = 1;
-		for (my $i = 0; $i < 8; $i++) {
-			my $c;
-			sysread($sock, $c, 1);
-			my $s = unpack("C", $c);
-			if ($i == 0) {
-				$ok = 0 if $s != 0x0;
-			} elsif ($i == 1) {
-				$ok = 0 if $s != 0x5a;
-			}
-		}
-		if (! $ok) {
-			print STDERR "SOCKS4 failed.\n";
-			close $sock;
-			exit(1);
-		}
-	} elsif ($ENV{PPROXY_SOCKS} eq "0") {
-		# hack for ipv6 "proxy", nothing to do, assume INET6 call worked.
-		;
-	} elsif ($ENV{PPROXY_REPEATER} ne "") {
-		my $rep = $ENV{PPROXY_REPEATER};
-		print STDERR "repeater: $rep\n";
-		$rep .= pack("x") x 250;
-		syswrite($sock, $rep, 250);
-
-		my $rfb = "";
-
-		my $ok = 1;
-		for (my $i = 0; $i < 12; $i++) {
-			my $c;
-			last if $ENV{PPROXY_GENERIC_REPEATER};
-			sysread($sock, $c, 1);
-			print STDERR $c;
-			$rfb .= $c;
-		}
-		if ($rfb ne "" && $rfb !~ /^RFB 000\.000/) {
-			$initial_data = $rfb;
-			$rfb =~ s/\n//g;
-			print STDERR "detected non-UltraVNC repeater; forwarding \"$rfb\"\nlength: ", length($initial_data), "\n";
-		}
-	} elsif ($ENV{PPROXY_VENCRYPT} ne "") {
-		my $vencrypt = $ENV{PPROXY_VENCRYPT};
-		vencrypt_dialog($vencrypt);
-
-	} else {
-		# Web Proxy:
-		$con = "CONNECT $CONNECT HTTP/1.1\r\n";
-		$con   .= "Host: $CONNECT\r\n";
-		$con   .= "Connection: close\r\n\r\n";
-		$msg = $con;
-
-		print STDERR "proxy_request$w: via $cur_proxy:\n$msg";
-		syswrite($sock, $con, length($con));
-
-		my $rep = "";
-		my $n = 0;
-		while ($rep !~ /\r\n\r\n/ && $n < 30000) {
-			my $c;
-			sysread($sock, $c, 1);
-			print STDERR $c;
-			$rep .= $c;
-			$n++;
-		}
-		if ($rep !~ m,HTTP/.* 200,) {
-			print STDERR "HTTP CONNECT failed.\n";
-			close $sock;
-			exit(1);
-		}
-	}
-}
-
-sub vdie {
-	append_handshake("done\n");
-	close $sock;
-	kill_proxy_pids();
-	exit(1);
-}
-
-sub anontls_handshake {
-	my ($vmode, $db) = @_;
-
-	print STDERR "\nPPROXY: Doing ANONTLS Handshake\n";
-
-	my $psec = pack("C", $rfbSecTypeAnonTls);
-	syswrite($sock, $psec, 1);
-
-	append_handshake("done\n");
-}
-
-sub vencrypt_handshake {
-	
-	my ($vmode, $db) = @_;
-
-	print STDERR "\nPPROXY: Doing VeNCrypt Handshake\n";
-
-	my $psec = pack("C", $rfbSecTypeVencrypt);
-
-	if (exists $ENV{SSVNC_TEST_SEC_TYPE}) {
-		my $fake = $ENV{SSVNC_TEST_SEC_TYPE};
-		print STDERR "PPROXY: sending sec-type: $fake\n";
-		$psec = pack("C", $fake);
-	}
-
-	syswrite($sock, $psec, 1);
-
-	my $vmajor;
-	my $vminor;
-	sysread($sock, $vmajor, 1);
-	sysread($sock, $vminor, 1);
-
-	vdie if $vmajor eq "" || $vminor eq "";
-
-	$vmajor = unpack("C", $vmajor);
-	$vminor = unpack("C", $vminor);
-	print STDERR "server vencrypt version $vmajor.$vminor\n" if $db;
-
-	if (exists $ENV{SSVNC_TEST_SEC_TYPE}) {
-		print STDERR "PPROXY: continuing on in test mode.\n";
-	} else {
-		vdie if $vmajor ne 0;
-		vdie if $vminor < 2;
-	}
-
-	$vmajor = pack("C", 0);
-	$vminor = pack("C", 2);
-	append_handshake("subversion=0.2\n");
-
-	syswrite($sock, $vmajor, 1);
-	syswrite($sock, $vminor, 1);
-
-	my $result;
-	sysread($sock, $result, 1);
-	print STDERR "result empty\n" if $db && $result eq "";
-
-	vdie if $result eq "";
-	$result = unpack("C", $result);
-	print STDERR "result=$result\n" if $db;
-
-	vdie if $result ne 0;
-
-	my $nsubtypes;
-	sysread($sock, $nsubtypes, 1);
-
-	vdie if $nsubtypes eq "";
-	$nsubtypes = unpack("C", $nsubtypes);
-	print STDERR "nsubtypes=$nsubtypes\n" if $db;
-
-	my %subtypes;
-
-	for (my $i = 0; $i < $nsubtypes; $i++) {
-		my $subtype = ""; 
-		sysread($sock, $subtype, 4);
-		vdie if length($subtype) != 4;
-
-		# XXX fix 64bit.
-		$subtype = unpack("N", $subtype);
-		print STDERR "subtype: $subtype\n" if $db;
-		$subtypes{$subtype} = 1;
-		append_handshake("sst$i=$subtype\n");
-	}
-
-	my $subtype = 0;
-	if (exists $subtypes{$rfbVencryptX509None})  {
-		$subtype = $rfbVencryptX509None;
-		print STDERR "selected rfbVencryptX509None\n" if $db;
-	} elsif (exists $subtypes{$rfbVencryptX509Vnc})  {
-		$subtype = $rfbVencryptX509Vnc;
-		print STDERR "selected rfbVencryptX509Vnc\n" if $db;
-	} elsif (exists $subtypes{$rfbVencryptX509Plain})  {
-		$subtype = $rfbVencryptX509Plain;
-		print STDERR "selected rfbVencryptX509Plain\n" if $db;
-	} elsif (exists $subtypes{$rfbVencryptTlsNone})  {
-		$subtype = $rfbVencryptTlsNone;
-		print STDERR "selected rfbVencryptTlsNone\n" if $db;
-	} elsif (exists $subtypes{$rfbVencryptTlsVnc})  {
-		$subtype = $rfbVencryptTlsVnc;
-		print STDERR "selected rfbVencryptTlsVnc\n" if $db;
-	} elsif (exists $subtypes{$rfbVencryptTlsPlain})  {
-		$subtype = $rfbVencryptTlsPlain;
-		print STDERR "selected rfbVencryptTlsPlain\n" if $db;
-	}
-
-	if (exists $ENV{SSVNC_TEST_SEC_SUBTYPE}) {
-		my $fake = $ENV{SSVNC_TEST_SEC_SUBTYPE};
-		print STDERR "PPROXY: sending sec-subtype: $fake\n";
-		$subtype = $fake;
-	}
-
-	append_handshake("subtype=$subtype\n");
-
-	my $pst = pack("N", $subtype);
-	syswrite($sock, $pst, 4); 
-
-	if (exists $ENV{SSVNC_TEST_SEC_SUBTYPE}) {
-		print STDERR "PPROXY: continuing on in test mode.\n";
-	} else {
-		vdie if $subtype == 0;
-	}
-
-	my $ok;
-	sysread($sock, $ok, 1);
-	$ok = unpack("C", $ok);
-	print STDERR "ok=$ok\n" if $db;
-
-	append_handshake("done\n");
-
-	vdie if $ok == 0;
-}
-
-sub vencrypt_dialog {
-	my $vmode = shift;
-	my $db = 0;
-
-	$db = 1 if exists $ENV{SS_DEBUG};
-	$db = 1 if exists $ENV{SSVNC_VENCRYPT_DEBUG};
-
-	append_handshake("mode=$vmode\n");
-
-	my $server_rfb = "";
-	#syswrite($sock, $rep, 250);
-	for (my $i = 0; $i < 12; $i++) {
-		my $c;
-		sysread($sock, $c, 1);
-		$server_rfb .= $c;
-		print STDERR $c;
-	}
-	print STDERR "server_rfb: $server_rfb\n" if $db;
-	append_handshake("server=$server_rfb");
-
-	my $minor = "";
-	if ($server_rfb =~ /^RFB 003\.(\d+)/) {
-		$minor = $1;
-	} else {
-		vdie;
-	}
-	my $viewer_rfb = "RFB 003.008\n";
-	if ($minor < 7) {
-		vdie;
-	} elsif ($minor == 7) {
-		$viewer_rfb = "RFB 003.007\n";
-	}
-	my $nsec;
-	my $t1 = gettime();
-	my $t0 = gettime();
-
-	syswrite($sock, $viewer_rfb, 12);
-	sysread($sock, $nsec, 1);
-
-	$t1 = gettime();
-	$t1 = sprintf("%.6f", $t1 - $t0);
-
-	append_handshake("viewer=$viewer_rfb");
-	append_handshake("latency=$t1\n");
-
-	vdie if $nsec eq "";
-
-	$nsec = unpack("C", $nsec);
-
-	print STDERR "nsec: $nsec\n" if $db;
-	vdie if $nsec eq 0 || $nsec > 100;
-
-	my %sectypes = ();
-
-	for (my $i = 0; $i < $nsec; $i++) {
-		my $sec;
-		sysread($sock, $sec, 1);
-		vdie if $sec eq "";
-		$sec = unpack("C", $sec);
-		print STDERR "sec: $sec\n" if $db;
-		$sectypes{$sec} = 1;
-	}
-	
-	if (exists $sectypes{$rfbSecTypeVencrypt}) {
-		print STDERR "found rfbSecTypeVencrypt\n" if $db;
-		append_handshake("sectype=$rfbSecTypeVencrypt\n");
-		vencrypt_handshake($vmode, $db);
-	} elsif (exists $sectypes{$rfbSecTypeAnonTls}) {
-		print STDERR "found rfbSecTypeAnonTls\n" if $db;
-		append_handshake("sectype=$rfbSecTypeAnonTls\n");
-		anontls_handshake($vmode, $db);
-	} else {
-		print STDERR "No supported sec-type found\n" if $db;
-		vdie;
-	}
-}
-
-sub append_handshake {
-	my $str = shift;
-	if ($handshake_file) {
-		if (open(HSF, ">>$handshake_file")) {
-			print HSF $str;
-			close HSF;
-		}
-	}
-}
-
-sub do_vencrypt_viewer_bridge {
-	my ($listen, $connect) = @_;
-	print STDERR "\npproxy: starting vencrypt_viewer_bridge[$$]: $listen \-> $connect\n";
-	my $db = 0;
-	my $backwards = 0;
-	if ($listen < 0) {
-		$backwards = 1;
-		$listen = -$listen;
-	}
-	if ($handshake_file eq "") {
-		die "pproxy: vencrypt_viewer_bridge[$$]: no SSVNC_PREDIGESTED_HANDSHAKE\n";
-	}
-	my $listen_sock;
-	my $maxtry = 12;
-	my $sleep = 5;
-	for (my $i=0; $i < $maxtry; $i++)  {
-		$listen_sock = IO::Socket::INET->new(
-			Listen    => 2,
-			ReuseAddr => 1,
-			LocalAddr => "127.0.0.1",
-			LocalPort => $listen,
-			Proto     => "tcp"
-		);
-		if (! $listen_sock) {
-			if ($i < $maxtry - 1) {
-				warn "pproxy: vencrypt_viewer_bridge[$$]: $!\n";
-				warn "Could not listen on port $listen, retrying in $sleep seconds... (Ctrl-C to quit)\n";
-				sleep $sleep;
-			}
-		} else {
-			last;
-		}
-	}
-	if (! $listen_sock) {
-		die "pproxy: vencrypt_viewer_bridge[$$]: $!\n";
-	}
-	print STDERR "pproxy: vencrypt_viewer_bridge[$$]: listening on port $listen\n\n";
-	my ($viewer_sock, $ip) = $listen_sock->accept();
-	my $err = $!;
-	close $listen_sock;
-	if (! $viewer_sock) {
-		die "pproxy: vencrypt_viewer_bridge[$$]: $err\n";
-	}
-	if ($ENV{PPROXY_LOOP_THYSELF_MASTER}) {
-		my $sml = $ENV{SSVNC_MULTIPLE_LISTEN}; 
-		if ($sml ne "" && $sml ne "0") {
-			setpgrp(0, 0);
-			if (fork()) {
-				close $viewer_sock;
-				wait;
-				exit 0;
-			}
-			if (fork()) {
-				close $viewer_sock;
-				exit 0;
-			}
-			setpgrp(0, 0);
-			$parent = $$;
-		}
-	}
-	print STDERR "vencrypt_viewer_bridge[$$]: viewer_sock $viewer_sock\n" if $db;
-
-	print STDERR "pproxy: vencrypt_viewer_bridge[$$]: connecting to 127.0.0.1:$connect\n";
-	my $server_sock = IO::Socket::INET->new(
-		PeerAddr => "127.0.0.1",
-		PeerPort => $connect,
-		Proto => "tcp"
-	);
-	print STDERR "vencrypt_viewer_bridge[$$]: server_sock $server_sock\n" if $db;
-	if (! $server_sock) {
-		my $err = $!;
-		die "pproxy: vencrypt_viewer_bridge[$$]: $err\n";
-	}
-
-	if ($backwards) {
-		print STDERR "vencrypt_viewer_bridge[$$]: reversing roles of viewer and server.\n";
-		my $t = $viewer_sock;
-		$viewer_sock = $server_sock;
-		$server_sock = $t;
-	}
-
-	my %hs = ();
-	my $dt = 0.2;
-	my $slept = 0.0;
-	while ($slept < 20.0) {
-		select(undef, undef, undef, $dt);
-		$slept += $dt;
-		if (-f $handshake_file && open(HSF, "<$handshake_file")) {
-			my $done = 0;
-			%hs = ();
-			my $str = "";
-			while (<HSF>) {
-				print STDERR "vencrypt_viewer_bridge[$$]: $_" if $ENV{VENCRYPT_VIEWER_BRIDGE_DEBUG};
-				$str .= "vencrypt_viewer_bridge[$$]: $_";
-				chomp;
-				if ($_ eq "done") {
-					$done = 1;
-				} else {
-					my ($k, $v) = split(/=/, $_, 2);
-					if ($k ne "" && $v ne "") {
-						$hs{$k} = $v;
-					}
-				}
-			}
-			close HSF;
-			if ($done) {
-				print STDERR "\n" . $str;
-				last;
-			}
-		}
-	}
-	if (! exists $hs{server}) {
-		$hs{server} = "RFB 003.008";
-	}
-	if (! exists $hs{sectype}) {
-		unlink($handshake_file);
-		die "pproxy: vencrypt_viewer_bridge[$$]: no sectype.\n";
-	}
-	syswrite($viewer_sock, "$hs{server}\n", length($hs{server}) + 1);
-	my $viewer_rfb = "";
-	for (my $i = 0; $i < 12; $i++) {
-		my $c;
-		sysread($viewer_sock, $c, 1);
-		$viewer_rfb .= $c;
-		print STDERR $c;
-	}
-	my $viewer_major = 3;
-	my $viewer_minor = 8;
-	if ($viewer_rfb =~ /RFB (\d+)\.(\d+)/) {
-		$viewer_major = $1;	
-		$viewer_minor = $2;	
-	}
-	my $u0 = pack("C", 0);
-	my $u1 = pack("C", 1);
-	my $u2 = pack("C", 2);
-	if ($hs{sectype} == $rfbSecTypeAnonTls) {
-		unlink($handshake_file);
-		print STDERR "\npproxy: vencrypt_viewer_bridge[$$]: rfbSecTypeAnonTls\n";
-		if ($viewer_major > 3 || $viewer_minor >= 7) {
-			;	# setup ok, proceed to xfer.
-		} else {
-			print STDERR "pproxy: vencrypt_viewer_bridge[$$]: faking RFB version 3.3 to viewer.\n";
-			my $n;
-			sysread($server_sock, $n, 1);
-			$n = unpack("C", $n);
-			if ($n == 0) {
-				die "pproxy: vencrypt_viewer_bridge[$$]: nsectypes == $n.\n";
-			}
-			my %types;
-			for (my $i = 0; $i < $n; $i++) {
-				my $t;
-				sysread($server_sock, $t, 1);
-				$t = unpack("C", $t);
-				$types{$t} = 1;
-			}
-			my $use = 1;	# None
-			if (exists $types{1}) {
-				$use = 1;	# None
-			} elsif (exists $types{2}) {
-				$use = 2;	# VncAuth
-			} else {
-				die "pproxy: vencrypt_viewer_bridge[$$]: no valid sectypes" . join(",", keys %types) . "\n";
-			}
-				
-			# send 4 bytes sectype to viewer: 
-			# (note this should be MSB, network byte order...)
-			my $up = pack("C", $use);
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $up, 1);
-			# and tell server the one we selected:
-			syswrite($server_sock, $up, 1);
-			if ($use == 1) {
-				# even None has security result, so read it here and discard it.
-				my $sr = "";
-				sysread($server_sock, $sr, 4);
-			}
-		}
-	} elsif ($hs{sectype} == $rfbSecTypeVencrypt) {
-		print STDERR "\npproxy: vencrypt_viewer_bridge[$$]: rfbSecTypeVencrypt\n";
-		if (! exists $hs{subtype}) {
-			unlink($handshake_file);
-			die "pproxy: vencrypt_viewer_bridge[$$]: no subtype.\n";
-		}
-		my $fake_type = "None";
-		my $plain = 0;
-		my $sub_type = $hs{subtype};
-		if ($sub_type == $rfbVencryptTlsNone) {
-			$fake_type = "None";
-		} elsif ($sub_type == $rfbVencryptTlsVnc) {
-			$fake_type = "VncAuth";
-		} elsif ($sub_type == $rfbVencryptTlsPlain) {
-			$fake_type = "None";
-			$plain = 1;
-		} elsif ($sub_type == $rfbVencryptX509None) {
-			$fake_type = "None";
-		} elsif ($sub_type == $rfbVencryptX509Vnc) {
-			$fake_type = "VncAuth";
-		} elsif ($sub_type == $rfbVencryptX509Plain) {
-			$fake_type = "None";
-			$plain = 1;
-		}
-		if ($plain) {
-			if (!open(W, ">$handshake_file")) {
-				unlink($handshake_file);
-				die "pproxy: vencrypt_viewer_bridge[$$]: $handshake_file $!\n";
-			}
-			print W <<"END";
-
-			proc print_out {} {
-				global user pass env
-
-				if [info exists env(SSVNC_UP_DEBUG)] {
-					toplevel .b
-					button .b.b -text "user=\$user pass=\$pass" -command {destroy .b}
-					pack .b.b
-					update
-					tkwait window .b
-				}
-				
-				if [info exists env(SSVNC_UP_FILE)] {
-					set fh "" 
-					catch {set fh [open \$env(SSVNC_UP_FILE) w]}
-					if {\$fh != ""} {
-						puts \$fh user=\$user\\npass=\$pass
-						flush \$fh
-						close \$fh
-						return
-					}
-				}
-				puts stdout user=\$user\\npass=\$pass
-				flush stdout
-			}
-
-			proc center_win {w} {
-				update
-				set W [winfo screenwidth  \$w]
-				set W [expr \$W + 1]
-				wm geometry \$w +\$W+0
-				update
-				set x [expr [winfo screenwidth  \$w]/2 - [winfo width  \$w]/2]
-				set y [expr [winfo screenheight \$w]/2 - [winfo height \$w]/2]
-
-				wm geometry \$w +\$x+\$y
-				wm deiconify \$w
-				update
-			}
-
-			wm withdraw .
-
-			global env
-			set up {}
-			if [info exists env(SSVNC_UNIXPW)] {
-				set rm 0
-				set up \$env(SSVNC_UNIXPW)
-				if [regexp {^rm:} \$up]  {
-					set rm 1
-					regsub {^rm:} \$up {} up
-				}
-				if [file exists \$up] {
-					set fh ""
-					set f \$up
-					catch {set fh [open \$up r]}
-					if {\$fh != ""} {
-						gets \$fh u	
-						gets \$fh p	
-						close \$fh
-						set up "\$u@\$p"
-					}
-					if {\$rm} {
-						catch {file delete \$f}
-					}
-				}
-			} elseif [info exists env(SSVNC_VENCRYPT_USERPASS)] {
-				set up \$env(SSVNC_VENCRYPT_USERPASS)
-			}
-			#puts stderr up=\$up
-			if {\$up != ""} {
-				if [regexp {@} \$up] {
-					global user pass
-					set user \$up
-					set pass \$up
-					regsub {@.*\$}  \$user "" user
-					regsub {^[^@]*@} \$pass "" pass
-					print_out
-					exit
-				}
-			}
-
-			wm title . {VeNCrypt Viewer Bridge User/Pass}
-
-			set user {}
-			set pass {}
-
-			label .l -text {SSVNC VeNCrypt Viewer Bridge}
-
-			frame .f0
-			frame .f0.fL
-			label .f0.fL.la -text {Username: }
-			label .f0.fL.lb -text {Password: }
-
-			pack .f0.fL.la .f0.fL.lb -side top
-
-			frame .f0.fR
-			entry .f0.fR.ea -width 24 -textvariable user
-			entry .f0.fR.eb -width 24 -textvariable pass -show *
-
-			pack .f0.fR.ea .f0.fR.eb -side top -fill x
-
-			pack .f0.fL -side left
-			pack .f0.fR -side right -expand 1 -fill x
-
-			button .no -text Cancel -command {destroy .}
-			button .ok -text Done   -command {print_out; destroy .}
-
-			center_win .
-			pack .l .f0 .no .ok -side top -fill x
-			update
-			wm deiconify .
-
-			bind .f0.fR.ea <Return> {focus .f0.fR.eb}
-			bind .f0.fR.eb <Return> {print_out; destroy .}
-			focus .f0.fR.ea
-
-			wm resizable . 1 0
-			wm minsize . [winfo reqwidth .] [winfo reqheight .]
-END
-			close W;
-
-			#system("cat $handshake_file");
-			my $w = "wish";
-			if ($ENV{WISH}) {
-				$w = $ENV{WISH};	
-			}
-			print STDERR "pproxy: vencrypt_viewer_bridge[$$]: prompt  VencryptPlain user and passwd.\n";
-			my $res = "";
-			if (`uname` =~ /Darwin/) {
-				my $mtmp = `mktemp /tmp/hsup.XXXXXX`;
-				chomp $mtmp;
-				system("env SSVNC_UP_FILE=$mtmp $w $handshake_file");
-				$res = `cat $mtmp`;
-				unlink $mtmp;
-			} else {
-				$res = `$w $handshake_file`;
-			}
-			my $user = "";
-			my $pass = "";
-			if ($res =~ /user=(\S*)/) {
-				$user = $1;
-			}
-			if ($res =~ /pass=(\S*)/) {
-				$pass = $1;
-			}
-			print STDERR "pproxy: vencrypt_viewer_bridge[$$]: sending VencryptPlain user and passwd.\n";
-			my $ulen = pack("C", length($user));
-			my $plen = pack("C", length($pass));
-			# (note this should be MSB, network byte order...)
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $ulen, 1);
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $u0, 1);
-			syswrite($server_sock, $plen, 1);
-			syswrite($server_sock, $user, length($user));
-			syswrite($server_sock, $pass, length($pass));
-		}
-		unlink($handshake_file);
-
-		my $ft = 0;
-		if ($fake_type eq "None") {
-			$ft = 1;
-		} elsif ($fake_type eq "VncAuth") {
-			$ft = 2;
-		} else {
-			die "pproxy: vencrypt_viewer_bridge[$$]: unknown fake type: $fake_type\n";
-		}
-		my $fp = pack("C", $ft);
-		if ($viewer_major > 3 || $viewer_minor >= 7) {
-			syswrite($viewer_sock, $u1, 1);
-			syswrite($viewer_sock, $fp, 1);
-			my $cr;
-			sysread($viewer_sock, $cr, 1);
-			$cr = unpack("C", $cr);
-			if ($cr != $ft) {
-				die "pproxy: vencrypt_viewer_bridge[$$]: client selected wrong type: $cr / $ft\n";
-			}
-		} else {
-			print STDERR "pproxy: vencrypt_viewer_bridge[$$]: faking RFB version 3.3 to viewer.\n";
-			# send 4 bytes sect type to viewer: 
-			# (note this should be MSB, network byte order...)
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $u0, 1);
-			syswrite($viewer_sock, $fp, 1);
-			if ($ft == 1) {
-				# even None has security result, so read it here and discard it.
-				my $sr = "";
-				sysread($server_sock, $sr, 4);
-			}
-		}
-	}
-
-	$listen_handle = $viewer_sock;
-	$sock = $server_sock;
-
-	xfer_both();
-}
-'
-	# '
-	# xpg_echo will expand \n \r, etc.
-	# try to unset and then test for it.
-	if type shopt > /dev/null 2>&1; then
-		shopt -u xpg_echo >/dev/null 2>&1
-	fi
-	v='print STDOUT "abc\n";'
-	echo "$v" > $tf
-	chmod 700 $tf
-
-	lc=`wc -l $tf | awk '{print $1}'`
-	if [ "X$lc" = "X1" ]; then
-		echo "$cod" > $tf
-	else
-		printf "%s" "$cod" > $tf
-		echo "" >> $tf
-	fi
-	# prime perl
-	perl -e 'use IO::Socket::INET; select(undef, undef, undef, 0.01)' >/dev/null 2>&1
-}
-
-# make_tcert is no longer invoked via the ssvnc gui (Listen mode).
-# make_tcert is for testing only now via -mycert BUILTIN
-make_tcert() {
-	tcert="/tmp/ss_vnc_viewer_tcert${RANDOM}.$$"
-	tcert=`mytmp "$tcert"`
-	cat > $tcert <<END
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAvkfXxb0wcxgrjV2ziFikjII+ze8iKcTBt47L0GM/c21efelN
-+zZpJUUXLu4zz8Ryq8Q+sQgfNy7uTOpN9bUUaOk1TnD7gaDQnQWiNHmqbW2kL+DS
-OKngJVPo9dETAS8hf7+D1e1DBZxjTc1a4RQqWJixwpYj99ixWzu8VC2m/xXsjvOs
-jp4+DLBB490nbkwvstmhmiWm1CmI5O5xOkgioVNQqHvQMdVKOSz9PpbjvZiRX1Uo
-qoMrk+2NOqwP90TB35yPASXb9zXKpO7DLhkube+yYGf+yk46aD707L07Eb7cosFP
-S84vNZ9gX7rQ0UOwm5rYA/oZTBskgaqhtIzkLwIDAQABAoIBAD4ot/sXt5kRn0Ca
-CIkU9AQWlC+v28grR2EQW9JiaZrqcoDNUzUqbCTJsi4ZkIFh2lf0TsqELbZYNW6Y
-6AjJM7al4E0UqYSKJTv2WCuuRxdiRs2BMwthqyBmjeanev7bB6V0ybt7u3Y8xU/o
-MrTuYnr4vrEjXPKdLirwk7AoDbKsRXHSIiHEIBOq1+dUQ32t36ukdnnza4wKDLZc
-PKHiCdCk/wOGhuDlxD6RspqUAlRnJ8/aEhrgWxadFXw1hRhRsf/v1shtB0T3DmTe
-Jchjwyiw9mryb9JZAcKxW+fUc4EVvj6VdQGqYInQJY5Yxm5JAlVQUJicuuJEvn6A
-rj5osQECgYEA552CaHpUiFlB4HGkjaH00kL+f0+gRF4PANCPk6X3UPDVYzKnzmuu
-yDvIdEETGFWBwoztUrOOKqVvPEQ+kBa2+DWWYaERZLtg2cI5byfDJxQ3ldzilS3J
-1S3WgCojqcsG/hlxoQJ1dZFanUy/QhUZ0B+wlC+Zp1Q8AyuGQvhHp68CgYEA0lBI
-eqq2GGCdJuNHMPFbi8Q0BnX55LW5C1hWjhuYiEkb3hOaIJuJrqvayBlhcQa2cGqp
-uP34e9UCfoeLgmoCQ0b4KpL2NGov/mL4i8bMgog4hcoYuIi3qxN18vVR14VKEh4U
-RLk0igAYPU+IK2QByaQlBo9OSaKkcfm7U1/pK4ECgYAxr6VpGk0GDvfF2Tsusv6d
-GIgV8ZP09qSLTTJvvxvF/lQYeqZq7sjI5aJD5i3de4JhpO/IXQJzfZfWOuGc8XKA
-3qYK/Y2IqXXGYRcHFGWV/Y1LFd55mCADHlk0l1WdOBOg8P5iRu/Br9PbiLpCx9oI
-vrOXpnp03eod1/luZmqguwKBgQCWFRSj9Q7ddpSvG6HCG3ro0qsNsUMTI1tZ7UBX
-SPogx4tLf1GN03D9ZUZLZVFUByZKMtPLX/Hi7K9K/A9ikaPrvsl6GEX6QYzeTGJx
-3Pw0amFrmDzr8ySewNR6/PXahxPEuhJcuI31rPufRRI3ZLah3rFNbRbBFX+klkJH
-zTnoAQKBgDbUK/aQFGduSy7WUT7LlM3UlGxJ2sA90TQh4JRQwzur0ACN5GdYZkqM
-YBts4sBJVwwJoxD9OpbvKu3uKCt41BSj0/KyoBzjT44S2io2tj1syujtlVUsyyBy
-/ca0A7WBB8lD1D7QMIhYUm2O9kYtSCLlUTHt5leqGaRG38DqlX36
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIIDzDCCArQCCQDSzxzxqhyqLzANBgkqhkiG9w0BAQQFADCBpzELMAkGA1UEBhMC
-VVMxFjAUBgNVBAgTDU1hc3NhY2h1c2V0dHMxDzANBgNVBAcTBkJvc3RvbjETMBEG
-A1UEChMKTXkgQ29tcGFueTEcMBoGA1UECxMTUHJvZHVjdCBEZXZlbG9wbWVudDEZ
-MBcGA1UEAxMQd3d3Lm5vd2hlcmUubm9uZTEhMB8GCSqGSIb3DQEJARYSYWRtaW5A
-bm93aGVyZS5ub25lMB4XDTA3MDMyMzE4MDc0NVoXDTI2MDUyMjE4MDc0NVowgacx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMQ8wDQYDVQQHEwZC
-b3N0b24xEzARBgNVBAoTCk15IENvbXBhbnkxHDAaBgNVBAsTE1Byb2R1Y3QgRGV2
-ZWxvcG1lbnQxGTAXBgNVBAMTEHd3dy5ub3doZXJlLm5vbmUxITAfBgkqhkiG9w0B
-CQEWEmFkbWluQG5vd2hlcmUubm9uZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAL5H18W9MHMYK41ds4hYpIyCPs3vIinEwbeOy9BjP3NtXn3pTfs2aSVF
-Fy7uM8/EcqvEPrEIHzcu7kzqTfW1FGjpNU5w+4Gg0J0FojR5qm1tpC/g0jip4CVT
-6PXREwEvIX+/g9XtQwWcY03NWuEUKliYscKWI/fYsVs7vFQtpv8V7I7zrI6ePgyw
-QePdJ25ML7LZoZolptQpiOTucTpIIqFTUKh70DHVSjks/T6W472YkV9VKKqDK5Pt
-jTqsD/dEwd+cjwEl2/c1yqTuwy4ZLm3vsmBn/spOOmg+9Oy9OxG+3KLBT0vOLzWf
-YF+60NFDsJua2AP6GUwbJIGqobSM5C8CAwEAATANBgkqhkiG9w0BAQQFAAOCAQEA
-vGomHEp6TVU83X2EBUgnbOhzKJ9u3fOI/Uf5L7p//Vxqow7OR1cguzh/YEzmXOIL
-ilMVnzX9nj/bvcLAuqEP7MR1A8f4+E807p/L/Sf49BiCcwQq5I966sGKYXjkve+T
-2GTBNwMSq+5kLSf6QY8VZI+qnrAudEQMeJByQhTZZ0dH8Njeq8EGl9KUio+VWaiW
-CQK6xJuAvAHqa06OjLmwu1fYD4GLGSrOIiRVkSXV8qLIUmzxdJaIRznkFWsrCEKR
-wAH966SAOvd2s6yOHMvyDRIL7WHxfESB6rDHsdIW/yny1fBePjv473KrxyXtbz7I
-dMw1yW09l+eEo4A7GzwOdw==
------END CERTIFICATE-----
-END
-	chmod 600 $tcert
-	echo "$tcert"
-}
-
-Kecho() {
-	NO_KECHO=1
-	if [ "X$USER" = "Xrunge" -a "X$NO_KECHO" = "X" ]; then
-		echo "dbg: $*"
-	fi
-}
-
-NHAFL_warning() {
-	echo "" 
-	echo "** Warning: For the proxy: $proxy" 
-	echo "** Warning: the ssh(1) option: $ssh_NHAFL" 
-	echo "** Warning: will be used to avoid frequent 'ssh key has changed for localhost'"
-	echo "** Warning: dialogs and connection failures (for example, ssh will exit asking"
-	echo "** Warning: you to manually remove a key from ~/.ssh/known_hosts.)"
-	echo "** Warning: "
-	echo "** Warning: This decreases security: a Man-In-The-Middle attack is possible."
-	echo "** Warning: For chained ssh connections the first ssh leg is secure but the"
-	echo "** Warning: 2nd ssh leg is vulnerable.  For an ssh connection going through"
-	echo "** Warning: a HTTP or SOCKS proxy the ssh connection is vulnerable."
-	echo "** Warning: "
-	echo "** Warning: You can set the SSVNC_SSH_LOCALHOST_AUTH=1 env. var. to disable" 
-	echo "** Warning: using the NoHostAuthenticationForLocalhost=yes ssh option." 
-	echo "** Warning: "
-	echo "** Warning: A better solution is to configure (in the SSVNC GUI) the setting:"
-	echo "** Warning: 'Options -> Advanced -> Private SSH KnownHosts file' (or set" 
-	echo "** Warning: SSVNC_KNOWN_HOSTS_FILE directly) to a per-connection known hosts" 
-	echo "** Warning: file.  That file holds the 'localhost' cert for this specific" 
-	echo "** Warning: connection.  This yields a both secure and convenient solution." 
-	echo "" 
-}
-
-space_expand() {
-	str=`echo "$1" | sed -e 's/%SPACE/ /g' -e 's/%TAB/\t/g'`
-	echo "$str"
-}
-
-# handle ssh case:
-#
-if [ "X$use_ssh" = "X1" ]; then
-	#
-	# USING SSH
-	#
-	ssh_port="22"
-	ssh_host="$host"
-	vnc_host="$localhost"
-	ssh_UKHF=""
-	localhost_extra=""
-	# let user override ssh via $SSH
-	ssh=${SSH:-"ssh -x"}
-
-	sshword=`echo "$ssh" | awk '{print $1}'`
-	if [ "X$sshword" != "X" ]; then
-		if [ -x "$sshword" ]; then
-			:
-		elif type "$sshword" > /dev/null 2>&1; then
-			:
-		else
-			echo ""
-			echo "*********************************************************"
-			echo "** Problem finding the SSH command '$sshword': **"
-			echo ""
-			type "$sshword"
-			echo ""
-			echo "** Perhaps you need to install the SSH client package. **"
-			echo "*********************************************************"
-			echo ""
-			sleep 5
-		fi
-	fi
-
-	ssh_NHAFL="-o NoHostAuthenticationForLocalhost=yes"
-	if [ "X$SSVNC_SSH_LOCALHOST_AUTH" = "X1" ]; then
-		ssh_NHAFL=""
-	fi
-	if [ "X$SSVNC_KNOWN_HOSTS_FILE" != "X" ]; then
-		ssh_NHAFL=""
-	
-		ssh_UKHF="-o UserKnownHostsFile=$SSVNC_KNOWN_HOSTS_FILE"
-		ssh_args="$ssh_args $ssh_UKHF"
-		if [ ! -f "$SSVNC_KNOWN_HOSTS_FILE" ]; then
-			touch "$SSVNC_KNOWN_HOSTS_FILE" >/dev/null 2>&1
-		fi
-		chmod 600 "$SSVNC_KNOWN_HOSTS_FILE" >/dev/null 2>&1
-	fi
-	did_ssh_NHAFL=""
-
-	if [ "X$SSVNC_LIM_ACCEPT_PRELOAD" != "X" ]; then
-		SSVNC_LIM_ACCEPT_PRELOAD="$SSVNC_BASEDIR/$SSVNC_UNAME/$SSVNC_LIM_ACCEPT_PRELOAD"
-	fi
-	if [ "X$SSVNC_LIM_ACCEPT_PRELOAD" != "X" ]; then
-		echo ""
-		echo "SSVNC_LIM_ACCEPT_PRELOAD=$SSVNC_LIM_ACCEPT_PRELOAD"
-	fi
-
-	if [ "X$SSVNC_LIM_ACCEPT_PRELOAD" != "X" -a -f "$SSVNC_LIM_ACCEPT_PRELOAD" ]; then
-		plvar=LD_PRELOAD
-		if uname | grep Darwin >/dev/null; then
-			plvar="DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES"
-		fi
-		ssh="env $plvar=$SSVNC_LIM_ACCEPT_PRELOAD $ssh"
-	else
-		SSVNC_LIM_ACCEPT_PRELOAD=""
-	fi
-
-	ssh_vencrypt_proxy=""
-	# We handle vencrypt for SSH+SSL mode.
-	if echo "$proxy" | grep 'vencrypt://' > /dev/null; then
-		proxynew=""
-		for part in `echo "$proxy" | tr ',' ' '`
-		do
-			if echo "$part" | egrep -i '^vencrypt://' > /dev/null; then
-				ssh_vencrypt_proxy=$part
-			else
-				if [ "X$proxynew" = "X" ]; then
-					proxynew="$part"
-				else
-					proxynew="$proxynew,$part"
-				fi
-			fi
-		done
-		proxy=$proxynew
-	fi 
-	Kecho ssh_vencrypt_proxy=$ssh_vencrypt_proxy
-
-	# note that user must supply http:// for web proxy in SSH and SSH+SSL.
-	# No xxxx:// implies ssh server+port.
-	#
-	if echo "$proxy" | egrep '(http|https|socks|socks4|socks5)://' > /dev/null; then
-		# Handle Web or SOCKS proxy(ies) for the initial connect.
-		Kecho host=$host
-		Kecho port=$port
-		pproxy=""
-		sproxy1=""
-		sproxy_rest=""
-		for part in `echo "$proxy" | tr ',' ' '`
-		do
-			Kecho proxy_part=$part
-			if [ "X$part" = "X" ]; then
-				continue
-			elif echo "$part" | egrep -i '^(http|https|socks|socks4|socks5)://' > /dev/null; then
-				pproxy="$pproxy,$part"
-			else
-				if [ "X$sproxy1" = "X" ]; then
-					sproxy1="$part"
-				else
-					sproxy_rest="$sproxy_rest,$part"
-				fi
-			fi
-		done
-		pproxy=`echo "$pproxy" | sed -e 's/^,,*//' -e 's/,,*/,/g'`
-		sproxy_rest=`echo "$sproxy_rest" | sed -e 's/^,,*//' -e 's/,,*/,/g'`
-
-		Kecho pproxy=$pproxy
-		Kecho sproxy1=$sproxy1
-		Kecho sproxy_rest=$sproxy_rest
-
-		sproxy1_host=""
-		sproxy1_port=""
-		sproxy1_user=""
-
-		if [ "X$sproxy1" != "X" ]; then
-			# XXX fix ipv6 ip adder here and below.
-			sproxy1_host=`echo "$sproxy1" | awk -F: '{print $1}'`
-			sproxy1_user=`echo "$sproxy1_host" | awk -F@ '{print $1}'`
-			sproxy1_host=`echo "$sproxy1_host" | awk -F@ '{print $2}'`
-			if [ "X$sproxy1_host" = "X" ]; then
-				sproxy1_host=$sproxy1_user
-				sproxy1_user=""
-			else
-				sproxy1_user="${sproxy1_user}@"
-			fi
-			sproxy1_port=`echo "$sproxy1" | awk -F: '{print $2}'`
-			if [ "X$sproxy1_port" = "X" ]; then
-				sproxy1_port="22"
-			fi
-		else
-			sproxy1_host=`echo "$host" | awk -F: '{print $1}'`
-			sproxy1_user=`echo "$sproxy1_host" | awk -F@ '{print $1}'`
-			sproxy1_host=`echo "$sproxy1_host" | awk -F@ '{print $2}'`
-			if [ "X$sproxy1_host" = "X" ]; then
-				sproxy1_host=$sproxy1_user
-				sproxy1_user=""
-			else
-				sproxy1_user="${sproxy1_user}@"
-			fi
-			sproxy1_port=`echo "$host" | awk -F: '{print $2}'`
-			if [ "X$sproxy1_port" = "X" ]; then
-				sproxy1_port="22"
-			fi
-		fi
-
-		Kecho sproxy1_host=$sproxy1_host
-		Kecho sproxy1_port=$sproxy1_port
-		Kecho sproxy1_user=$sproxy1_user
-
-		ptmp="/tmp/ss_vncviewer_ssh${RANDOM}.$$.pl"
-		ptmp=`mytmp "$ptmp"`
-		PPROXY_REMOVE=1; export PPROXY_REMOVE
-		proxy=$pproxy
-		port_save=$port
-		host_save=$host
-		if [ "X$sproxy1_host" != "X" ]; then
-			host=$sproxy1_host
-		fi
-		if [ "X$sproxy1_port" != "X" ]; then
-			port=$sproxy1_port
-		fi
-		host=`echo "$host" | sed -e 's/^.*@//'`
-		port=`echo "$port" | sed -e 's/^.*://'`
-		pcode "$ptmp"
-		port=$port_save
-		host=$host_save
-
-		nd=`findfree 6600`
-		PPROXY_LISTEN=$nd; export PPROXY_LISTEN
-		# XXX no reverse forever PPROXY_LOOP_THYSELF ...
-		$ptmp &
-		sleep 1
-		if [ "X$ssh_NHAFL" != "X" -a "X$did_ssh_NHAFL" != "X1" ]; then
-			NHAFL_warning
-			ssh_args="$ssh_args $ssh_NHAFL"
-			did_ssh_NHAFL=1
-		fi
-		sleep 1
-		if [ "X$sproxy1" = "X" ]; then
-			u=""
-			if echo "$host" | grep '@' > /dev/null; then
-				u=`echo "$host" | sed -e 's/@.*$/@/'`
-			fi
-			
-			proxy="${u}$localhost:$nd"
-		else
-			proxy="${sproxy1_user}$localhost:$nd"
-		fi
-		localhost_extra=".2"
-		if [ "X$sproxy_rest" != "X" ]; then
-			proxy="$proxy,$sproxy_rest"
-		fi
-		Kecho proxy=$proxy
-	fi
-
-	if echo "$proxy" | grep "," > /dev/null; then
-
-		proxy1=`echo "$proxy" | awk -F, '{print $1}'`
-		proxy2=`echo "$proxy" | awk -F, '{print $2}'`
-
-		# user1@gw1.com:port1,user2@ws2:port2
-		ssh_host1=`echo "$proxy1" | awk -F: '{print $1}'`
-		ssh_port1=`echo "$proxy1" | awk -F: '{print $2}'`
-		if [ "X$ssh_port1" != "X" ]; then
-			ssh_port1="-p $ssh_port1"
-		fi
-		ssh_host2=`echo "$proxy2" | awk -F: '{print $1}'`
-		ssh_user2=`echo "$ssh_host2" | awk -F@ '{print $1}'`
-		ssh_host2=`echo "$ssh_host2" | awk -F@ '{print $2}'`
-		if [ "X$ssh_host2" = "X" ]; then
-			ssh_host2=$ssh_user2
-			ssh_user2=""
-		else
-			ssh_user2="${ssh_user2}@"
-		fi
-		ssh_port2=`echo "$proxy2" | awk -F: '{print $2}'`
-		if [ "X$ssh_port2" = "X" ]; then
-			ssh_port2="22"
-		fi
-		proxport=`findfree 3500`
-		if [ "X$ssh_NHAFL" != "X" -a "X$did_ssh_NHAFL" != "X1" ]; then
-			NHAFL_warning
-			did_ssh_NHAFL=1
-			sleep 1
-		fi
-		echo
-		echo "Running 1st ssh proxy:"
-		ukhf=""
-		if [ "X$ssh_UKHF" != "X" ]; then 
-			ukhf="$ssh_UKHF$localhost_extra"
-		fi
-		if echo "$ssh_host1" | grep '%' > /dev/null; then
-			uath=`space_expand "$ssh_host1"`
-		else
-			uath="$ssh_host1"
-		fi
-		echo "$ssh -f -x $ssh_port1 $targ -e none $ssh_NHAFL $ukhf -L $proxport:$ssh_host2:$ssh_port2 \"$uath\" \"sleep 30\""
-		echo ""
-		      $ssh -f -x $ssh_port1 $targ -e none $ssh_NHAFL $ukhf -L $proxport:$ssh_host2:$ssh_port2 "$uath" "sleep 30"
-		ssh_args="$ssh_args $ssh_NHAFL"
-		sleep 1
-		stty sane
-		proxy="${ssh_user2}$localhost:$proxport"
-	fi
-
-	if [ "X$proxy" != "X" ]; then
-		ssh_port=`echo "$proxy" | awk -F: '{print $2}'`
-		if [ "X$ssh_port" = "X" ]; then
-			ssh_port="22"
-		fi
-		ssh_host=`echo "$proxy" | awk -F: '{print $1}'`
-		vnc_host="$host"
-	fi
-
-	echo ""
-	echo "Running ssh:"
-	sz=`echo "$ssh_cmd" | wc -c`
-	if [ "$sz" -gt 300 ]; then
-		info="..."
-	else
-		info="$ssh_cmd"
-	fi
-
-	C=""
-	if [ "X$SS_VNCVIEWER_USE_C" != "X" ]; then
-		C="-C"
-	fi
-
-	getport=""
-	teeport=""
-	if echo "$ssh_cmd" | egrep "(PORT=|P=) " > /dev/null; then
-		getport=1
-		if echo "$ssh_cmd" | egrep "P= " > /dev/null; then
-			teeport=1
-		fi
-
-		PORT=""
-		ssh_cmd=`echo "$ssh_cmd" | sed -e 's/PORT=[ 	]*//' -e 's/P=//'`
-		SSVNC_NO_ENC_WARN=1
-		if [ "X$use_sshssl" = "X" ]; then
-			direct_connect=1
-		fi
-	fi
-	if [ "X$getport" != "X" ]; then
-		ssh_redir="-D ${use}"
-	elif [ "X$reverse" = "X" ]; then
-		ssh_redir="-L ${use}:${vnc_host}:${port}"
-	else
-		ssh_redir="-R ${port}:${vnc_host}:${use}"
-	fi
-	pmark=`sh -c 'echo $$'`
-
-	# the -t option actually speeds up typing response via VNC!!
-	if [ "X$ssh_port" = "X22" ]; then
-		ssh_port=""
-	else
-		ssh_port="-p $ssh_port"
-	fi
-
-	if echo "$ssh_host" | grep '%' > /dev/null; then
-		uath=`space_expand "$ssh_host"`
-	else
-		uath="$ssh_host"
-	fi
-	if [ "X$SS_VNCVIEWER_SSH_ONLY" != "X" ]; then
-		echo "$ssh -x $ssh_port $targ $C $ssh_args \"$uath\" \"$info\""
-		echo ""
-		$ssh -x $ssh_port $targ $C $ssh_args "$uath" "$ssh_cmd"
-		exit $?
-
-	elif [ "X$SS_VNCVIEWER_NO_F" != "X" ]; then
-		echo "$ssh -x $ssh_port $targ $C $ssh_redir $ssh_args \"$uath\" \"$info\""
-		echo ""
-		$ssh -x $ssh_port $targ $C $ssh_redir $ssh_args "$uath" "$ssh_cmd"
-		rc=$?
-
-	elif [ "X$getport" != "X" ]; then
-		tport=/tmp/ss_vncviewer_tport${RANDOM}.$$
-		tport=`mytmp "$tport"`
-		tport2=/tmp/ss_vncviewer_tport2${RANDOM}.$$
-		tport2=`mytmp "$tport2"`
-
-		if [ "X$rsh" != "X1" ]; then
-			if echo "$ssh_cmd" | grep "sudo " > /dev/null; then
-				echo ""
-				echo "Initial ssh with 'sudo id' to prime sudo so hopefully the next one"
-				echo "will require no password..."
-				echo ""
-				targ="-t"
-				$ssh -x $ssh_port $targ $ssh_args "$uath" "sudo id; tty"
-				echo ""
-			fi
-			echo "$ssh -x -f $ssh_port $targ $C $ssh_redir $ssh_args \"$uath\" \"$info\""
-			echo ""
-			$ssh -x -f $ssh_port $targ $C $ssh_redir $ssh_args "$uath" "$ssh_cmd" > $tport 2> $tport2
-			if [ "X$teeport" = "X1" ]; then
-				tail -f $tport  1>&2 &
-				tail_pid=$!
-				tail -f $tport2 1>&2 &
-				tail_pid2=$!
-			fi
-			rc=$?
-		else
-			rsh_setup
-			echo "rsh $ul \"$ssh_host\" \"$ssh_cmd\""
-			echo ""
-			rsh $ul "$ssh_host" "$ssh_cmd" > $tport &
-			sleep 1
-			rc=0
-		fi
-
-		if [ "X$SSVNC_EXTRA_SLEEP" != "X" ]; then
-			echo "sleep $SSVNC_EXTRA_SLEEP"
-			sleep $SSVNC_EXTRA_SLEEP
-		fi
-
-		stty sane
-		i=0
-		if type perl > /dev/null 2>&1; then
-			imax=50
-			sleepit="perl -e 'select(undef, undef, undef, 0.20)'"
-		else
-			imax=10
-			sleepit="sleep 1"
-		fi
-		while [ $i -lt $imax ]; do
-			#echo $sleepit
-			eval $sleepit
-			PORT=`grep "^PORT=" $tport | tr '\r' ' ' | head -n 1 | sed -e 's/PORT=//' -e 's/\r//g' -e 's/ *$//'`
-			if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then
-				break
-			fi
-			vnss=`sed -e 's/\r//g' $tport $tport2 | egrep -i '^(New.* desktop is|A VNC server is already running).*:[0-9[0-9]*$' | head -n 1 | awk '{print $NF}'`
-			if [ "X$vnss" != "X" ]; then
-				PORT=`echo "$vnss" | awk -F: '{print $2}'`
-				if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then
-					if [ $PORT -lt 100 ]; then
-						PORT=`expr $PORT + 5900`
-					fi
-				fi
-				if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then
-					vnss=`sed -e 's/\r//g' $tport | egrep -i '^(New.* desktop is|A VNC server is already running).*:[0-9[0-9]*$' | head -n 1`
-					echo "vncserver string: $vnss" 1>&2
-					break
-				fi
-			fi
-			i=`expr $i + 1`
-		done
-
-		echo "found: PORT='$PORT'" 1>&2
-		lh6=""
-		if [ "X$SSVNC_PORT_IPV6" != "X" ]; then
-			lh6=1
-		elif egrep 'Info: listening on IPv6 only|Info: listening only on IPv6' $tport > /dev/null; then
-			lh6=1
-		fi
-		if [ "X$lh6" = "X1" ]; then
-			echo "set SOCKS5 localhost to ::1" 1>&2
-		fi
-		rm -f $tport $tport2
-		if [ "X$rsh" = "X1" ]; then
-			rsh_viewer "$@"
-			exit $?
-		fi
-		PPROXY_SOCKS=5
-		if [ "X$SSVNC_SOCKS5" != "X" ]; then
-			PPROXY_SOCKS=5
-		elif [ "X$SSVNC_SOCKS4" != "X" ]; then
-			PPROXY_SOCKS=1
-		fi
-		export PPROXY_SOCKS
-		if [ "X$lh6" = "X" ]; then
-			host="$localhost"
-		else
-			host="::1"
-		fi
-		port="$PORT"
-		proxy="$localhost:$use"
-
-	else
-		if [ "X$rsh" != "X1" ]; then
-			echo "$ssh -x -f $ssh_port $targ $C $ssh_redir $ssh_args \"$uath\" \"$info\""
-			echo ""
-			$ssh -x -f $ssh_port $targ $C $ssh_redir $ssh_args "$uath" "$ssh_cmd"
-			rc=$?
-		else
-			rsh_setup
-			echo "rsh $ul \"$ssh_host\" \"$ssh_cmd\""
-			echo ""
-			rsh $ul "$ssh_host" "$ssh_cmd" &
-			sleep 1
-			PORT=$port
-			rsh_viewer "$@"
-			exit $?
-		fi
-	fi
-
-	if [ "$rc" != "0" ]; then
-		echo ""
-		echo "ssh to \"$uath\" failed."
-		exit 1
-	fi
-	stty sane
-
-	c=0
-	pssh=""
-	while [ $c -lt 40 ]
-	do
-		p=`expr $pmark + $c`
-		pout=`ps -p "$p" 2>/dev/null | grep -v '^[ 	]*PID' | sed -e 's/-L.*$//' -e 's/-x .*$//'`
-		if echo "$pout" | grep "ssh" > /dev/null; then
-			if echo "$pout" | egrep -i 'ssh.*(-add|-agent|-ask|-keygen|-argv0|vnc)' >/dev/null; then
-				:
-			elif echo "$pout" | egrep -i 'scp|sshd' >/dev/null; then
-				:
-			else
-				pssh=$p
-				break
-			fi
-		fi
-		c=`expr $c + 1`
-	done
-	if [ "X$getport" != "X" ]; then
-		:
-	elif [ "X$SSVNC_LIM_ACCEPT_PRELOAD" != "X" ] ; then
-		sleep 2
-	elif [ "X$ssh_cmd" = "Xsleep $ssh_sleep" ] ; then
-		#echo T sleep 1
-		sleep 1
-	elif echo "$ssh_cmd" | grep '^sleep ' >/dev/null; then
-		#echo T sleep 2
-		sleep 2
-	else
-		# let any command get started a bit.
-		#echo T sleep 5
-		sleep 5
-	fi
-	echo ""
-	#reset
-	stty sane
-	if [ "X$SSVNC_EXTRA_SLEEP" != "X" ]; then
-		echo "sleep $SSVNC_EXTRA_SLEEP"
-		sleep $SSVNC_EXTRA_SLEEP
-	fi
-	echo "ssh_pid='$pssh'"; echo
-	if [ "X$use_sshssl" = "X" -a "X$getport" = "X" ]; then
-		if [ "X$SSVNC_EXTRA_COMMAND" != "X" ]; then
-			(sh -c "$SSVNC_EXTRA_COMMAND") &
-			echo "($SSVNC_EXTRA_COMMAND) &"; echo
-		fi
-		echo "Running viewer:"
-
-		trap "final" 0 2 15
-		if [ "X$reverse" = "X" ]; then
-			echo "$VNCVIEWERCMD" "$@" $localhost:$N
-			echo ""
-			$VNCVIEWERCMD "$@" $localhost:$N
-			if [ $? != 0 ]; then
-				echo "vncviewer command failed: $?"
-				if [ "X$secondtry" = "X1" ]; then
-					sleep 2
-					$VNCVIEWERCMD "$@" $localhost:$N
-				fi
-			fi
-		else
-			echo ""
-			echo "NOTE: Press Ctrl-C to terminate viewer LISTEN mode."
-			echo ""
-			N2=$N
-			if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then
-				N2=`echo "$N2" | sed -e 's/://g'`
-				if [ $N2 -le 200 ]; then
-					N2=`expr $N2 + 5500`
-				fi
-			fi
-			echo "$VNCVIEWERCMD" "$@" -listen $N2
-			echo ""
-			$VNCVIEWERCMD "$@" -listen $N2
-		fi
-
-		exit $?
-	else
-		use2=`findfree 5960`
-		host0=$host
-		port0=$port
-		host=$localhost
-		port=$use
-		use=$use2
-		N=`expr $use - 5900`
-		if [ "X$getport" != "X" ]; then
-			host="$host0"
-			port="$port0"
-		else
-			proxy=""
-		fi
-		if [ "X$ssh_vencrypt_proxy" != "X" ]; then
-			ssh_vencrypt_proxy="vencrypt://$host:$port"
-			if [ "X$proxy" = "X" ]; then
-				proxy=$ssh_vencrypt_proxy
-			else
-				proxy="$proxy,$ssh_vencrypt_proxy"
-			fi
-			Kecho "proxy_now=$proxy"
-			unset PPROXY_LISTEN
-		fi
-	fi
-fi
-
-if [ "X$stunnel_set_here" = "X1" -a "X$showcert" = "X" ]; then
-	if type $STUNNEL > /dev/null 2>&1; then
-		:
-	else
-		echo ""
-		echo "***************************************************************"
-		echo "** Problem finding the Stunnel command '$STUNNEL': **"
-		echo ""
-		type $STUNNEL
-		echo ""
-		echo "** Perhaps you need to install the stunnel/stunnel4 package. **"
-		echo "***************************************************************"
-		echo ""
-		sleep 5
-	fi
-fi
-
-# create the stunnel config file:
-if [ "X$verify" != "X" ]; then
-	if [ -d $verify ]; then
-		verify="CApath = $verify"
-	else
-		verify="CAfile = $verify"
-	fi
-	verify="$verify
-verify = 2"
-fi
-if [ "X$SSVNC_STUNNEL_VERIFY3" != "X" ]; then
-	verify=`echo "$verify" | sed -e 's/verify = 2/verify = 3/'`
-fi
-if [ "X$mycert" != "X" ]; then
-	cert="cert = $mycert"
-fi
-if [ "X$crl" != "X" ]; then
-	if [ -d $crl ]; then
-		crl="CRLpath = $crl"
-	else
-		crl="CRLfile = $crl"
-	fi
-fi
-
-if [ "X$showcert" = "X1" ]; then
-	if [ "X$have_uvnc_dsm_helper_showcert" = "X1" ]; then
-		:
-	elif [ "X$SSVNC_NO_IPV6_PROXY" != "X" ]; then
-		:
-	elif [ "X$ipv6" = "X1" -a "X$proxy" = "X" ]; then
-		proxy="ipv6://$host:$port"
-	fi
-fi
-
-if [ "X$direct_connect" != "X" -a "X$STUNNEL_LISTEN" != "X" ]; then
-	proxy=reverse_direct
-fi
-
-ptmp=""
-if [ "X$proxy" != "X" ]; then
-	ptmp="/tmp/ss_vncviewer${RANDOM}.$$.pl"
-	ptmp=`mytmp "$ptmp"`
-	PPROXY_REMOVE=1; export PPROXY_REMOVE
-	pcode "$ptmp"
-	if [ "X$showcert" != "X1" -a "X$direct_connect" = "X" ]; then
-		if uname | egrep 'Darwin|SunOS' >/dev/null; then
-			vout=`echo "$proxy" | grep -i vencrypt`
-			if [ "X$vout" != "X" -a "X$reverse" = "X1" ]; then
-				# need to exec for reverse vencrypt
-				connect="exec = $ptmp"
-			else
-				# on mac and solaris we need to listen on socket instead of stdio:
-				nd=`findfree 6700`
-				PPROXY_LISTEN=$nd
-				export PPROXY_LISTEN
-				if [ "X$reverse" = "X" ]; then
-					$ptmp &
-				fi
-				sleep 2
-				host="$localhost"
-				port="$nd"
-				connect="connect = $localhost:$nd"
-			fi
-		else
-			# otherwise on unix we can exec it:
-			connect="exec = $ptmp"
-		fi
-	else
-		connect="exec = $ptmp"
-	fi
-else
-	connect="connect = $host:$port"
-fi
-
-# handle showcert case:
-#
-if [ "X$showcert" = "X1" ]; then
-	if [ "X$proxy" != "X" ]; then
-		PPROXY_LISTEN=$use
-		export PPROXY_LISTEN
-		if [ "X$SS_DEBUG" != "X" ]; then
-			$ptmp &
-		else
-			$ptmp 2>/dev/null &
-		fi
-		sleep 1
-		more_sleep=1
-		if uname | grep Linux > /dev/null; then
-			if netstat -ant | grep LISTEN | grep "127.0.0.1:$use" > /dev/null; then
-				more_sleep=""
-			fi
-		elif uname | grep SunOS > /dev/null; then
-			if netstat -an -f inet -P tcp | grep LISTEN | grep "127.0.0.1.$use" > /dev/null; then
-				more_sleep=""
-			fi
-		elif uname | egrep -i 'bsd|darwin' > /dev/null; then
-			if netstat -ant -f inet | grep LISTEN | grep "127.0.0.1.$use" > /dev/null; then
-				more_sleep=""
-			fi
-		fi
-		if [ "X$more_sleep" = "X1" ]; then
-			sleep 1
-		fi
-		host="$localhost"
-		port="$use"
-	fi
-	cipher_args=""
-	if [ "X$ciphers" != "X" ]; then
-		cipher_args=`echo "$ciphers" | sed -e 's/ciphers=/-cipher /'`
-	fi
-	if [ "X$have_uvnc_dsm_helper_showcert" = "X1" ]; then
-		:
-	elif type openssl > /dev/null 2>&1; then
-		:
-	else
-		echo ""
-		echo "********************************************************"
-		echo "** Problem finding the OpenSSL command 'openssl': **" 
-		echo ""
-		type openssl 2>&1
-		echo ""
-		echo "** Perhaps you need to install the 'openssl' package. **"
-		echo "********************************************************"
-		echo ""
-	fi
-	#echo "openssl s_client $cipher_args -connect $host:$port" 
-	if [ "X$reverse" = "X" ]; then
-		if type host > /dev/null 2>/dev/null; then
-			host $host >/dev/null 2>&1
-			host $host >/dev/null 2>&1
-		fi
-		timeout=15
-		if [ "X$SSVNC_FETCH_TIMEOUT" != "X" ]; then
-			timeout=$SSVNC_FETCH_TIMEOUT
-		fi
-		if [ "X$have_uvnc_dsm_helper_showcert" = "X1" ]; then
-			if type pkill >/dev/null 2>&1; then
-				(sleep $timeout; if kill -0 $$; then pkill -TERM -f "ultravnc_dsm_helper.*$host.*$port"; fi) >/dev/null 2>&1 &
-			fi
-			ultravnc_dsm_helper showcert $host:$port 2>&1
-		else
-			if type pkill >/dev/null 2>&1; then
-				(sleep $timeout; if kill -0 $$; then pkill -TERM -f "openssl.*s_client.*$host.*$port"; fi) >/dev/null 2>&1 &
-			fi
-			openssl s_client $cipher_args -prexit -connect $host:$port 2>&1 < /dev/null
-		fi
-		rc=$?
-	else
-		tcert=""
-		if [ "X$mycert" = "X" ]; then
-			tcert=`make_tcert`
-			cert_args="-cert $tcert -CAfile $tcert"
-		else
-			cert_args="-cert $mycert -CAfile $mycert"
-		fi
-		tmp_out=/tmp/showcert_out${RANDOM}.$$
-		tmp_out=`mytmp "$tmp_out"`
-		tmp_err=/tmp/showcert_err${RANDOM}.$$
-		tmp_err=`mytmp "$tmp_err"`
-
-		#echo "openssl s_server $cipher_args $cert_args -accept $port -verify 2 > $tmp_out 2> $tmp_err" 1>&2
-
-		# assume we have perl:
-		check_perl perl
-
-		perl -e "
-			\$p = open(O, \"|openssl s_server $cipher_args $cert_args -accept $port -verify 2 1>$tmp_out 2> $tmp_err\");
-			exit 1 unless \$p;
-			while (1) {
-				sleep 1;
-				if (!open(F, \"<$tmp_out\")) {
-					kill \$p;
-					exit 1;
-				}
-				while (<F>) {
-					if (/RFB 00/) {
-						fsleep(0.25);
-						print O \"RFB 000.000\\n\";
-						fsleep(1.00);
-						kill \$p;
-						fsleep(0.25);
-						exit 0;
-					}
-				}
-				close F;
-			}
-			sub fsleep {
-				select(undef, undef, undef, shift);
-			}
-		";
-
-		echo ""
-		cat $tmp_out
-		echo ""
-		echo "----2----"
-		cat $tmp_err
-		if grep BEGIN.CERTIFICATE $tmp_out >/dev/null; then
-			rc=0
-		else
-			rc=1
-		fi
-
-		rm -f $tmp_out $tmp_err
-	fi
-	if [ "X$SSVNC_PREDIGESTED_HANDSHAKE" != "X" ]; then
-		rm -f $SSVNC_PREDIGESTED_HANDSHAKE
-	fi
-	if [ "X$SSVNC_SHOWCERT_EXIT_0" = "X1" ]; then
-		exit 0
-	else
-		exit $rc
-	fi
-fi
-
-# handle direct connect case:
-#
-if [ "X$direct_connect" != "X" ]; then
-	if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then
-		SSVNC_NO_ENC_WARN=1
-		echo ""
-		echo "Using UltraVNC DSM Plugin key for encryption:"
-		echo ""
-		ustr=`echo "$SSVNC_ULTRA_DSM" | sed -e 's/pw=[^ ]*/pw=******/g'`
-		echo "  $ustr PORT HOST:PORT"
-		echo ""
-	elif [ "X$getport" = "X" ]; then
-		echo ""
-		echo "Running viewer for direct connection:"
-		if echo X"$@" | grep chatonly > /dev/null; then
-			:
-		else
-			echo ""
-			echo "** WARNING: THERE WILL BE NO SSL OR SSH ENCRYPTION **"
-			echo ""
-		fi
-	fi
-	x=""
-	if [ "X$SSVNC_NO_ENC_WARN" != "X" ]; then
-		if [ "X$getport" = "X" ]; then
-			sleep 1
-		fi
-	elif type printf > /dev/null 2>&1; then
-		printf  "Are you sure you want to continue? [y]/n "
-		read x
-	else
-		echo -n "Are you sure you want to continue? [y]/n "
-		read x
-	fi
-	if [ "X$x" = "Xn" ]; then
-		exit 1
-	fi
-	echo ""
-	if [ "X$ptmp" != "X" ]; then
-		if [ "X$reverse" = "X" ]; then
-			PPROXY_LISTEN=$use
-			export PPROXY_LISTEN
-		else
-			if [ "X$proxy" = "Xreverse_direct" ]; then
-				PPROXY_LISTEN="$STUNNEL_LISTEN:`expr 5500 + $disp`"
-				PPROXY_DEST="$localhost:$use"
-				PPROXY_PROXY="ipv6://$localhost:$use"	# not always ipv6..
-				export PPROXY_LISTEN PPROXY_DEST PPROXY_PROXY
-				pps=1
-			else
-				PPROXY_REVERSE="$localhost:$use"
-				export PPROXY_LISTEN
-				pps=3
-			fi
-			if [ "X$SSVNC_LISTEN_ONCE" != "X1" ]; then
-				PPROXY_LOOP_THYSELF=`mytmp "/tmp/pproxy_loop_thyself.${RANDOM}.$$"`
-				export PPROXY_LOOP_THYSELF
-				pps=2
-			fi
-			if [ "X$SSVNC_EXTRA_SLEEP" != "X" ]; then
-				pps=`expr $pps + $SSVNC_EXTRA_SLEEP`
-			fi
-			PPROXY_SLEEP=$pps; export PPROXY_SLEEP;
-			PPROXY_KILLPID=+1; export PPROXY_KILLPID;
-		fi
-
-		$ptmp &
-
-		if [ "X$reverse" = "X" ]; then
-			#sleep 2
-			#echo T sleep 1
-			sleep 1
-		fi
-		host="$localhost"
-		disp="$N"
-		port=`expr $disp + 5900`
-	fi
-	if [ "X$SSVNC_EXTRA_SLEEP" != "X" ]; then
-		echo "T sleep $SSVNC_EXTRA_SLEEP"
-		sleep $SSVNC_EXTRA_SLEEP
-	fi
-	if [ "X$SSVNC_EXTRA_COMMAND" != "X" ]; then
-		(sh -c "$SSVNC_EXTRA_COMMAND") &
-		echo "($SSVNC_EXTRA_COMMAND) &"; echo
-	fi
-	if [ "X$reverse" = "X" ]; then
-		hostdisp="$host:$disp"
-		if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then
-			if [ "X$SSVNC_USE_OURS" = "X1" ]; then
-				hostdisp="exec=$SSVNC_ULTRA_DSM 0 $host:$port"
-			else
-				pf=`findfree 5970`
-				cmd="$SSVNC_ULTRA_DSM -$pf $host:$port"
-				pf=`expr $pf - 5900`
-				hostdisp="$localhost:$pf"
-				ustr=`echo "$cmd" | sed -e 's/pw=[^ ]*/pw=******/g'`
-				echo "Running:"
-				echo
-				echo "$ustr &"
-				echo
-				$cmd &
-				dsm_pid=$!
-				sleep 2
-			fi
-		fi
-		hostdisp2=`echo "$hostdisp" | sed -e 's/pw=[^ ]*/pw=******/g'`
-		echo "$VNCVIEWERCMD" "$@" "$hostdisp2"
-		trap "final" 0 2 15
-		echo ""
-		$VNCVIEWERCMD "$@" "$hostdisp"
-		if [ $? != 0 ]; then
-			echo "vncviewer command failed: $?"
-			if [ "X$secondtry" = "X1" ]; then
-				sleep 2
-				$VNCVIEWERCMD "$@" "$hostdisp"
-			fi
-		fi
-	else
-		echo ""
-		echo "NOTE: Press Ctrl-C to terminate viewer LISTEN mode."
-		echo ""
-		trap "final" 0 2 15
-		if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then
-			if [ "X$SSVNC_LISTEN_ONCE" = "X1" ]; then
-				echo "NOTE: The ultravnc_dsm_helper only runs once.  So after the first LISTEN"
-				echo "      ends you must restart the Listening mode.  You may also need to"
-				echo "      Press Ctrl-C to stop the viewer and restart for another connection."
-				echo ""
-			fi
-			#SSVNC_LISTEN_ONCE=1; export SSVNC_LISTEN_ONCE
-			VNCVIEWER_LISTEN_LOCALHOST=1
-			export VNCVIEWER_LISTEN_LOCALHOST
-			dport=`expr 5500 + $disp`
-			cmd="$SSVNC_ULTRA_DSM $dport $localhost:$use"
-			ustr=`echo "$cmd" | sed -e 's/pw=[^ ]*/pw=******/g'`
-			echo "Running:"
-			echo
-			echo "$ustr &"
-			echo
-			if [ "X$SSVNC_LISTEN_ONCE" = "X1" ]; then
-				$cmd &
-				dsm_pid=$!
-			else
-				while [ 1 ]; do $cmd; sleep 1; done &
-				dsm_pid=$!
-			fi
-			sleep 2
-			disp=$use
-			if [ $disp -ge 5500 ]; then
-				disp=`expr $disp - 5500`
-			fi
-		fi
-		disp2=$disp
-		if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then
-			disp2=`echo "$disp2" | sed -e 's/://g'`
-			if [ $disp2 -le 200 ]; then
-				disp2=`expr $disp2 + 5500`
-			fi
-		fi
-		echo "$VNCVIEWERCMD" "$@" -listen $disp2
-		echo ""
-		$VNCVIEWERCMD "$@" -listen $disp2
-		if [ "X$PPROXY_LOOP_THYSELF" != "X" ]; then
-			rm -f $PPROXY_LOOP_THYSELF
-		fi
-	fi
-	exit $?
-fi
-
-tmp_cfg=/tmp/ss_vncviewer${RANDOM}.$$
-tmp_cfg=`mytmp "$tmp_cfg"`
-
-stunnel_exec=""
-if [ "X$SSVNC_USE_OURS" != "X1" ]; then
-	:
-elif echo $STUNNEL_EXTRA_SVC_OPTS | grep '#stunnel-exec' > /dev/null; then
-	stunnel_exec="#"
-fi
-
-if [ "X$reverse" = "X" ]; then
-
-	if echo "$proxy" | grep "^repeater://" > /dev/null; then
-		if [ "X$cert" = "XBUILTIN" ]; then
-			ttcert=`make_tcert`
-			cert="cert = $ttcert"
-		fi
-		# Note for listen mode, an empty cert will cause stunnel to fail.
-		# The ssvnc gui will have already taken care of this.
-	fi
-
-	cat > "$tmp_cfg" <<END
-foreground = yes
-pid =
-client = yes
-debug = $stunnel_debug
-$ciphers
-$STUNNEL_EXTRA_OPTS
-$STUNNEL_EXTRA_OPTS_USER
-$cert
-$crl
-$verify
-
-${stunnel_exec}[vnc_stunnel]
-${stunnel_exec}accept = $localhost:$use
-$connect
-$STUNNEL_EXTRA_SVC_OPTS
-$STUNNEL_EXTRA_SVC_OPTS_USER
-
-END
-
-else
-	# REVERSE case:
-
-	stunnel_exec=""	# doesn't work for listening.
-
-	p2=`expr 5500 + $N`
-	connect="connect = $localhost:$p2"
-	if [ "X$cert" = "XBUILTIN" ]; then
-		ttcert=`make_tcert`
-		cert="cert = $ttcert"
-	fi
-	# Note for listen mode, an empty cert will cause stunnel to fail.
-	# The ssvnc gui will have already taken care of this.
-
-
-	hloc=""
-	if [ "X$use_ssh" = "X1" ]; then
-		hloc="$localhost:"
-	elif [ "X$STUNNEL_LISTEN" != "X" ]; then
-		hloc="$STUNNEL_LISTEN:"
-	fi
-	if echo "$proxy" | grep -i '^vencrypt:' > /dev/null; then
-		hloc="$localhost:"
-		pv=`findfree 5570`
-		proxy="vencrypt:$pv:$port"
-		port=$pv
-		if [ "X$anondh_set" = "X1" ]; then
-			# not needed for ANONDH in this mode
-			#ciphers="ciphers = ADH:@STRENGTH"
-			:
-		fi
-	fi
-	cat > "$tmp_cfg" <<END
-foreground = yes
-pid =
-client = no
-debug = $stunnel_debug
-$ciphers
-$STUNNEL_EXTRA_OPTS
-$STUNNEL_EXTRA_OPTS_USER
-$cert
-$crl
-$verify
-
-[vnc_stunnel]
-accept = $hloc$port
-$connect
-$STUNNEL_EXTRA_SVC_OPTS
-$STUNNEL_EXTRA_SVC_OPTS_USER
-
-END
-
-fi
-
-echo ""
-echo "Using this stunnel configuration:"
-echo ""
-cat "$tmp_cfg" | uniq
-echo ""
-if egrep -i '^[ 	]*(CApath|CAfile) =' "$tmp_cfg" > /dev/null ; then
-	:
-else
-	echo "** WARNING: THE STUNNEL CONFIG HAS NO SERVER CERTIFICATE SPECIFIED       **"
-	echo "** WARNING: (the CApath or CAfile stunnel option) THE VNC SERVER WILL    **"
-	echo "** WARNING: NOT BE AUTHENTICATED. A MAN-IN-THE-MIDDLE ATTACK IS POSSIBLE **"
-	echo ""
-fi
-sleep 1
-
-if [ "X$stunnel_exec" = "X" ]; then
-	echo ""
-	echo "Running stunnel:"
-	echo "$STUNNEL $tmp_cfg"
-	st=`echo "$STUNNEL" | awk '{print $1}'`
-	$st -help > /dev/null 2>&1
-	$STUNNEL "$tmp_cfg" < /dev/tty > /dev/tty &
-	stunnel_pid=$!
-	echo ""
-
-	# pause here to let the user supply a possible passphrase for the
-	# mycert key:
-	if [ "X$mycert" != "X" ]; then
-		nsl=10
-		dsl=0
-		if [ ! -f $mycert ]; then
-			dsl=0
-		elif grep -i 'Proc-Type.*ENCRYPTED' "$mycert" > /dev/null 2>/dev/null; then
-			dsl=1
-		fi
-		if [ "X$dsl" = "X1" ]; then
-			echo ""
-			echo "(** pausing $nsl secs for possible certificate passphrase dialog **)"
-			echo ""
-			sleep $nsl
-			echo "(** done pausing for passphrase **)"
-			echo ""
-		fi
-	fi
-	#echo T sleep 1
-	sleep 1
-	rm -f "$tmp_cfg"
-fi
-
-
-echo ""
-if [ "X$SSVNC_EXTRA_SLEEP" != "X" ]; then
-	echo "sleep $SSVNC_EXTRA_SLEEP"
-	sleep $SSVNC_EXTRA_SLEEP
-fi
-if [ "X$SSVNC_EXTRA_COMMAND" != "X" ]; then
-	(sh -c "$SSVNC_EXTRA_COMMAND") &
-	echo "($SSVNC_EXTRA_COMMAND) &"; echo
-fi
-
-if [ "X$reverse" = "X" ]; then
-	if [ "X$NEED_VENCRYPT_VIEWER_BRIDGE" = "X1" -a "X$ptmp" != "X" ] ; then
-		port1=`expr 5900 + $N`		# stunnel port
-		port2=`findfree 5970`		# bridge port (viewer connects to it.)
-		N=`expr $port2 - 5900`
-		env PPROXY_REMOVE=0 PPROXY_SLEEP=0 PPROXY_VENCRYPT_VIEWER_BRIDGE="$port2,$port1" $ptmp &
-		sleep 1
-	fi
-	echo "Running viewer:"
-	vnc_hp=$localhost:$N
-	if [ "X$stunnel_exec" != "X" ]; then
-		vnc_hp="exec=$STUNNEL $tmp_cfg"
-	fi
-	echo "$VNCVIEWERCMD" "$@" "$vnc_hp"
-	trap "final" 0 2 15
-	echo ""
-	$VNCVIEWERCMD "$@" "$vnc_hp"
-	if [ $? != 0 ]; then
-		echo "vncviewer command failed: $?"
-		if [ "X$secondtry" = "X1" ]; then
-			sleep 2
-			$VNCVIEWERCMD "$@" "$vnc_hp"
-		fi
-	fi
-else
-	echo "Running viewer:"
-	echo ""
-	echo "NOTE: Press Ctrl-C to terminate viewer LISTEN mode."
-	echo ""
-	trap "final" 0 2 15
-	N2=$N
-	N2_trim=`echo "$N2" | sed -e 's/://g'`
-	if [ $N2_trim -le 200 ]; then
-		N2_trim=`expr $N2_trim + 5500`
-	fi
-	if [ "X$proxy" != "X" ]; then
-		if echo "$proxy" | grep -i '^vencrypt:' > /dev/null; then
-			pstunnel=`echo "$proxy" | awk -F: '{print $2}'`
-			plisten=`echo "$proxy" | awk -F: '{print $3}'`
-			IF=INADDR_ANY
-			if [ "X$STUNNEL_LISTEN" != "X" ]; then
-				IF=$STUNNEL_LISTEN
-			fi
-			PPROXY_VENCRYPT_REVERSE=1; export PPROXY_VENCRYPT_REVERSE
-			PPROXY_LISTEN="$IF:$plisten"; export PPROXY_LISTEN
-			PPROXY_PROXY="vencrypt://$localhost:$pstunnel"; export PPROXY_PROXY
-			PPROXY_DEST="$localhost:$pstunnel"; export PPROXY_DEST
-			STUNNEL_ONCE=1; export STUNNEL_ONCE
-			STUNNEL_MAX_CLIENTS=1; export STUNNEL_MAX_CLIENTS
-			if [ "X$NEED_VENCRYPT_VIEWER_BRIDGE" = "X1" -a "X$ptmp" != "X" ] ; then
-				port1=`expr 5500 + $N2`
-				port2=`findfree 5580`
-				N2=`expr $port2 - 5500`
-				N2_trim=`echo "$N2" | sed -e 's/://g'`
-				if [ $N2_trim -le 200 ]; then
-					N2_trim=`expr $N2_trim + 5500`
-				fi
-				if [ "X$SSVNC_LISTEN_ONCE" != "X1" ]; then
-					PPROXY_LOOP_THYSELF=`mytmp "/tmp/pproxy_loop_thyself1.${RANDOM}.$$"`
-					export PPROXY_LOOP_THYSELF
-					PPROXY_LOOP_THYSELF0=$PPROXY_LOOP_THYSELF
-				fi
-				env PPROXY_REMOVE=0 PPROXY_SLEEP=0 PPROXY_VENCRYPT_VIEWER_BRIDGE="-$port1,$port2" $ptmp &
-				sleep 1
-			fi
-		else
-			PPROXY_REVERSE="$localhost:$port"; export PPROXY_REVERSE
-			PPROXY_SLEEP=1; export PPROXY_SLEEP;
-		fi
-		PPROXY_KILLPID=+1; export PPROXY_KILLPID;
-		if [ "X$SSVNC_LISTEN_ONCE" != "X1" ]; then
-			PPROXY_LOOP_THYSELF=`mytmp "/tmp/pproxy_loop_thyself2.${RANDOM}.$$"`
-			export PPROXY_LOOP_THYSELF
-		fi
-		$ptmp &
-		# Important to have no extra pids generated between here and VNCVIEWERCMD
-	fi
-	if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then
-		N2=$N2_trim
-	fi
-	echo "$VNCVIEWERCMD" "$@" -listen $N2
-	echo ""
-	$VNCVIEWERCMD "$@" -listen $N2
-
-	if [ "X$PPROXY_LOOP_THYSELF" != "X" ]; then
-		rm -f $PPROXY_LOOP_THYSELF
-	fi
-	if [ "X$PPROXY_LOOP_THYSELF0" != "X" ]; then
-		rm -f $PPROXY_LOOP_THYSELF0
-	fi
-fi
-
-sleep 1

+ 0 - 28
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultra.vnc

@@ -1,28 +0,0 @@
-<!-- 
-     index.vnc - default HTML page for TightVNC Java viewer applet, to be
-     used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
-     Xvnc will substitute the following variables when preceded by a dollar:
-     USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
-     PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
-     HTML page.
-
-     NOTE: the $PARAMS variable is not supported by the standard VNC, so
-     make sure you have TightVNC on the server side, if you're using this
-     variable.
--->
-
-<HTML>
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-<APPLET CODE=VncViewer.class ARCHIVE=UltraViewerSSL.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name=PORT value=$PORT>
-<param name="Open New Window" value=yes>
-<param name="ignoreMSLogonCheck" value=yes>
-<param name="delayAuthPanel" value=yes>
-$PARAMS
-</APPLET>
-<BR>
-<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
-</HTML>

+ 0 - 28
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultraproxy.vnc

@@ -1,28 +0,0 @@
-<!-- 
-     index.vnc - default HTML page for TightVNC Java viewer applet, to be
-     used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
-     Xvnc will substitute the following variables when preceded by a dollar:
-     USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
-     PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
-     HTML page.
-
-     NOTE: the $PARAMS variable is not supported by the standard VNC, so
-     make sure you have TightVNC on the server side, if you're using this
-     variable.
--->
-
-<HTML>
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-<APPLET CODE=VncViewer.class ARCHIVE=SignedUltraViewerSSL.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name="Open New Window" value=yes>
-<param name="ignoreMSLogonCheck" value=yes>
-<param name="delayAuthPanel" value=yes>
-<param name=VNCSERVERPORT value=$PORT>
-$PARAMS
-</APPLET>
-<BR>
-<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
-</HTML>

+ 0 - 28
board/GfA/Display001/rootfs/var/GfA/WebVnc/java-applet/ssl/ultrasigned.vnc

@@ -1,28 +0,0 @@
-<!-- 
-     index.vnc - default HTML page for TightVNC Java viewer applet, to be
-     used with Xvnc. On any file ending in .vnc, the HTTP server embedded in
-     Xvnc will substitute the following variables when preceded by a dollar:
-     USER, DESKTOP, DISPLAY, APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT,
-     PARAMS. Use two dollar signs ($$) to get a dollar sign in the generated
-     HTML page.
-
-     NOTE: the $PARAMS variable is not supported by the standard VNC, so
-     make sure you have TightVNC on the server side, if you're using this
-     variable.
--->
-
-<HTML>
-<TITLE>
-$USER's $DESKTOP desktop ($DISPLAY)
-</TITLE>
-<APPLET CODE=VncViewer.class ARCHIVE=SignedUltraViewerSSL.jar
-        WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
-<param name=PORT value=$PORT>
-<param name="Open New Window" value=yes>
-<param name="ignoreMSLogonCheck" value=yes>
-<param name="delayAuthPanel" value=yes>
-$PARAMS
-</APPLET>
-<BR>
-<A href="http://www.karlrunge.com/x11vnc">x11vnc site</A>
-</HTML>

+ 0 - 35
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/LICENSE.txt

@@ -1,35 +0,0 @@
-noVNC is Copyright (C) 2011 Joel Martin <github@martintribe.org>
-
-Some portions of noVNC are copyright to their individual authors.
-Please refer to the individual source files and/or to the noVNC commit
-history: https://github.com/kanaka/noVNC/commits/master
-
-noVNC is licensed under the LGPL (GNU Lesser General Public License)
-version 3 with the following exceptions (all LGPL-3 compatible):
-
-    include/input.js           : LGPL-2 or any later version
-   
-    include/base64.js          : Dual GPL-2 or LGPL-2.1
-   
-    include/des.js             : Various BSD style licenses
-
-    include/jsunzip.js         : zlib/libpng license
-
-    include/web-socket-js/     : New BSD license. Source code at
-                                 http://github.com/gimite/web-socket-js
-
-    include/Orbitron*          : SIL Open Font License 1.1
-                                 (Copyright 2009 Matt McInerney)
-
-    images/                    : Creative Commons Attribution-ShareAlike
-                                 http://creativecommons.org/licenses/by-sa/3.0/
-
-The license texts are included at:
-    docs/LICENSE.LGPL-3 and
-    docs/LICENSE.GPL-3
-    docs/LICENSE.OFL-1.1
-
-Or alternatively the license texts may be found here:
-    http://www.gnu.org/licenses/lgpl.html and
-    http://www.gnu.org/licenses/gpl.html
-    http://scripts.sil.org/OFL

+ 0 - 102
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/README.md

@@ -1,102 +0,0 @@
-## noVNC: HTML5 VNC Client
-
-
-### Description
-
-noVNC is a HTML5 VNC client that runs well in any modern browser
-including mobile browsers (iPhone/iPad and Android).
-
-Notable commits, announcements and news are posted to
-@<a href="http://www.twitter.com/noVNC">noVNC</a>
-
-There are many companies/projects that have integrated noVNC into
-their products including: [Ganeti Web Manager](http://code.osuosl.org/projects/ganeti-webmgr), [Archipel](http://archipelproject.org), [openQRM](http://www.openqrm.com/), [OpenNode](http://www.opennodecloud.com/), [OpenStack](http://www.openstack.org), [Broadway (HTML5 GDK/GTK+ backend)](http://blogs.gnome.org/alexl/2011/03/15/gtk-html-backend-update/), [OpenNebula](http://opennebula.org/), [CloudSigma](http://www.cloudsigma.com/), [Zentyal (formerly eBox)](http://www.zentyal.org/), [SlapOS](http://www.slapos.org), [Intel MeshCentral](https://meshcentral.com), [Amahi](http://amahi.org), [Brightbox](http://brightbox.com/), [Foreman](http://theforeman.org) and [LibVNCServer](http://libvncserver.sourceforge.net). See [this wiki page](https://github.com/kanaka/noVNC/wiki/ProjectsCompanies-using-noVNC) for more info and links.
-
-
-### Features
-
-* Supports all modern browsers including mobile (iOS, Android)
-* Supported VNC encodings: raw, copyrect, rre, hextile, tight, tightPNG
-* WebSocket SSL/TLS encryption (i.e. "wss://") support
-* 24-bit true color and 8 bit colour mapped
-* Supports desktop resize notification/pseudo-encoding
-* Local or remote cursor
-* Clipboard copy/paste
-* Clipping or scolling modes for large remote screens
-* Easy site integration and theming (3 example themes included)
-* Licensed under the [LGPLv3](http://www.gnu.org/licenses/lgpl.html)
-
-### Screenshots
-
-Running in Chrome before and after connecting:
-
-<img src="http://kanaka.github.com/noVNC/img/noVNC-5.png" width=400>&nbsp;<img src="http://kanaka.github.com/noVNC/img/noVNC-7.jpg" width=400>
-
-See more screenshots <a href="http://kanaka.github.com/noVNC/screenshots.html">here</a>.
-
-
-### Browser Requirements
-
-* HTML5 Canvas (with createImageData): Chrome, Firefox 3.6+, iOS
-  Safari, Opera 11+, Internet Explorer 9+, etc.
-
-* HTML5 WebSockets: For browsers that do not have builtin
-  WebSockets support, the project includes
-  <a href="http://github.com/gimite/web-socket-js">web-socket-js</a>,
-  a WebSockets emulator using Adobe Flash. iOS 4.2+ has built-in
-  WebSocket support.
-
-* Fast Javascript Engine: this is not strictly a requirement, but
-  without a fast Javascript engine, noVNC might be painfully slow.
-
-* I maintain a more detailed browser compatibility list <a
-  href="https://github.com/kanaka/noVNC/wiki/Browser-support">here</a>.
-
-
-### Server Requirements
-
-Unless you are using a VNC server with support for WebSockets
-connections (such as [x11vnc/libvncserver](http://libvncserver.sourceforge.net/)),
-you need to use a WebSockets to TCP socket proxy. There is
-a python proxy included ('websockify').
-
-
-### Quick Start
-
-* Use the launch script to start a mini-webserver and the WebSockets
-  proxy (websockify). The `--vnc` option is used to specify the location of
-  a running VNC server:
-
-    `./utils/launch.sh --vnc localhost:5901`
-
-* Point your browser to the cut-and-paste URL that is output by the
-  launch script. Enter a password if the VNC server has one
-  configured. Hit the Connect button and enjoy!
-
-
-### Other Pages
-
-* [Advanced Usage](https://github.com/kanaka/noVNC/wiki/Advanced-usage). Generating an SSL
-  certificate, starting a VNC server, advanced websockify usage, etc.
-
-* [Integrating noVNC](https://github.com/kanaka/noVNC/wiki/Integration) into existing projects.
-
-* [Troubleshooting noVNC](https://github.com/kanaka/noVNC/wiki/Troubleshooting) problems.
-
-
-### Authors/Contributors
-
-* noVNC : Joel Martin (github.com/kanaka)
-    * New UI and Icons : Chris Gordon
-    * Original Logo : Michael Sersen
-    * tight encoding : Michael Tinglof (Mercuri.ca)
-
-* Included libraries:
-    * web-socket-js : Hiroshi Ichikawa (github.com/gimite/web-socket-js)
-    * as3crypto : Henri Torgemane (code.google.com/p/as3crypto)
-    * base64 : Martijn Pieters (Digital Creations 2), Samuel Sieb (sieb.net)
-    * jsunzip : Erik Moller (github.com/operasoftware/jsunzip),
-    * tinflate : Joergen Ibsen (ibsensoftware.com)
-    * DES : Dave Zimmerman (Widget Workshop), Jef Poskanzer (ACME Labs)
-
-

+ 56 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/error-handler.js

@@ -0,0 +1,56 @@
+// NB: this should *not* be included as a module until we have
+// native support in the browsers, so that our error handler
+// can catch script-loading errors.
+
+
+(function(){
+    "use strict";
+
+    // Fallback for all uncought errors
+    function handleError (event, err) {
+        try {
+            var msg = document.getElementById('noVNC_fallback_errormsg');
+
+            // Only show the initial error
+            if (msg.hasChildNodes()) {
+                return false;
+            }
+
+            var div = document.createElement("div");
+            div.classList.add('noVNC_message');
+            div.appendChild(document.createTextNode(event.message));
+            msg.appendChild(div);
+
+            if (event.filename) {
+                div = document.createElement("div");
+                div.className = 'noVNC_location';
+                var text = event.filename;
+                if (event.lineno !== undefined) {
+                    text += ":" + event.lineno;
+                    if (event.colno !== undefined) {
+                        text += ":" + event.colno;
+                    }
+                }
+                div.appendChild(document.createTextNode(text));
+                msg.appendChild(div);
+            }
+
+            if (err && (err.stack !== undefined)) {
+                div = document.createElement("div");
+                div.className = 'noVNC_stack';
+                div.appendChild(document.createTextNode(err.stack));
+                msg.appendChild(div);
+            }
+
+            document.getElementById('noVNC_fallback_error')
+                .classList.add("noVNC_open");
+        } catch (exc) {
+            document.write("noVNC encountered an error.");
+        }
+        // Don't return true since this would prevent the error
+        // from being printed to the browser console.
+        return false;
+    }
+    window.addEventListener('error', function (evt) { handleError(evt, evt.error); });
+    window.addEventListener('unhandledrejection', function (evt) { handleError(evt.reason, evt.reason); });
+})();

+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/alt.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="alt.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="18.205425"
+     inkscape:cy="17.531398"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text5290">
+      <path
+         d="m 9.9560547,1042.3329 -2.9394531,0 -0.4638672,1.3281 -1.8896485,0 2.7001953,-7.29 2.241211,0 2.7001958,7.29 -1.889649,0 -0.4589843,-1.3281 z m -2.4707031,-1.3526 1.9970703,0 -0.9960938,-2.9003 -1.0009765,2.9003 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5340" />
+      <path
+         d="m 13.188477,1036.0634 1.748046,0 0,7.5976 -1.748046,0 0,-7.5976 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5342" />
+      <path
+         d="m 18.535156,1036.6395 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151367,0.5176 0.151368,0.1318 0.600586,0.1318 l 0.898438,0 0,1.25 -1.499024,0 q -1.035156,0 -1.469726,-0.4297 -0.429688,-0.4345 -0.429688,-1.4697 l 0,-2.3193 -0.86914,0 0,-1.25 0.86914,0 0,-1.5528 1.748047,0 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5344" />
+    </g>
+  </g>
+</svg>

+ 106 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/clipboard.svg

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="clipboard.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="15.366606"
+     inkscape:cy="16.42981"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 9,6 6,6 C 5.4459889,6 5,6.4459889 5,7 l 0,13 c 0,0.554011 0.4459889,1 1,1 l 13,0 c 0.554011,0 1,-0.445989 1,-1 L 20,7 C 20,6.4459889 19.554011,6 19,6 l -3,0"
+       transform="translate(0,1027.3622)"
+       id="rect6083"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cssssssssc" />
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect6085"
+       width="7"
+       height="4"
+       x="9"
+       y="1031.3622"
+       ry="1.00002" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
+       d="m 8.5071212,1038.8622 7.9999998,0"
+       id="path6087"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
+       d="m 8.5071212,1041.8622 3.9999998,0"
+       id="path6089"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196081"
+       d="m 8.5071212,1044.8622 5.9999998,0"
+       id="path6091"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>

+ 96 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/connect.svg

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="connect.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="37.14834"
+     inkscape:cy="1.9525926"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <g
+       id="g5103"
+       transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-729.15757,315.8823)">
+      <path
+         sodipodi:nodetypes="cssssc"
+         inkscape:connector-curvature="0"
+         id="rect5096"
+         d="m 11,1040.3622 -5,0 c -1.108,0 -2,-0.892 -2,-2 l 0,-4 c 0,-1.108 0.892,-2 2,-2 l 5,0"
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <path
+         style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+         d="m 14,1032.3622 5,0 c 1.108,0 2,0.892 2,2 l 0,4 c 0,1.108 -0.892,2 -2,2 l -5,0"
+         id="path5099"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cssssc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path5101"
+         d="m 9,1036.3622 7,0"
+         style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>

+ 96 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrl.svg

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ctrl.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="18.205425"
+     inkscape:cy="17.531398"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text5290">
+      <path
+         d="m 9.1210938,1043.1898 q -0.5175782,0.2686 -1.0791016,0.4053 -0.5615235,0.1367 -1.171875,0.1367 -1.8212891,0 -2.8857422,-1.0156 -1.0644531,-1.0205 -1.0644531,-2.7637 0,-1.748 1.0644531,-2.7637 1.0644531,-1.0205 2.8857422,-1.0205 0.6103515,0 1.171875,0.1368 0.5615234,0.1367 1.0791016,0.4052 l 0,1.5088 q -0.522461,-0.3564 -1.0302735,-0.5224 -0.5078125,-0.1661 -1.0693359,-0.1661 -1.0058594,0 -1.5820313,0.6446 -0.5761719,0.6445 -0.5761719,1.7773 0,1.1279 0.5761719,1.7725 0.5761719,0.6445 1.5820313,0.6445 0.5615234,0 1.0693359,-0.166 0.5078125,-0.166 1.0302735,-0.5225 l 0,1.5088 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5370" />
+      <path
+         d="m 12.514648,1036.5687 0,1.5528 1.801758,0 0,1.25 -1.801758,0 0,2.3193 q 0,0.3809 0.151368,0.5176 0.151367,0.1318 0.600586,0.1318 l 0.898437,0 0,1.25 -1.499023,0 q -1.035157,0 -1.469727,-0.4297 -0.429687,-0.4345 -0.429687,-1.4697 l 0,-2.3193 -0.8691411,0 0,-1.25 0.8691411,0 0,-1.5528 1.748046,0 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5372" />
+      <path
+         d="m 19.453125,1039.6107 q -0.229492,-0.1074 -0.458984,-0.1562 -0.22461,-0.054 -0.454102,-0.054 -0.673828,0 -1.040039,0.4345 -0.361328,0.4297 -0.361328,1.2354 l 0,2.5195 -1.748047,0 0,-5.4687 1.748047,0 0,0.8984 q 0.336914,-0.5371 0.771484,-0.7813 0.439453,-0.249 1.049805,-0.249 0.08789,0 0.19043,0.01 0.102539,0 0.297851,0.029 l 0.0049,1.582 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5374" />
+      <path
+         d="m 20.332031,1035.9926 1.748047,0 0,7.5976 -1.748047,0 0,-7.5976 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5376" />
+    </g>
+  </g>
+</svg>

+ 100 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/ctrlaltdel.svg

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ctrlaltdel.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8"
+     inkscape:cx="11.135667"
+     inkscape:cy="16.407428"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5253"
+       width="5"
+       height="5.0000172"
+       x="16"
+       y="1031.3622"
+       ry="1.0000174" />
+    <rect
+       y="1043.3622"
+       x="4"
+       height="5.0000172"
+       width="5"
+       id="rect5255"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       ry="1.0000174" />
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5257"
+       width="5"
+       height="5.0000172"
+       x="13"
+       y="1043.3622"
+       ry="1.0000174" />
+  </g>
+</svg>

+ 94 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/disconnect.svg

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="disconnect.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="25.05707"
+     inkscape:cy="11.594858"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <g
+       id="g5171"
+       transform="translate(-24.062499,-6.15775e-4)">
+      <path
+         id="path5110"
+         transform="translate(0,1027.3622)"
+         d="m 39.744141,3.4960938 c -0.769923,0 -1.539607,0.2915468 -2.121094,0.8730468 l -2.566406,2.5664063 1.414062,1.4140625 2.566406,-2.5664063 c 0.403974,-0.404 1.010089,-0.404 1.414063,0 l 2.828125,2.828125 c 0.40398,0.4039 0.403907,1.0101621 0,1.4140629 l -2.566406,2.566406 1.414062,1.414062 2.566406,-2.566406 c 1.163041,-1.1629 1.162968,-3.0791874 0,-4.2421874 L 41.865234,4.3691406 C 41.283747,3.7876406 40.514063,3.4960937 39.744141,3.4960938 Z M 39.017578,9.015625 a 1.0001,1.0001 0 0 0 -0.6875,0.3027344 l -0.445312,0.4453125 1.414062,1.4140621 0.445313,-0.445312 A 1.0001,1.0001 0 0 0 39.017578,9.015625 Z m -6.363281,0.7070312 a 1.0001,1.0001 0 0 0 -0.6875,0.3027348 L 28.431641,13.5625 c -1.163042,1.163 -1.16297,3.079187 0,4.242188 l 2.828125,2.828124 c 1.162974,1.163101 3.079213,1.163101 4.242187,0 l 3.535156,-3.535156 a 1.0001,1.0001 0 1 0 -1.414062,-1.414062 l -3.535156,3.535156 c -0.403974,0.404 -1.010089,0.404 -1.414063,0 l -2.828125,-2.828125 c -0.403981,-0.404 -0.403908,-1.010162 0,-1.414063 l 3.535156,-3.537109 A 1.0001,1.0001 0 0 0 32.654297,9.7226562 Z m 3.109375,2.1621098 -2.382813,2.384765 a 1.0001,1.0001 0 1 0 1.414063,1.414063 l 2.382812,-2.384766 -1.414062,-1.414062 z"
+         style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+         inkscape:connector-curvature="0" />
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="752.29541"
+         x="-712.31262"
+         height="18.000017"
+         width="3"
+         id="rect5116"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>

Fișier diff suprimat deoarece este prea mare
+ 71 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/drag.svg


+ 81 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/error.svg

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="error.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="14.00357"
+     inkscape:cy="12.443398"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 7 3 C 4.7839905 3 3 4.7839905 3 7 L 3 18 C 3 20.21601 4.7839905 22 7 22 L 18 22 C 20.21601 22 22 20.21601 22 18 L 22 7 C 22 4.7839905 20.21601 3 18 3 L 7 3 z M 7.6992188 6 A 1.6916875 1.6924297 0 0 1 8.9121094 6.5117188 L 12.5 10.101562 L 16.087891 6.5117188 A 1.6916875 1.6924297 0 0 1 17.251953 6 A 1.6916875 1.6924297 0 0 1 18.480469 8.90625 L 14.892578 12.496094 L 18.480469 16.085938 A 1.6916875 1.6924297 0 1 1 16.087891 18.478516 L 12.5 14.888672 L 8.9121094 18.478516 A 1.6916875 1.6924297 0 1 1 6.5214844 16.085938 L 10.109375 12.496094 L 6.5214844 8.90625 A 1.6916875 1.6924297 0 0 1 7.6992188 6 z "
+       transform="translate(0,1027.3622)"
+       id="rect4135" />
+  </g>
+</svg>

+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/esc.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="esc.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="18.205425"
+     inkscape:cy="17.531398"
+     inkscape:document-units="px"
+     inkscape:current-layer="text5290"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:48px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text5290">
+      <path
+         d="m 3.9331055,1036.1464 5.0732422,0 0,1.4209 -3.1933594,0 0,1.3574 3.0029297,0 0,1.4209 -3.0029297,0 0,1.6699 3.3007812,0 0,1.4209 -5.180664,0 0,-7.29 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5314" />
+      <path
+         d="m 14.963379,1038.1385 0,1.3282 q -0.561524,-0.2344 -1.083984,-0.3516 -0.522461,-0.1172 -0.986329,-0.1172 -0.498046,0 -0.742187,0.127 -0.239258,0.122 -0.239258,0.3808 0,0.21 0.180664,0.3223 0.185547,0.1123 0.65918,0.166 l 0.307617,0.044 q 1.342773,0.1709 1.806641,0.5615 0.463867,0.3906 0.463867,1.2256 0,0.874 -0.644531,1.3134 -0.644532,0.4395 -1.923829,0.4395 -0.541992,0 -1.123046,-0.088 -0.576172,-0.083 -1.186524,-0.2539 l 0,-1.3281 q 0.522461,0.2539 1.069336,0.3808 0.551758,0.127 1.118164,0.127 0.512695,0 0.771485,-0.1416 0.258789,-0.1416 0.258789,-0.4199 0,-0.2344 -0.180664,-0.3467 -0.175782,-0.1172 -0.708008,-0.1807 l -0.307617,-0.039 q -1.166993,-0.1465 -1.635743,-0.542 -0.46875,-0.3955 -0.46875,-1.2012 0,-0.8691 0.595703,-1.2891 0.595704,-0.4199 1.826172,-0.4199 0.483399,0 1.015625,0.073 0.532227,0.073 1.157227,0.2294 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5316" />
+      <path
+         d="m 21.066895,1038.1385 0,1.4258 q -0.356446,-0.2441 -0.717774,-0.3613 -0.356445,-0.1172 -0.742187,-0.1172 -0.732422,0 -1.142579,0.4297 -0.405273,0.4248 -0.405273,1.1914 0,0.7666 0.405273,1.1963 0.410157,0.4248 1.142579,0.4248 0.410156,0 0.776367,-0.1221 0.371094,-0.122 0.683594,-0.3613 l 0,1.4307 q -0.410157,0.1513 -0.834961,0.2246 -0.419922,0.078 -0.844727,0.078 -1.479492,0 -2.314453,-0.7568 -0.834961,-0.7618 -0.834961,-2.1143 0,-1.3525 0.834961,-2.1094 0.834961,-0.7617 2.314453,-0.7617 0.429688,0 0.844727,0.078 0.419921,0.073 0.834961,0.2246 z"
+         style="font-size:10px;fill:#ffffff;fill-opacity:1"
+         id="path5318" />
+    </g>
+  </g>
+</svg>

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/expander.svg

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="9"
+   height="10"
+   viewBox="0 0 9 10"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="expander.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="9.8737281"
+     inkscape:cy="6.4583132"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:snap-object-midpoints="false"
+     inkscape:object-nodes="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1042.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="M 2.0800781,1042.3633 A 2.0002,2.0002 0 0 0 0,1044.3613 l 0,6 a 2.0002,2.0002 0 0 0 3.0292969,1.7168 l 5,-3 a 2.0002,2.0002 0 0 0 0,-3.4316 l -5,-3 a 2.0002,2.0002 0 0 0 -0.9492188,-0.2832 z"
+       id="path4138"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>

+ 93 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/fullscreen.svg

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="fullscreen.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="16.400723"
+     inkscape:cy="15.083758"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect5006"
+       width="17"
+       height="17.000017"
+       x="4"
+       y="1031.3622"
+       ry="3.0000174" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+       d="m 7.5,1044.8622 4,0 -1.5,-1.5 1.5,-1.5 -1,-1 -1.5,1.5 -1.5,-1.5 0,4 z"
+       id="path5017"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path5025"
+       d="m 17.5,1034.8622 -4,0 1.5,1.5 -1.5,1.5 1,1 1.5,-1.5 1.5,1.5 0,-4 z"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  </g>
+</svg>

+ 82 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle.svg

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="5"
+   height="6"
+   viewBox="0 0 5 6"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="handle.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="32"
+     inkscape:cx="1.3551778"
+     inkscape:cy="8.7800329"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1046.3622)">
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 4.0000803,1049.3622 -3,-2 0,4 z"
+       id="path4247"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>

+ 172 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/handle_bg.svg

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="15"
+   height="50"
+   viewBox="0 0 15 50"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="handle_bg.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="-10.001409"
+     inkscape:cy="24.512566"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1002.3622)">
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4249"
+       width="1"
+       height="1.0000174"
+       x="9.5"
+       y="1008.8622"
+       ry="1.7382812e-05" />
+    <rect
+       ry="1.7382812e-05"
+       y="1013.8622"
+       x="9.5"
+       height="1.0000174"
+       width="1"
+       id="rect4255"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       ry="1.7382812e-05"
+       y="1008.8622"
+       x="4.5"
+       height="1.0000174"
+       width="1"
+       id="rect4261"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4263"
+       width="1"
+       height="1.0000174"
+       x="4.5"
+       y="1013.8622"
+       ry="1.7382812e-05" />
+    <rect
+       ry="1.7382812e-05"
+       y="1039.8622"
+       x="9.5"
+       height="1.0000174"
+       width="1"
+       id="rect4265"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4267"
+       width="1"
+       height="1.0000174"
+       x="9.5"
+       y="1044.8622"
+       ry="1.7382812e-05" />
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4269"
+       width="1"
+       height="1.0000174"
+       x="4.5"
+       y="1039.8622"
+       ry="1.7382812e-05" />
+    <rect
+       ry="1.7382812e-05"
+       y="1044.8622"
+       x="4.5"
+       height="1.0000174"
+       width="1"
+       id="rect4271"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4273"
+       width="1"
+       height="1.0000174"
+       x="9.5"
+       y="1018.8622"
+       ry="1.7382812e-05" />
+    <rect
+       ry="1.7382812e-05"
+       y="1018.8622"
+       x="4.5"
+       height="1.0000174"
+       width="1"
+       id="rect4275"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    <rect
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4277"
+       width="1"
+       height="1.0000174"
+       x="9.5"
+       y="1034.8622"
+       ry="1.7382812e-05" />
+    <rect
+       ry="1.7382812e-05"
+       y="1034.8622"
+       x="4.5"
+       height="1.0000174"
+       width="1"
+       id="rect4279"
+       style="opacity:0.25;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+  </g>
+</svg>

+ 42 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/Makefile

@@ -0,0 +1,42 @@
+ICONS := \
+	novnc-16x16.png \
+	novnc-24x24.png \
+	novnc-32x32.png \
+	novnc-48x48.png \
+	novnc-64x64.png
+
+ANDROID_LAUNCHER := \
+	novnc-48x48.png \
+	novnc-72x72.png \
+	novnc-96x96.png \
+	novnc-144x144.png \
+	novnc-192x192.png
+
+IPHONE_LAUNCHER := \
+	novnc-60x60.png \
+	novnc-120x120.png
+
+IPAD_LAUNCHER := \
+	novnc-76x76.png \
+	novnc-152x152.png
+
+ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER)
+
+all: $(ALL_ICONS)
+
+novnc-16x16.png: novnc-icon-sm.svg
+	convert -density 90 \
+		-background transparent "$<" "$@"
+novnc-24x24.png: novnc-icon-sm.svg
+	convert -density 135 \
+		-background transparent "$<" "$@"
+novnc-32x32.png: novnc-icon-sm.svg
+	convert -density 180 \
+		-background transparent "$<" "$@"
+
+novnc-%.png: novnc-icon.svg
+	convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \
+		-background transparent "$<" "$@"
+
+clean:
+	rm -f *.png

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-120x120.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-144x144.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-152x152.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-16x16.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-192x192.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-24x24.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-32x32.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-48x48.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-60x60.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-64x64.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-72x72.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-76x76.png


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-96x96.png


+ 163 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon-sm.svg

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   viewBox="0 0 16 16"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="novnc-icon-sm.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="9.722703"
+     inkscape:cy="5.5311896"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4169" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3621)">
+    <rect
+       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4167"
+       width="16"
+       height="15.999992"
+       x="0"
+       y="1036.3622"
+       ry="2.6666584" />
+    <path
+       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 2.6666667,1036.3621 C 1.1893373,1036.3621 0,1037.5515 0,1039.0288 l 0,10.6666 c 0,1.4774 1.1893373,2.6667 2.6666667,2.6667 l 4,0 C 11.837333,1052.3621 16,1046.7128 16,1039.6955 l 0,-0.6667 c 0,-1.4773 -1.189337,-2.6667 -2.666667,-2.6667 l -10.6666663,0 z"
+       id="rect4173"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g4381">
+      <g
+         transform="translate(0.25,0.25)"
+         style="fill:#000000;fill-opacity:1"
+         id="g4365">
+        <g
+           style="fill:#000000;fill-opacity:1"
+           id="g4367">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4369"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 C 2.011349,1040.3621 2,1040.3741 2,1040.3981 l 0,2.964 -1,0 0,-4 z"
+             sodipodi:nodetypes="scsccsssscccs" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4371"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
+             sodipodi:nodetypes="sscsscsscsscssssssssss" />
+        </g>
+        <g
+           style="fill:#000000;fill-opacity:1"
+           id="g4373">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4375"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
+             sodipodi:nodetypes="cccccccc" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4377"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
+             sodipodi:nodetypes="ccccccccccc" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4379"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
+             sodipodi:nodetypes="cssssccscsscscc" />
+        </g>
+      </g>
+      <g
+         id="g4356">
+        <g
+           id="g4347">
+          <path
+             sodipodi:nodetypes="scsccsssscccs"
+             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 c -0.022689,0 -0.034038,0.012 -0.034038,0.036 l 0,2.964 -1,0 0,-4 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4143"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="sscsscsscsscssssssssss"
+             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4145"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g4351">
+          <path
+             sodipodi:nodetypes="cccccccc"
+             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4147"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="ccccccccccc"
+             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4149"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="cssssccscsscscc"
+             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4151"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>

+ 163 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/icons/novnc-icon.svg

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 48 48.000001"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="novnc-icon.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="27.187245"
+     inkscape:cy="17.700974"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4169" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1004.3621)">
+    <rect
+       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4167"
+       width="48"
+       height="48"
+       x="0"
+       y="1004.3621"
+       ry="7.9999785" />
+    <path
+       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 8,1004.3621 c -4.4319881,0 -8,3.568 -8,8 l 0,32 c 0,4.432 3.5680119,8 8,8 l 12,0 c 15.512,0 28,-16.948 28,-38 l 0,-2 c 0,-4.432 -3.568012,-8 -8,-8 l -32,0 z"
+       id="rect4173"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g4300"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       transform="translate(0.5,0.5)">
+      <g
+         id="g4302"
+         style="fill:#000000;fill-opacity:1;stroke:none">
+        <path
+           sodipodi:nodetypes="scsccsssscccs"
+           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4304"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="sscsscsscsscssssssssss"
+           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4306"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4308"
+         style="fill:#000000;fill-opacity:1;stroke:none">
+        <path
+           sodipodi:nodetypes="cccccccc"
+           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4310"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="ccccccccccc"
+           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4312"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="cssssccscsscscc"
+           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4314"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g4291"
+       style="stroke:none">
+      <g
+         id="g4282"
+         style="stroke:none">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4143"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
+           sodipodi:nodetypes="scsccsssscccs" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4145"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
+           sodipodi:nodetypes="sscsscsscsscssssssssss" />
+      </g>
+      <g
+         id="g4286"
+         style="stroke:none">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4147"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
+           sodipodi:nodetypes="cccccccc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4149"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
+           sodipodi:nodetypes="ccccccccccc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4151"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
+           sodipodi:nodetypes="cssssccscsscscc" />
+      </g>
+    </g>
+  </g>
+</svg>

+ 81 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/info.svg

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="info.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="15.720838"
+     inkscape:cy="8.9111233"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 12.5 3 A 9.5 9.4999914 0 0 0 3 12.5 A 9.5 9.4999914 0 0 0 12.5 22 A 9.5 9.4999914 0 0 0 22 12.5 A 9.5 9.4999914 0 0 0 12.5 3 z M 12.5 5 A 1.5 1.5000087 0 0 1 14 6.5 A 1.5 1.5000087 0 0 1 12.5 8 A 1.5 1.5000087 0 0 1 11 6.5 A 1.5 1.5000087 0 0 1 12.5 5 z M 10.521484 8.9785156 L 12.521484 8.9785156 A 1.50015 1.50015 0 0 1 14.021484 10.478516 L 14.021484 15.972656 A 1.50015 1.50015 0 0 1 14.498047 18.894531 C 14.498047 18.894531 13.74301 19.228309 12.789062 18.912109 C 12.312092 18.754109 11.776235 18.366625 11.458984 17.828125 C 11.141734 17.289525 11.021484 16.668469 11.021484 15.980469 L 11.021484 11.980469 L 10.521484 11.980469 A 1.50015 1.50015 0 1 1 10.521484 8.9804688 L 10.521484 8.9785156 z "
+       transform="translate(0,1027.3622)"
+       id="path4136" />
+  </g>
+</svg>

Fișier diff suprimat deoarece este prea mare
+ 75 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/keyboard.svg


+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_left.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="mouse_left.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="15.551515"
+     inkscape:cy="12.205592"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
+       id="path6219" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
+       id="path6217" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
+       id="path6215" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
+       id="rect6178" />
+  </g>
+</svg>

+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_middle.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="mouse_middle.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="15.551515"
+     inkscape:cy="12.205592"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
+       id="path6219" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
+       id="path6217" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
+       id="path6215" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
+       id="rect6178" />
+  </g>
+</svg>

+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_none.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="mouse_none.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="23.160825"
+     inkscape:cy="13.208262"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
+       id="path6219" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
+       id="path6217" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
+       id="path6215" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
+       id="rect6178" />
+  </g>
+</svg>

+ 92 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/mouse_right.svg

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="mouse_right.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="15.551515"
+     inkscape:cy="12.205592"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 8,1030.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,2 5,0 0,-2 c 0,-1.4738 1.090393,-2.7071 2.5,-2.9492 l 0,-1.0508 -3.5,0 z"
+       id="path6219" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#0068f6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 13.5,1030.3622 0,1.0508 c 1.409607,0.2421 2.5,1.4754 2.5,2.9492 l 0,2 5,0 0,-2 c 0,-2.1987 -1.801288,-4 -4,-4 l -3.5,0 z"
+       id="path6217" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 12,1033.3622 c -0.571311,0 -1,0.4287 -1,1 l 0,5 c 0,0.5713 0.428689,1 1,1 l 1,0 c 0.571311,0 1,-0.4287 1,-1 l 0,-5 c 0,-0.5713 -0.428689,-1 -1,-1 l -1,0 z"
+       id="path6215" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 4,1038.3622 0,3.5 c 0,4.1377 3.362302,7.5 7.5,7.5 l 2,0 c 4.137698,0 7.5,-3.3623 7.5,-7.5 l 0,-3.5 -5,0 0,1 c 0,1.6447 -1.355293,3 -3,3 l -1,0 c -1.644707,0 -3,-1.3553 -3,-3 l 0,-1 -5,0 z"
+       id="rect6178" />
+  </g>
+</svg>

+ 87 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/power.svg

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="power.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="9.3159849"
+     inkscape:cy="13.436208"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="M 9 6.8183594 C 6.3418164 8.1213032 4.5 10.849161 4.5 14 C 4.5 18.4065 8.0935666 22 12.5 22 C 16.906433 22 20.5 18.4065 20.5 14 C 20.5 10.849161 18.658184 8.1213032 16 6.8183594 L 16 9.125 C 17.514327 10.211757 18.5 11.984508 18.5 14 C 18.5 17.3256 15.825553 20 12.5 20 C 9.1744469 20 6.5 17.3256 6.5 14 C 6.5 11.984508 7.4856727 10.211757 9 9.125 L 9 6.8183594 z "
+       transform="translate(0,1027.3622)"
+       id="path6140" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 12.5,1031.8836 0,6.4786"
+       id="path6142"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>

+ 76 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/settings.svg

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="settings.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="22.627417"
+     inkscape:cx="14.69683"
+     inkscape:cy="8.8039511"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 11 3 L 11 5.1601562 A 7.5 7.5 0 0 0 8.3671875 6.2460938 L 6.84375 4.7226562 L 4.7226562 6.84375 L 6.2480469 8.3691406 A 7.5 7.5 0 0 0 5.1523438 11 L 3 11 L 3 14 L 5.1601562 14 A 7.5 7.5 0 0 0 6.2460938 16.632812 L 4.7226562 18.15625 L 6.84375 20.277344 L 8.3691406 18.751953 A 7.5 7.5 0 0 0 11 19.847656 L 11 22 L 14 22 L 14 19.839844 A 7.5 7.5 0 0 0 16.632812 18.753906 L 18.15625 20.277344 L 20.277344 18.15625 L 18.751953 16.630859 A 7.5 7.5 0 0 0 19.847656 14 L 22 14 L 22 11 L 19.839844 11 A 7.5 7.5 0 0 0 18.753906 8.3671875 L 20.277344 6.84375 L 18.15625 4.7226562 L 16.630859 6.2480469 A 7.5 7.5 0 0 0 14 5.1523438 L 14 3 L 11 3 z M 12.5 10 A 2.5 2.5 0 0 1 15 12.5 A 2.5 2.5 0 0 1 12.5 15 A 2.5 2.5 0 0 1 10 12.5 A 2.5 2.5 0 0 1 12.5 10 z "
+       transform="translate(0,1027.3622)"
+       id="rect4967" />
+  </g>
+</svg>

+ 86 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/tab.svg

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="tab.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="11.67335"
+     inkscape:cy="17.881696"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 3,1031.3622 0,8 2,0 0,-4 0,-4 -2,0 z m 2,4 4,4 0,-3 13,0 0,-2 -13,0 0,-3 -4,4 z"
+       id="rect5194"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path5211"
+       d="m 22,1048.3622 0,-8 -2,0 0,4 0,4 2,0 z m -2,-4 -4,-4 0,3 -13,0 0,2 13,0 0,3 4,-4 z"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>

+ 90 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/toggleextrakeys.svg

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="extrakeys.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="15.234555"
+     inkscape:cy="9.9710826"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 8,1031.3622 c -2.1987124,0 -4,1.8013 -4,4 l 0,8.9996 c 0,2.1987 1.8012876,4 4,4 l 9,0 c 2.198712,0 4,-1.8013 4,-4 l 0,-8.9996 c 0,-2.1987 -1.801288,-4 -4,-4 z m 0,2 9,0 c 1.125307,0 2,0.8747 2,2 l 0,7.0005 c 0,1.1253 -0.874693,2 -2,2 l -9,0 c -1.1253069,0 -2,-0.8747 -2,-2 l 0,-7.0005 c 0,-1.1253 0.8746931,-2 2,-2 z"
+       id="rect5006"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssssssssssssssssss" />
+    <g
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text4167"
+       transform="matrix(0.96021948,0,0,0.96021948,0.18921715,41.80659)">
+      <path
+         d="m 14.292969,1040.6791 -2.939453,0 -0.463868,1.3281 -1.889648,0 2.700195,-7.29 2.241211,0 2.700196,7.29 -1.889649,0 -0.458984,-1.3281 z m -2.470703,-1.3526 1.99707,0 -0.996094,-2.9004 -1.000976,2.9004 z"
+         id="path4172"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>

+ 81 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/images/warning.svg

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   viewBox="0 0 25 25"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="warning.svg"
+   inkscape:export-filename="/home/ossman/devel/noVNC/images/drag.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#959595"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="16.457343"
+     inkscape:cy="12.179552"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:object-paths="true"
+     showguides="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:object-nodes="true"
+     inkscape:snap-intersection-paths="true"
+     inkscape:snap-nodes="true"
+     inkscape:snap-global="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1027.3622)">
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="M 12.513672 3.0019531 C 11.751609 2.9919531 11.052563 3.4242687 10.710938 4.1054688 L 3.2109375 19.105469 C 2.5461937 20.435369 3.5132277 21.9999 5 22 L 20 22 C 21.486772 21.9999 22.453806 20.435369 21.789062 19.105469 L 14.289062 4.1054688 C 13.951849 3.4330688 13.265888 3.0066531 12.513672 3.0019531 z M 12.478516 6.9804688 A 1.50015 1.50015 0 0 1 14 8.5 L 14 14.5 A 1.50015 1.50015 0 1 1 11 14.5 L 11 8.5 A 1.50015 1.50015 0 0 1 12.478516 6.9804688 z M 12.5 17 A 1.5 1.5 0 0 1 14 18.5 A 1.5 1.5 0 0 1 12.5 20 A 1.5 1.5 0 0 1 11 18.5 A 1.5 1.5 0 0 1 12.5 17 z "
+       transform="translate(0,1027.3622)"
+       id="path4208" />
+  </g>
+</svg>

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/de.json

@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Verbinden...",
+    "Disconnecting...": "Verbindung trennen...",
+    "Reconnecting...": "Verbindung wiederherstellen...",
+    "Internal error": "Interner Fehler",
+    "Must set host": "Richten Sie den Server ein",
+    "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
+    "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
+    "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt",
+    "Disconnected": "Verbindung zum Server getrennt",
+    "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ",
+    "New connection has been rejected": "Verbindung wurde abgelehnt",
+    "Password is required": "Passwort ist erforderlich",
+    "noVNC encountered an error:": "Ein Fehler ist aufgetreten:",
+    "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen",
+    "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen",
+    "viewport drag": "Ansichtsfenster ziehen",
+    "Active Mouse Button": "Aktive Maustaste",
+    "No mousebutton": "Keine Maustaste",
+    "Left mousebutton": "Linke Maustaste",
+    "Middle mousebutton": "Mittlere Maustaste",
+    "Right mousebutton": "Rechte Maustaste",
+    "Keyboard": "Tastatur",
+    "Show Keyboard": "Tastatur anzeigen",
+    "Extra keys": "Zusatztasten",
+    "Show Extra Keys": "Zusatztasten anzeigen",
+    "Ctrl": "Strg",
+    "Toggle Ctrl": "Strg umschalten",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt umschalten",
+    "Send Tab": "Tab senden",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Escape senden",
+    "Ctrl+Alt+Del": "Strg+Alt+Entf",
+    "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden",
+    "Shutdown/Reboot": "Herunterfahren/Neustarten",
+    "Shutdown/Reboot...": "Herunterfahren/Neustarten...",
+    "Power": "Energie",
+    "Shutdown": "Herunterfahren",
+    "Reboot": "Neustarten",
+    "Reset": "Zurücksetzen",
+    "Clipboard": "Zwischenablage",
+    "Clear": "Löschen",
+    "Fullscreen": "Vollbild",
+    "Settings": "Einstellungen",
+    "Shared Mode": "Geteilter Modus",
+    "View Only": "Nur betrachten",
+    "Clip to Window": "Auf Fenster begrenzen",
+    "Scaling Mode:": "Skalierungsmodus:",
+    "None": "Keiner",
+    "Local Scaling": "Lokales skalieren",
+    "Remote Resizing": "Serverseitiges skalieren",
+    "Advanced": "Erweitert",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Verschlüsselt",
+    "Host:": "Server:",
+    "Port:": "Port:",
+    "Path:": "Pfad:",
+    "Automatic Reconnect": "Automatisch wiederverbinden",
+    "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):",
+    "Logging:": "Protokollierung:",
+    "Disconnect": "Verbindung trennen",
+    "Connect": "Verbinden",
+    "Password:": "Passwort:",
+    "Cancel": "Abbrechen",
+    "Canvas not supported.": "Canvas nicht unterstützt."
+}

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/el.json

@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Συνδέεται...",
+    "Disconnecting...": "Aποσυνδέεται...",
+    "Reconnecting...": "Επανασυνδέεται...",
+    "Internal error": "Εσωτερικό σφάλμα",
+    "Must set host": "Πρέπει να οριστεί ο διακομιστής",
+    "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
+    "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
+    "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε",
+    "Disconnected": "Αποσυνδέθηκε",
+    "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ",
+    "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ",
+    "Password is required": "Απαιτείται ο κωδικός πρόσβασης",
+    "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:",
+    "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
+    "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
+    "viewport drag": "σύρσιμο θεατού πεδίου",
+    "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού",
+    "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού",
+    "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού",
+    "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού",
+    "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού",
+    "Keyboard": "Πληκτρολόγιο",
+    "Show Keyboard": "Εμφάνιση Πληκτρολογίου",
+    "Extra keys": "Επιπλέον πλήκτρα",
+    "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Εναλλαγή Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Εναλλαγή Alt",
+    "Send Tab": "Αποστολή Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Αποστολή Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση",
+    "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...",
+    "Power": "Απενεργοποίηση",
+    "Shutdown": "Κλείσιμο",
+    "Reboot": "Επανεκκίνηση",
+    "Reset": "Επαναφορά",
+    "Clipboard": "Πρόχειρο",
+    "Clear": "Καθάρισμα",
+    "Fullscreen": "Πλήρης Οθόνη",
+    "Settings": "Ρυθμίσεις",
+    "Shared Mode": "Κοινόχρηστη Λειτουργία",
+    "View Only": "Μόνο Θέαση",
+    "Clip to Window": "Αποκοπή στο όριο του Παράθυρου",
+    "Scaling Mode:": "Λειτουργία Κλιμάκωσης:",
+    "None": "Καμία",
+    "Local Scaling": "Τοπική Κλιμάκωση",
+    "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους",
+    "Advanced": "Για προχωρημένους",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Κρυπτογράφηση",
+    "Host:": "Όνομα διακομιστή:",
+    "Port:": "Πόρτα διακομιστή:",
+    "Path:": "Διαδρομή:",
+    "Automatic Reconnect": "Αυτόματη επανασύνδεση",
+    "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):",
+    "Logging:": "Καταγραφή:",
+    "Disconnect": "Αποσύνδεση",
+    "Connect": "Σύνδεση",
+    "Password:": "Κωδικός Πρόσβασης:",
+    "Cancel": "Ακύρωση",
+    "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas"
+}

+ 68 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/es.json

@@ -0,0 +1,68 @@
+{
+    "Connecting...": "Conectando...",
+    "Connected (encrypted) to ": "Conectado (con encriptación) a",
+    "Connected (unencrypted) to ": "Conectado (sin encriptación) a",
+    "Disconnecting...": "Desconectando...",
+    "Disconnected": "Desconectado",
+    "Must set host": "Debes configurar el host",
+    "Reconnecting...": "Reconectando...",
+    "Password is required": "Contraseña es obligatoria",
+    "Disconnect timeout": "Tiempo de desconexión agotado",
+    "noVNC encountered an error:": "noVNC ha encontrado un error:",
+    "Hide/Show the control bar": "Ocultar/Mostrar la barra de control",
+    "Move/Drag Viewport": "Mover/Arrastrar la ventana",
+    "viewport drag": "Arrastrar la ventana",
+    "Active Mouse Button": "Botón activo del ratón",
+    "No mousebutton": "Ningún botón del ratón",
+    "Left mousebutton": "Botón izquierdo del ratón",
+    "Middle mousebutton": "Botón central del ratón",
+    "Right mousebutton": "Botón derecho del ratón",
+    "Keyboard": "Teclado",
+    "Show Keyboard": "Mostrar teclado",
+    "Extra keys": "Teclas adicionales",
+    "Show Extra Keys": "Mostrar Teclas Adicionales",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Pulsar/Soltar Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Pulsar/Soltar Alt",
+    "Send Tab": "Enviar Tabulación",
+    "Tab": "Tabulación",
+    "Esc": "Esc",
+    "Send Escape": "Enviar Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del",
+    "Shutdown/Reboot": "Apagar/Reiniciar",
+    "Shutdown/Reboot...": "Apagar/Reiniciar...",
+    "Power": "Encender",
+    "Shutdown": "Apagar",
+    "Reboot": "Reiniciar",
+    "Reset": "Restablecer",
+    "Clipboard": "Portapapeles",
+    "Clear": "Vaciar",
+    "Fullscreen": "Pantalla Completa",
+    "Settings": "Configuraciones",
+    "Shared Mode": "Modo Compartido",
+    "View Only": "Solo visualización",
+    "Clip to Window": "Recortar al tamaño de la ventana",
+    "Scaling Mode:": "Modo de escalado:",
+    "None": "Ninguno",
+    "Local Scaling": "Escalado Local",
+    "Local Downscaling": "Reducción de escala local",
+    "Remote Resizing": "Cambio de tamaño remoto",
+    "Advanced": "Avanzado",
+    "Local Cursor": "Cursor Local",
+    "Repeater ID:": "ID del Repetidor",
+    "WebSocket": "WebSocket",
+    "Encrypt": "",
+    "Host:": "Host",
+    "Port:": "Puesto",
+    "Path:": "Ruta",
+    "Automatic Reconnect": "Reconexión automática",
+    "Reconnect Delay (ms):": "Retraso en la reconexión (ms)",
+    "Logging:": "Logging",
+    "Disconnect": "Desconectar",
+    "Connect": "Conectar",
+    "Password:": "Contraseña",
+    "Cancel": "Cancelar",
+    "Canvas not supported.": "Canvas no está soportado"
+}

+ 68 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/nl.json

@@ -0,0 +1,68 @@
+{
+    "Connecting...": "Verbinden...",
+    "Connected (encrypted) to ": "Verbonden (versleuteld) met ",
+    "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
+    "Disconnecting...": "Verbinding verbreken...",
+    "Disconnected": "Verbinding verbroken",
+    "Must set host": "Host moeten worden ingesteld",
+    "Reconnecting...": "Opnieuw verbinding maken...",
+    "Password is required": "Wachtwoord is vereist",
+    "Disconnect timeout": "Timeout tijdens verbreken van verbinding",
+    "noVNC encountered an error:": "noVNC heeft een fout bemerkt:",
+    "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk",
+    "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster",
+    "viewport drag": "kijkvenster slepen",
+    "Active Mouse Button": "Actieve Muisknop",
+    "No mousebutton": "Geen muisknop",
+    "Left mousebutton": "Linker muisknop",
+    "Middle mousebutton": "Middelste muisknop",
+    "Right mousebutton": "Rechter muisknop",
+    "Keyboard": "Toetsenbord",
+    "Show Keyboard": "Toon Toetsenbord",
+    "Extra keys": "Extra toetsen",
+    "Show Extra Keys": "Toon Extra Toetsen",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl aan/uitzetten",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt aan/uitzetten",
+    "Send Tab": "Tab Sturen",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Escape Sturen",
+    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
+    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen",
+    "Shutdown/Reboot": "Uitschakelen/Herstarten",
+    "Shutdown/Reboot...": "Uitschakelen/Herstarten...",
+    "Power": "Systeem",
+    "Shutdown": "Uitschakelen",
+    "Reboot": "Herstarten",
+    "Reset": "Resetten",
+    "Clipboard": "Klembord",
+    "Clear": "Wissen",
+    "Fullscreen": "Volledig Scherm",
+    "Settings": "Instellingen",
+    "Shared Mode": "Gedeelde Modus",
+    "View Only": "Alleen Kijken",
+    "Clip to Window": "Randen buiten venster afsnijden",
+    "Scaling Mode:": "Schaalmodus:",
+    "None": "Geen",
+    "Local Scaling": "Lokaal Schalen",
+    "Local Downscaling": "Lokaal Neerschalen",
+    "Remote Resizing": "Op Afstand Formaat Wijzigen",
+    "Advanced": "Geavanceerd",
+    "Local Cursor": "Lokale Cursor",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Versleutelen",
+    "Host:": "Host:",
+    "Port:": "Poort:",
+    "Path:": "Pad:",
+    "Automatic Reconnect": "Automatisch Opnieuw Verbinden",
+    "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):",
+    "Logging:": "Logmeldingen:",
+    "Disconnect": "Verbinding verbreken",
+    "Connect": "Verbinden",
+    "Password:": "Wachtwoord:",
+    "Cancel": "Annuleren",
+    "Canvas not supported.": "Canvas wordt niet ondersteund."
+}

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/pl.json

@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Łączenie...",
+    "Disconnecting...": "Rozłączanie...",
+    "Reconnecting...": "Łączenie...",
+    "Internal error": "Błąd wewnętrzny",
+    "Must set host": "Host i port są wymagane",
+    "Connected (encrypted) to ": "Połączenie (szyfrowane) z ",
+    "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ",
+    "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte",
+    "Disconnected": "Rozłączony",
+    "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ",
+    "New connection has been rejected": "Nowe połączenie zostało odrzucone",
+    "Password is required": "Hasło jest wymagane",
+    "noVNC encountered an error:": "noVNC napotkało błąd:",
+    "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień",
+    "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport",
+    "viewport drag": "przeciągnij viewport",
+    "Active Mouse Button": "Aktywny Przycisk Myszy",
+    "No mousebutton": "Brak przycisku myszy",
+    "Left mousebutton": "Lewy przycisk myszy",
+    "Middle mousebutton": "Środkowy przycisk myszy",
+    "Right mousebutton": "Prawy przycisk myszy",
+    "Keyboard": "Klawiatura",
+    "Show Keyboard": "Pokaż klawiaturę",
+    "Extra keys": "Przyciski dodatkowe",
+    "Show Extra Keys": "Pokaż przyciski dodatkowe",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Przełącz Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Przełącz Alt",
+    "Send Tab": "Wyślij Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Wyślij Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Wyłącz/Uruchom ponownie",
+    "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...",
+    "Power": "Włączony",
+    "Shutdown": "Wyłącz",
+    "Reboot": "Uruchom ponownie",
+    "Reset": "Resetuj",
+    "Clipboard": "Schowek",
+    "Clear": "Wyczyść",
+    "Fullscreen": "Pełny ekran",
+    "Settings": "Ustawienia",
+    "Shared Mode": "Tryb Współdzielenia",
+    "View Only": "Tylko Podgląd",
+    "Clip to Window": "Przytnij do Okna",
+    "Scaling Mode:": "Tryb Skalowania:",
+    "None": "Brak",
+    "Local Scaling": "Skalowanie lokalne",
+    "Remote Resizing": "Skalowanie zdalne",
+    "Advanced": "Zaawansowane",
+    "Repeater ID:": "ID Repeatera:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Szyfrowanie",
+    "Host:": "Host:",
+    "Port:": "Port:",
+    "Path:": "Ścieżka:",
+    "Automatic Reconnect": "Automatycznie wznawiaj połączenie",
+    "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):",
+    "Logging:": "Poziom logowania:",
+    "Disconnect": "Rozłącz",
+    "Connect": "Połącz",
+    "Password:": "Hasło:",
+    "Cancel": "Anuluj",
+    "Canvas not supported.": "Element Canvas nie jest wspierany."
+}

+ 68 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/sv.json

@@ -0,0 +1,68 @@
+{
+    "Connecting...": "Ansluter...",
+    "Connected (encrypted) to ": "Ansluten (krypterat) till ",
+    "Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
+    "Disconnecting...": "Kopplar ner...",
+    "Disconnected": "Frånkopplad",
+    "Must set host": "Du måste specifiera en värd",
+    "Reconnecting...": "Återansluter...",
+    "Password is required": "Lösenord krävs",
+    "Disconnect timeout": "Det tog för lång tid att koppla ner",
+    "noVNC encountered an error:": "noVNC stötte på ett problem:",
+    "Hide/Show the control bar": "Göm/Visa kontrollbaren",
+    "Move/Drag Viewport": "Flytta/Dra Vyn",
+    "viewport drag": "dra vy",
+    "Active Mouse Button": "Aktiv musknapp",
+    "No mousebutton": "Ingen musknapp",
+    "Left mousebutton": "Vänster musknapp",
+    "Middle mousebutton": "Mitten-musknapp",
+    "Right mousebutton": "Höger musknapp",
+    "Keyboard": "Tangentbord",
+    "Show Keyboard": "Visa Tangentbord",
+    "Extra keys": "Extraknappar",
+    "Show Extra Keys": "Visa Extraknappar",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Växla Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Växla Alt",
+    "Send Tab": "Skicka Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Skicka Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Stäng av/Boota om",
+    "Shutdown/Reboot...": "Stäng av/Boota om...",
+    "Power": "Ström",
+    "Shutdown": "Stäng av",
+    "Reboot": "Boota om",
+    "Reset": "Återställ",
+    "Clipboard": "Urklipp",
+    "Clear": "Rensa",
+    "Fullscreen": "Fullskärm",
+    "Settings": "Inställningar",
+    "Shared Mode": "Delat Läge",
+    "View Only": "Endast Visning",
+    "Clip to Window": "Begränsa till Fönster",
+    "Scaling Mode:": "Skalningsläge:",
+    "None": "Ingen",
+    "Local Scaling": "Lokal Skalning",
+    "Local Downscaling": "Lokal Nedskalning",
+    "Remote Resizing": "Ändra Storlek",
+    "Advanced": "Avancerat",
+    "Local Cursor": "Lokal Muspekare",
+    "Repeater ID:": "Repeater-ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Kryptera",
+    "Host:": "Värd:",
+    "Port:": "Port:",
+    "Path:": "Sökväg:",
+    "Automatic Reconnect": "Automatisk Återanslutning",
+    "Reconnect Delay (ms):": "Fördröjning (ms):",
+    "Logging:": "Loggning:",
+    "Disconnect": "Koppla från",
+    "Connect": "Anslut",
+    "Password:": "Lösenord:",
+    "Cancel": "Avbryt",
+    "Canvas not supported.": "Canvas stöds ej"
+}

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/tr.json

@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Bağlanıyor...",
+    "Disconnecting...": "Bağlantı kesiliyor...",
+    "Reconnecting...": "Yeniden bağlantı kuruluyor...",
+    "Internal error": "İç hata",
+    "Must set host": "Sunucuyu kur",
+    "Connected (encrypted) to ": "Bağlı (şifrelenmiş)",
+    "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)",
+    "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi",
+    "Disconnected": "Bağlantı kesildi",
+    "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ",
+    "New connection has been rejected": "Bağlantı reddedildi",
+    "Password is required": "Şifre gerekli",
+    "noVNC encountered an error:": "Bir hata oluştu:",
+    "Hide/Show the control bar": "Denetim masasını Gizle/Göster",
+    "Move/Drag Viewport": "Görünümü Taşı/Sürükle",
+    "viewport drag": "Görüntü penceresini sürükle",
+    "Active Mouse Button": "Aktif Fare Düğmesi",
+    "No mousebutton": "Fare düğmesi yok",
+    "Left mousebutton": "Farenin sol düğmesi",
+    "Middle mousebutton": "Farenin orta düğmesi",
+    "Right mousebutton": "Farenin sağ düğmesi",
+    "Keyboard": "Klavye",
+    "Show Keyboard": "Klavye Düzenini Göster",
+    "Extra keys": "Ekstra tuşlar",
+    "Show Extra Keys": "Ekstra tuşları göster",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl Değiştir ",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt Değiştir",
+    "Send Tab": "Sekme Gönder",
+    "Tab": "Sekme",
+    "Esc": "Esc",
+    "Send Escape": "Boşluk Gönder",
+    "Ctrl+Alt+Del": "Ctrl + Alt + Del",
+    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder",
+    "Shutdown/Reboot": "Kapat/Yeniden Başlat",
+    "Shutdown/Reboot...": "Kapat/Yeniden Başlat...",
+    "Power": "Güç",
+    "Shutdown": "Kapat",
+    "Reboot": "Yeniden Başlat",
+    "Reset": "Sıfırla",
+    "Clipboard": "Pano",
+    "Clear": "Temizle",
+    "Fullscreen": "Tam Ekran",
+    "Settings": "Ayarlar",
+    "Shared Mode": "Paylaşım Modu",
+    "View Only": "Sadece Görüntüle",
+    "Clip to Window": "Pencereye Tıkla",
+    "Scaling Mode:": "Ölçekleme Modu:",
+    "None": "Bilinmeyen",
+    "Local Scaling": "Yerel Ölçeklendirme",
+    "Remote Resizing": "Uzaktan Yeniden Boyutlandırma",
+    "Advanced": "Gelişmiş",
+    "Repeater ID:": "Tekralayıcı ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Şifrele",
+    "Host:": "Ana makine:",
+    "Port:": "Port:",
+    "Path:": "Yol:",
+    "Automatic Reconnect": "Otomatik Yeniden Bağlan",
+    "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):",
+    "Logging:": "Giriş yapılıyor:",
+    "Disconnect": "Bağlantıyı Kes",
+    "Connect": "Bağlan",
+    "Password:": "Parola:",
+    "Cancel": "Vazgeç",
+    "Canvas not supported.": "Tuval desteklenmiyor."
+}

+ 69 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/locale/zh.json

@@ -0,0 +1,69 @@
+{
+    "Connecting...": "連線中...",
+    "Disconnecting...": "正在中斷連線...",
+    "Reconnecting...": "重新連線中...",
+    "Internal error": "內部錯誤",
+    "Must set host": "請提供主機資訊",
+    "Connected (encrypted) to ": "已加密連線到",
+    "Connected (unencrypted) to ": "未加密連線到",
+    "Something went wrong, connection is closed": "發生錯誤,連線已關閉",
+    "Failed to connect to server": "無法連線到伺服器",
+    "Disconnected": "連線已中斷",
+    "New connection has been rejected with reason: ": "連線被拒絕,原因:",
+    "New connection has been rejected": "連線被拒絕",
+    "Password is required": "請提供密碼",
+    "noVNC encountered an error:": "noVNC 遇到一個錯誤:",
+    "Hide/Show the control bar": "顯示/隱藏控制列",
+    "Move/Drag Viewport": "拖放顯示範圍",
+    "viewport drag": "顯示範圍拖放",
+    "Active Mouse Button": "啟用滑鼠按鍵",
+    "No mousebutton": "無滑鼠按鍵",
+    "Left mousebutton": "滑鼠左鍵",
+    "Middle mousebutton": "滑鼠中鍵",
+    "Right mousebutton": "滑鼠右鍵",
+    "Keyboard": "鍵盤",
+    "Show Keyboard": "顯示鍵盤",
+    "Extra keys": "額外按鍵",
+    "Show Extra Keys": "顯示額外按鍵",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "切換 Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "切換 Alt",
+    "Send Tab": "送出 Tab 鍵",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "送出 Escape 鍵",
+    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
+    "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵",
+    "Shutdown/Reboot": "關機/重新啟動",
+    "Shutdown/Reboot...": "關機/重新啟動...",
+    "Power": "電源",
+    "Shutdown": "關機",
+    "Reboot": "重新啟動",
+    "Reset": "重設",
+    "Clipboard": "剪貼簿",
+    "Clear": "清除",
+    "Fullscreen": "全螢幕",
+    "Settings": "設定",
+    "Shared Mode": "分享模式",
+    "View Only": "僅檢視",
+    "Clip to Window": "限制/裁切視窗大小",
+    "Scaling Mode:": "縮放模式:",
+    "None": "無",
+    "Local Scaling": "本機縮放",
+    "Remote Resizing": "遠端調整大小",
+    "Advanced": "進階",
+    "Repeater ID:": "中繼站 ID",
+    "WebSocket": "WebSocket",
+    "Encrypt": "加密",
+    "Host:": "主機:",
+    "Port:": "連接埠:",
+    "Path:": "路徑:",
+    "Automatic Reconnect": "自動重新連線",
+    "Reconnect Delay (ms):": "重新連線間隔 (ms):",
+    "Logging:": "日誌級別:",
+    "Disconnect": "中斷連線",
+    "Connect": "連線",
+    "Password:": "密碼:",
+    "Cancel": "取消"
+}

+ 170 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/localization.js

@@ -0,0 +1,170 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2012 Joel Martin
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+/*
+ * Localization Utilities
+ */
+
+export function Localizer() {
+    // Currently configured language
+    this.language = 'en';
+
+    // Current dictionary of translations
+    this.dictionary = undefined;
+}
+
+Localizer.prototype = {
+    // Configure suitable language based on user preferences
+    setup: function (supportedLanguages) {
+        var userLanguages;
+
+        this.language = 'en'; // Default: US English
+
+        /*
+         * Navigator.languages only available in Chrome (32+) and FireFox (32+)
+         * Fall back to navigator.language for other browsers
+         */
+        if (typeof window.navigator.languages == 'object') {
+            userLanguages = window.navigator.languages;
+        } else {
+            userLanguages = [navigator.language || navigator.userLanguage];
+        }
+
+        for (var i = 0;i < userLanguages.length;i++) {
+            var userLang = userLanguages[i];
+            userLang = userLang.toLowerCase();
+            userLang = userLang.replace("_", "-");
+            userLang = userLang.split("-");
+
+            // Built-in default?
+            if ((userLang[0] === 'en') &&
+                ((userLang[1] === undefined) || (userLang[1] === 'us'))) {
+                return;
+            }
+
+            // First pass: perfect match
+            for (var j = 0;j < supportedLanguages.length;j++) {
+                var supLang = supportedLanguages[j];
+                supLang = supLang.toLowerCase();
+                supLang = supLang.replace("_", "-");
+                supLang = supLang.split("-");
+
+                if (userLang[0] !== supLang[0])
+                    continue;
+                if (userLang[1] !== supLang[1])
+                    continue;
+
+                this.language = supportedLanguages[j];
+                return;
+            }
+
+            // Second pass: fallback
+            for (var j = 0;j < supportedLanguages.length;j++) {
+                supLang = supportedLanguages[j];
+                supLang = supLang.toLowerCase();
+                supLang = supLang.replace("_", "-");
+                supLang = supLang.split("-");
+
+                if (userLang[0] !== supLang[0])
+                    continue;
+                if (supLang[1] !== undefined)
+                    continue;
+
+                this.language = supportedLanguages[j];
+                return;
+            }
+        }
+    },
+
+    // Retrieve localised text
+    get: function (id) {
+        if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) {
+            return this.dictionary[id];
+        } else {
+            return id;
+        }
+    },
+
+    // Traverses the DOM and translates relevant fields
+    // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
+    translateDOM: function () {
+        var self = this;
+        function process(elem, enabled) {
+            function isAnyOf(searchElement, items) {
+                return items.indexOf(searchElement) !== -1;
+            }
+
+            function translateAttribute(elem, attr) {
+                var str = elem.getAttribute(attr);
+                str = self.get(str);
+                elem.setAttribute(attr, str);
+            }
+
+            function translateTextNode(node) {
+                var str = node.data.trim();
+                str = self.get(str);
+                node.data = str;
+            }
+
+            if (elem.hasAttribute("translate")) {
+                if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) {
+                    enabled = true;
+                } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) {
+                    enabled = false;
+                }
+            }
+
+            if (enabled) {
+                if (elem.hasAttribute("abbr") &&
+                    elem.tagName === "TH") {
+                    translateAttribute(elem, "abbr");
+                }
+                if (elem.hasAttribute("alt") &&
+                    isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) {
+                    translateAttribute(elem, "alt");
+                }
+                if (elem.hasAttribute("download") &&
+                    isAnyOf(elem.tagName, ["A", "AREA"])) {
+                    translateAttribute(elem, "download");
+                }
+                if (elem.hasAttribute("label") &&
+                    isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP",
+                                   "OPTION", "TRACK"])) {
+                    translateAttribute(elem, "label");
+                }
+                // FIXME: Should update "lang"
+                if (elem.hasAttribute("placeholder") &&
+                    isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) {
+                    translateAttribute(elem, "placeholder");
+                }
+                if (elem.hasAttribute("title")) {
+                    translateAttribute(elem, "title");
+                }
+                if (elem.hasAttribute("value") &&
+                    elem.tagName === "INPUT" &&
+                    isAnyOf(elem.getAttribute("type"), ["reset", "button", "submit"])) {
+                    translateAttribute(elem, "value");
+                }
+            }
+
+            for (var i = 0;i < elem.childNodes.length;i++) {
+                var node = elem.childNodes[i];
+                if (node.nodeType === node.ELEMENT_NODE) {
+                    process(node, enabled);
+                } else if (node.nodeType === node.TEXT_NODE && enabled) {
+                    translateTextNode(node);
+                }
+            }
+        }
+
+        process(document.body, true);
+    },
+};
+
+export var l10n = new Localizer();
+export default l10n.get.bind(l10n);

+ 4 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/CREDITS

@@ -0,0 +1,4 @@
+bell
+        Copyright: Dr. Richard Boulanger et al
+        URL: http://www.archive.org/details/Berklee44v12
+        License: CC-BY Attribution 3.0 Unported

BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.mp3


BIN
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/sounds/bell.oga


+ 0 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/include/Orbitron700.ttf → board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/Orbitron700.ttf


+ 0 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/include/Orbitron700.woff → board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/Orbitron700.woff


+ 902 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/base.css

@@ -0,0 +1,902 @@
+/*
+ * noVNC base CSS
+ * Copyright (C) 2012 Joel Martin
+ * Copyright (C) 2016 Samuel Mannehed for Cendio AB
+ * Copyright (C) 2016 Pierre Ossman for Cendio AB
+ * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
+ * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
+ */
+
+/*
+ * Z index layers:
+ *
+ * 0: Main screen
+ * 10: Control bar
+ * 50: Transition blocker
+ * 60: Connection popups
+ * 100: Status bar
+ * ...
+ * 1000: Javascript crash
+ * ...
+ * 10000: Max (used for polyfills)
+ */
+
+body {
+  margin:0;
+  padding:0;
+  font-family: Helvetica;
+  /*Background image with light grey curve.*/
+  background-color:#494949;
+  background-repeat:no-repeat;
+  background-position:right bottom;
+  height:100%;
+  touch-action: none;
+}
+
+html {
+  height:100%;
+}
+
+.noVNC_only_touch.noVNC_hidden {
+  display: none;
+}
+
+.noVNC_disabled {
+  color: rgb(128, 128, 128);
+}
+
+/* ----------------------------------------
+ * Spinner
+ * ----------------------------------------
+ */
+
+.noVNC_spinner {
+  position: relative;
+}
+.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
+  width: 10px;
+  height: 10px;
+  border-radius: 2px;
+  box-shadow: -60px 10px 0 rgba(255, 255, 255, 0);
+  animation: noVNC_spinner 1.0s linear infinite;
+}
+.noVNC_spinner::before {
+  content: "";
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  animation-delay: -0.1s;
+}
+.noVNC_spinner::after {
+  content: "";
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  animation-delay: 0.1s;
+}
+@keyframes noVNC_spinner {
+  0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; }
+  25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; }
+  50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; }
+}
+
+/* ----------------------------------------
+ * Input Elements
+ * ----------------------------------------
+ */
+
+input[type=input], input[type=password], input[type=number],
+input:not([type]), textarea {
+  /* Disable default rendering */
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+
+  margin: 2px;
+  padding: 2px;
+  border: 1px solid rgb(192, 192, 192);
+  border-radius: 5px;
+  color: black;
+  background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240));
+}
+
+input[type=button], input[type=submit], select {
+  /* Disable default rendering */
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+
+  margin: 2px;
+  padding: 2px;
+  border: 1px solid rgb(192, 192, 192);
+  border-bottom-width: 2px;
+  border-radius: 5px;
+  color: black;
+  background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240));
+
+  /* This avoids it jumping around when :active */
+  vertical-align: middle;
+}
+
+input[type=button], input[type=submit] {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+option {
+  color: black;
+  background: white;
+}
+
+input[type=input]:focus, input[type=password]:focus,
+input:not([type]):focus, input[type=button]:focus,
+input[type=submit]:focus,
+textarea:focus, select:focus {
+  box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5);
+  border-color: rgb(74, 144, 217);
+  outline: none;
+}
+
+input[type=button]::-moz-focus-inner,
+input[type=submit]::-moz-focus-inner {
+  border: none;
+}
+
+input[type=input]:disabled, input[type=password]:disabled,
+input:not([type]):disabled, input[type=button]:disabled,
+input[type=submit]:disabled, input[type=number]:disabled,
+textarea:disabled, select:disabled {
+  color: rgb(128, 128, 128);
+  background: rgb(240, 240, 240);
+}
+
+input[type=button]:active, input[type=submit]:active,
+select:active {
+  border-bottom-width: 1px;
+  margin-top: 3px;
+}
+
+:root:not(.noVNC_touch) input[type=button]:hover:not(:disabled),
+:root:not(.noVNC_touch) input[type=submit]:hover:not(:disabled),
+:root:not(.noVNC_touch) select:hover:not(:disabled) {
+  background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250));
+}
+
+/* ----------------------------------------
+ * WebKit centering hacks
+ * ----------------------------------------
+ */
+
+.noVNC_center {
+  /*
+   * This is a workaround because webkit misrenders transforms and
+   * uses non-integer coordinates, resulting in blurry content.
+   * Ideally we'd use "top: 50%; transform: translateY(-50%);" on
+   * the objects instead.
+   */
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+}
+.noVNC_center > * {
+  pointer-events: auto;
+}
+.noVNC_vcenter {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 100%;
+  pointer-events: none;
+}
+.noVNC_vcenter > * {
+  pointer-events: auto;
+}
+
+/* ----------------------------------------
+ * Layering
+ * ----------------------------------------
+ */
+
+.noVNC_connect_layer {
+  z-index: 60;
+}
+
+/* ----------------------------------------
+ * Fallback error
+ * ----------------------------------------
+ */
+
+#noVNC_fallback_error {
+  z-index: 1000;
+  visibility: hidden;
+}
+#noVNC_fallback_error.noVNC_open {
+  visibility: visible;
+}
+
+#noVNC_fallback_error > div {
+  max-width: 90%;
+  padding: 15px;
+
+  transition: 0.5s ease-in-out;
+
+  transform: translateY(-50px);
+  opacity: 0;
+
+  text-align: center;
+  font-weight: bold;
+  color: #fff;
+
+  border-radius: 10px;
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+  background: rgba(200,55,55,0.8);
+}
+#noVNC_fallback_error.noVNC_open > div {
+  transform: translateY(0);
+  opacity: 1;
+}
+
+#noVNC_fallback_errormsg {
+  font-weight: normal;
+}
+
+#noVNC_fallback_errormsg .noVNC_message {
+  display: inline-block;
+  text-align: left;
+  font-family: monospace;
+  white-space: pre-wrap;
+}
+
+#noVNC_fallback_error .noVNC_location {
+  font-style: italic;
+  font-size: 0.8em;
+  color: rgba(255, 255, 255, 0.8);
+}
+
+#noVNC_fallback_error .noVNC_stack {
+  max-height: 50vh;
+  padding: 10px;
+  margin: 10px;
+  font-size: 0.8em;
+  text-align: left;
+  font-family: monospace;
+  white-space: pre;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  background: rgba(0, 0, 0, 0.2);
+  overflow: auto;
+}
+
+/* ----------------------------------------
+ * Control Bar
+ * ----------------------------------------
+ */
+
+#noVNC_control_bar_anchor {
+  /* The anchor is needed to get z-stacking to work */
+  position: fixed;
+  z-index: 10;
+
+  transition: 0.5s ease-in-out;
+
+  /* Edge misrenders animations wihthout this */
+  transform: translateX(0);
+}
+:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
+  opacity: 0.8;
+}
+#noVNC_control_bar_anchor.noVNC_right {
+  left: auto;
+  right: 0;
+}
+
+#noVNC_control_bar {
+  position: relative;
+  left: -100%;
+
+  transition: 0.5s ease-in-out;
+
+  background-color: rgb(110, 132, 163);
+  border-radius: 0 10px 10px 0;
+
+}
+#noVNC_control_bar.noVNC_open {
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+  left: 0;
+}
+#noVNC_control_bar::before {
+  /* This extra element is to get a proper shadow */
+  content: "";
+  position: absolute;
+  z-index: -1;
+  height: 100%;
+  width: 30px;
+  left: -30px;
+  transition: box-shadow 0.5s ease-in-out;
+}
+#noVNC_control_bar.noVNC_open::before {
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+.noVNC_right #noVNC_control_bar {
+  left: 100%;
+  border-radius: 10px 0 0 10px;
+}
+.noVNC_right #noVNC_control_bar.noVNC_open {
+  left: 0;
+}
+.noVNC_right #noVNC_control_bar::before {
+  visibility: hidden;
+}
+
+#noVNC_control_bar_handle {
+  position: absolute;
+  left: -15px;
+  top: 0;
+  transform: translateY(35px);
+  width: calc(100% + 30px);
+  height: 50px;
+  z-index: -1;
+  cursor: pointer;
+  border-radius: 5px;
+  background-color: rgb(83, 99, 122);
+  background-image: url("../images/handle_bg.svg");
+  background-repeat: no-repeat;
+  background-position: right;
+  box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
+}
+#noVNC_control_bar_handle:after {
+  content: "";
+  transition: transform 0.5s ease-in-out;
+  background: url("../images/handle.svg");
+  position: absolute;
+  top: 22px; /* (50px-6px)/2 */
+  right: 5px;
+  width: 5px;
+  height: 6px;
+}
+#noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
+  transform: translateX(1px) rotate(180deg);
+}
+:root:not(.noVNC_connected) #noVNC_control_bar_handle {
+  display: none;
+}
+.noVNC_right #noVNC_control_bar_handle {
+  background-position: left;
+}
+.noVNC_right #noVNC_control_bar_handle:after {
+  left: 5px;
+  right: 0;
+  transform: translateX(1px) rotate(180deg);
+}
+.noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
+  transform: none;
+}
+#noVNC_control_bar_handle div {
+  position: absolute;
+  right: -35px;
+  top: 0;
+  width: 50px;
+  height: 50px;
+}
+:root:not(.noVNC_touch) #noVNC_control_bar_handle div {
+  display: none;
+}
+.noVNC_right #noVNC_control_bar_handle div {
+  left: -35px;
+  right: auto;
+}
+
+#noVNC_control_bar .noVNC_scroll {
+  max-height: 100vh; /* Chrome is buggy with 100% */
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0 10px 0 5px;
+}
+.noVNC_right #noVNC_control_bar .noVNC_scroll {
+  padding: 0 5px 0 10px;
+}
+
+/* Control bar hint */
+#noVNC_control_bar_hint {
+  position: fixed;
+  left: calc(100vw - 50px);
+  right: auto;
+  top: 50%;
+  transform: translateY(-50%) scale(0);
+  width: 100px;
+  height: 50%;
+  max-height: 600px;
+
+  visibility: hidden;
+  opacity: 0;
+  transition: 0.2s ease-in-out;
+  background: transparent;
+  box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8);
+  border-radius: 10px;
+  transition-delay: 0s;
+}
+#noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{
+  left: auto;
+  right: calc(100vw - 50px);
+}
+#noVNC_control_bar_hint.noVNC_active {
+  visibility: visible;
+  opacity: 1;
+  transition-delay: 0.2s;
+  transform: translateY(-50%) scale(1);
+}
+
+/* General button style */
+.noVNC_button {
+  display: block;
+  padding: 4px 4px;
+  margin: 10px 0;
+  vertical-align: middle;
+  border:1px solid rgba(255, 255, 255, 0.2);
+  border-radius: 6px;
+}
+.noVNC_button.noVNC_selected {
+  border-color: rgba(0, 0, 0, 0.8);
+  background: rgba(0, 0, 0, 0.5);
+}
+.noVNC_button:disabled {
+  opacity: 0.4;
+}
+.noVNC_button:focus {
+  outline: none;
+}
+.noVNC_button:active {
+  padding-top: 5px;
+  padding-bottom: 3px;
+}
+/* Android browsers don't properly update hover state if touch events
+ * are intercepted, but focus should be safe to display */
+:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover,
+.noVNC_button.noVNC_selected:focus {
+  border-color: rgba(0, 0, 0, 0.4);
+  background: rgba(0, 0, 0, 0.2);
+}
+:root:not(.noVNC_touch) .noVNC_button:hover,
+.noVNC_button:focus {
+  background: rgba(255, 255, 255, 0.2);
+}
+.noVNC_button.noVNC_hidden {
+  display: none;
+}
+
+/* Panels */
+.noVNC_panel {
+  transform: translateX(25px);
+
+  transition: 0.5s ease-in-out;
+
+  max-height: 100vh; /* Chrome is buggy with 100% */
+  overflow-x: hidden;
+  overflow-y: auto;
+
+  visibility: hidden;
+  opacity: 0;
+
+  padding: 15px;
+
+  background: #fff;
+  border-radius: 10px;
+  color: #000;
+  border: 2px solid #E0E0E0;
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+.noVNC_panel.noVNC_open {
+  visibility: visible;
+  opacity: 1;
+  transform: translateX(75px);
+}
+.noVNC_right .noVNC_vcenter {
+  left: auto;
+  right: 0;
+}
+.noVNC_right .noVNC_panel {
+  transform: translateX(-25px);
+}
+.noVNC_right .noVNC_panel.noVNC_open {
+  transform: translateX(-75px);
+}
+
+.noVNC_panel hr {
+  border: none;
+  border-top: 1px solid rgb(192, 192, 192);
+}
+
+.noVNC_panel label {
+  display: block;
+  white-space: nowrap;
+}
+
+.noVNC_panel .noVNC_heading {
+  background-color: rgb(110, 132, 163);
+  border-radius: 5px;
+  padding: 5px;
+  /* Compensate for padding in image */
+  padding-right: 8px;
+  color: white;
+  font-size: 20px;
+  margin-bottom: 10px;
+  white-space: nowrap;
+}
+.noVNC_panel .noVNC_heading img {
+  vertical-align: bottom;
+}
+
+.noVNC_submit {
+  float: right;
+}
+
+/* Expanders */
+.noVNC_expander {
+  cursor: pointer;
+}
+.noVNC_expander::before {
+  content: url("../images/expander.svg");
+  display: inline-block;
+  margin-right: 5px;
+  transition: 0.2s ease-in-out;
+}
+.noVNC_expander.noVNC_open::before {
+  transform: rotateZ(90deg);
+}
+.noVNC_expander ~ * {
+  margin: 5px;
+  margin-left: 10px;
+  padding: 5px;
+  background: rgba(0, 0, 0, 0.05);
+  border-radius: 5px;
+}
+.noVNC_expander:not(.noVNC_open) ~ * {
+  display: none;
+}
+
+/* Control bar content */
+
+#noVNC_control_bar .noVNC_logo {
+  font-size: 13px;
+}
+
+:root:not(.noVNC_connected) #noVNC_view_drag_button {
+  display: none;
+}
+
+/* noVNC Touch Device only buttons */
+:root:not(.noVNC_connected) #noVNC_mobile_buttons {
+  display: none;
+}
+:root:not(.noVNC_touch) #noVNC_mobile_buttons {
+  display: none;
+}
+
+/* Extra manual keys */
+:root:not(.noVNC_connected) #noVNC_extra_keys {
+  display: none;
+}
+
+#noVNC_modifiers {
+  background-color: rgb(92, 92, 92);
+  border: none;
+  padding: 0 10px;
+}
+
+/* Shutdown/Reboot */
+:root:not(.noVNC_connected) #noVNC_power_button {
+  display: none;
+}
+#noVNC_power {
+}
+#noVNC_power_buttons {
+  display: none;
+}
+
+#noVNC_power input[type=button] {
+  width: 100%;
+}
+
+/* Clipboard */
+:root:not(.noVNC_connected) #noVNC_clipboard_button {
+  display: none;
+}
+#noVNC_clipboard {
+  /* Full screen, minus padding and left and right margins */
+  max-width: calc(100vw - 2*15px - 75px - 25px);
+}
+#noVNC_clipboard_text {
+  width: 500px;
+  max-width: 100%;
+}
+
+/* Settings */
+#noVNC_settings {
+}
+#noVNC_settings ul {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+}
+#noVNC_setting_port {
+  width: 80px;
+}
+#noVNC_setting_path {
+  width: 100px;
+}
+
+/* Connection Controls */
+:root:not(.noVNC_connected) #noVNC_disconnect_button {
+  display: none;
+}
+
+/* ----------------------------------------
+ * Status Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_status {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 100;
+  transform: translateY(-100%);
+
+  cursor: pointer;
+
+  transition: 0.5s ease-in-out;
+
+  visibility: hidden;
+  opacity: 0;
+
+  padding: 5px;
+
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-content: center;
+
+  line-height: 25px;
+  word-wrap: break-word;
+  color: #fff;
+
+  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
+}
+#noVNC_status.noVNC_open {
+  transform: translateY(0);
+  visibility: visible;
+  opacity: 1;
+}
+
+#noVNC_status::before {
+  content: "";
+  display: inline-block;
+  width: 25px;
+  height: 25px;
+  margin-right: 5px;
+}
+
+#noVNC_status.noVNC_status_normal {
+  background: rgba(128,128,128,0.9);
+}
+#noVNC_status.noVNC_status_normal::before {
+  content: url("../images/info.svg") " ";
+}
+#noVNC_status.noVNC_status_error {
+  background: rgba(200,55,55,0.9);
+}
+#noVNC_status.noVNC_status_error::before {
+  content: url("../images/error.svg") " ";
+}
+#noVNC_status.noVNC_status_warn {
+  background: rgba(180,180,30,0.9);
+}
+#noVNC_status.noVNC_status_warn::before {
+  content: url("../images/warning.svg") " ";
+}
+
+/* ----------------------------------------
+ * Connect Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_connect_dlg {
+  transition: 0.5s ease-in-out;
+
+  transform: scale(0, 0);
+  visibility: hidden;
+  opacity: 0;
+}
+#noVNC_connect_dlg.noVNC_open {
+  transform: scale(1, 1);
+  visibility: visible;
+  opacity: 1;
+}
+#noVNC_connect_dlg .noVNC_logo {
+  transition: 0.5s ease-in-out;
+  padding: 10px;
+  margin-bottom: 10px;
+
+  font-size: 80px;
+  text-align: center;
+
+  border-radius: 5px;
+}
+@media (max-width: 440px) {
+  #noVNC_connect_dlg {
+    max-width: calc(100vw - 100px);
+  }
+  #noVNC_connect_dlg .noVNC_logo {
+    font-size: calc(25vw - 30px);
+  }
+}
+#noVNC_connect_button {
+  cursor: pointer;
+
+  padding: 10px;
+
+  color: white;
+  background-color: rgb(110, 132, 163);
+  border-radius: 12px;
+
+  text-align: center;
+  font-size: 20px;
+
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+#noVNC_connect_button div {
+  margin: 2px;
+  padding: 5px 30px;
+  border: 1px solid rgb(83, 99, 122);
+  border-bottom-width: 2px;
+  border-radius: 5px;
+  background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147));
+
+  /* This avoids it jumping around when :active */
+  vertical-align: middle;
+}
+#noVNC_connect_button div:active {
+  border-bottom-width: 1px;
+  margin-top: 3px;
+}
+:root:not(.noVNC_touch) #noVNC_connect_button div:hover {
+  background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155));
+}
+
+#noVNC_connect_button img {
+  vertical-align: bottom;
+  height: 1.3em;
+}
+
+/* ----------------------------------------
+ * Password Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_password_dlg {
+  position: relative;
+
+  transform: translateY(-50px);
+}
+#noVNC_password_dlg.noVNC_open {
+  transform: translateY(0);
+}
+#noVNC_password_dlg ul {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+}
+
+/* ----------------------------------------
+ * Main Area
+ * ----------------------------------------
+ */
+
+/* Transition screen */
+#noVNC_transition {
+  display: none;
+
+  position: fixed;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+
+  color: white;
+  background: rgba(0, 0, 0, 0.5);
+  z-index: 50;
+
+  /*display: flex;*/
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+}
+:root.noVNC_loading #noVNC_transition,
+:root.noVNC_connecting #noVNC_transition,
+:root.noVNC_disconnecting #noVNC_transition,
+:root.noVNC_reconnecting #noVNC_transition {
+  display: flex;
+}
+:root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button {
+  display: none;
+}
+#noVNC_transition_text {
+  font-size: 1.5em;
+}
+
+/* Main container */
+#noVNC_container {
+  width: 100%;
+  height: 100%;
+  background-color: #313131;
+  border-bottom-right-radius: 800px 600px;
+  /*border-top-left-radius: 800px 600px;*/
+}
+
+#noVNC_keyboardinput {
+  width: 1px;
+  height: 1px;
+  background-color: #fff;
+  color: #fff;
+  border: 0;
+  position: absolute;
+  left: -40px;
+  z-index: -1;
+  ime-mode: disabled;
+}
+
+/*Default noVNC logo.*/
+/* From: http://fonts.googleapis.com/css?family=Orbitron:700 */
+@font-face {
+  font-family: 'Orbitron';
+  font-style: normal;
+  font-weight: 700;
+  src: local('?'), url('Orbitron700.woff') format('woff'),
+                   url('Orbitron700.ttf') format('truetype');
+}
+
+.noVNC_logo {
+  color:yellow;
+  font-family: 'Orbitron', 'OrbitronTTF', sans-serif;
+  line-height:90%;
+  text-shadow: 0.1em 0.1em 0 black;
+}
+.noVNC_logo span{
+  color:green;
+}
+
+#noVNC_bell {
+  display: none;
+}
+
+/* ----------------------------------------
+ * Media sizing
+ * ----------------------------------------
+ */
+
+@media screen and (max-width: 640px){
+  #noVNC_logo {
+    font-size: 150px;
+  }
+}
+
+@media screen and (min-width: 321px) and (max-width: 480px) {
+  #noVNC_logo {
+    font-size: 110px;
+  }
+}
+
+@media screen and (max-width: 320px) {
+  #noVNC_logo {
+    font-size: 90px;
+  }
+}

+ 63 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/styles/lite.css

@@ -0,0 +1,63 @@
+/*
+ * noVNC auto CSS
+ * Copyright (C) 2012 Joel Martin
+ * Copyright (C) 2017 Samuel Mannehed for Cendio AB
+ * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
+ * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
+ */
+
+body {
+  margin:0;
+  background-color:#313131;
+  border-bottom-right-radius: 800px 600px;
+  height:100%;
+  display: flex;
+  flex-direction: column;
+}
+
+html {
+  background-color:#494949;
+  height:100%;
+}
+
+#noVNC_status_bar {
+  width: 100%;
+  display:flex;
+  justify-content: space-between;
+}
+
+#noVNC_status {
+  color: #fff;
+  font: bold 12px Helvetica;
+  margin: auto;
+}
+
+.noVNC_status_normal {
+  background: linear-gradient(#b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
+}
+
+.noVNC_status_error {
+  background: linear-gradient(#c83737 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
+}
+
+.noVNC_status_warn {
+  background: linear-gradient(#b4b41e 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
+}
+
+.noNVC_shown {
+  display: inline;
+}
+.noVNC_hidden {
+  display: none;
+}
+
+#noVNC_left_dummy_elem {
+  flex: 1;
+}
+
+#noVNC_buttons {
+  padding: 1px;
+  flex: 1;
+  display: flex;
+  justify-content: flex-end;
+}

+ 1669 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/ui.js

@@ -0,0 +1,1669 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2012 Joel Martin
+ * Copyright (C) 2016 Samuel Mannehed for Cendio AB
+ * Copyright (C) 2016 Pierre Ossman for Cendio AB
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import * as Log from '../core/util/logging.js';
+import _, { l10n } from './localization.js';
+import { isTouchDevice } from '../core/util/browser.js';
+import { setCapture, getPointerEvent } from '../core/util/events.js';
+import KeyTable from "../core/input/keysym.js";
+import keysyms from "../core/input/keysymdef.js";
+import Keyboard from "../core/input/keyboard.js";
+import RFB from "../core/rfb.js";
+import Display from "../core/display.js";
+import * as WebUtil from "./webutil.js";
+
+var UI = {
+
+    connected: false,
+    desktopName: "",
+
+    statusTimeout: null,
+    hideKeyboardTimeout: null,
+    idleControlbarTimeout: null,
+    closeControlbarTimeout: null,
+
+    controlbarGrabbed: false,
+    controlbarDrag: false,
+    controlbarMouseDownClientY: 0,
+    controlbarMouseDownOffsetY: 0,
+
+    isSafari: false,
+    lastKeyboardinput: null,
+    defaultKeyboardinputLen: 100,
+
+    inhibit_reconnect: true,
+    reconnect_callback: null,
+    reconnect_password: null,
+
+    prime: function(callback) {
+        if (document.readyState === "interactive" || document.readyState === "complete") {
+            UI.load(callback);
+        } else {
+            document.addEventListener('DOMContentLoaded', UI.load.bind(UI, callback));
+        }
+    },
+
+    // Setup rfb object, load settings from browser storage, then call
+    // UI.init to setup the UI/menus
+    load: function(callback) {
+        WebUtil.initSettings(UI.start, callback);
+    },
+
+    // Render default UI and initialize settings menu
+    start: function(callback) {
+
+        // Setup global variables first
+        UI.isSafari = (navigator.userAgent.indexOf('Safari') !== -1 &&
+                       navigator.userAgent.indexOf('Chrome') === -1);
+
+        UI.initSettings();
+
+        // Translate the DOM
+        l10n.translateDOM();
+
+        // Adapt the interface for touch screen devices
+        if (isTouchDevice) {
+            document.documentElement.classList.add("noVNC_touch");
+            // Remove the address bar
+            setTimeout(function() { window.scrollTo(0, 1); }, 100);
+        }
+
+        // Restore control bar position
+        if (WebUtil.readSetting('controlbar_pos') === 'right') {
+            UI.toggleControlbarSide();
+        }
+
+        UI.initFullscreen();
+
+        // Setup event handlers
+        UI.addControlbarHandlers();
+        UI.addTouchSpecificHandlers();
+        UI.addExtraKeysHandlers();
+        UI.addMachineHandlers();
+        UI.addConnectionControlHandlers();
+        UI.addClipboardHandlers();
+        UI.addSettingsHandlers();
+        document.getElementById("noVNC_status")
+            .addEventListener('click', UI.hideStatus);
+
+        // Bootstrap fallback input handler
+        UI.keyboardinputReset();
+
+        UI.openControlbar();
+
+        UI.updateVisualState('init');
+
+        document.documentElement.classList.remove("noVNC_loading");
+
+        var autoconnect = WebUtil.getConfigVar('autoconnect', false);
+        if (autoconnect === 'true' || autoconnect == '1') {
+            autoconnect = true;
+            UI.connect();
+        } else {
+            autoconnect = false;
+            // Show the connect panel on first load unless autoconnecting
+            UI.openConnectPanel();
+        }
+
+        if (typeof callback === "function") {
+            callback(UI.rfb);
+        }
+    },
+
+    initFullscreen: function() {
+        // Only show the button if fullscreen is properly supported
+        // * Safari doesn't support alphanumerical input while in fullscreen
+        if (!UI.isSafari &&
+            (document.documentElement.requestFullscreen ||
+             document.documentElement.mozRequestFullScreen ||
+             document.documentElement.webkitRequestFullscreen ||
+             document.body.msRequestFullscreen)) {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.remove("noVNC_hidden");
+            UI.addFullscreenHandlers();
+        }
+    },
+
+    initSettings: function() {
+        var i;
+
+        // Logging selection dropdown
+        var llevels = ['error', 'warn', 'info', 'debug'];
+        for (i = 0; i < llevels.length; i += 1) {
+            UI.addOption(document.getElementById('noVNC_setting_logging'),llevels[i], llevels[i]);
+        }
+
+        // Settings with immediate effects
+        UI.initSetting('logging', 'warn');
+        UI.updateLogging();
+
+        // if port == 80 (or 443) then it won't be present and should be
+        // set manually
+        var port = window.location.port;
+        if (!port) {
+            if (window.location.protocol.substring(0,5) == 'https') {
+                port = 443;
+            }
+            else if (window.location.protocol.substring(0,4) == 'http') {
+                port = 80;
+            }
+        }
+
+        /* Populate the controls if defaults are provided in the URL */
+        UI.initSetting('host', window.location.hostname);
+        UI.initSetting('port', port);
+        UI.initSetting('encrypt', (window.location.protocol === "https:"));
+        UI.initSetting('view_clip', false);
+        UI.initSetting('resize', 'off');
+        UI.initSetting('shared', true);
+        UI.initSetting('view_only', false);
+        UI.initSetting('path', 'websockify');
+        UI.initSetting('repeaterID', '');
+        UI.initSetting('reconnect', false);
+        UI.initSetting('reconnect_delay', 5000);
+
+        UI.setupSettingLabels();
+    },
+    // Adds a link to the label elements on the corresponding input elements
+    setupSettingLabels: function() {
+        var labels = document.getElementsByTagName('LABEL');
+        for (var i = 0; i < labels.length; i++) {
+            var htmlFor = labels[i].htmlFor;
+            if (htmlFor != '') {
+                var elem = document.getElementById(htmlFor);
+                if (elem) elem.label = labels[i];
+            } else {
+                // If 'for' isn't set, use the first input element child
+                var children = labels[i].children;
+                for (var j = 0; j < children.length; j++) {
+                    if (children[j].form !== undefined) {
+                        children[j].label = labels[i];
+                        break;
+                    }
+                }
+            }
+        }
+    },
+
+/* ------^-------
+*     /INIT
+* ==============
+* EVENT HANDLERS
+* ------v------*/
+
+    addControlbarHandlers: function() {
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousemove', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mouseup', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousedown', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('keydown', UI.activateControlbar);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousedown', UI.keepControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('keydown', UI.keepControlbar);
+
+        document.getElementById("noVNC_view_drag_button")
+            .addEventListener('click', UI.toggleViewDrag);
+
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mousedown', UI.controlbarHandleMouseDown);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mouseup', UI.controlbarHandleMouseUp);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mousemove', UI.dragControlbarHandle);
+        // resize events aren't available for elements
+        window.addEventListener('resize', UI.updateControlbarHandle);
+
+        var exps = document.getElementsByClassName("noVNC_expander");
+        for (var i = 0;i < exps.length;i++) {
+            exps[i].addEventListener('click', UI.toggleExpander);
+        }
+    },
+
+    addTouchSpecificHandlers: function() {
+        document.getElementById("noVNC_mouse_button0")
+            .addEventListener('click', function () { UI.setMouseButton(1); });
+        document.getElementById("noVNC_mouse_button1")
+            .addEventListener('click', function () { UI.setMouseButton(2); });
+        document.getElementById("noVNC_mouse_button2")
+            .addEventListener('click', function () { UI.setMouseButton(4); });
+        document.getElementById("noVNC_mouse_button4")
+            .addEventListener('click', function () { UI.setMouseButton(0); });
+        document.getElementById("noVNC_keyboard_button")
+            .addEventListener('click', UI.toggleVirtualKeyboard);
+
+        UI.touchKeyboard = new Keyboard(document.getElementById('noVNC_keyboardinput'));
+        UI.touchKeyboard.onkeyevent = UI.keyEvent;
+        UI.touchKeyboard.grab();
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('input', UI.keyInput);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('focus', UI.onfocusVirtualKeyboard);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('blur', UI.onblurVirtualKeyboard);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('submit', function () { return false; });
+
+        document.documentElement
+            .addEventListener('mousedown', UI.keepVirtualKeyboard, true);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchstart', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchmove', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchend', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('input', UI.activateControlbar);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchstart', UI.keepControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('input', UI.keepControlbar);
+
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchstart', UI.controlbarHandleMouseDown);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchend', UI.controlbarHandleMouseUp);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchmove', UI.dragControlbarHandle);
+    },
+
+    addExtraKeysHandlers: function() {
+        document.getElementById("noVNC_toggle_extra_keys_button")
+            .addEventListener('click', UI.toggleExtraKeys);
+        document.getElementById("noVNC_toggle_ctrl_button")
+            .addEventListener('click', UI.toggleCtrl);
+        document.getElementById("noVNC_toggle_alt_button")
+            .addEventListener('click', UI.toggleAlt);
+        document.getElementById("noVNC_send_tab_button")
+            .addEventListener('click', UI.sendTab);
+        document.getElementById("noVNC_send_esc_button")
+            .addEventListener('click', UI.sendEsc);
+        document.getElementById("noVNC_send_ctrl_alt_del_button")
+            .addEventListener('click', UI.sendCtrlAltDel);
+    },
+
+    addMachineHandlers: function() {
+        document.getElementById("noVNC_shutdown_button")
+            .addEventListener('click', function() { UI.rfb.machineShutdown(); });
+        document.getElementById("noVNC_reboot_button")
+            .addEventListener('click', function() { UI.rfb.machineReboot(); });
+        document.getElementById("noVNC_reset_button")
+            .addEventListener('click', function() { UI.rfb.machineReset(); });
+        document.getElementById("noVNC_power_button")
+            .addEventListener('click', UI.togglePowerPanel);
+    },
+
+    addConnectionControlHandlers: function() {
+        document.getElementById("noVNC_disconnect_button")
+            .addEventListener('click', UI.disconnect);
+        document.getElementById("noVNC_connect_button")
+            .addEventListener('click', UI.connect);
+        document.getElementById("noVNC_cancel_reconnect_button")
+            .addEventListener('click', UI.cancelReconnect);
+
+        document.getElementById("noVNC_password_button")
+            .addEventListener('click', UI.setPassword);
+    },
+
+    addClipboardHandlers: function() {
+        document.getElementById("noVNC_clipboard_button")
+            .addEventListener('click', UI.toggleClipboardPanel);
+        document.getElementById("noVNC_clipboard_text")
+            .addEventListener('change', UI.clipboardSend);
+        document.getElementById("noVNC_clipboard_clear_button")
+            .addEventListener('click', UI.clipboardClear);
+    },
+
+    // Add a call to save settings when the element changes,
+    // unless the optional parameter changeFunc is used instead.
+    addSettingChangeHandler: function(name, changeFunc) {
+        var settingElem = document.getElementById("noVNC_setting_" + name);
+        if (changeFunc === undefined) {
+            changeFunc = function () { UI.saveSetting(name); };
+        }
+        settingElem.addEventListener('change', changeFunc);
+    },
+
+    addSettingsHandlers: function() {
+        document.getElementById("noVNC_settings_button")
+            .addEventListener('click', UI.toggleSettingsPanel);
+
+        UI.addSettingChangeHandler('encrypt');
+        UI.addSettingChangeHandler('resize');
+        UI.addSettingChangeHandler('resize', UI.enableDisableViewClip);
+        UI.addSettingChangeHandler('resize', UI.applyResizeMode);
+        UI.addSettingChangeHandler('view_clip');
+        UI.addSettingChangeHandler('view_clip', UI.updateViewClip);
+        UI.addSettingChangeHandler('shared');
+        UI.addSettingChangeHandler('view_only');
+        UI.addSettingChangeHandler('view_only', UI.updateViewOnly);
+        UI.addSettingChangeHandler('host');
+        UI.addSettingChangeHandler('port');
+        UI.addSettingChangeHandler('path');
+        UI.addSettingChangeHandler('repeaterID');
+        UI.addSettingChangeHandler('logging');
+        UI.addSettingChangeHandler('logging', UI.updateLogging);
+        UI.addSettingChangeHandler('reconnect');
+        UI.addSettingChangeHandler('reconnect_delay');
+    },
+
+    addFullscreenHandlers: function() {
+        document.getElementById("noVNC_fullscreen_button")
+            .addEventListener('click', UI.toggleFullscreen);
+
+        window.addEventListener('fullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('mozfullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('webkitfullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('msfullscreenchange', UI.updateFullscreenButton);
+    },
+
+/* ------^-------
+ * /EVENT HANDLERS
+ * ==============
+ *     VISUAL
+ * ------v------*/
+
+    // Disable/enable controls depending on connection state
+    updateVisualState: function(state) {
+
+        document.documentElement.classList.remove("noVNC_connecting");
+        document.documentElement.classList.remove("noVNC_connected");
+        document.documentElement.classList.remove("noVNC_disconnecting");
+        document.documentElement.classList.remove("noVNC_reconnecting");
+
+        let transition_elem = document.getElementById("noVNC_transition_text");
+        switch (state) {
+            case 'init':
+                break;
+            case 'connecting':
+                transition_elem.textContent = _("Connecting...");
+                document.documentElement.classList.add("noVNC_connecting");
+                break;
+            case 'connected':
+                document.documentElement.classList.add("noVNC_connected");
+                break;
+            case 'disconnecting':
+                transition_elem.textContent = _("Disconnecting...");
+                document.documentElement.classList.add("noVNC_disconnecting");
+                break;
+            case 'disconnected':
+                break;
+            case 'reconnecting':
+                transition_elem.textContent = _("Reconnecting...");
+                document.documentElement.classList.add("noVNC_reconnecting");
+                break;
+            default:
+                Log.Error("Invalid visual state: " + state);
+                UI.showStatus(_("Internal error"), 'error');
+                return;
+        }
+
+        UI.enableDisableViewClip();
+
+        if (UI.connected) {
+            UI.disableSetting('encrypt');
+            UI.disableSetting('shared');
+            UI.disableSetting('host');
+            UI.disableSetting('port');
+            UI.disableSetting('path');
+            UI.disableSetting('repeaterID');
+            UI.setMouseButton(1);
+
+            // Hide the controlbar after 2 seconds
+            UI.closeControlbarTimeout = setTimeout(UI.closeControlbar, 2000);
+        } else {
+            UI.enableSetting('encrypt');
+            UI.enableSetting('shared');
+            UI.enableSetting('host');
+            UI.enableSetting('port');
+            UI.enableSetting('path');
+            UI.enableSetting('repeaterID');
+            UI.updatePowerButton();
+            UI.keepControlbar();
+        }
+
+        // State change disables viewport dragging.
+        // It is enabled (toggled) by direct click on the button
+        UI.setViewDrag(false);
+
+        // State change also closes the password dialog
+        document.getElementById('noVNC_password_dlg')
+            .classList.remove('noVNC_open');
+    },
+
+    showStatus: function(text, status_type, time) {
+        var statusElem = document.getElementById('noVNC_status');
+
+        clearTimeout(UI.statusTimeout);
+
+        if (typeof status_type === 'undefined') {
+            status_type = 'normal';
+        }
+
+        // Don't overwrite more severe visible statuses and never
+        // errors. Only shows the first error.
+        let visible_status_type = 'none';
+        if (statusElem.classList.contains("noVNC_open")) {
+            if (statusElem.classList.contains("noVNC_status_error")) {
+                visible_status_type = 'error';
+            } else if (statusElem.classList.contains("noVNC_status_warn")) {
+                visible_status_type = 'warn';
+            } else {
+                visible_status_type = 'normal';
+            }
+        }
+        if (visible_status_type === 'error' ||
+            (visible_status_type === 'warn' && status_type === 'normal')) {
+            return;
+        }
+
+        switch (status_type) {
+            case 'error':
+                statusElem.classList.remove("noVNC_status_warn");
+                statusElem.classList.remove("noVNC_status_normal");
+                statusElem.classList.add("noVNC_status_error");
+                break;
+            case 'warning':
+            case 'warn':
+                statusElem.classList.remove("noVNC_status_error");
+                statusElem.classList.remove("noVNC_status_normal");
+                statusElem.classList.add("noVNC_status_warn");
+                break;
+            case 'normal':
+            case 'info':
+            default:
+                statusElem.classList.remove("noVNC_status_error");
+                statusElem.classList.remove("noVNC_status_warn");
+                statusElem.classList.add("noVNC_status_normal");
+                break;
+        }
+
+        statusElem.textContent = text;
+        statusElem.classList.add("noVNC_open");
+
+        // If no time was specified, show the status for 1.5 seconds
+        if (typeof time === 'undefined') {
+            time = 1500;
+        }
+
+        // Error messages do not timeout
+        if (status_type !== 'error') {
+            UI.statusTimeout = window.setTimeout(UI.hideStatus, time);
+        }
+    },
+
+    hideStatus: function() {
+        clearTimeout(UI.statusTimeout);
+        document.getElementById('noVNC_status').classList.remove("noVNC_open");
+    },
+
+    activateControlbar: function(event) {
+        clearTimeout(UI.idleControlbarTimeout);
+        // We manipulate the anchor instead of the actual control
+        // bar in order to avoid creating new a stacking group
+        document.getElementById('noVNC_control_bar_anchor')
+            .classList.remove("noVNC_idle");
+        UI.idleControlbarTimeout = window.setTimeout(UI.idleControlbar, 2000);
+    },
+
+    idleControlbar: function() {
+        document.getElementById('noVNC_control_bar_anchor')
+            .classList.add("noVNC_idle");
+    },
+
+    keepControlbar: function() {
+        clearTimeout(UI.closeControlbarTimeout);
+    },
+
+    openControlbar: function() {
+        document.getElementById('noVNC_control_bar')
+            .classList.add("noVNC_open");
+    },
+
+    closeControlbar: function() {
+        UI.closeAllPanels();
+        document.getElementById('noVNC_control_bar')
+            .classList.remove("noVNC_open");
+    },
+
+    toggleControlbar: function() {
+        if (document.getElementById('noVNC_control_bar')
+            .classList.contains("noVNC_open")) {
+            UI.closeControlbar();
+        } else {
+            UI.openControlbar();
+        }
+    },
+
+    toggleControlbarSide: function () {
+        // Temporarily disable animation to avoid weird movement
+        var bar = document.getElementById('noVNC_control_bar');
+        bar.style.transitionDuration = '0s';
+        bar.addEventListener('transitionend', function () { this.style.transitionDuration = ""; });
+
+        var anchor = document.getElementById('noVNC_control_bar_anchor');
+        if (anchor.classList.contains("noVNC_right")) {
+            WebUtil.writeSetting('controlbar_pos', 'left');
+            anchor.classList.remove("noVNC_right");
+        } else {
+            WebUtil.writeSetting('controlbar_pos', 'right');
+            anchor.classList.add("noVNC_right");
+        }
+
+        // Consider this a movement of the handle
+        UI.controlbarDrag = true;
+    },
+
+    showControlbarHint: function (show) {
+        var hint = document.getElementById('noVNC_control_bar_hint');
+        if (show) {
+            hint.classList.add("noVNC_active");
+        } else {
+            hint.classList.remove("noVNC_active");
+        }
+    },
+
+    dragControlbarHandle: function (e) {
+        if (!UI.controlbarGrabbed) return;
+
+        var ptr = getPointerEvent(e);
+
+        var anchor = document.getElementById('noVNC_control_bar_anchor');
+        if (ptr.clientX < (window.innerWidth * 0.1)) {
+            if (anchor.classList.contains("noVNC_right")) {
+                UI.toggleControlbarSide();
+            }
+        } else if (ptr.clientX > (window.innerWidth * 0.9)) {
+            if (!anchor.classList.contains("noVNC_right")) {
+                UI.toggleControlbarSide();
+            }
+        }
+
+        if (!UI.controlbarDrag) {
+            // The goal is to trigger on a certain physical width, the
+            // devicePixelRatio brings us a bit closer but is not optimal.
+            var dragThreshold = 10 * (window.devicePixelRatio || 1);
+            var dragDistance = Math.abs(ptr.clientY - UI.controlbarMouseDownClientY);
+
+            if (dragDistance < dragThreshold) return;
+
+            UI.controlbarDrag = true;
+        }
+
+        var eventY = ptr.clientY - UI.controlbarMouseDownOffsetY;
+
+        UI.moveControlbarHandle(eventY);
+
+        e.preventDefault();
+        e.stopPropagation();
+        UI.keepControlbar();
+        UI.activateControlbar();
+    },
+
+    // Move the handle but don't allow any position outside the bounds
+    moveControlbarHandle: function (viewportRelativeY) {
+        var handle = document.getElementById("noVNC_control_bar_handle");
+        var handleHeight = handle.getBoundingClientRect().height;
+        var controlbarBounds = document.getElementById("noVNC_control_bar")
+            .getBoundingClientRect();
+        var margin = 10;
+
+        // These heights need to be non-zero for the below logic to work
+        if (handleHeight === 0 || controlbarBounds.height === 0) {
+            return;
+        }
+
+        var newY = viewportRelativeY;
+
+        // Check if the coordinates are outside the control bar
+        if (newY < controlbarBounds.top + margin) {
+            // Force coordinates to be below the top of the control bar
+            newY = controlbarBounds.top + margin;
+
+        } else if (newY > controlbarBounds.top +
+                   controlbarBounds.height - handleHeight - margin) {
+            // Force coordinates to be above the bottom of the control bar
+            newY = controlbarBounds.top +
+                controlbarBounds.height - handleHeight - margin;
+        }
+
+        // Corner case: control bar too small for stable position
+        if (controlbarBounds.height < (handleHeight + margin * 2)) {
+            newY = controlbarBounds.top +
+                (controlbarBounds.height - handleHeight) / 2;
+        }
+
+        // The transform needs coordinates that are relative to the parent
+        var parentRelativeY = newY - controlbarBounds.top;
+        handle.style.transform = "translateY(" + parentRelativeY + "px)";
+    },
+
+    updateControlbarHandle: function () {
+        // Since the control bar is fixed on the viewport and not the page,
+        // the move function expects coordinates relative the the viewport.
+        var handle = document.getElementById("noVNC_control_bar_handle");
+        var handleBounds = handle.getBoundingClientRect();
+        UI.moveControlbarHandle(handleBounds.top);
+    },
+
+    controlbarHandleMouseUp: function(e) {
+        if ((e.type == "mouseup") && (e.button != 0)) return;
+
+        // mouseup and mousedown on the same place toggles the controlbar
+        if (UI.controlbarGrabbed && !UI.controlbarDrag) {
+            UI.toggleControlbar();
+            e.preventDefault();
+            e.stopPropagation();
+            UI.keepControlbar();
+            UI.activateControlbar();
+        }
+        UI.controlbarGrabbed = false;
+        UI.showControlbarHint(false);
+    },
+
+    controlbarHandleMouseDown: function(e) {
+        if ((e.type == "mousedown") && (e.button != 0)) return;
+
+        var ptr = getPointerEvent(e);
+
+        var handle = document.getElementById("noVNC_control_bar_handle");
+        var bounds = handle.getBoundingClientRect();
+
+        // Touch events have implicit capture
+        if (e.type === "mousedown") {
+            setCapture(handle);
+        }
+
+        UI.controlbarGrabbed = true;
+        UI.controlbarDrag = false;
+
+        UI.showControlbarHint(true);
+
+        UI.controlbarMouseDownClientY = ptr.clientY;
+        UI.controlbarMouseDownOffsetY = ptr.clientY - bounds.top;
+        e.preventDefault();
+        e.stopPropagation();
+        UI.keepControlbar();
+        UI.activateControlbar();
+    },
+
+    toggleExpander: function(e) {
+        if (this.classList.contains("noVNC_open")) {
+            this.classList.remove("noVNC_open");
+        } else {
+            this.classList.add("noVNC_open");
+        }
+    },
+
+/* ------^-------
+ *    /VISUAL
+ * ==============
+ *    SETTINGS
+ * ------v------*/
+
+    // Initial page load read/initialization of settings
+    initSetting: function(name, defVal) {
+        // Check Query string followed by cookie
+        var val = WebUtil.getConfigVar(name);
+        if (val === null) {
+            val = WebUtil.readSetting(name, defVal);
+        }
+        UI.updateSetting(name, val);
+        return val;
+    },
+
+    // Update cookie and form control setting. If value is not set, then
+    // updates from control to current cookie setting.
+    updateSetting: function(name, value) {
+
+        // Save the cookie for this session
+        if (typeof value !== 'undefined') {
+            WebUtil.writeSetting(name, value);
+        }
+
+        // Update the settings control
+        value = UI.getSetting(name);
+
+        var ctrl = document.getElementById('noVNC_setting_' + name);
+        if (ctrl.type === 'checkbox') {
+            ctrl.checked = value;
+
+        } else if (typeof ctrl.options !== 'undefined') {
+            for (var i = 0; i < ctrl.options.length; i += 1) {
+                if (ctrl.options[i].value === value) {
+                    ctrl.selectedIndex = i;
+                    break;
+                }
+            }
+        } else {
+            /*Weird IE9 error leads to 'null' appearring
+            in textboxes instead of ''.*/
+            if (value === null) {
+                value = "";
+            }
+            ctrl.value = value;
+        }
+    },
+
+    // Save control setting to cookie
+    saveSetting: function(name) {
+        var val, ctrl = document.getElementById('noVNC_setting_' + name);
+        if (ctrl.type === 'checkbox') {
+            val = ctrl.checked;
+        } else if (typeof ctrl.options !== 'undefined') {
+            val = ctrl.options[ctrl.selectedIndex].value;
+        } else {
+            val = ctrl.value;
+        }
+        WebUtil.writeSetting(name, val);
+        //Log.Debug("Setting saved '" + name + "=" + val + "'");
+        return val;
+    },
+
+    // Read form control compatible setting from cookie
+    getSetting: function(name) {
+        var ctrl = document.getElementById('noVNC_setting_' + name);
+        var val = WebUtil.readSetting(name);
+        if (typeof val !== 'undefined' && val !== null && ctrl.type === 'checkbox') {
+            if (val.toString().toLowerCase() in {'0':1, 'no':1, 'false':1}) {
+                val = false;
+            } else {
+                val = true;
+            }
+        }
+        return val;
+    },
+
+    // These helpers compensate for the lack of parent-selectors and
+    // previous-sibling-selectors in CSS which are needed when we want to
+    // disable the labels that belong to disabled input elements.
+    disableSetting: function(name) {
+        var ctrl = document.getElementById('noVNC_setting_' + name);
+        ctrl.disabled = true;
+        ctrl.label.classList.add('noVNC_disabled');
+    },
+
+    enableSetting: function(name) {
+        var ctrl = document.getElementById('noVNC_setting_' + name);
+        ctrl.disabled = false;
+        ctrl.label.classList.remove('noVNC_disabled');
+    },
+
+/* ------^-------
+ *   /SETTINGS
+ * ==============
+ *    PANELS
+ * ------v------*/
+
+    closeAllPanels: function() {
+        UI.closeSettingsPanel();
+        UI.closePowerPanel();
+        UI.closeClipboardPanel();
+        UI.closeExtraKeys();
+    },
+
+/* ------^-------
+ *   /PANELS
+ * ==============
+ * SETTINGS (panel)
+ * ------v------*/
+
+    openSettingsPanel: function() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        // Refresh UI elements from saved cookies
+        UI.updateSetting('encrypt');
+        UI.updateSetting('view_clip');
+        UI.updateSetting('resize');
+        UI.updateSetting('shared');
+        UI.updateSetting('view_only');
+        UI.updateSetting('path');
+        UI.updateSetting('repeaterID');
+        UI.updateSetting('logging');
+        UI.updateSetting('reconnect');
+        UI.updateSetting('reconnect_delay');
+
+        document.getElementById('noVNC_settings')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_settings_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeSettingsPanel: function() {
+        document.getElementById('noVNC_settings')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_settings_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleSettingsPanel: function() {
+        if (document.getElementById('noVNC_settings')
+            .classList.contains("noVNC_open")) {
+            UI.closeSettingsPanel();
+        } else {
+            UI.openSettingsPanel();
+        }
+    },
+
+/* ------^-------
+ *   /SETTINGS
+ * ==============
+ *     POWER
+ * ------v------*/
+
+    openPowerPanel: function() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_power')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_power_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closePowerPanel: function() {
+        document.getElementById('noVNC_power')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_power_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    togglePowerPanel: function() {
+        if (document.getElementById('noVNC_power')
+            .classList.contains("noVNC_open")) {
+            UI.closePowerPanel();
+        } else {
+            UI.openPowerPanel();
+        }
+    },
+
+    // Disable/enable power button
+    updatePowerButton: function() {
+        if (UI.connected &&
+            UI.rfb.capabilities.power &&
+            !UI.rfb.viewOnly) {
+            document.getElementById('noVNC_power_button')
+                .classList.remove("noVNC_hidden");
+        } else {
+            document.getElementById('noVNC_power_button')
+                .classList.add("noVNC_hidden");
+            // Close power panel if open
+            UI.closePowerPanel();
+        }
+    },
+
+/* ------^-------
+ *    /POWER
+ * ==============
+ *   CLIPBOARD
+ * ------v------*/
+
+    openClipboardPanel: function() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_clipboard')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_clipboard_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeClipboardPanel: function() {
+        document.getElementById('noVNC_clipboard')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_clipboard_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleClipboardPanel: function() {
+        if (document.getElementById('noVNC_clipboard')
+            .classList.contains("noVNC_open")) {
+            UI.closeClipboardPanel();
+        } else {
+            UI.openClipboardPanel();
+        }
+    },
+
+    clipboardReceive: function(e) {
+        Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0,40) + "...");
+        document.getElementById('noVNC_clipboard_text').value = e.detail.text;
+        Log.Debug("<< UI.clipboardReceive");
+    },
+
+    clipboardClear: function() {
+        document.getElementById('noVNC_clipboard_text').value = "";
+        UI.rfb.clipboardPasteFrom("");
+    },
+
+    clipboardSend: function() {
+        var text = document.getElementById('noVNC_clipboard_text').value;
+        Log.Debug(">> UI.clipboardSend: " + text.substr(0,40) + "...");
+        UI.rfb.clipboardPasteFrom(text);
+        Log.Debug("<< UI.clipboardSend");
+    },
+
+/* ------^-------
+ *  /CLIPBOARD
+ * ==============
+ *  CONNECTION
+ * ------v------*/
+
+    openConnectPanel: function() {
+        document.getElementById('noVNC_connect_dlg')
+            .classList.add("noVNC_open");
+    },
+
+    closeConnectPanel: function() {
+        document.getElementById('noVNC_connect_dlg')
+            .classList.remove("noVNC_open");
+    },
+
+    connect: function(event, password) {
+
+        // Ignore when rfb already exists
+        if (typeof UI.rfb !== 'undefined') {
+            return;
+        }
+
+        var host = UI.getSetting('host');
+        var port = UI.getSetting('port');
+        var path = UI.getSetting('path');
+
+        if (typeof password === 'undefined') {
+            password = WebUtil.getConfigVar('password');
+            UI.reconnect_password = password;
+        }
+
+        if (password === null) {
+            password = undefined;
+        }
+
+        UI.hideStatus();
+
+        if (!host) {
+            Log.Error("Can't connect when host is: " + host);
+            UI.showStatus(_("Must set host"), 'error');
+            return;
+        }
+
+        UI.closeAllPanels();
+        UI.closeConnectPanel();
+
+        UI.updateVisualState('connecting');
+
+        var url;
+
+        url = UI.getSetting('encrypt') ? 'wss' : 'ws';
+
+        url += '://' + host;
+        if(port) {
+            url += ':' + port;
+        }
+        url += '/' + path;
+
+        UI.rfb = new RFB(document.getElementById('noVNC_container'), url,
+                         { shared: UI.getSetting('shared'),
+                           repeaterID: UI.getSetting('repeaterID'),
+                           credentials: { password: password } });
+        UI.rfb.addEventListener("connect", UI.connectFinished);
+        UI.rfb.addEventListener("disconnect", UI.disconnectFinished);
+        UI.rfb.addEventListener("credentialsrequired", UI.credentials);
+        UI.rfb.addEventListener("securityfailure", UI.securityFailed);
+        UI.rfb.addEventListener("capabilities", function () { UI.updatePowerButton(); });
+        UI.rfb.addEventListener("clipboard", UI.clipboardReceive);
+        UI.rfb.addEventListener("bell", UI.bell);
+        UI.rfb.addEventListener("desktopname", UI.updateDesktopName);
+        UI.rfb.clipViewport = UI.getSetting('view_clip');
+        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
+        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
+
+        UI.updateViewOnly(); // requires UI.rfb
+    },
+
+    disconnect: function() {
+        UI.closeAllPanels();
+        UI.rfb.disconnect();
+
+        UI.connected = false;
+
+        // Disable automatic reconnecting
+        UI.inhibit_reconnect = true;
+
+        UI.updateVisualState('disconnecting');
+
+        // Don't display the connection settings until we're actually disconnected
+    },
+
+    reconnect: function() {
+        UI.reconnect_callback = null;
+
+        // if reconnect has been disabled in the meantime, do nothing.
+        if (UI.inhibit_reconnect) {
+            return;
+        }
+
+        UI.connect(null, UI.reconnect_password);
+    },
+
+    cancelReconnect: function() {
+        if (UI.reconnect_callback !== null) {
+            clearTimeout(UI.reconnect_callback);
+            UI.reconnect_callback = null;
+        }
+
+        UI.updateVisualState('disconnected');
+
+        UI.openControlbar();
+        UI.openConnectPanel();
+    },
+
+    connectFinished: function (e) {
+        UI.connected = true;
+        UI.inhibit_reconnect = false;
+
+        let msg;
+        if (UI.getSetting('encrypt')) {
+            msg = _("Connected (encrypted) to ") + UI.desktopName;
+        } else {
+            msg = _("Connected (unencrypted) to ") + UI.desktopName;
+        }
+        UI.showStatus(msg);
+        UI.updateVisualState('connected');
+
+        // Do this last because it can only be used on rendered elements
+        UI.rfb.focus();
+    },
+
+    disconnectFinished: function (e) {
+        let wasConnected = UI.connected;
+
+        // This variable is ideally set when disconnection starts, but
+        // when the disconnection isn't clean or if it is initiated by
+        // the server, we need to do it here as well since
+        // UI.disconnect() won't be used in those cases.
+        UI.connected = false;
+
+        UI.rfb = undefined;
+
+        if (!e.detail.clean) {
+            UI.updateVisualState('disconnected');
+            if (wasConnected) {
+                UI.showStatus(_("Something went wrong, connection is closed"),
+                              'error');
+            } else {
+                UI.showStatus(_("Failed to connect to server"), 'error');
+            }
+        } else if (UI.getSetting('reconnect', false) === true && !UI.inhibit_reconnect) {
+            UI.updateVisualState('reconnecting');
+
+            var delay = parseInt(UI.getSetting('reconnect_delay'));
+            UI.reconnect_callback = setTimeout(UI.reconnect, delay);
+            return;
+        } else {
+            UI.updateVisualState('disconnected');
+            UI.showStatus(_("Disconnected"), 'normal');
+        }
+
+        UI.openControlbar();
+        UI.openConnectPanel();
+    },
+
+    securityFailed: function (e) {
+        let msg = "";
+        // On security failures we might get a string with a reason
+        // directly from the server. Note that we can't control if
+        // this string is translated or not.
+        if ('reason' in e.detail) {
+            msg = _("New connection has been rejected with reason: ") +
+                e.detail.reason;
+        } else {
+            msg = _("New connection has been rejected");
+        }
+        UI.showStatus(msg, 'error');
+    },
+
+/* ------^-------
+ *  /CONNECTION
+ * ==============
+ *   PASSWORD
+ * ------v------*/
+
+    credentials: function(e) {
+        // FIXME: handle more types
+        document.getElementById('noVNC_password_dlg')
+            .classList.add('noVNC_open');
+
+        setTimeout(function () {
+                document.getElementById('noVNC_password_input').focus();
+            }, 100);
+
+        Log.Warn("Server asked for a password");
+        UI.showStatus(_("Password is required"), "warning");
+    },
+
+    setPassword: function(e) {
+        // Prevent actually submitting the form
+        e.preventDefault();
+
+        var inputElem = document.getElementById('noVNC_password_input');
+        var password = inputElem.value;
+        // Clear the input after reading the password
+        inputElem.value = "";
+        UI.rfb.sendCredentials({ password: password });
+        UI.reconnect_password = password;
+        document.getElementById('noVNC_password_dlg')
+            .classList.remove('noVNC_open');
+    },
+
+/* ------^-------
+ *  /PASSWORD
+ * ==============
+ *   FULLSCREEN
+ * ------v------*/
+
+    toggleFullscreen: function() {
+        if (document.fullscreenElement || // alternative standard method
+            document.mozFullScreenElement || // currently working methods
+            document.webkitFullscreenElement ||
+            document.msFullscreenElement) {
+            if (document.exitFullscreen) {
+                document.exitFullscreen();
+            } else if (document.mozCancelFullScreen) {
+                document.mozCancelFullScreen();
+            } else if (document.webkitExitFullscreen) {
+                document.webkitExitFullscreen();
+            } else if (document.msExitFullscreen) {
+                document.msExitFullscreen();
+            }
+        } else {
+            if (document.documentElement.requestFullscreen) {
+                document.documentElement.requestFullscreen();
+            } else if (document.documentElement.mozRequestFullScreen) {
+                document.documentElement.mozRequestFullScreen();
+            } else if (document.documentElement.webkitRequestFullscreen) {
+                document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
+            } else if (document.body.msRequestFullscreen) {
+                document.body.msRequestFullscreen();
+            }
+        }
+        UI.enableDisableViewClip();
+        UI.updateFullscreenButton();
+    },
+
+    updateFullscreenButton: function() {
+        if (document.fullscreenElement || // alternative standard method
+            document.mozFullScreenElement || // currently working methods
+            document.webkitFullscreenElement ||
+            document.msFullscreenElement ) {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.add("noVNC_selected");
+        } else {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.remove("noVNC_selected");
+        }
+    },
+
+/* ------^-------
+ *  /FULLSCREEN
+ * ==============
+ *     RESIZE
+ * ------v------*/
+
+    // Apply remote resizing or local scaling
+    applyResizeMode: function() {
+        if (!UI.rfb) return;
+
+        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
+        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
+    },
+
+/* ------^-------
+ *    /RESIZE
+ * ==============
+ * VIEW CLIPPING
+ * ------v------*/
+
+    // Update parameters that depend on the viewport clip setting
+    updateViewClip: function() {
+        if (!UI.rfb) return;
+
+        var cur_clip = UI.rfb.clipViewport;
+        var new_clip = UI.getSetting('view_clip');
+
+        if (isTouchDevice) {
+            // Touch devices usually have shit scrollbars
+            new_clip = true;
+        }
+
+        if (cur_clip !== new_clip) {
+            UI.rfb.clipViewport = new_clip;
+        }
+
+        // Changing the viewport may change the state of
+        // the dragging button
+        UI.updateViewDrag();
+    },
+
+    // Handle special cases where viewport clipping is forced on/off or locked
+    enableDisableViewClip: function() {
+        var resizeSetting = UI.getSetting('resize');
+        // Disable clipping if we are scaling, connected or on touch
+        if (resizeSetting === 'scale' ||
+            isTouchDevice) {
+            UI.disableSetting('view_clip');
+        } else {
+            UI.enableSetting('view_clip');
+        }
+    },
+
+/* ------^-------
+ * /VIEW CLIPPING
+ * ==============
+ *    VIEWDRAG
+ * ------v------*/
+
+    toggleViewDrag: function() {
+        if (!UI.rfb) return;
+
+        var drag = UI.rfb.dragViewport;
+        UI.setViewDrag(!drag);
+     },
+
+    // Set the view drag mode which moves the viewport on mouse drags
+    setViewDrag: function(drag) {
+        if (!UI.rfb) return;
+
+        UI.rfb.dragViewport = drag;
+
+        UI.updateViewDrag();
+    },
+
+    updateViewDrag: function() {
+        if (!UI.connected) return;
+
+        var viewDragButton = document.getElementById('noVNC_view_drag_button');
+
+        if (!UI.rfb.clipViewport && UI.rfb.dragViewport) {
+            // We are no longer clipping the viewport. Make sure
+            // viewport drag isn't active when it can't be used.
+            UI.rfb.dragViewport = false;
+        }
+
+        if (UI.rfb.dragViewport) {
+            viewDragButton.classList.add("noVNC_selected");
+        } else {
+            viewDragButton.classList.remove("noVNC_selected");
+        }
+
+        // Different behaviour for touch vs non-touch
+        // The button is disabled instead of hidden on touch devices
+        if (isTouchDevice) {
+            viewDragButton.classList.remove("noVNC_hidden");
+
+            if (UI.rfb.clipViewport) {
+                viewDragButton.disabled = false;
+            } else {
+                viewDragButton.disabled = true;
+            }
+        } else {
+            viewDragButton.disabled = false;
+
+            if (UI.rfb.clipViewport) {
+                viewDragButton.classList.remove("noVNC_hidden");
+            } else {
+                viewDragButton.classList.add("noVNC_hidden");
+            }
+        }
+    },
+
+/* ------^-------
+ *   /VIEWDRAG
+ * ==============
+ *    KEYBOARD
+ * ------v------*/
+
+    showVirtualKeyboard: function() {
+        if (!isTouchDevice) return;
+
+        var input = document.getElementById('noVNC_keyboardinput');
+
+        if (document.activeElement == input) return;
+
+        input.focus();
+
+        try {
+            var l = input.value.length;
+            // Move the caret to the end
+            input.setSelectionRange(l, l);
+        } catch (err) {} // setSelectionRange is undefined in Google Chrome
+    },
+
+    hideVirtualKeyboard: function() {
+        if (!isTouchDevice) return;
+
+        var input = document.getElementById('noVNC_keyboardinput');
+
+        if (document.activeElement != input) return;
+
+        input.blur();
+    },
+
+    toggleVirtualKeyboard: function () {
+        if (document.getElementById('noVNC_keyboard_button')
+            .classList.contains("noVNC_selected")) {
+            UI.hideVirtualKeyboard();
+        } else {
+            UI.showVirtualKeyboard();
+        }
+    },
+
+    onfocusVirtualKeyboard: function(event) {
+        document.getElementById('noVNC_keyboard_button')
+            .classList.add("noVNC_selected");
+        if (UI.rfb) {
+            UI.rfb.focusOnClick = false;
+        }
+    },
+
+    onblurVirtualKeyboard: function(event) {
+        document.getElementById('noVNC_keyboard_button')
+            .classList.remove("noVNC_selected");
+        if (UI.rfb) {
+            UI.rfb.focusOnClick = true;
+        }
+    },
+
+    keepVirtualKeyboard: function(event) {
+        var input = document.getElementById('noVNC_keyboardinput');
+
+        // Only prevent focus change if the virtual keyboard is active
+        if (document.activeElement != input) {
+            return;
+        }
+
+        // Only allow focus to move to other elements that need
+        // focus to function properly
+        if (event.target.form !== undefined) {
+            switch (event.target.type) {
+                case 'text':
+                case 'email':
+                case 'search':
+                case 'password':
+                case 'tel':
+                case 'url':
+                case 'textarea':
+                case 'select-one':
+                case 'select-multiple':
+                    return;
+            }
+        }
+
+        event.preventDefault();
+    },
+
+    keyboardinputReset: function() {
+        var kbi = document.getElementById('noVNC_keyboardinput');
+        kbi.value = new Array(UI.defaultKeyboardinputLen).join("_");
+        UI.lastKeyboardinput = kbi.value;
+    },
+
+    keyEvent: function (keysym, code, down) {
+        if (!UI.rfb) return;
+
+        UI.rfb.sendKey(keysym, code, down);
+    },
+
+    // When normal keyboard events are left uncought, use the input events from
+    // the keyboardinput element instead and generate the corresponding key events.
+    // This code is required since some browsers on Android are inconsistent in
+    // sending keyCodes in the normal keyboard events when using on screen keyboards.
+    keyInput: function(event) {
+
+        if (!UI.rfb) return;
+
+        var newValue = event.target.value;
+
+        if (!UI.lastKeyboardinput) {
+            UI.keyboardinputReset();
+        }
+        var oldValue = UI.lastKeyboardinput;
+
+        var newLen;
+        try {
+            // Try to check caret position since whitespace at the end
+            // will not be considered by value.length in some browsers
+            newLen = Math.max(event.target.selectionStart, newValue.length);
+        } catch (err) {
+            // selectionStart is undefined in Google Chrome
+            newLen = newValue.length;
+        }
+        var oldLen = oldValue.length;
+
+        var backspaces;
+        var inputs = newLen - oldLen;
+        if (inputs < 0) {
+            backspaces = -inputs;
+        } else {
+            backspaces = 0;
+        }
+
+        // Compare the old string with the new to account for
+        // text-corrections or other input that modify existing text
+        var i;
+        for (i = 0; i < Math.min(oldLen, newLen); i++) {
+            if (newValue.charAt(i) != oldValue.charAt(i)) {
+                inputs = newLen - i;
+                backspaces = oldLen - i;
+                break;
+            }
+        }
+
+        // Send the key events
+        for (i = 0; i < backspaces; i++) {
+            UI.rfb.sendKey(KeyTable.XK_BackSpace, "Backspace");
+        }
+        for (i = newLen - inputs; i < newLen; i++) {
+            UI.rfb.sendKey(keysyms.lookup(newValue.charCodeAt(i)));
+        }
+
+        // Control the text content length in the keyboardinput element
+        if (newLen > 2 * UI.defaultKeyboardinputLen) {
+            UI.keyboardinputReset();
+        } else if (newLen < 1) {
+            // There always have to be some text in the keyboardinput
+            // element with which backspace can interact.
+            UI.keyboardinputReset();
+            // This sometimes causes the keyboard to disappear for a second
+            // but it is required for the android keyboard to recognize that
+            // text has been added to the field
+            event.target.blur();
+            // This has to be ran outside of the input handler in order to work
+            setTimeout(event.target.focus.bind(event.target), 0);
+        } else {
+            UI.lastKeyboardinput = newValue;
+        }
+    },
+
+/* ------^-------
+ *   /KEYBOARD
+ * ==============
+ *   EXTRA KEYS
+ * ------v------*/
+
+    openExtraKeys: function() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_modifiers')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_toggle_extra_keys_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeExtraKeys: function() {
+        document.getElementById('noVNC_modifiers')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_toggle_extra_keys_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleExtraKeys: function() {
+        if(document.getElementById('noVNC_modifiers')
+            .classList.contains("noVNC_open")) {
+            UI.closeExtraKeys();
+        } else  {
+            UI.openExtraKeys();
+        }
+    },
+
+    sendEsc: function() {
+        UI.rfb.sendKey(KeyTable.XK_Escape, "Escape");
+    },
+
+    sendTab: function() {
+        UI.rfb.sendKey(KeyTable.XK_Tab);
+    },
+
+    toggleCtrl: function() {
+        var btn = document.getElementById('noVNC_toggle_ctrl_button');
+        if (btn.classList.contains("noVNC_selected")) {
+            UI.rfb.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
+            btn.classList.remove("noVNC_selected");
+        } else {
+            UI.rfb.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
+            btn.classList.add("noVNC_selected");
+        }
+    },
+
+    toggleAlt: function() {
+        var btn = document.getElementById('noVNC_toggle_alt_button');
+        if (btn.classList.contains("noVNC_selected")) {
+            UI.rfb.sendKey(KeyTable.XK_Alt_L, "AltLeft", false);
+            btn.classList.remove("noVNC_selected");
+        } else {
+            UI.rfb.sendKey(KeyTable.XK_Alt_L, "AltLeft", true);
+            btn.classList.add("noVNC_selected");
+        }
+    },
+
+    sendCtrlAltDel: function() {
+        UI.rfb.sendCtrlAltDel();
+    },
+
+/* ------^-------
+ *   /EXTRA KEYS
+ * ==============
+ *     MISC
+ * ------v------*/
+
+    setMouseButton: function(num) {
+        var view_only = UI.rfb.viewOnly;
+        if (UI.rfb && !view_only) {
+            UI.rfb.touchButton = num;
+        }
+
+        var blist = [0, 1,2,4];
+        for (var b = 0; b < blist.length; b++) {
+            var button = document.getElementById('noVNC_mouse_button' +
+                                                 blist[b]);
+            if (blist[b] === num && !view_only) {
+                button.classList.remove("noVNC_hidden");
+            } else {
+                button.classList.add("noVNC_hidden");
+            }
+        }
+    },
+
+    updateViewOnly: function() {
+        if (!UI.rfb) return;
+        UI.rfb.viewOnly = UI.getSetting('view_only');
+
+        // Hide input related buttons in view only mode
+        if (UI.rfb.viewOnly) {
+            document.getElementById('noVNC_keyboard_button')
+                .classList.add('noVNC_hidden');
+            document.getElementById('noVNC_toggle_extra_keys_button')
+                .classList.add('noVNC_hidden');
+        } else {
+            document.getElementById('noVNC_keyboard_button')
+                .classList.remove('noVNC_hidden');
+            document.getElementById('noVNC_toggle_extra_keys_button')
+                .classList.remove('noVNC_hidden');
+        }
+        UI.setMouseButton(1); //has it's own logic for hiding/showing
+    },
+
+    updateLogging: function() {
+        WebUtil.init_logging(UI.getSetting('logging'));
+    },
+
+    updateDesktopName: function(e) {
+        UI.desktopName = e.detail.name;
+        // Display the desktop name in the document title
+        document.title = e.detail.name + " - noVNC";
+    },
+
+    bell: function(e) {
+        if (WebUtil.getConfigVar('bell', 'on') === 'on') {
+            var promise = document.getElementById('noVNC_bell').play();
+            // The standards disagree on the return value here
+            if (promise) {
+                promise.catch(function(e) {
+                    if (e.name === "NotAllowedError") {
+                        // Ignore when the browser doesn't let us play audio.
+                        // It is common that the browsers require audio to be
+                        // initiated from a user action.
+                    } else {
+                        Log.Error("Unable to play bell: " + e);
+                    }
+                });
+            }
+        }
+    },
+
+    //Helper to add options to dropdown.
+    addOption: function(selectbox, text, value) {
+        var optn = document.createElement("OPTION");
+        optn.text = text;
+        optn.value = value;
+        selectbox.options.add(optn);
+    },
+
+/* ------^-------
+ *    /MISC
+ * ==============
+ */
+};
+
+// Set up translations
+var LINGUAS = ["de", "el", "es", "nl", "pl", "sv", "tr", "zh"];
+l10n.setup(LINGUAS);
+if (l10n.language !== "en" && l10n.dictionary === undefined) {
+    WebUtil.fetchJSON('app/locale/' + l10n.language + '.json', function (translations) {
+        l10n.dictionary = translations;
+
+        // wait for translations to load before loading the UI
+        UI.prime();
+    }, function (err) {
+        Log.Error("Failed to load translations: " + err);
+        UI.prime();
+    });
+} else {
+    UI.prime();
+}
+
+export default UI;

+ 230 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/app/webutil.js

@@ -0,0 +1,230 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2012 Joel Martin
+ * Copyright (C) 2013 NTT corp.
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import { init_logging as main_init_logging } from '../core/util/logging.js';
+
+// init log level reading the logging HTTP param
+export function init_logging (level) {
+    "use strict";
+    if (typeof level !== "undefined") {
+        main_init_logging(level);
+    } else {
+        var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/);
+        main_init_logging(param || undefined);
+    }
+};
+
+// Read a query string variable
+export function getQueryVar (name, defVal) {
+    "use strict";
+    var re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
+        match = document.location.href.match(re);
+    if (typeof defVal === 'undefined') { defVal = null; }
+    if (match) {
+        return decodeURIComponent(match[1]);
+    } else {
+        return defVal;
+    }
+};
+
+// Read a hash fragment variable
+export function getHashVar (name, defVal) {
+    "use strict";
+    var re = new RegExp('.*[&#]' + name + '=([^&]*)'),
+        match = document.location.hash.match(re);
+    if (typeof defVal === 'undefined') { defVal = null; }
+    if (match) {
+        return decodeURIComponent(match[1]);
+    } else {
+        return defVal;
+    }
+};
+
+// Read a variable from the fragment or the query string
+// Fragment takes precedence
+export function getConfigVar (name, defVal) {
+    "use strict";
+    var val = getHashVar(name);
+    if (val === null) {
+        val = getQueryVar(name, defVal);
+    }
+    return val;
+};
+
+/*
+ * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
+ */
+
+// No days means only for this browser session
+export function createCookie (name, value, days) {
+    "use strict";
+    var date, expires;
+    if (days) {
+        date = new Date();
+        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+        expires = "; expires=" + date.toGMTString();
+    } else {
+        expires = "";
+    }
+
+    var secure;
+    if (document.location.protocol === "https:") {
+        secure = "; secure";
+    } else {
+        secure = "";
+    }
+    document.cookie = name + "=" + value + expires + "; path=/" + secure;
+};
+
+export function readCookie (name, defaultValue) {
+    "use strict";
+    var nameEQ = name + "=",
+        ca = document.cookie.split(';');
+
+    for (var i = 0; i < ca.length; i += 1) {
+        var c = ca[i];
+        while (c.charAt(0) === ' ') { c = c.substring(1, c.length); }
+        if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); }
+    }
+    return (typeof defaultValue !== 'undefined') ? defaultValue : null;
+};
+
+export function eraseCookie (name) {
+    "use strict";
+    createCookie(name, "", -1);
+};
+
+/*
+ * Setting handling.
+ */
+
+var settings = {};
+
+export function initSettings (callback /*, ...callbackArgs */) {
+    "use strict";
+    var callbackArgs = Array.prototype.slice.call(arguments, 1);
+    if (window.chrome && window.chrome.storage) {
+        window.chrome.storage.sync.get(function (cfg) {
+            settings = cfg;
+            if (callback) {
+                callback.apply(this, callbackArgs);
+            }
+        });
+    } else {
+        // No-op
+        if (callback) {
+            callback.apply(this, callbackArgs);
+        }
+    }
+};
+
+// No days means only for this browser session
+export function writeSetting (name, value) {
+    "use strict";
+    if (window.chrome && window.chrome.storage) {
+        if (settings[name] !== value) {
+            settings[name] = value;
+            window.chrome.storage.sync.set(settings);
+        }
+    } else {
+        localStorage.setItem(name, value);
+    }
+};
+
+export function readSetting (name, defaultValue) {
+    "use strict";
+    var value;
+    if (window.chrome && window.chrome.storage) {
+        value = settings[name];
+    } else {
+        value = localStorage.getItem(name);
+    }
+    if (typeof value === "undefined") {
+        value = null;
+    }
+    if (value === null && typeof defaultValue !== "undefined") {
+        return defaultValue;
+    } else {
+        return value;
+    }
+};
+
+export function eraseSetting (name) {
+    "use strict";
+    if (window.chrome && window.chrome.storage) {
+        window.chrome.storage.sync.remove(name);
+        delete settings[name];
+    } else {
+        localStorage.removeItem(name);
+    }
+};
+
+export function injectParamIfMissing (path, param, value) {
+    // force pretend that we're dealing with a relative path
+    // (assume that we wanted an extra if we pass one in)
+    path = "/" + path;
+
+    var elem = document.createElement('a');
+    elem.href = path;
+
+    var param_eq = encodeURIComponent(param) + "=";
+    var query;
+    if (elem.search) {
+        query = elem.search.slice(1).split('&');
+    } else {
+        query = [];
+    }
+
+    if (!query.some(function (v) { return v.startsWith(param_eq); })) {
+        query.push(param_eq + encodeURIComponent(value));
+        elem.search = "?" + query.join("&");
+    }
+
+    // some browsers (e.g. IE11) may occasionally omit the leading slash
+    // in the elem.pathname string. Handle that case gracefully.
+    if (elem.pathname.charAt(0) == "/") {
+        return elem.pathname.slice(1) + elem.search + elem.hash;
+    } else {
+        return elem.pathname + elem.search + elem.hash;
+    }
+};
+
+// sadly, we can't use the Fetch API until we decide to drop
+// IE11 support or polyfill promises and fetch in IE11.
+// resolve will receive an object on success, while reject
+// will receive either an event or an error on failure.
+export function fetchJSON(path, resolve, reject) {
+    // NB: IE11 doesn't support JSON as a responseType
+    var req = new XMLHttpRequest();
+    req.open('GET', path);
+
+    req.onload = function () {
+        if (req.status === 200) {
+            try {
+                var resObj = JSON.parse(req.responseText);
+            } catch (err) {
+                reject(err);
+                return;
+            }
+            resolve(resObj);
+        } else {
+            reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
+        }
+    };
+
+    req.onerror = function (evt) {
+        reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
+    };
+
+    req.ontimeout = function (evt) {
+        reject(new Error("XHR timed out while trying to load '" + path + "'"));
+    };
+
+    req.send();
+}

+ 110 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/base64.js

@@ -0,0 +1,110 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
+
+import * as Log from './util/logging.js';
+
+export default {
+    /* Convert data (an array of integers) to a Base64 string. */
+    toBase64Table : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
+    base64Pad     : '=',
+
+    encode: function (data) {
+        "use strict";
+        var result = '';
+        var toBase64Table = this.toBase64Table;
+        var length = data.length;
+        var lengthpad = (length % 3);
+        // Convert every three bytes to 4 ascii characters.
+
+        for (var i = 0; i < (length - 2); i += 3) {
+            result += toBase64Table[data[i] >> 2];
+            result += toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)];
+            result += toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)];
+            result += toBase64Table[data[i + 2] & 0x3f];
+        }
+
+        // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
+        var j = 0;
+        if (lengthpad === 2) {
+            j = length - lengthpad;
+            result += toBase64Table[data[j] >> 2];
+            result += toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)];
+            result += toBase64Table[(data[j + 1] & 0x0f) << 2];
+            result += toBase64Table[64];
+        } else if (lengthpad === 1) {
+            j = length - lengthpad;
+            result += toBase64Table[data[j] >> 2];
+            result += toBase64Table[(data[j] & 0x03) << 4];
+            result += toBase64Table[64];
+            result += toBase64Table[64];
+        }
+
+        return result;
+    },
+
+    /* Convert Base64 data to a string */
+    toBinaryTable : [
+        -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,62, -1,-1,-1,63,
+        52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
+        -1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
+        15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
+        -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
+        41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
+    ],
+
+    decode: function (data, offset) {
+        "use strict";
+        offset = typeof(offset) !== 'undefined' ? offset : 0;
+        var toBinaryTable = this.toBinaryTable;
+        var base64Pad = this.base64Pad;
+        var result, result_length;
+        var leftbits = 0; // number of bits decoded, but yet to be appended
+        var leftdata = 0; // bits decoded, but yet to be appended
+        var data_length = data.indexOf('=') - offset;
+
+        if (data_length < 0) { data_length = data.length - offset; }
+
+        /* Every four characters is 3 resulting numbers */
+        result_length = (data_length >> 2) * 3 + Math.floor((data_length % 4) / 1.5);
+        result = new Array(result_length);
+
+        // Convert one by one.
+        for (var idx = 0, i = offset; i < data.length; i++) {
+            var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
+            var padding = (data.charAt(i) === base64Pad);
+            // Skip illegal characters and whitespace
+            if (c === -1) {
+                Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i);
+                continue;
+            }
+
+            // Collect data into leftdata, update bitcount
+            leftdata = (leftdata << 6) | c;
+            leftbits += 6;
+
+            // If we have 8 or more bits, append 8 bits to the result
+            if (leftbits >= 8) {
+                leftbits -= 8;
+                // Append if not padding.
+                if (!padding) {
+                    result[idx++] = (leftdata >> leftbits) & 0xff;
+                }
+                leftdata &= (1 << leftbits) - 1;
+            }
+        }
+
+        // If there are any bits left, the base64 string was corrupted
+        if (leftbits) {
+            err = new Error('Corrupted base64 string');
+            err.name = 'Base64-Error';
+            throw err;
+        }
+
+        return result;
+    }
+}; /* End of Base64 namespace */

+ 271 - 0
board/GfA/Display001/rootfs/var/GfA/WebVnc/novnc/core/des.js

@@ -0,0 +1,271 @@
+/*
+ * Ported from Flashlight VNC ActionScript implementation:
+ *     http://www.wizhelp.com/flashlight-vnc/
+ *
+ * Full attribution follows:
+ *
+ * -------------------------------------------------------------------------
+ *
+ * This DES class has been extracted from package Acme.Crypto for use in VNC.
+ * The unnecessary odd parity code has been removed.
+ *
+ * These changes are:
+ *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+
+ * DesCipher - the DES encryption method
+ *
+ * The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
+ *
+ * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
+ * without fee is hereby granted, provided that this copyright notice is kept
+ * intact.
+ *
+ * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
+ * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
+ * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
+ * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
+ * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
+ * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
+ * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
+ * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
+ * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP
+ * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
+ * HIGH RISK ACTIVITIES.
+ *
+ *
+ * The rest is:
+ *
+ * Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
+ *
+ * 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 AUTHOR 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 AUTHOR 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.
+ *
+ * Visit the ACME Labs Java page for up-to-date versions of this and other
+ * fine Java utilities: http://www.acme.com/java/
+ */
+
+export default function DES(passwd) {
+    "use strict";
+
+    // Tables, permutations, S-boxes, etc.
+    var PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
+               25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
+               50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
+        totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28],
+        z = 0x0, a,b,c,d,e,f, SP1,SP2,SP3,SP4,SP5,SP6,SP7,SP8,
+        keys = [];
+
+    a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
+    SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
+           z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
+           a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
+           c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
+    a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
+    SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
+           a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
+           z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
+           z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
+    a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
+    SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
+           b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
+           c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
+           b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
+    a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
+    SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
+           z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
+           b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
+           c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
+    a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
+    SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
+           a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
+           z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
+           c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
+    a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
+    SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
+           z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
+           b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
+           a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
+    a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
+    SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
+           b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
+           b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
+           z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
+    a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
+    SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
+           c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
+           a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
+           z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
+
+    // Set the key.
+    function setKeys(keyBlock) {
+        var i, j, l, m, n, o, pc1m = [], pcr = [], kn = [],
+            raw0, raw1, rawi, KnLi;
+
+        for (j = 0, l = 56; j < 56; ++j, l -= 8) {
+            l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
+            m = l & 0x7;
+            pc1m[j] = ((keyBlock[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
+        }
+
+        for (i = 0; i < 16; ++i) {
+            m = i << 1;
+            n = m + 1;
+            kn[m] = kn[n] = 0;
+            for (o = 28; o < 59; o += 28) {
+                for (j = o - 28; j < o; ++j) {
+                    l = j + totrot[i];
+                    if (l < o) {
+                        pcr[j] = pc1m[l];
+                    } else {
+                        pcr[j] = pc1m[l - 28];
+                    }
+                }
+            }
+            for (j = 0; j < 24; ++j) {
+                if (pcr[PC2[j]] !== 0) {
+                    kn[m] |= 1 << (23 - j);
+                }
+                if (pcr[PC2[j + 24]] !== 0) {
+                    kn[n] |= 1 << (23 - j);
+                }
+            }
+        }
+
+        // cookey
+        for (i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
+            raw0 = kn[rawi++];
+            raw1 = kn[rawi++];
+            keys[KnLi] = (raw0 & 0x00fc0000) << 6;
+            keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
+            keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
+            keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
+            ++KnLi;
+            keys[KnLi] = (raw0 & 0x0003f000) << 12;
+            keys[KnLi] |= (raw0 & 0x0000003f) << 16;
+            keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
+            keys[KnLi] |= (raw1 & 0x0000003f);
+            ++KnLi;
+        }
+    }
+
+    // Encrypt 8 bytes of text
+    function enc8(text) {
+        var i = 0, b = text.slice(), fval, keysi = 0,
+            l, r, x; // left, right, accumulator
+
+        // Squash 8 bytes to 2 ints
+        l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
+        r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
+
+        x = ((l >>> 4) ^ r) & 0x0f0f0f0f;
+        r ^= x;
+        l ^= (x << 4);
+        x = ((l >>> 16) ^ r) & 0x0000ffff;
+        r ^= x;
+        l ^= (x << 16);
+        x = ((r >>> 2) ^ l) & 0x33333333;
+        l ^= x;
+        r ^= (x << 2);
+        x = ((r >>> 8) ^ l) & 0x00ff00ff;
+        l ^= x;
+        r ^= (x << 8);
+        r = (r << 1) | ((r >>> 31) & 1);
+        x = (l ^ r) & 0xaaaaaaaa;
+        l ^= x;
+        r ^= x;
+        l = (l << 1) | ((l >>> 31) & 1);
+
+        for (i = 0; i < 8; ++i) {
+            x = (r << 28) | (r >>> 4);
+            x ^= keys[keysi++];
+            fval =  SP7[x & 0x3f];
+            fval |= SP5[(x >>> 8) & 0x3f];
+            fval |= SP3[(x >>> 16) & 0x3f];
+            fval |= SP1[(x >>> 24) & 0x3f];
+            x = r ^ keys[keysi++];
+            fval |= SP8[x & 0x3f];
+            fval |= SP6[(x >>> 8) & 0x3f];
+            fval |= SP4[(x >>> 16) & 0x3f];
+            fval |= SP2[(x >>> 24) & 0x3f];
+            l ^= fval;
+            x = (l << 28) | (l >>> 4);
+            x ^= keys[keysi++];
+            fval =  SP7[x & 0x3f];
+            fval |= SP5[(x >>> 8) & 0x3f];
+            fval |= SP3[(x >>> 16) & 0x3f];
+            fval |= SP1[(x >>> 24) & 0x3f];
+            x = l ^ keys[keysi++];
+            fval |= SP8[x & 0x0000003f];
+            fval |= SP6[(x >>> 8) & 0x3f];
+            fval |= SP4[(x >>> 16) & 0x3f];
+            fval |= SP2[(x >>> 24) & 0x3f];
+            r ^= fval;
+        }
+
+        r = (r << 31) | (r >>> 1);
+        x = (l ^ r) & 0xaaaaaaaa;
+        l ^= x;
+        r ^= x;
+        l = (l << 31) | (l >>> 1);
+        x = ((l >>> 8) ^ r) & 0x00ff00ff;
+        r ^= x;
+        l ^= (x << 8);
+        x = ((l >>> 2) ^ r) & 0x33333333;
+        r ^= x;
+        l ^= (x << 2);
+        x = ((r >>> 16) ^ l) & 0x0000ffff;
+        l ^= x;
+        r ^= (x << 16);
+        x = ((r >>> 4) ^ l) & 0x0f0f0f0f;
+        l ^= x;
+        r ^= (x << 4);
+
+        // Spread ints to bytes
+        x = [r, l];
+        for (i = 0; i < 8; i++) {
+            b[i] = (x[i>>>2] >>> (8 * (3 - (i % 4)))) % 256;
+            if (b[i] < 0) { b[i] += 256; } // unsigned
+        }
+        return b;
+    }
+
+    // Encrypt 16 bytes of text using passwd as key
+    function encrypt(t) {
+        return enc8(t.slice(0, 8)).concat(enc8(t.slice(8, 16)));
+    }
+
+    setKeys(passwd);             // Setup keys
+    return {'encrypt': encrypt}; // Public interface
+
+}; // function DES

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff