am dd2dac36: am edf631de: Package renamed fonts. [DO NOT MERGE]

* commit 'dd2dac3659cad1594ce3a72f10b1216424b62441':
  Package renamed fonts. [DO NOT MERGE]
diff --git a/build/Android.mk b/build/Android.mk
index 6d0820a..a3f1464 100644
--- a/build/Android.mk
+++ b/build/Android.mk
@@ -124,6 +124,8 @@
     android-support-v7-gridlayout \
     android-support-v7-appcompat \
     android-support-v7-mediarouter \
-    android-support-v13
+    android-support-v7-recyclerview \
+    android-support-v13 \
+    android-support-v17-leanback
 
 $(foreach lib, $(ANDROID_SUPPORT_LIBRARIES), $(eval $(call _package_sdk_library,$(lib))))
diff --git a/build/product_sdk.mk b/build/product_sdk.mk
index a7fc08a..fc74b18 100644
--- a/build/product_sdk.mk
+++ b/build/product_sdk.mk
@@ -30,6 +30,7 @@
 	aapt \
 	adb \
 	aidl \
+	zipalign \
 	bcc_compat \
 	bios.bin \
 	commons-compress-1.0 \
diff --git a/build/sdk-windows-x86.atree b/build/sdk-windows-x86.atree
index a6beab1..7eac71e 100644
--- a/build/sdk-windows-x86.atree
+++ b/build/sdk-windows-x86.atree
@@ -51,6 +51,9 @@
 rm build-tools/${PLATFORM_NAME}/aidl
 bin/aidl.exe                            strip build-tools/${PLATFORM_NAME}/aidl.exe
 
+rm build-tools/${PLATFORM_NAME}/zipalign
+bin/zipalign.exe                        strip build-tools/${PLATFORM_NAME}/zipalign.exe
+
 rm build-tools/${PLATFORM_NAME}/dx
 dalvik/dx/etc/dx.bat                          build-tools/${PLATFORM_NAME}/dx.bat
 rm build-tools/${PLATFORM_NAME}/dexdump
diff --git a/build/sdk.atree b/build/sdk.atree
index ca67afc..d1000f3 100644
--- a/build/sdk.atree
+++ b/build/sdk.atree
@@ -73,6 +73,7 @@
 # build tools from out/host/$(HOST_OS)-$(HOST_ARCH)/
 bin/aapt                                strip build-tools/${PLATFORM_NAME}/aapt
 bin/aidl                                strip build-tools/${PLATFORM_NAME}/aidl
+bin/zipalign                            strip build-tools/${PLATFORM_NAME}/zipalign
 
 # renderscript (cc + headers)
 bin/llvm-rs-cc                          strip build-tools/${PLATFORM_NAME}/llvm-rs-cc
diff --git a/build/windows_sdk_whitelist.mk b/build/windows_sdk_whitelist.mk
index f2f4d8e..548e6fd 100644
--- a/build/windows_sdk_whitelist.mk
+++ b/build/windows_sdk_whitelist.mk
@@ -53,6 +53,7 @@
 	system/core/libcutils \
 	system/core/liblog \
 	system/core/libsparse \
+	system/core/libziparchive \
 	system/core/libzipfile \
 	system/core/libutils \
 	system/extras/ext4_utils
diff --git a/ide/eclipse/.classpath b/ide/eclipse/.classpath
index dda0606..af99325 100644
--- a/ide/eclipse/.classpath
+++ b/ide/eclipse/.classpath
@@ -65,7 +65,12 @@
 	<classpathentry kind="src" path="frameworks/base/packages/SystemUI/src"/>
 	<classpathentry kind="src" path="frameworks/base/policy/src"/>
 	<classpathentry kind="src" path="frameworks/base/sax/java"/>
-	<classpathentry kind="src" path="frameworks/base/services/java"/>
+	<classpathentry kind="src" path="frameworks/base/services/core/java"/>
+        <classpathentry kind="src" path="frameworks/base/services/accessibility/java"/>
+        <classpathentry kind="src" path="frameworks/base/services/print/java"/>
+        <classpathentry kind="src" path="frameworks/base/services/backup/java"/>
+        <classpathentry kind="src" path="frameworks/base/services/devicepolicy/java"/>
+        <classpathentry kind="src" path="frameworks/base/services/appwidget/java"/>
 	<classpathentry kind="src" path="frameworks/base/telephony/java"/>
 	<classpathentry kind="src" path="frameworks/base/test-runner/src"/>
 	<classpathentry kind="src" path="frameworks/base/wifi/java"/>
diff --git a/ide/eclipse/android-include-paths.xml b/ide/eclipse/android-include-paths.xml
index 4487fa4..90bb30f 100644
--- a/ide/eclipse/android-include-paths.xml
+++ b/ide/eclipse/android-include-paths.xml
@@ -11,9 +11,9 @@
 <includepath>${ProjDirPath}/bionic/libc/arch-arm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libc/include</includepath>
 <includepath>${ProjDirPath}/bionic/libstdc++/include</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common/linux</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/arch-arm</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/linux</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/asm-arm</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include/arm</includepath>
 <includepath>${ProjDirPath}/bionic/libthread_db/include</includepath>
@@ -41,9 +41,9 @@
 <includepath>${ProjDirPath}/bionic/libc/arch-arm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libc/include</includepath>
 <includepath>${ProjDirPath}/bionic/libstdc++/include</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common/linux</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/arch-arm</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/linux</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/asm-arm</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include/arm</includepath>
 <includepath>${ProjDirPath}/bionic/libthread_db/include</includepath>
@@ -71,9 +71,9 @@
 <includepath>${ProjDirPath}/bionic/libc/arch-arm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libc/include</includepath>
 <includepath>${ProjDirPath}/bionic/libstdc++/include</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/common/linux</includepath>
-<includepath>${ProjDirPath}/bionic/libc/kernel/arch-arm</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/linux</includepath>
+<includepath>${ProjDirPath}/bionic/libc/kernel/uapi/asm-arm</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include</includepath>
 <includepath>${ProjDirPath}/bionic/libm/include/arm</includepath>
 <includepath>${ProjDirPath}/bionic/libthread_db/include</includepath>
diff --git a/ndk/Android.mk b/ndk/Android.mk
index e7d9fe9..6c93761 100644
--- a/ndk/Android.mk
+++ b/ndk/Android.mk
@@ -1,3 +1,4 @@
 # Please this file empty. It is used to make the Android build system happy.
 
 include development/ndk/sources/android/libportable/Android.mk
+include development/ndk/sources/android/native_app_glue/Android.mk
diff --git a/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..acfb94c
--- /dev/null
+++ b/ndk/platforms/android-12/arch-arm/symbols/libc.so.functions.txt
@@ -0,0 +1,1084 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+_Unwind_Backtrace
+_Unwind_Complete
+_Unwind_DeleteException
+_Unwind_ForcedUnwind
+_Unwind_GetCFA
+_Unwind_GetDataRelBase
+_Unwind_GetLanguageSpecificData
+_Unwind_GetRegionStart
+_Unwind_GetTextRelBase
+_Unwind_RaiseException
+_Unwind_Resume
+_Unwind_Resume_or_Rethrow
+_Unwind_VRS_Get
+_Unwind_VRS_Pop
+_Unwind_VRS_Set
+___Unwind_Backtrace
+___Unwind_ForcedUnwind
+___Unwind_RaiseException
+___Unwind_Resume
+___Unwind_Resume_or_Rethrow
+__adddf3
+__addsf3
+__aeabi_atexit
+__aeabi_cdcmpeq
+__aeabi_cdcmple
+__aeabi_cdrcmple
+__aeabi_d2f
+__aeabi_d2iz
+__aeabi_dadd
+__aeabi_dcmpeq
+__aeabi_dcmpge
+__aeabi_dcmpgt
+__aeabi_dcmple
+__aeabi_dcmplt
+__aeabi_dcmpun
+__aeabi_ddiv
+__aeabi_dmul
+__aeabi_drsub
+__aeabi_dsub
+__aeabi_f2d
+__aeabi_f2iz
+__aeabi_fadd
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2d
+__aeabi_i2f
+__aeabi_idiv
+__aeabi_idiv0
+__aeabi_idivmod
+__aeabi_l2d
+__aeabi_l2f
+__aeabi_ldiv0
+__aeabi_ldivmod
+__aeabi_lmul
+__aeabi_memclr
+__aeabi_memclr4
+__aeabi_memclr8
+__aeabi_memcpy
+__aeabi_memcpy4
+__aeabi_memcpy8
+__aeabi_memmove
+__aeabi_memmove4
+__aeabi_memmove8
+__aeabi_memset
+__aeabi_memset4
+__aeabi_memset8
+__aeabi_ui2d
+__aeabi_ui2f
+__aeabi_uidiv
+__aeabi_uidivmod
+__aeabi_ul2d
+__aeabi_ul2f
+__aeabi_uldivmod
+__aeabi_unwind_cpp_pr0
+__aeabi_unwind_cpp_pr1
+__aeabi_unwind_cpp_pr2
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__bionic_clone
+__bionic_clone_entry
+__bionic_libgcc_compat_hooks
+__brk
+__cmpdf2
+__cxa_atexit
+__cxa_finalize
+__div0
+__divdf3
+__divdi3
+__divsf3
+__divsi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__eqdf2
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__extendsfdf2
+__fcntl
+__fcntl64
+__findenv
+__fixdfsi
+__fixsfsi
+__floatdidf
+__floatdisf
+__floatsidf
+__floatsisf
+__floatundidf
+__floatundisf
+__floatunsidf
+__floatunsisf
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__gedf2
+__get_h_errno
+__get_pc
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__getcwd
+__getpriority
+__gnu_Unwind_Backtrace
+__gnu_Unwind_Find_exidx
+__gnu_Unwind_ForcedUnwind
+__gnu_Unwind_RaiseException
+__gnu_Unwind_Restore_VFP
+__gnu_Unwind_Restore_VFP_D
+__gnu_Unwind_Restore_VFP_D_16_to_31
+__gnu_Unwind_Restore_WMMXC
+__gnu_Unwind_Restore_WMMXD
+__gnu_Unwind_Resume
+__gnu_Unwind_Resume_or_Rethrow
+__gnu_Unwind_Save_VFP
+__gnu_Unwind_Save_VFP_D
+__gnu_Unwind_Save_VFP_D_16_to_31
+__gnu_Unwind_Save_WMMXC
+__gnu_Unwind_Save_WMMXD
+__gnu_ldivmod_helper
+__gnu_uldivmod_helper
+__gnu_unwind_execute
+__gnu_unwind_frame
+__gtdf2
+__hostalias
+__init_tls
+__ioctl
+__ledf2
+__libc_android_abort
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__ltdf2
+__memcmp16
+__mmap2
+__muldf3
+__muldi3
+__mulsf3
+__nedf2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__restore_core_regs
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__subdf3
+__subsf3
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__truncdfsf2
+__udivdi3
+__udivsi3
+__unorddf2
+__unordsf2
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+restore_core_regs
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-arm/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..efbc282
--- /dev/null
+++ b/ndk/platforms/android-12/arch-mips/symbols/libc.so.functions.txt
@@ -0,0 +1,950 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__brk
+__clone_thread_start
+__cxa_atexit
+__cxa_finalize
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__memcmp16
+__mmap2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_flush_cache
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimes
+utimensat
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-mips/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt b/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..8478e47
--- /dev/null
+++ b/ndk/platforms/android-12/arch-x86/symbols/libc.so.functions.txt
@@ -0,0 +1,944 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__b64_ntop
+__b64_pton
+__brk
+__cxa_atexit
+__cxa_finalize
+__divdi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__mmap2
+__moddi3
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__udivdi3
+__umoddi3
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt b/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-12/arch-x86/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-12/include/sys/stat.h b/ndk/platforms/android-12/include/sys/stat.h
new file mode 100644
index 0000000..497f404
--- /dev/null
+++ b/ndk/platforms/android-12/include/sys/stat.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+    unsigned long long  st_dev;
+    unsigned char       __pad0[4];
+
+    unsigned long       __st_ino;
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long long  st_rdev;
+    unsigned char       __pad3[4];
+
+    long long           st_size;
+    unsigned long	st_blksize;
+    unsigned long long  st_blocks;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long long  st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define  st_atimensec  st_atime_nsec
+#define  st_mtimensec  st_mtime_nsec
+#define  st_ctimensec  st_ctime_nsec
+
+extern int    chmod(const char *, mode_t);
+extern int    fchmod(int, mode_t);
+extern int    mkdir(const char *, mode_t);
+
+extern int    stat(const char *, struct stat *);
+extern int    fstat(int, struct stat *);
+extern int    lstat(const char *, struct stat *);
+extern int    mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define  stat64    stat
+#define  fstat64   fstat
+#define  lstat64   lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+  return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int  fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int  mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+# define UTIME_NOW      ((1l << 30) - 1l)
+# define UTIME_OMIT     ((1l << 30) - 2l)
+extern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..df649fb
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,233 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-13/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..276e531
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libm.so.functions.txt
@@ -0,0 +1,185 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-13/arch-mips/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..4ace8c3
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,170 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt b/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..5691e40
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libm.so.functions.txt
@@ -0,0 +1,196 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+_scan_nan
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+feclearexcept
+fedisableexcept
+feenableexcept
+fegetenv
+fegetexcept
+fegetexceptflag
+fegetround
+feholdexcept
+feraiseexcept
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt b/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..6e5cdee
--- /dev/null
+++ b/ndk/platforms/android-13/arch-x86/symbols/libm.so.variables.txt
@@ -0,0 +1,3 @@
+__fe_dfl_env
+__has_sse
+signgam
diff --git a/ndk/platforms/android-13/include/android/asset_manager.h b/ndk/platforms/android-13/include/android/asset_manager.h
new file mode 100644
index 0000000..6ac350e
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/asset_manager.h
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_ASSET_MANAGER_H
+#define ANDROID_ASSET_MANAGER_H
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AAssetManager;
+typedef struct AAssetManager AAssetManager;
+
+struct AAssetDir;
+typedef struct AAssetDir AAssetDir;
+
+struct AAsset;
+typedef struct AAsset AAsset;
+
+/* Available modes for opening assets */
+enum {
+    AASSET_MODE_UNKNOWN      = 0,
+    AASSET_MODE_RANDOM       = 1,
+    AASSET_MODE_STREAMING    = 2,
+    AASSET_MODE_BUFFER       = 3
+};
+
+
+/**
+ * Open the named directory within the asset hierarchy.  The directory can then
+ * be inspected with the AAssetDir functions.  To open the top-level directory,
+ * pass in "" as the dirName.
+ *
+ * The object returned here should be freed by calling AAssetDir_close().
+ */
+AAssetDir* AAssetManager_openDir(AAssetManager* mgr, const char* dirName);
+
+/**
+ * Open an asset.
+ *
+ * The object returned here should be freed by calling AAsset_close().
+ */
+AAsset* AAssetManager_open(AAssetManager* mgr, const char* filename, int mode);
+
+/**
+ * Iterate over the files in an asset directory.  A NULL string is returned
+ * when all the file names have been returned.
+ *
+ * The returned file name is suitable for passing to AAssetManager_open().
+ *
+ * The string returned here is owned by the AssetDir implementation and is not
+ * guaranteed to remain valid if any other calls are made on this AAssetDir
+ * instance.
+ */
+const char* AAssetDir_getNextFileName(AAssetDir* assetDir);
+
+/**
+ * Reset the iteration state of AAssetDir_getNextFileName() to the beginning.
+ */
+void AAssetDir_rewind(AAssetDir* assetDir);
+
+/**
+ * Close an opened AAssetDir, freeing any related resources.
+ */
+void AAssetDir_close(AAssetDir* assetDir);
+
+/**
+ * Attempt to read 'count' bytes of data from the current offset.
+ *
+ * Returns the number of bytes read, zero on EOF, or < 0 on error.
+ */
+int AAsset_read(AAsset* asset, void* buf, size_t count);
+
+/**
+ * Seek to the specified offset within the asset data.  'whence' uses the
+ * same constants as lseek()/fseek().
+ *
+ * Returns the new position on success, or (off_t) -1 on error.
+ */
+off_t AAsset_seek(AAsset* asset, off_t offset, int whence);
+
+/**
+ * Seek to the specified offset within the asset data.  'whence' uses the
+ * same constants as lseek()/fseek().
+ *
+ * Uses 64-bit data type for large files as opposed to the 32-bit type used
+ * by AAsset_seek.
+ *
+ * Returns the new position on success, or (off64_t) -1 on error.
+ */
+off64_t AAsset_seek64(AAsset* asset, off64_t offset, int whence);
+
+/**
+ * Close the asset, freeing all associated resources.
+ */
+void AAsset_close(AAsset* asset);
+
+/**
+ * Get a pointer to a buffer holding the entire contents of the assset.
+ *
+ * Returns NULL on failure.
+ */
+const void* AAsset_getBuffer(AAsset* asset);
+
+/**
+ * Report the total size of the asset data.
+ */
+off_t AAsset_getLength(AAsset* asset);
+
+/**
+ * Report the total size of the asset data. Reports the size using a 64-bit
+ * number insted of 32-bit as AAsset_getLength.
+ */
+off64_t AAsset_getLength64(AAsset* asset);
+
+/**
+ * Report the total amount of asset data that can be read from the current position.
+ */
+off_t AAsset_getRemainingLength(AAsset* asset);
+
+/**
+ * Report the total amount of asset data that can be read from the current position.
+ *
+ * Uses a 64-bit number instead of a 32-bit number as AAsset_getRemainingLength does.
+ */
+off64_t AAsset_getRemainingLength64(AAsset* asset);
+
+/**
+ * Open a new file descriptor that can be used to read the asset data. If the
+ * start or length cannot be represented by a 32-bit number, it will be
+ * truncated. If the file is large, use AAsset_openFileDescriptor64 instead.
+ *
+ * Returns < 0 if direct fd access is not possible (for example, if the asset is
+ * compressed).
+ */
+int AAsset_openFileDescriptor(AAsset* asset, off_t* outStart, off_t* outLength);
+
+/**
+ * Open a new file descriptor that can be used to read the asset data.
+ *
+ * Uses a 64-bit number for the offset and length instead of 32-bit instead of
+ * as AAsset_openFileDescriptor does.
+ *
+ * Returns < 0 if direct fd access is not possible (for example, if the asset is
+ * compressed).
+ */
+int AAsset_openFileDescriptor64(AAsset* asset, off64_t* outStart, off64_t* outLength);
+
+/**
+ * Returns whether this asset's internal buffer is allocated in ordinary RAM (i.e. not
+ * mmapped).
+ */
+int AAsset_isAllocated(AAsset* asset);
+
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif      // ANDROID_ASSET_MANAGER_H
diff --git a/ndk/platforms/android-13/include/android/configuration.h b/ndk/platforms/android-13/include/android/configuration.h
new file mode 100644
index 0000000..2444c4b
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/configuration.h
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+    ACONFIGURATION_ORIENTATION_ANY  = 0x0000,
+    ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+    ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+    ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+    ACONFIGURATION_TOUCHSCREEN_ANY  = 0x0000,
+    ACONFIGURATION_TOUCHSCREEN_NOTOUCH  = 0x0001,
+    ACONFIGURATION_TOUCHSCREEN_STYLUS  = 0x0002,
+    ACONFIGURATION_TOUCHSCREEN_FINGER  = 0x0003,
+
+    ACONFIGURATION_DENSITY_DEFAULT = 0,
+    ACONFIGURATION_DENSITY_LOW = 120,
+    ACONFIGURATION_DENSITY_MEDIUM = 160,
+    ACONFIGURATION_DENSITY_TV = 213,
+    ACONFIGURATION_DENSITY_HIGH = 240,
+    ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+    ACONFIGURATION_KEYBOARD_ANY  = 0x0000,
+    ACONFIGURATION_KEYBOARD_NOKEYS  = 0x0001,
+    ACONFIGURATION_KEYBOARD_QWERTY  = 0x0002,
+    ACONFIGURATION_KEYBOARD_12KEY  = 0x0003,
+
+    ACONFIGURATION_NAVIGATION_ANY  = 0x0000,
+    ACONFIGURATION_NAVIGATION_NONAV  = 0x0001,
+    ACONFIGURATION_NAVIGATION_DPAD  = 0x0002,
+    ACONFIGURATION_NAVIGATION_TRACKBALL  = 0x0003,
+    ACONFIGURATION_NAVIGATION_WHEEL  = 0x0004,
+
+    ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+    ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+    ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+    ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+    ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+    ACONFIGURATION_SCREENSIZE_ANY  = 0x00,
+    ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+    ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+    ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+    ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+    ACONFIGURATION_SCREENLONG_ANY = 0x00,
+    ACONFIGURATION_SCREENLONG_NO = 0x1,
+    ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+    ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+    ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+    ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+    ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+
+    ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+    ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+    ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_MCC = 0x0001,
+    ACONFIGURATION_MNC = 0x0002,
+    ACONFIGURATION_LOCALE = 0x0004,
+    ACONFIGURATION_TOUCHSCREEN = 0x0008,
+    ACONFIGURATION_KEYBOARD = 0x0010,
+    ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+    ACONFIGURATION_NAVIGATION = 0x0040,
+    ACONFIGURATION_ORIENTATION = 0x0080,
+    ACONFIGURATION_DENSITY = 0x0100,
+    ACONFIGURATION_SCREEN_SIZE = 0x0200,
+    ACONFIGURATION_VERSION = 0x0400,
+    ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+    ACONFIGURATION_UI_MODE = 0x1000,
+    ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations.  Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'.  Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'.  Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'.  If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there.  If it is NULL, this decision is
+ * simply based on which configuration is more specific.  Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+        AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-13/include/android/input.h b/ndk/platforms/android-13/include/android/input.h
new file mode 100644
index 0000000..7717a50
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/input.h
@@ -0,0 +1,805 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+    /* The key state is unknown or the requested key itself is not supported. */
+    AKEY_STATE_UNKNOWN = -1,
+
+    /* The key is up. */
+    AKEY_STATE_UP = 0,
+
+    /* The key is down. */
+    AKEY_STATE_DOWN = 1,
+
+    /* The key is down but is a virtual key press that is being emulated by the system. */
+    AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+    /* No meta keys are pressed. */
+    AMETA_NONE = 0,
+
+    /* This mask is used to check whether one of the ALT meta keys is pressed. */
+    AMETA_ALT_ON = 0x02,
+
+    /* This mask is used to check whether the left ALT meta key is pressed. */
+    AMETA_ALT_LEFT_ON = 0x10,
+
+    /* This mask is used to check whether the right ALT meta key is pressed. */
+    AMETA_ALT_RIGHT_ON = 0x20,
+
+    /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+    AMETA_SHIFT_ON = 0x01,
+
+    /* This mask is used to check whether the left SHIFT meta key is pressed. */
+    AMETA_SHIFT_LEFT_ON = 0x40,
+
+    /* This mask is used to check whether the right SHIFT meta key is pressed. */
+    AMETA_SHIFT_RIGHT_ON = 0x80,
+
+    /* This mask is used to check whether the SYM meta key is pressed. */
+    AMETA_SYM_ON = 0x04,
+
+    /* This mask is used to check whether the FUNCTION meta key is pressed. */
+    AMETA_FUNCTION_ON = 0x08,
+
+    /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+    AMETA_CTRL_ON = 0x1000,
+
+    /* This mask is used to check whether the left CTRL meta key is pressed. */
+    AMETA_CTRL_LEFT_ON = 0x2000,
+
+    /* This mask is used to check whether the right CTRL meta key is pressed. */
+    AMETA_CTRL_RIGHT_ON = 0x4000,
+
+    /* This mask is used to check whether one of the META meta keys is pressed. */
+    AMETA_META_ON = 0x10000,
+
+    /* This mask is used to check whether the left META meta key is pressed. */
+    AMETA_META_LEFT_ON = 0x20000,
+
+    /* This mask is used to check whether the right META meta key is pressed. */
+    AMETA_META_RIGHT_ON = 0x40000,
+
+    /* This mask is used to check whether the CAPS LOCK meta key is on. */
+    AMETA_CAPS_LOCK_ON = 0x100000,
+
+    /* This mask is used to check whether the NUM LOCK meta key is on. */
+    AMETA_NUM_LOCK_ON = 0x200000,
+
+    /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+    AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures.  Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+    /* Indicates that the input event is a key event. */
+    AINPUT_EVENT_TYPE_KEY = 1,
+
+    /* Indicates that the input event is a motion event. */
+    AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+    /* The key has been pressed down. */
+    AKEY_EVENT_ACTION_DOWN = 0,
+
+    /* The key has been released. */
+    AKEY_EVENT_ACTION_UP = 1,
+
+    /* Multiple duplicate key events have occurred in a row, or a complex string is
+     * being delivered.  The repeat_count property of the key event contains the number
+     * of times the given key code should be executed.
+     */
+    AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+    /* This mask is set if the device woke because of this key event. */
+    AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+    /* This mask is set if the key event was generated by a software keyboard. */
+    AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+    /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+    AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+    /* This mask is set if an event was known to come from a trusted part
+     * of the system.  That is, the event is known to come from the user,
+     * and could not have been spoofed by a third party component. */
+    AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+    /* This mask is used for compatibility, to identify enter keys that are
+     * coming from an IME whose enter key has been auto-labelled "next" or
+     * "done".  This allows TextView to dispatch these as normal enter keys
+     * for old applications, but still do the appropriate action when
+     * receiving them. */
+    AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+    /* When associated with up key events, this indicates that the key press
+     * has been canceled.  Typically this is used with virtual touch screen
+     * keys, where the user can slide from the virtual key area on to the
+     * display: in that case, the application will receive a canceled up
+     * event and should not perform the action normally associated with the
+     * key.  Note that for this to work, the application can not perform an
+     * action for a key until it receives an up or the long press timeout has
+     * expired. */
+    AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+    /* This key event was generated by a virtual (on-screen) hard key area.
+     * Typically this is an area of the touchscreen, outside of the regular
+     * display, dedicated to "hardware" buttons. */
+    AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+    /* This flag is set for the first key repeat that occurs after the
+     * long press timeout. */
+    AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+    /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+     * press action was executed while it was down. */
+    AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+    /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+     * tracked from its initial down.  That is, somebody requested that tracking
+     * started on the key down and a long press has not caused
+     * the tracking to be canceled. */
+    AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+    /* Set when a key event has been synthesized to implement default behavior
+     * for an event that the application did not handle.
+     * Fallback key events are generated by unhandled trackball motions
+     * (to emulate a directional keypad) and by certain unhandled key presses
+     * that are declared in the key map (such as special function numeric keypad
+     * keys when numlock is off). */
+    AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+    /* Bit mask of the parts of the action code that are the action itself.
+     */
+    AMOTION_EVENT_ACTION_MASK = 0xff,
+
+    /* Bits in the action code that represent a pointer index, used with
+     * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP.  Shifting
+     * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+     * index where the data for the pointer going up or down can be found.
+     */
+    AMOTION_EVENT_ACTION_POINTER_INDEX_MASK  = 0xff00,
+
+    /* A pressed gesture has started, the motion contains the initial starting location.
+     */
+    AMOTION_EVENT_ACTION_DOWN = 0,
+
+    /* A pressed gesture has finished, the motion contains the final release location
+     * as well as any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_UP = 1,
+
+    /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+     * AMOTION_EVENT_ACTION_UP).  The motion contains the most recent point, as well as
+     * any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_MOVE = 2,
+
+    /* The current gesture has been aborted.
+     * You will not receive any more points in it.  You should treat this as
+     * an up event, but not perform any action that you normally would.
+     */
+    AMOTION_EVENT_ACTION_CANCEL = 3,
+
+    /* A movement has happened outside of the normal bounds of the UI element.
+     * This does not provide a full gesture, but only the initial location of the movement/touch.
+     */
+    AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+    /* A non-primary pointer has gone down.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+    /* A non-primary pointer has gone up.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+    /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+     * The motion contains the most recent point, as well as any intermediate points since
+     * the last hover move event.
+     */
+    AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+    /* The motion event contains relative vertical and/or horizontal scroll offsets.
+     * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+     * and AMOTION_EVENT_AXIS_HSCROLL.
+     * The pointer may or may not be down when this event is dispatched.
+     * This action is always delivered to the winder under the pointer, which
+     * may not be the window currently touched.
+     */
+    AMOTION_EVENT_ACTION_SCROLL = 8,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+    /* This flag indicates that the window that received this motion event is partly
+     * or wholly obscured by another visible window above it.  This flag is set to true
+     * even if the event did not directly pass through the obscured area.
+     * A security sensitive application can check this flag to identify situations in which
+     * a malicious application may have covered up part of its content for the purpose
+     * of misleading the user or hijacking touches.  An appropriate response might be
+     * to drop the suspect touches or to take additional precautions to confirm the user's
+     * actual intent.
+     */
+    AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+    /* No edges intersected */
+    AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+    /* Flag indicating the motion event intersected the top edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+    /* Flag indicating the motion event intersected the bottom edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+    /* Flag indicating the motion event intersected the left edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+    /* Flag indicating the motion event intersected the right edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+    AMOTION_EVENT_AXIS_X = 0,
+    AMOTION_EVENT_AXIS_Y = 1,
+    AMOTION_EVENT_AXIS_PRESSURE = 2,
+    AMOTION_EVENT_AXIS_SIZE = 3,
+    AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+    AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+    AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+    AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+    AMOTION_EVENT_AXIS_ORIENTATION = 8,
+    AMOTION_EVENT_AXIS_VSCROLL = 9,
+    AMOTION_EVENT_AXIS_HSCROLL = 10,
+    AMOTION_EVENT_AXIS_Z = 11,
+    AMOTION_EVENT_AXIS_RX = 12,
+    AMOTION_EVENT_AXIS_RY = 13,
+    AMOTION_EVENT_AXIS_RZ = 14,
+    AMOTION_EVENT_AXIS_HAT_X = 15,
+    AMOTION_EVENT_AXIS_HAT_Y = 16,
+    AMOTION_EVENT_AXIS_LTRIGGER = 17,
+    AMOTION_EVENT_AXIS_RTRIGGER = 18,
+    AMOTION_EVENT_AXIS_THROTTLE = 19,
+    AMOTION_EVENT_AXIS_RUDDER = 20,
+    AMOTION_EVENT_AXIS_WHEEL = 21,
+    AMOTION_EVENT_AXIS_GAS = 22,
+    AMOTION_EVENT_AXIS_BRAKE = 23,
+    AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+    AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+    AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+    AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+    AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+    AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+    AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+    AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+    AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+    AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+    AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+    AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+    AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+    AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+    AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+    AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+    // NOTE: If you add a new axis here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+    AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+    AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+    AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+    AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+    AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+    AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+    AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+    AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+    AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+    AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+    AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+    AINPUT_KEYBOARD_TYPE_NONE = 0,
+    AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+    AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated.  Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+    AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+    AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+    AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+    AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+    AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+    AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+    AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+    AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+    AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there.  For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base.  If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index is this event.  The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the number of historical points in this event.  These are movements that
+ * have occurred between this event and the previous event.  This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+        size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index, size_t history_index) __NDK_FPABI__;
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing.  See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+        int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue.  Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue.  Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app.  Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now.  If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-13/include/android/keycodes.h b/ndk/platforms/android-13/include/android/keycodes.h
new file mode 100644
index 0000000..c4a7eff
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/keycodes.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-13/include/android/native_activity.h b/ndk/platforms/android-13/include/android/native_activity.h
new file mode 100644
index 0000000..bc70f88
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/native_activity.h
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_NATIVE_ACTIVITY_H
+#define ANDROID_NATIVE_ACTIVITY_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <jni.h>
+
+#include <android/asset_manager.h>
+#include <android/input.h>
+#include <android/native_window.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ANativeActivityCallbacks;
+
+/**
+ * This structure defines the native side of an android.app.NativeActivity.
+ * It is created by the framework, and handed to the application's native
+ * code as it is being launched.
+ */
+typedef struct ANativeActivity {
+    /**
+     * Pointer to the callback function table of the native application.
+     * You can set the functions here to your own callbacks.  The callbacks
+     * pointer itself here should not be changed; it is allocated and managed
+     * for you by the framework.
+     */
+    struct ANativeActivityCallbacks* callbacks;
+
+    /**
+     * The global handle on the process's Java VM.
+     */
+    JavaVM* vm;
+
+    /**
+     * JNI context for the main thread of the app.  Note that this field
+     * can ONLY be used from the main thread of the process; that is, the
+     * thread that calls into the ANativeActivityCallbacks.
+     */
+    JNIEnv* env;
+
+    /**
+     * The NativeActivity object handle.
+     *
+     * IMPORTANT NOTE: This member is mis-named. It should really be named
+     * 'activity' instead of 'clazz', since it's a reference to the
+     * NativeActivity instance created by the system for you.
+     *
+     * We unfortunately cannot change this without breaking NDK
+     * source-compatibility.
+     */
+    jobject clazz;
+
+    /**
+     * Path to this application's internal data directory.
+     */
+    const char* internalDataPath;
+    
+    /**
+     * Path to this application's external (removable/mountable) data directory.
+     */
+    const char* externalDataPath;
+    
+    /**
+     * The platform's SDK version code.
+     */
+    int32_t sdkVersion;
+    
+    /**
+     * This is the native instance of the application.  It is not used by
+     * the framework, but can be set by the application to its own instance
+     * state.
+     */
+    void* instance;
+
+    /**
+     * Pointer to the Asset Manager instance for the application.  The application
+     * uses this to access binary assets bundled inside its own .apk file.
+     */
+    AAssetManager* assetManager;
+
+    /**
+     * Available starting with Honeycomb: path to the directory containing
+     * the application's OBB files (if any).  If the app doesn't have any
+     * OBB files, this directory may not exist.
+     */
+    const char* obbPath;
+} ANativeActivity;
+
+/**
+ * These are the callbacks the framework makes into a native application.
+ * All of these callbacks happen on the main thread of the application.
+ * By default, all callbacks are NULL; set to a pointer to your own function
+ * to have it called.
+ */
+typedef struct ANativeActivityCallbacks {
+    /**
+     * NativeActivity has started.  See Java documentation for Activity.onStart()
+     * for more information.
+     */
+    void (*onStart)(ANativeActivity* activity);
+    
+    /**
+     * NativeActivity has resumed.  See Java documentation for Activity.onResume()
+     * for more information.
+     */
+    void (*onResume)(ANativeActivity* activity);
+    
+    /**
+     * Framework is asking NativeActivity to save its current instance state.
+     * See Java documentation for Activity.onSaveInstanceState() for more
+     * information.  The returned pointer needs to be created with malloc();
+     * the framework will call free() on it for you.  You also must fill in
+     * outSize with the number of bytes in the allocation.  Note that the
+     * saved state will be persisted, so it can not contain any active
+     * entities (pointers to memory, file descriptors, etc).
+     */
+    void* (*onSaveInstanceState)(ANativeActivity* activity, size_t* outSize);
+    
+    /**
+     * NativeActivity has paused.  See Java documentation for Activity.onPause()
+     * for more information.
+     */
+    void (*onPause)(ANativeActivity* activity);
+    
+    /**
+     * NativeActivity has stopped.  See Java documentation for Activity.onStop()
+     * for more information.
+     */
+    void (*onStop)(ANativeActivity* activity);
+    
+    /**
+     * NativeActivity is being destroyed.  See Java documentation for Activity.onDestroy()
+     * for more information.
+     */
+    void (*onDestroy)(ANativeActivity* activity);
+
+    /**
+     * Focus has changed in this NativeActivity's window.  This is often used,
+     * for example, to pause a game when it loses input focus.
+     */
+    void (*onWindowFocusChanged)(ANativeActivity* activity, int hasFocus);
+    
+    /**
+     * The drawing window for this native activity has been created.  You
+     * can use the given native window object to start drawing.
+     */
+    void (*onNativeWindowCreated)(ANativeActivity* activity, ANativeWindow* window);
+
+    /**
+     * The drawing window for this native activity has been resized.  You should
+     * retrieve the new size from the window and ensure that your rendering in
+     * it now matches.
+     */
+    void (*onNativeWindowResized)(ANativeActivity* activity, ANativeWindow* window);
+
+    /**
+     * The drawing window for this native activity needs to be redrawn.  To avoid
+     * transient artifacts during screen changes (such resizing after rotation),
+     * applications should not return from this function until they have finished
+     * drawing their window in its current state.
+     */
+    void (*onNativeWindowRedrawNeeded)(ANativeActivity* activity, ANativeWindow* window);
+
+    /**
+     * The drawing window for this native activity is going to be destroyed.
+     * You MUST ensure that you do not touch the window object after returning
+     * from this function: in the common case of drawing to the window from
+     * another thread, that means the implementation of this callback must
+     * properly synchronize with the other thread to stop its drawing before
+     * returning from here.
+     */
+    void (*onNativeWindowDestroyed)(ANativeActivity* activity, ANativeWindow* window);
+    
+    /**
+     * The input queue for this native activity's window has been created.
+     * You can use the given input queue to start retrieving input events.
+     */
+    void (*onInputQueueCreated)(ANativeActivity* activity, AInputQueue* queue);
+    
+    /**
+     * The input queue for this native activity's window is being destroyed.
+     * You should no longer try to reference this object upon returning from this
+     * function.
+     */
+    void (*onInputQueueDestroyed)(ANativeActivity* activity, AInputQueue* queue);
+
+    /**
+     * The rectangle in the window in which content should be placed has changed.
+     */
+    void (*onContentRectChanged)(ANativeActivity* activity, const ARect* rect);
+
+    /**
+     * The current device AConfiguration has changed.  The new configuration can
+     * be retrieved from assetManager.
+     */
+    void (*onConfigurationChanged)(ANativeActivity* activity);
+
+    /**
+     * The system is running low on memory.  Use this callback to release
+     * resources you do not need, to help the system avoid killing more
+     * important processes.
+     */
+    void (*onLowMemory)(ANativeActivity* activity);
+} ANativeActivityCallbacks;
+
+/**
+ * This is the function that must be in the native code to instantiate the
+ * application's native activity.  It is called with the activity instance (see
+ * above); if the code is being instantiated from a previously saved instance,
+ * the savedState will be non-NULL and point to the saved data.  You must make
+ * any copy of this data you need -- it will be released after you return from
+ * this function.
+ */
+typedef void ANativeActivity_createFunc(ANativeActivity* activity,
+        void* savedState, size_t savedStateSize);
+
+/**
+ * The name of the function that NativeInstance looks for when launching its
+ * native code.  This is the default function that is used, you can specify
+ * "android.app.func_name" string meta-data in your manifest to use a different
+ * function.
+ */
+extern ANativeActivity_createFunc ANativeActivity_onCreate;
+
+/**
+ * Finish the given activity.  Its finish() method will be called, causing it
+ * to be stopped and destroyed.  Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_finish(ANativeActivity* activity);
+
+/**
+ * Change the window format of the given activity.  Calls getWindow().setFormat()
+ * of the given activity.  Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_setWindowFormat(ANativeActivity* activity, int32_t format);
+
+/**
+ * Change the window flags of the given activity.  Calls getWindow().setFlags()
+ * of the given activity.  Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.  See window.h for flag constants.
+ */
+void ANativeActivity_setWindowFlags(ANativeActivity* activity,
+        uint32_t addFlags, uint32_t removeFlags);
+
+/**
+ * Flags for ANativeActivity_showSoftInput; see the Java InputMethodManager
+ * API for documentation.
+ */
+enum {
+    ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT = 0x0001,
+    ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED = 0x0002,
+};
+
+/**
+ * Show the IME while in the given activity.  Calls InputMethodManager.showSoftInput()
+ * for the given activity.  Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_showSoftInput(ANativeActivity* activity, uint32_t flags);
+
+/**
+ * Flags for ANativeActivity_hideSoftInput; see the Java InputMethodManager
+ * API for documentation.
+ */
+enum {
+    ANATIVEACTIVITY_HIDE_SOFT_INPUT_IMPLICIT_ONLY = 0x0001,
+    ANATIVEACTIVITY_HIDE_SOFT_INPUT_NOT_ALWAYS = 0x0002,
+};
+
+/**
+ * Hide the IME while in the given activity.  Calls InputMethodManager.hideSoftInput()
+ * for the given activity.  Note that this method can be called from
+ * *any* thread; it will send a message to the main thread of the process
+ * where the Java finish call will take place.
+ */
+void ANativeActivity_hideSoftInput(ANativeActivity* activity, uint32_t flags);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_ACTIVITY_H
+
diff --git a/ndk/platforms/android-13/include/android/native_window_jni.h b/ndk/platforms/android-13/include/android/native_window_jni.h
new file mode 100644
index 0000000..408c263
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/native_window_jni.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_JNI_H
+#define ANDROID_NATIVE_WINDOW_JNI_H
+
+#include <android/native_window.h>
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Return the ANativeWindow associated with a Java Surface object,
+ * for interacting with it through native code.  This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface);
+
+/**
+ * Return the ANativeWindow associated with a Java SurfaceTexture object,
+ * for interacting with it through native code.  This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurfaceTexture(JNIEnv* env, jobject surfaceTexture);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-13/include/android/tts.h b/ndk/platforms/android-13/include/android/tts.h
new file mode 100644
index 0000000..946498e
--- /dev/null
+++ b/ndk/platforms/android-13/include/android/tts.h
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef ANDROID_TTS_H
+#define ANDROID_TTS_H 
+
+// This header defines the interface used by the Android platform
+// to access Text-To-Speech functionality in shared libraries that implement
+// speech synthesis and the management of resources associated with the
+// synthesis.
+
+// The shared library must contain a function named "android_getTtsEngine"
+// that returns an 'android_tts_engine_t' instance.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define ANDROID_TTS_ENGINE_PROPERTY_CONFIG "engineConfig"
+#define ANDROID_TTS_ENGINE_PROPERTY_PITCH  "pitch"
+#define ANDROID_TTS_ENGINE_PROPERTY_RATE   "rate"
+#define ANDROID_TTS_ENGINE_PROPERTY_VOLUME "volume"
+
+typedef enum {
+    ANDROID_TTS_SUCCESS                 = 0,
+    ANDROID_TTS_FAILURE                 = -1,
+    ANDROID_TTS_FEATURE_UNSUPPORTED     = -2,
+    ANDROID_TTS_VALUE_INVALID           = -3,
+    ANDROID_TTS_PROPERTY_UNSUPPORTED    = -4,
+    ANDROID_TTS_PROPERTY_SIZE_TOO_SMALL = -5,
+    ANDROID_TTS_MISSING_RESOURCES       = -6
+} android_tts_result_t;
+
+typedef enum {
+    ANDROID_TTS_LANG_COUNTRY_VAR_AVAILABLE = 2,
+    ANDROID_TTS_LANG_COUNTRY_AVAILABLE    = 1,
+    ANDROID_TTS_LANG_AVAILABLE            = 0,
+    ANDROID_TTS_LANG_MISSING_DATA         = -1,
+    ANDROID_TTS_LANG_NOT_SUPPORTED        = -2
+} android_tts_support_result_t;
+
+typedef enum {
+    ANDROID_TTS_SYNTH_DONE              = 0,
+    ANDROID_TTS_SYNTH_PENDING           = 1
+} android_tts_synth_status_t;
+
+typedef enum {
+    ANDROID_TTS_CALLBACK_HALT           = 0,
+    ANDROID_TTS_CALLBACK_CONTINUE       = 1
+} android_tts_callback_status_t;
+
+// Supported audio formats
+typedef enum {
+    ANDROID_TTS_AUDIO_FORMAT_INVALID    = -1,
+    ANDROID_TTS_AUDIO_FORMAT_DEFAULT    = 0,
+    ANDROID_TTS_AUDIO_FORMAT_PCM_16_BIT = 1,
+    ANDROID_TTS_AUDIO_FORMAT_PCM_8_BIT  = 2,
+} android_tts_audio_format_t;
+
+
+/* An android_tts_engine_t object can be anything, but must have,
+ * as its first field, a pointer to a table of functions.
+ *
+ * See the full definition of struct android_tts_engine_t_funcs_t
+ * below for details.
+ */
+typedef struct android_tts_engine_funcs_t  android_tts_engine_funcs_t;
+
+typedef struct {
+    android_tts_engine_funcs_t *funcs;
+} android_tts_engine_t;
+
+/* This function must be located in the TTS Engine shared library
+ * and must return the address of an android_tts_engine_t library.
+ */
+extern android_tts_engine_t *android_getTtsEngine();
+
+/* Including the old version for legacy support (Froyo compatibility).
+ * This should return the same thing as android_getTtsEngine.
+ */
+android_tts_engine_t *getTtsEngine();
+
+// A callback type used to notify the framework of new synthetized
+// audio samples, status will be SYNTH_DONE for the last sample of
+// the last request, of SYNTH_PENDING otherwise.
+//
+// This is passed by the framework to the engine through the
+// 'engine_init' function (see below).
+//
+// The callback for synthesis completed takes:
+// @param [inout] void *&       - The userdata pointer set in the original
+//                                 synth call
+// @param [in]    uint32_t      - Track sampling rate in Hz
+// @param [in]    uint32_t      - The audio format
+// @param [in]    int           - The number of channels
+// @param [inout] int8_t *&     - A buffer of audio data only valid during the
+//                                execution of the callback
+// @param [inout] size_t  &     - The size of the buffer
+// @param [in] tts_synth_status - indicate whether the synthesis is done, or
+//                                 if more data is to be synthesized.
+// @return TTS_CALLBACK_HALT to indicate the synthesis must stop,
+//         TTS_CALLBACK_CONTINUE to indicate the synthesis must continue if
+//            there is more data to produce.
+typedef android_tts_callback_status_t (*android_tts_synth_cb_t)
+            (void **pUserData,
+             uint32_t trackSamplingHz,
+             android_tts_audio_format_t audioFormat,
+             int channelCount,
+             int8_t **pAudioBuffer,
+             size_t *pBufferSize,
+             android_tts_synth_status_t status);
+
+
+// The table of function pointers that the android_tts_engine_t must point to.
+// Note that each of these functions will take a handle to the engine itself
+// as their first parameter.
+//
+
+struct android_tts_engine_funcs_t {
+    // reserved fields, ignored by the framework
+    // they must be placed here to ensure binary compatibility
+    // of legacy binary plugins.
+    void *reserved[2];
+
+    // Initialize the TTS engine and returns whether initialization succeeded.
+    // @param synthDoneCBPtr synthesis callback function pointer
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*init)
+            (void *engine,
+             android_tts_synth_cb_t synthDonePtr,
+             const char *engineConfig);
+
+    // Shut down the TTS engine and releases all associated resources.
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*shutdown)
+            (void *engine);
+
+    // Interrupt synthesis and flushes any synthesized data that hasn't been
+    // output yet. This will block until callbacks underway are completed.
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*stop)
+            (void *engine);
+
+    // Returns the level of support for the language, country and variant.
+    // @return TTS_LANG_COUNTRY_VAR_AVAILABLE if the language, country and variant are supported,
+    //            and the corresponding resources are correctly installed
+    //         TTS_LANG_COUNTRY_AVAILABLE if the language and country are supported and the
+    //             corresponding resources are correctly installed, but there is no match for
+    //             the specified variant
+    //         TTS_LANG_AVAILABLE if the language is supported and the
+    //             corresponding resources are correctly installed, but there is no match for
+    //             the specified country and variant
+    //         TTS_LANG_MISSING_DATA if the required resources to provide any level of support
+    //             for the language are not correctly installed
+    //         TTS_LANG_NOT_SUPPORTED if the language is not supported by the TTS engine.
+    android_tts_support_result_t (*isLanguageAvailable)
+            (void *engine,
+             const char *lang,
+             const char *country,
+             const char *variant);
+
+    // Load the resources associated with the specified language. The loaded
+    // language will only be used once a call to setLanguage() with the same
+    // language value is issued. Language and country values are coded according to the ISO three
+    // letter codes for languages and countries, as can be retrieved from a java.util.Locale
+    // instance. The variant value is encoded as the variant string retrieved from a
+    // java.util.Locale instance built with that variant data.
+    // @param lang pointer to the ISO three letter code for the language
+    // @param country pointer to the ISO three letter code for the country
+    // @param variant pointer to the variant code
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*loadLanguage)
+            (void *engine,
+             const char *lang,
+             const char *country,
+             const char *variant);
+
+    // Load the resources associated with the specified language, country and Locale variant.
+    // The loaded language will only be used once a call to setLanguageFromLocale() with the same
+    // language value is issued. Language and country values are coded according to the ISO three
+    // letter codes for languages and countries, as can be retrieved from a java.util.Locale
+    // instance. The variant value is encoded as the variant string retrieved from a
+    // java.util.Locale instance built with that variant data.
+    // @param lang pointer to the ISO three letter code for the language
+    // @param country pointer to the ISO three letter code for the country
+    // @param variant pointer to the variant code
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*setLanguage)
+            (void *engine,
+             const char *lang,
+             const char *country,
+             const char *variant);
+
+    // Retrieve the currently set language, country and variant, or empty strings if none of
+    // parameters have been set. Language and country are represented by their 3-letter ISO code
+    // @param[out]   pointer to the retrieved 3-letter code language value
+    // @param[out]   pointer to the retrieved 3-letter code country value
+    // @param[out]   pointer to the retrieved variant value
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*getLanguage)
+            (void *engine,
+             char *language,
+             char *country,
+             char *variant);
+
+    // Notifies the engine what audio parameters should be used for the synthesis.
+    // This is meant to be used as a hint, the engine implementation will set the output values
+    // to those of the synthesis format, based on a given hint.
+    // @param[inout] encoding in: the desired audio sample format
+    //                         out: the format used by the TTS engine
+    // @param[inout] rate in: the desired audio sample rate
+    //                         out: the sample rate used by the TTS engine
+    // @param[inout] channels in: the desired number of audio channels
+    //                         out: the number of channels used by the TTS engine
+    // @return TTS_SUCCESS, or TTS_FAILURE
+    android_tts_result_t (*setAudioFormat)
+            (void *engine,
+             android_tts_audio_format_t* pEncoding,
+             uint32_t* pRate,
+             int* pChannels);
+
+    // Set a property for the the TTS engine
+    // "size" is the maximum size of "value" for properties "property"
+    // @param property pointer to the property name
+    // @param value    pointer to the property value
+    // @param size     maximum size required to store this type of property
+    // @return         TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS, or TTS_FAILURE,
+    //                  or TTS_VALUE_INVALID
+    android_tts_result_t (*setProperty)
+            (void *engine,
+             const char *property,
+             const char *value,
+             const size_t size);
+
+    // Retrieve a property from the TTS engine
+    // @param        property pointer to the property name
+    // @param[out]   value    pointer to the retrieved language value
+    // @param[inout] iosize   in: stores the size available to store the
+    //                          property value.
+    //                        out: stores the size required to hold the language
+    //                          value if getLanguage() returned
+    //                          TTS_PROPERTY_SIZE_TOO_SMALL, unchanged otherwise
+    // @return TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS,
+    //         or TTS_PROPERTY_SIZE_TOO_SMALL
+    android_tts_result_t (*getProperty)
+            (void *engine,
+             const char *property,
+             char *value,
+             size_t *iosize);
+
+    // Synthesize the text.
+    // As the synthesis is performed, the engine invokes the callback to notify
+    // the TTS framework that it has filled the given buffer, and indicates how
+    // many bytes it wrote. The callback is called repeatedly until the engine
+    // has generated all the audio data corresponding to the text.
+    // Note about the format of the input: the text parameter may use the
+    // following elements
+    // and their respective attributes as defined in the SSML 1.0 specification:
+    //    * lang
+    //    * say-as:
+    //          o interpret-as
+    //    * phoneme
+    //    * voice:
+    //          o gender,
+    //          o age,
+    //          o variant,
+    //          o name
+    //    * emphasis
+    //    * break:
+    //          o strength,
+    //          o time
+    //    * prosody:
+    //          o pitch,
+    //          o contour,
+    //          o range,
+    //          o rate,
+    //          o duration,
+    //          o volume
+    //    * mark
+    // Differences between this text format and SSML are:
+    //    * full SSML documents are not supported
+    //    * namespaces are not supported
+    // Text is coded in UTF-8.
+    // @param text      the UTF-8 text to synthesize
+    // @param userdata  pointer to be returned when the call is invoked
+    // @param buffer    the location where the synthesized data must be written
+    // @param bufferSize the number of bytes that can be written in buffer
+    // @return          TTS_SUCCESS or TTS_FAILURE
+    android_tts_result_t (*synthesizeText)
+            (void *engine,
+             const char *text,
+             int8_t *buffer,
+             size_t bufferSize,
+             void *userdata);
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ANDROID_TTS_H */
diff --git a/ndk/platforms/android-13/include/math.h b/ndk/platforms/android-13/include/math.h
new file mode 100644
index 0000000..408f262
--- /dev/null
+++ b/ndk/platforms/android-13/include/math.h
@@ -0,0 +1,712 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD: src/lib/msun/src/math.h,v 1.61 2005/04/16 21:12:47 das Exp $
+ */
+
+#ifndef _MATH_H_
+#define	_MATH_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <limits.h>
+
+#define __pure2
+
+/*
+ * ANSI/POSIX
+ */
+extern const union __infinity_un {
+	unsigned char	__uc[8];
+	double		__ud;
+} __infinity;
+
+extern const union __nan_un {
+	unsigned char	__uc[sizeof(float)];
+	float		__uf;
+} __nan;
+
+/* #if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) */
+#if 1
+#define	__MATH_BUILTIN_CONSTANTS
+#endif
+
+/* #if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER) */
+#if 1
+#define	__MATH_BUILTIN_RELOPS
+#endif
+
+/* #ifdef __MATH_BUILTIN_CONSTANTS */
+#if 1
+#define	HUGE_VAL	__builtin_huge_val()
+#else
+#define	HUGE_VAL	(__infinity.__ud)
+#endif
+
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+#define	FP_ILOGB0	(-__INT_MAX)
+#define	FP_ILOGBNAN	__INT_MAX
+#else
+#define	FP_ILOGB0	(-INT_MAX)
+#define	FP_ILOGBNAN	INT_MAX
+#endif
+
+#ifdef __MATH_BUILTIN_CONSTANTS
+#define	HUGE_VALF	__builtin_huge_valf()
+#define	HUGE_VALL	__builtin_huge_vall()
+#define	INFINITY	__builtin_inf()
+#define	NAN		__builtin_nan("")
+#else
+#define	HUGE_VALF	(float)HUGE_VAL
+#define	HUGE_VALL	(long double)HUGE_VAL
+#define	INFINITY	HUGE_VALF
+#define	NAN		(__nan.__uf)
+#endif /* __MATH_BUILTIN_CONSTANTS */
+
+#define	MATH_ERRNO	1
+#define	MATH_ERREXCEPT	2
+#define	math_errhandling	MATH_ERREXCEPT
+
+/* XXX We need a <machine/math.h>. */
+#if defined(__ia64__) || defined(__sparc64__)
+#define	FP_FAST_FMA
+#endif
+#ifdef __ia64__
+#define	FP_FAST_FMAL
+#endif
+#define	FP_FAST_FMAF
+
+/* Symbolic constants to classify floating point numbers. */
+#define	FP_INFINITE	0x01
+#define	FP_NAN		0x02
+#define	FP_NORMAL	0x04
+#define	FP_SUBNORMAL	0x08
+#define	FP_ZERO		0x10
+#define	fpclassify(x) \
+    ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
+    : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
+    : __fpclassifyl(x))
+
+#define	isfinite(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isfinitef(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isfinite(x)	\
+    : __isfinitel(x))
+#define	isinf(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isinff(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isinf(x)	\
+    : __isinfl(x))
+#define	isnan(x)					\
+    ((sizeof (x) == sizeof (float)) ? isnanf(x)		\
+    : (sizeof (x) == sizeof (double)) ? isnan(x)	\
+    : __isnanl(x))
+#define	isnormal(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isnormalf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isnormal(x)	\
+    : __isnormall(x))
+
+#ifdef __MATH_BUILTIN_RELOPS
+#define	isgreater(x, y)		__builtin_isgreater((x), (y))
+#define	isgreaterequal(x, y)	__builtin_isgreaterequal((x), (y))
+#define	isless(x, y)		__builtin_isless((x), (y))
+#define	islessequal(x, y)	__builtin_islessequal((x), (y))
+#define	islessgreater(x, y)	__builtin_islessgreater((x), (y))
+#define	isunordered(x, y)	__builtin_isunordered((x), (y))
+#else
+#define	isgreater(x, y)		(!isunordered((x), (y)) && (x) > (y))
+#define	isgreaterequal(x, y)	(!isunordered((x), (y)) && (x) >= (y))
+#define	isless(x, y)		(!isunordered((x), (y)) && (x) < (y))
+#define	islessequal(x, y)	(!isunordered((x), (y)) && (x) <= (y))
+#define	islessgreater(x, y)	(!isunordered((x), (y)) && \
+					((x) > (y) || (y) > (x)))
+#define	isunordered(x, y)	(isnan(x) || isnan(y))
+#endif /* __MATH_BUILTIN_RELOPS */
+
+#define	signbit(x)					\
+    ((sizeof (x) == sizeof (float)) ? __signbitf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __signbit(x)	\
+    : __signbitl(x))
+
+#if 0
+typedef	__double_t	double_t;
+typedef	__float_t	float_t;
+#endif 
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+
+/*
+ * XOPEN/SVID
+ */
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+#define	M_E		2.7182818284590452354	/* e */
+#define	M_LOG2E		1.4426950408889634074	/* log 2e */
+#define	M_LOG10E	0.43429448190325182765	/* log 10e */
+#define	M_LN2		0.69314718055994530942	/* log e2 */
+#define	M_LN10		2.30258509299404568402	/* log e10 */
+#define	M_PI		3.14159265358979323846	/* pi */
+#define	M_PI_2		1.57079632679489661923	/* pi/2 */
+#define	M_PI_4		0.78539816339744830962	/* pi/4 */
+#define	M_1_PI		0.31830988618379067154	/* 1/pi */
+#define	M_2_PI		0.63661977236758134308	/* 2/pi */
+#define	M_2_SQRTPI	1.12837916709551257390	/* 2/sqrt(pi) */
+#define	M_SQRT2		1.41421356237309504880	/* sqrt(2) */
+#define	M_SQRT1_2	0.70710678118654752440	/* 1/sqrt(2) */
+
+#define	MAXFLOAT	((float)3.40282346638528860e+38)
+extern int signgam;
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+#if __BSD_VISIBLE
+#if 0
+/* Old value from 4.4BSD-Lite math.h; this is probably better. */
+#define	HUGE		HUGE_VAL
+#else
+#define	HUGE		MAXFLOAT
+#endif
+#endif /* __BSD_VISIBLE */
+
+/*
+ * Most of these functions depend on the rounding mode and have the side
+ * effect of raising floating-point exceptions, so they are not declared
+ * as __pure2.  In C99, FENV_ACCESS affects the purity of these functions.
+ */
+__BEGIN_DECLS
+/*
+ * ANSI/POSIX
+ */
+int	__fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int	__isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isinff(float) __NDK_FPABI_MATH__ __pure2;
+int     __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int	__isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int	__isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int	__signbit(double) __NDK_FPABI_MATH__ __pure2;
+int	__signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int	__signbitl(long double) __NDK_FPABI_MATH__ __pure2;
+
+double	acos(double) __NDK_FPABI_MATH__;
+double	asin(double) __NDK_FPABI_MATH__;
+double	atan(double) __NDK_FPABI_MATH__;
+double	atan2(double, double) __NDK_FPABI_MATH__;
+double	cos(double) __NDK_FPABI_MATH__;
+double	sin(double) __NDK_FPABI_MATH__;
+double	tan(double) __NDK_FPABI_MATH__;
+
+double	cosh(double) __NDK_FPABI_MATH__;
+double	sinh(double) __NDK_FPABI_MATH__;
+double	tanh(double) __NDK_FPABI_MATH__;
+
+double	exp(double) __NDK_FPABI_MATH__;
+double	frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	ldexp(double, int) __NDK_FPABI_MATH__;
+double	log(double) __NDK_FPABI_MATH__;
+double	log10(double) __NDK_FPABI_MATH__;
+double	modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+
+double	pow(double, double) __NDK_FPABI_MATH__;
+double	sqrt(double) __NDK_FPABI_MATH__;
+
+double	ceil(double) __NDK_FPABI_MATH__;
+double	fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	floor(double) __NDK_FPABI_MATH__;
+double	fmod(double, double) __NDK_FPABI_MATH__;
+
+/*
+ * These functions are not in C90.
+ */
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+double	acosh(double) __NDK_FPABI_MATH__;
+double	asinh(double) __NDK_FPABI_MATH__;
+double	atanh(double) __NDK_FPABI_MATH__;
+double	cbrt(double) __NDK_FPABI_MATH__;
+double	erf(double) __NDK_FPABI_MATH__;
+double	erfc(double) __NDK_FPABI_MATH__;
+double	exp2(double) __NDK_FPABI_MATH__;
+double	expm1(double) __NDK_FPABI_MATH__;
+double	fma(double, double, double) __NDK_FPABI_MATH__;
+double	hypot(double, double) __NDK_FPABI_MATH__;
+int	ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	(isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int	(isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double	lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double	log1p(double) __NDK_FPABI_MATH__;
+double	logb(double) __NDK_FPABI_MATH__;
+long	lrint(double) __NDK_FPABI_MATH__;
+long	lround(double) __NDK_FPABI_MATH__;
+double	nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double	nextafter(double, double) __NDK_FPABI_MATH__;
+double	remainder(double, double) __NDK_FPABI_MATH__;
+double	remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	rint(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+double	j0(double) __NDK_FPABI_MATH__;
+double	j1(double) __NDK_FPABI_MATH__;
+double	jn(int, double) __NDK_FPABI_MATH__;
+double	scalb(double, double) __NDK_FPABI_MATH__;
+double	y0(double) __NDK_FPABI_MATH__;
+double	y1(double) __NDK_FPABI_MATH__;
+double	yn(int, double) __NDK_FPABI_MATH__;
+
+/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
+double	gamma(double) __NDK_FPABI_MATH__;
+/* #endif */
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
+double	copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fdim(double, double) __NDK_FPABI_MATH__;
+double	fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	nearbyint(double) __NDK_FPABI_MATH__;
+double	round(double) __NDK_FPABI_MATH__;
+double	scalbln(double, long) __NDK_FPABI_MATH__;
+double	scalbn(double, int) __NDK_FPABI_MATH__;
+double	tgamma(double) __NDK_FPABI_MATH__;
+double	trunc(double) __NDK_FPABI_MATH__;
+/* #endif */
+
+/*
+ * BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+double	drem(double, double) __NDK_FPABI_MATH__;
+int	finite(double) __NDK_FPABI_MATH__ __pure2;
+int	isnanf(float) __NDK_FPABI_MATH__ __pure2;
+
+/*
+ * Reentrant version of gamma & lgamma; passes signgam back by reference
+ * as the second argument; user must allocate space for signgam.
+ */
+double	gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	lgamma_r(double, int *) __NDK_FPABI_MATH__;
+
+/*
+ * IEEE Test Vector
+ */
+double	significand(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/* float versions of ANSI/POSIX functions */
+/*#if __ISO_C_VISIBLE >= 1999 */
+float	acosf(float) __NDK_FPABI_MATH__;
+float	asinf(float) __NDK_FPABI_MATH__;
+float	atanf(float) __NDK_FPABI_MATH__;
+float	atan2f(float, float) __NDK_FPABI_MATH__;
+float	cosf(float) __NDK_FPABI_MATH__;
+float	sinf(float) __NDK_FPABI_MATH__;
+float	tanf(float) __NDK_FPABI_MATH__;
+
+float	coshf(float) __NDK_FPABI_MATH__;
+float	sinhf(float) __NDK_FPABI_MATH__;
+float	tanhf(float) __NDK_FPABI_MATH__;
+
+float	exp2f(float) __NDK_FPABI_MATH__;
+float	expf(float) __NDK_FPABI_MATH__;
+float	expm1f(float) __NDK_FPABI_MATH__;
+float	frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	ldexpf(float, int) __NDK_FPABI_MATH__;
+float	log10f(float) __NDK_FPABI_MATH__;
+float	log1pf(float) __NDK_FPABI_MATH__;
+float	logf(float) __NDK_FPABI_MATH__;
+float	modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+
+float	powf(float, float) __NDK_FPABI_MATH__;
+float	sqrtf(float) __NDK_FPABI_MATH__;
+
+float	ceilf(float) __NDK_FPABI_MATH__;
+float	fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	floorf(float) __NDK_FPABI_MATH__;
+float	fmodf(float, float) __NDK_FPABI_MATH__;
+float	roundf(float) __NDK_FPABI_MATH__;
+
+float	erff(float) __NDK_FPABI_MATH__;
+float	erfcf(float) __NDK_FPABI_MATH__;
+float	hypotf(float, float) __NDK_FPABI_MATH__;
+float	lgammaf(float) __NDK_FPABI_MATH__;
+float	tgammaf(float) __NDK_FPABI_MATH__;
+
+float	acoshf(float) __NDK_FPABI_MATH__;
+float	asinhf(float) __NDK_FPABI_MATH__;
+float	atanhf(float) __NDK_FPABI_MATH__;
+float	cbrtf(float) __NDK_FPABI_MATH__;
+float	logbf(float) __NDK_FPABI_MATH__;
+float	copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long	lrintf(float) __NDK_FPABI_MATH__;
+long	lroundf(float) __NDK_FPABI_MATH__;
+float	nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float	nearbyintf(float) __NDK_FPABI_MATH__;
+float	nextafterf(float, float) __NDK_FPABI_MATH__;
+float	remainderf(float, float) __NDK_FPABI_MATH__;
+float	remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	rintf(float) __NDK_FPABI_MATH__;
+float	scalblnf(float, long) __NDK_FPABI_MATH__;
+float	scalbnf(float, int) __NDK_FPABI_MATH__;
+float	truncf(float) __NDK_FPABI_MATH__;
+
+float	fdimf(float, float) __NDK_FPABI_MATH__;
+float	fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+/* #endif */
+
+/*
+ * float versions of BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+float	dremf(float, float) __NDK_FPABI_MATH__;
+int	finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	gammaf(float) __NDK_FPABI_MATH__;
+float	j0f(float) __NDK_FPABI_MATH__;
+float	j1f(float) __NDK_FPABI_MATH__;
+float	jnf(int, float) __NDK_FPABI_MATH__;
+float	scalbf(float, float) __NDK_FPABI_MATH__;
+float	y0f(float) __NDK_FPABI_MATH__;
+float	y1f(float) __NDK_FPABI_MATH__;
+float	ynf(int, float) __NDK_FPABI_MATH__;
+
+/*
+ * Float versions of reentrant version of gamma & lgamma; passes
+ * signgam back by reference as the second argument; user must
+ * allocate space for signgam.
+ */
+float	gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+
+/*
+ * float version of IEEE Test Vector
+ */
+float	significandf(float) __NDK_FPABI_MATH__;
+/* #endif */	/* __BSD_VISIBLE */ 
+
+/*
+ * long double versions of ISO/POSIX math functions
+ */
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+long double	acoshl(long double) __NDK_FPABI_MATH__;
+long double	acosl(long double) __NDK_FPABI_MATH__;
+long double	asinhl(long double) __NDK_FPABI_MATH__;
+long double	asinl(long double) __NDK_FPABI_MATH__;
+long double	atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	atanhl(long double) __NDK_FPABI_MATH__;
+long double	atanl(long double) __NDK_FPABI_MATH__;
+long double	cbrtl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	ceill(long double) __NDK_FPABI_MATH__;
+long double	copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	coshl(long double) __NDK_FPABI_MATH__;
+long double	cosl(long double) __NDK_FPABI_MATH__;
+long double	erfcl(long double) __NDK_FPABI_MATH__;
+long double	erfl(long double) __NDK_FPABI_MATH__;
+long double	exp2l(long double) __NDK_FPABI_MATH__;
+long double	expl(long double) __NDK_FPABI_MATH__;
+long double	expm1l(long double) __NDK_FPABI_MATH__;
+#endif
+long double	fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	floorl(long double) __NDK_FPABI_MATH__;
+long double	fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	fmodl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+long double	frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#if 0
+long double	hypotl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+int		ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	ldexpl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double	lgammal(long double) __NDK_FPABI_MATH__;
+long long	llrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long long	llroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double	log10l(long double) __NDK_FPABI_MATH__;
+long double	log1pl(long double) __NDK_FPABI_MATH__;
+long double	log2l(long double) __NDK_FPABI_MATH__;
+long double	logbl(long double) __NDK_FPABI_MATH__;
+long double	logl(long double) __NDK_FPABI_MATH__;
+long		lrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long		lroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double	modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#endif
+long double	nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	nearbyintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double		nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double	nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+#if 0
+long double	powl(long double, long double) __NDK_FPABI_MATH__;
+long double	remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	rintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	roundl(long double) __NDK_FPABI_MATH__;
+long double	scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	scalbnl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double	sinhl(long double) __NDK_FPABI_MATH__;
+long double	sinl(long double) __NDK_FPABI_MATH__;
+long double	sqrtl(long double) __NDK_FPABI_MATH__;
+long double	tanhl(long double) __NDK_FPABI_MATH__;
+long double	tanl(long double) __NDK_FPABI_MATH__;
+long double	tgammal(long double) __NDK_FPABI_MATH__;
+#endif
+long double	truncl(long double) __NDK_FPABI_MATH__;
+
+/* BIONIC: GLibc compatibility - required by the ARM toolchain */
+#ifdef _GNU_SOURCE
+void  sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+#endif
+
+/* builtin version of all the above math functions are annotated too */
+
+double	__builtin_acos(double) __NDK_FPABI_MATH__;
+double	__builtin_asin(double) __NDK_FPABI_MATH__;
+double	__builtin_atan(double) __NDK_FPABI_MATH__;
+double	__builtin_atan2(double, double) __NDK_FPABI_MATH__;
+double	__builtin_cos(double) __NDK_FPABI_MATH__;
+double	__builtin_sin(double) __NDK_FPABI_MATH__;
+double	__builtin_tan(double) __NDK_FPABI_MATH__;
+double	__builtin_cosh(double) __NDK_FPABI_MATH__;
+double	__builtin_sinh(double) __NDK_FPABI_MATH__;
+double	__builtin_tanh(double) __NDK_FPABI_MATH__;
+double	__builtin_exp(double) __NDK_FPABI_MATH__;
+double	__builtin_frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_ldexp(double, int) __NDK_FPABI_MATH__;
+double	__builtin_log(double) __NDK_FPABI_MATH__;
+double	__builtin_log10(double) __NDK_FPABI_MATH__;
+double	__builtin_modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_pow(double, double) __NDK_FPABI_MATH__;
+double	__builtin_sqrt(double) __NDK_FPABI_MATH__;
+double	__builtin_ceil(double) __NDK_FPABI_MATH__;
+double	__builtin_fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_floor(double) __NDK_FPABI_MATH__;
+double	__builtin_fmod(double, double) __NDK_FPABI_MATH__;
+double	__builtin_acosh(double) __NDK_FPABI_MATH__;
+double	__builtin_asinh(double) __NDK_FPABI_MATH__;
+double	__builtin_atanh(double) __NDK_FPABI_MATH__;
+double	__builtin_cbrt(double) __NDK_FPABI_MATH__;
+double	__builtin_erf(double) __NDK_FPABI_MATH__;
+double	__builtin_erfc(double) __NDK_FPABI_MATH__;
+double	__builtin_exp2(double) __NDK_FPABI_MATH__;
+double	__builtin_expm1(double) __NDK_FPABI_MATH__;
+double	__builtin_fma(double, double, double) __NDK_FPABI_MATH__;
+double	__builtin_hypot(double, double) __NDK_FPABI_MATH__;
+int	__builtin_ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	__builtin_isinf(double) __NDK_FPABI_MATH__ __pure2; */
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 5)
+int	__builtin_isnan(double) __NDK_FPABI_MATH__ __pure2;
+#else
+/* clang < 3.5 has faulty prototype for __builtin_isnan */
+#endif
+double	__builtin_lgamma(double) __NDK_FPABI_MATH__;
+long long __builtin_llrint(double) __NDK_FPABI_MATH__;
+long long __builtin_llround(double) __NDK_FPABI_MATH__;
+double	__builtin_log1p(double) __NDK_FPABI_MATH__;
+double	__builtin_logb(double) __NDK_FPABI_MATH__;
+long	__builtin_lrint(double) __NDK_FPABI_MATH__;
+long	__builtin_lround(double) __NDK_FPABI_MATH__;
+double	__builtin_nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nextafter(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remainder(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	__builtin_rint(double) __NDK_FPABI_MATH__;
+double	__builtin_j0(double) __NDK_FPABI_MATH__;
+double	__builtin_j1(double) __NDK_FPABI_MATH__;
+double	__builtin_jn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_scalb(double, double) __NDK_FPABI_MATH__;
+double	__builtin_y0(double) __NDK_FPABI_MATH__;
+double	__builtin_y1(double) __NDK_FPABI_MATH__;
+double	__builtin_yn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_gamma(double) __NDK_FPABI_MATH__;
+double	__builtin_copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fdim(double, double) __NDK_FPABI_MATH__;
+double	__builtin_fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nearbyint(double) __NDK_FPABI_MATH__;
+double	__builtin_round(double) __NDK_FPABI_MATH__;
+double	__builtin_scalbln(double, long) __NDK_FPABI_MATH__;
+double	__builtin_scalbn(double, int) __NDK_FPABI_MATH__;
+double	__builtin_tgamma(double) __NDK_FPABI_MATH__;
+double	__builtin_trunc(double) __NDK_FPABI_MATH__;
+double	__builtin_drem(double, double) __NDK_FPABI_MATH__;
+int	__builtin_finite(double) __NDK_FPABI_MATH__ __pure2;
+int	__builtin_isnanf(float) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_lgamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_significand(double) __NDK_FPABI_MATH__;
+float	__builtin_acosf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanf(float) __NDK_FPABI_MATH__;
+float	__builtin_atan2f(float, float) __NDK_FPABI_MATH__;
+float	__builtin_cosf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanf(float) __NDK_FPABI_MATH__;
+float	__builtin_coshf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_exp2f(float) __NDK_FPABI_MATH__;
+float	__builtin_expf(float) __NDK_FPABI_MATH__;
+float	__builtin_expm1f(float) __NDK_FPABI_MATH__;
+float	__builtin_frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	__builtin_ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_ldexpf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_log10f(float) __NDK_FPABI_MATH__;
+float	__builtin_log1pf(float) __NDK_FPABI_MATH__;
+float	__builtin_logf(float) __NDK_FPABI_MATH__;
+float	__builtin_modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+float	__builtin_powf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_sqrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_ceilf(float) __NDK_FPABI_MATH__;
+float	__builtin_fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_floorf(float) __NDK_FPABI_MATH__;
+float	__builtin_fmodf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_roundf(float) __NDK_FPABI_MATH__;
+float	__builtin_erff(float) __NDK_FPABI_MATH__;
+float	__builtin_erfcf(float) __NDK_FPABI_MATH__;
+float	__builtin_hypotf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_tgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_acoshf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_cbrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_logbf(float) __NDK_FPABI_MATH__;
+float	__builtin_copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long __builtin_llrintf(float) __NDK_FPABI_MATH__;
+long long __builtin_llroundf(float) __NDK_FPABI_MATH__;
+long	__builtin_lrintf(float) __NDK_FPABI_MATH__;
+long	__builtin_lroundf(float) __NDK_FPABI_MATH__;
+float	__builtin_nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_nearbyintf(float) __NDK_FPABI_MATH__;
+float	__builtin_nextafterf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remainderf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	__builtin_rintf(float) __NDK_FPABI_MATH__;
+float	__builtin_scalblnf(float, long) __NDK_FPABI_MATH__;
+float	__builtin_scalbnf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_truncf(float) __NDK_FPABI_MATH__;
+float	__builtin_fdimf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_dremf(float, float) __NDK_FPABI_MATH__;
+int	__builtin_finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_gammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_j0f(float) __NDK_FPABI_MATH__;
+float	__builtin_j1f(float) __NDK_FPABI_MATH__;
+float	__builtin_jnf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_scalbf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_y0f(float) __NDK_FPABI_MATH__;
+float	__builtin_y1f(float) __NDK_FPABI_MATH__;
+float	__builtin_ynf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_significandf(float) __NDK_FPABI_MATH__;
+long double	__builtin_acoshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_acosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cbrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_ceill(long double) __NDK_FPABI_MATH__;
+long double	__builtin_copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_coshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfcl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_exp2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expm1l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_floorl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fmodl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_hypotl(long double, long double) __NDK_FPABI_MATH__;
+int		__builtin_ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_ldexpl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_lgammal(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llrintl(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log10l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log1pl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logbl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lrintl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_nearbyintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_nextafterl(long double, long double) __NDK_FPABI_MATH__;
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)
+double		__builtin_nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, long double) __NDK_FPABI_MATH__;
+#else
+/* clang < 3.4 */
+double		__builtin_nexttoward(double, double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, float) __NDK_FPABI_MATH__;
+#endif
+long double	__builtin_nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_powl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	__builtin_rintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_roundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	__builtin_scalbnl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_sinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sqrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tgammal(long double) __NDK_FPABI_MATH__;
+long double	__builtin_truncl(long double) __NDK_FPABI_MATH__;
+void  __builtin_sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+__END_DECLS
+
+#endif /* !_MATH_H_ */
diff --git a/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..090b655
--- /dev/null
+++ b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,172 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_fromSurfaceTexture
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-14/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-14/include/OMXAL/OpenMAXAL_Android.h b/ndk/platforms/android-14/include/OMXAL/OpenMAXAL_Android.h
index 10f36f4..7c9bba5 100644
--- a/ndk/platforms/android-14/include/OMXAL/OpenMAXAL_Android.h
+++ b/ndk/platforms/android-14/include/OMXAL/OpenMAXAL_Android.h
@@ -21,6 +21,8 @@
 extern "C" {
 #endif
 
+#include "OpenMAXAL.h"
+
 /*---------------------------------------------------------------------------*/
 /* Android common types                                                      */
 /*---------------------------------------------------------------------------*/
diff --git a/ndk/platforms/android-14/include/SLES/OpenSLES_Android.h b/ndk/platforms/android-14/include/SLES/OpenSLES_Android.h
index f295518..4d8f656 100644
--- a/ndk/platforms/android-14/include/SLES/OpenSLES_Android.h
+++ b/ndk/platforms/android-14/include/SLES/OpenSLES_Android.h
@@ -24,6 +24,8 @@
 extern "C" {
 #endif
 
+#include "OpenSLES.h"
+
 /*---------------------------------------------------------------------------*/
 /* Android common types                                                      */
 /*---------------------------------------------------------------------------*/
diff --git a/ndk/platforms/android-14/include/android/input.h b/ndk/platforms/android-14/include/android/input.h
new file mode 100644
index 0000000..ac7bcc0
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/input.h
@@ -0,0 +1,848 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+    /* The key state is unknown or the requested key itself is not supported. */
+    AKEY_STATE_UNKNOWN = -1,
+
+    /* The key is up. */
+    AKEY_STATE_UP = 0,
+
+    /* The key is down. */
+    AKEY_STATE_DOWN = 1,
+
+    /* The key is down but is a virtual key press that is being emulated by the system. */
+    AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+    /* No meta keys are pressed. */
+    AMETA_NONE = 0,
+
+    /* This mask is used to check whether one of the ALT meta keys is pressed. */
+    AMETA_ALT_ON = 0x02,
+
+    /* This mask is used to check whether the left ALT meta key is pressed. */
+    AMETA_ALT_LEFT_ON = 0x10,
+
+    /* This mask is used to check whether the right ALT meta key is pressed. */
+    AMETA_ALT_RIGHT_ON = 0x20,
+
+    /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+    AMETA_SHIFT_ON = 0x01,
+
+    /* This mask is used to check whether the left SHIFT meta key is pressed. */
+    AMETA_SHIFT_LEFT_ON = 0x40,
+
+    /* This mask is used to check whether the right SHIFT meta key is pressed. */
+    AMETA_SHIFT_RIGHT_ON = 0x80,
+
+    /* This mask is used to check whether the SYM meta key is pressed. */
+    AMETA_SYM_ON = 0x04,
+
+    /* This mask is used to check whether the FUNCTION meta key is pressed. */
+    AMETA_FUNCTION_ON = 0x08,
+
+    /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+    AMETA_CTRL_ON = 0x1000,
+
+    /* This mask is used to check whether the left CTRL meta key is pressed. */
+    AMETA_CTRL_LEFT_ON = 0x2000,
+
+    /* This mask is used to check whether the right CTRL meta key is pressed. */
+    AMETA_CTRL_RIGHT_ON = 0x4000,
+
+    /* This mask is used to check whether one of the META meta keys is pressed. */
+    AMETA_META_ON = 0x10000,
+
+    /* This mask is used to check whether the left META meta key is pressed. */
+    AMETA_META_LEFT_ON = 0x20000,
+
+    /* This mask is used to check whether the right META meta key is pressed. */
+    AMETA_META_RIGHT_ON = 0x40000,
+
+    /* This mask is used to check whether the CAPS LOCK meta key is on. */
+    AMETA_CAPS_LOCK_ON = 0x100000,
+
+    /* This mask is used to check whether the NUM LOCK meta key is on. */
+    AMETA_NUM_LOCK_ON = 0x200000,
+
+    /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+    AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures.  Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+    /* Indicates that the input event is a key event. */
+    AINPUT_EVENT_TYPE_KEY = 1,
+
+    /* Indicates that the input event is a motion event. */
+    AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+    /* The key has been pressed down. */
+    AKEY_EVENT_ACTION_DOWN = 0,
+
+    /* The key has been released. */
+    AKEY_EVENT_ACTION_UP = 1,
+
+    /* Multiple duplicate key events have occurred in a row, or a complex string is
+     * being delivered.  The repeat_count property of the key event contains the number
+     * of times the given key code should be executed.
+     */
+    AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+    /* This mask is set if the device woke because of this key event. */
+    AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+    /* This mask is set if the key event was generated by a software keyboard. */
+    AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+    /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+    AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+    /* This mask is set if an event was known to come from a trusted part
+     * of the system.  That is, the event is known to come from the user,
+     * and could not have been spoofed by a third party component. */
+    AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+    /* This mask is used for compatibility, to identify enter keys that are
+     * coming from an IME whose enter key has been auto-labelled "next" or
+     * "done".  This allows TextView to dispatch these as normal enter keys
+     * for old applications, but still do the appropriate action when
+     * receiving them. */
+    AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+    /* When associated with up key events, this indicates that the key press
+     * has been canceled.  Typically this is used with virtual touch screen
+     * keys, where the user can slide from the virtual key area on to the
+     * display: in that case, the application will receive a canceled up
+     * event and should not perform the action normally associated with the
+     * key.  Note that for this to work, the application can not perform an
+     * action for a key until it receives an up or the long press timeout has
+     * expired. */
+    AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+    /* This key event was generated by a virtual (on-screen) hard key area.
+     * Typically this is an area of the touchscreen, outside of the regular
+     * display, dedicated to "hardware" buttons. */
+    AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+    /* This flag is set for the first key repeat that occurs after the
+     * long press timeout. */
+    AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+    /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+     * press action was executed while it was down. */
+    AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+    /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+     * tracked from its initial down.  That is, somebody requested that tracking
+     * started on the key down and a long press has not caused
+     * the tracking to be canceled. */
+    AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+    /* Set when a key event has been synthesized to implement default behavior
+     * for an event that the application did not handle.
+     * Fallback key events are generated by unhandled trackball motions
+     * (to emulate a directional keypad) and by certain unhandled key presses
+     * that are declared in the key map (such as special function numeric keypad
+     * keys when numlock is off). */
+    AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+    /* Bit mask of the parts of the action code that are the action itself.
+     */
+    AMOTION_EVENT_ACTION_MASK = 0xff,
+
+    /* Bits in the action code that represent a pointer index, used with
+     * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP.  Shifting
+     * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+     * index where the data for the pointer going up or down can be found.
+     */
+    AMOTION_EVENT_ACTION_POINTER_INDEX_MASK  = 0xff00,
+
+    /* A pressed gesture has started, the motion contains the initial starting location.
+     */
+    AMOTION_EVENT_ACTION_DOWN = 0,
+
+    /* A pressed gesture has finished, the motion contains the final release location
+     * as well as any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_UP = 1,
+
+    /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+     * AMOTION_EVENT_ACTION_UP).  The motion contains the most recent point, as well as
+     * any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_MOVE = 2,
+
+    /* The current gesture has been aborted.
+     * You will not receive any more points in it.  You should treat this as
+     * an up event, but not perform any action that you normally would.
+     */
+    AMOTION_EVENT_ACTION_CANCEL = 3,
+
+    /* A movement has happened outside of the normal bounds of the UI element.
+     * This does not provide a full gesture, but only the initial location of the movement/touch.
+     */
+    AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+    /* A non-primary pointer has gone down.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+    /* A non-primary pointer has gone up.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+    /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+     * The motion contains the most recent point, as well as any intermediate points since
+     * the last hover move event.
+     */
+    AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+    /* The motion event contains relative vertical and/or horizontal scroll offsets.
+     * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+     * and AMOTION_EVENT_AXIS_HSCROLL.
+     * The pointer may or may not be down when this event is dispatched.
+     * This action is always delivered to the winder under the pointer, which
+     * may not be the window currently touched.
+     */
+    AMOTION_EVENT_ACTION_SCROLL = 8,
+
+    /* The pointer is not down but has entered the boundaries of a window or view.
+     */
+    AMOTION_EVENT_ACTION_HOVER_ENTER = 9,
+
+    /* The pointer is not down but has exited the boundaries of a window or view.
+     */
+    AMOTION_EVENT_ACTION_HOVER_EXIT = 10,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+    /* This flag indicates that the window that received this motion event is partly
+     * or wholly obscured by another visible window above it.  This flag is set to true
+     * even if the event did not directly pass through the obscured area.
+     * A security sensitive application can check this flag to identify situations in which
+     * a malicious application may have covered up part of its content for the purpose
+     * of misleading the user or hijacking touches.  An appropriate response might be
+     * to drop the suspect touches or to take additional precautions to confirm the user's
+     * actual intent.
+     */
+    AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+    /* No edges intersected */
+    AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+    /* Flag indicating the motion event intersected the top edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+    /* Flag indicating the motion event intersected the bottom edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+    /* Flag indicating the motion event intersected the left edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+    /* Flag indicating the motion event intersected the right edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+    AMOTION_EVENT_AXIS_X = 0,
+    AMOTION_EVENT_AXIS_Y = 1,
+    AMOTION_EVENT_AXIS_PRESSURE = 2,
+    AMOTION_EVENT_AXIS_SIZE = 3,
+    AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+    AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+    AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+    AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+    AMOTION_EVENT_AXIS_ORIENTATION = 8,
+    AMOTION_EVENT_AXIS_VSCROLL = 9,
+    AMOTION_EVENT_AXIS_HSCROLL = 10,
+    AMOTION_EVENT_AXIS_Z = 11,
+    AMOTION_EVENT_AXIS_RX = 12,
+    AMOTION_EVENT_AXIS_RY = 13,
+    AMOTION_EVENT_AXIS_RZ = 14,
+    AMOTION_EVENT_AXIS_HAT_X = 15,
+    AMOTION_EVENT_AXIS_HAT_Y = 16,
+    AMOTION_EVENT_AXIS_LTRIGGER = 17,
+    AMOTION_EVENT_AXIS_RTRIGGER = 18,
+    AMOTION_EVENT_AXIS_THROTTLE = 19,
+    AMOTION_EVENT_AXIS_RUDDER = 20,
+    AMOTION_EVENT_AXIS_WHEEL = 21,
+    AMOTION_EVENT_AXIS_GAS = 22,
+    AMOTION_EVENT_AXIS_BRAKE = 23,
+    AMOTION_EVENT_AXIS_DISTANCE = 24,
+    AMOTION_EVENT_AXIS_TILT = 25,
+    AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+    AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+    AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+    AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+    AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+    AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+    AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+    AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+    AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+    AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+    AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+    AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+    AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+    AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+    AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+    AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+    // NOTE: If you add a new axis here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Constants that identify buttons that are associated with motion events.
+ * Refer to the documentation on the MotionEvent class for descriptions of each button.
+ */
+enum {
+    AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0,
+    AMOTION_EVENT_BUTTON_SECONDARY = 1 << 1,
+    AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2,
+    AMOTION_EVENT_BUTTON_BACK = 1 << 3,
+    AMOTION_EVENT_BUTTON_FORWARD = 1 << 4,
+};
+
+/*
+ * Constants that identify tool types.
+ * Refer to the documentation on the MotionEvent class for descriptions of each tool type.
+ */
+enum {
+    AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0,
+    AMOTION_EVENT_TOOL_TYPE_FINGER = 1,
+    AMOTION_EVENT_TOOL_TYPE_STYLUS = 2,
+    AMOTION_EVENT_TOOL_TYPE_MOUSE = 3,
+    AMOTION_EVENT_TOOL_TYPE_ERASER = 4,
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+    AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+    AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+    AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+    AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+    AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+    AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+    AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+    AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_STYLUS = 0x00004000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+    AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+    AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+    AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+    AINPUT_KEYBOARD_TYPE_NONE = 0,
+    AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+    AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated.  Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+    AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+    AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+    AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+    AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+    AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+    AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+    AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+    AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+    AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there.  For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base.  If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get the button state of all buttons that are pressed. */
+int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index in this event.  The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the tool type of a pointer for the given pointer index.
+ * The tool type indicates the type of tool used to make contact such as a
+ * finger or stylus, if known. */
+int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index) __NDK_FPABI__;
+
+/* Get the number of historical points in this event.  These are movements that
+ * have occurred between this event and the previous event.  This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+        size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index) __NDK_FPABI__;
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index, size_t history_index) __NDK_FPABI__;
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing.  See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+        int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue.  Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue.  Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app.  Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now.  If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-14/include/android/keycodes.h b/ndk/platforms/android-14/include/android/keycodes.h
new file mode 100644
index 0000000..5d49775
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/keycodes.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+    AKEYCODE_LANGUAGE_SWITCH = 204,
+    AKEYCODE_MANNER_MODE     = 205,
+    AKEYCODE_3D_MODE         = 206,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-14/include/android/native_window.h b/ndk/platforms/android-14/include/android/native_window.h
new file mode 100644
index 0000000..2f4f2d3
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/native_window.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_H
+#define ANDROID_NATIVE_WINDOW_H
+
+#include <android/rect.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Pixel formats that a window can use.
+ */
+enum {
+    WINDOW_FORMAT_RGBA_8888          = 1,
+    WINDOW_FORMAT_RGBX_8888          = 2,
+    WINDOW_FORMAT_RGB_565            = 4,
+};
+
+struct ANativeWindow;
+typedef struct ANativeWindow ANativeWindow;
+
+typedef struct ANativeWindow_Buffer {
+    // The number of pixels that are show horizontally.
+    int32_t width;
+
+    // The number of pixels that are shown vertically.
+    int32_t height;
+
+    // The number of *pixels* that a line in the buffer takes in
+    // memory.  This may be >= width.
+    int32_t stride;
+
+    // The format of the buffer.  One of WINDOW_FORMAT_*
+    int32_t format;
+
+    // The actual bits.
+    void* bits;
+    
+    // Do not touch.
+    uint32_t reserved[6];
+} ANativeWindow_Buffer;
+
+/**
+ * Acquire a reference on the given ANativeWindow object.  This prevents the object
+ * from being deleted until the reference is removed.
+ */
+void ANativeWindow_acquire(ANativeWindow* window);
+
+/**
+ * Remove a reference that was previously acquired with ANativeWindow_acquire().
+ */
+void ANativeWindow_release(ANativeWindow* window);
+
+/*
+ * Return the current width in pixels of the window surface.  Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getWidth(ANativeWindow* window);
+
+/*
+ * Return the current height in pixels of the window surface.  Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getHeight(ANativeWindow* window);
+
+/*
+ * Return the current pixel format of the window surface.  Returns a
+ * negative value on error.
+ */
+int32_t ANativeWindow_getFormat(ANativeWindow* window);
+
+/*
+ * Change the format and size of the window buffers.
+ *
+ * The width and height control the number of pixels in the buffers, not the
+ * dimensions of the window on screen.  If these are different than the
+ * window's physical size, then it buffer will be scaled to match that size
+ * when compositing it to the screen.
+ *
+ * For all of these parameters, if 0 is supplied then the window's base
+ * value will come back in force.
+ *
+ * width and height must be either both zero or both non-zero.
+ *
+ */
+int32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window,
+        int32_t width, int32_t height, int32_t format);
+
+/**
+ * Lock the window's next drawing surface for writing.
+ * inOutDirtyBounds is used as an in/out parameter, upon entering the
+ * function, it contains the dirty region, that is, the region the caller
+ * intends to redraw. When the function returns, inOutDirtyBounds is updated
+ * with the actual area the caller needs to redraw -- this region is often
+ * extended by ANativeWindow_lock.
+ */
+int32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer,
+        ARect* inOutDirtyBounds);
+
+/**
+ * Unlock the window's drawing surface after previously locking it,
+ * posting the new buffer to the display.
+ */
+int32_t ANativeWindow_unlockAndPost(ANativeWindow* window);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-14/include/android/rect.h b/ndk/platforms/android-14/include/android/rect.h
new file mode 100644
index 0000000..bcd42a9
--- /dev/null
+++ b/ndk/platforms/android-14/include/android/rect.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_RECT_H
+#define ANDROID_RECT_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ARect {
+#ifdef __cplusplus
+    typedef int32_t value_type;
+#endif
+    int32_t left;
+    int32_t top;
+    int32_t right;
+    int32_t bottom;
+} ARect;
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_RECT_H
diff --git a/ndk/platforms/android-15/include/android/keycodes.h b/ndk/platforms/android-15/include/android/keycodes.h
new file mode 100644
index 0000000..8414ff6
--- /dev/null
+++ b/ndk/platforms/android-15/include/android/keycodes.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+    AKEYCODE_LANGUAGE_SWITCH = 204,
+    AKEYCODE_MANNER_MODE     = 205,
+    AKEYCODE_3D_MODE         = 206,
+    AKEYCODE_CONTACTS        = 207,
+    AKEYCODE_CALENDAR        = 208,
+    AKEYCODE_MUSIC           = 209,
+    AKEYCODE_CALCULATOR      = 210,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..845515a
--- /dev/null
+++ b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,171 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-16/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-16/include/android/configuration.h b/ndk/platforms/android-16/include/android/configuration.h
new file mode 100644
index 0000000..06cd3da
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/configuration.h
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+    ACONFIGURATION_ORIENTATION_ANY  = 0x0000,
+    ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+    ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+    ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+    ACONFIGURATION_TOUCHSCREEN_ANY  = 0x0000,
+    ACONFIGURATION_TOUCHSCREEN_NOTOUCH  = 0x0001,
+    ACONFIGURATION_TOUCHSCREEN_STYLUS  = 0x0002,
+    ACONFIGURATION_TOUCHSCREEN_FINGER  = 0x0003,
+
+    ACONFIGURATION_DENSITY_DEFAULT = 0,
+    ACONFIGURATION_DENSITY_LOW = 120,
+    ACONFIGURATION_DENSITY_MEDIUM = 160,
+    ACONFIGURATION_DENSITY_TV = 213,
+    ACONFIGURATION_DENSITY_HIGH = 240,
+    ACONFIGURATION_DENSITY_XHIGH = 320,
+    ACONFIGURATION_DENSITY_XXHIGH = 480,
+    ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+    ACONFIGURATION_KEYBOARD_ANY  = 0x0000,
+    ACONFIGURATION_KEYBOARD_NOKEYS  = 0x0001,
+    ACONFIGURATION_KEYBOARD_QWERTY  = 0x0002,
+    ACONFIGURATION_KEYBOARD_12KEY  = 0x0003,
+
+    ACONFIGURATION_NAVIGATION_ANY  = 0x0000,
+    ACONFIGURATION_NAVIGATION_NONAV  = 0x0001,
+    ACONFIGURATION_NAVIGATION_DPAD  = 0x0002,
+    ACONFIGURATION_NAVIGATION_TRACKBALL  = 0x0003,
+    ACONFIGURATION_NAVIGATION_WHEEL  = 0x0004,
+
+    ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+    ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+    ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+    ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+    ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+    ACONFIGURATION_SCREENSIZE_ANY  = 0x00,
+    ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+    ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+    ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+    ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+    ACONFIGURATION_SCREENLONG_ANY = 0x00,
+    ACONFIGURATION_SCREENLONG_NO = 0x1,
+    ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+    ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+    ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+    ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+    ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+    ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+    ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+    ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+    ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_MCC = 0x0001,
+    ACONFIGURATION_MNC = 0x0002,
+    ACONFIGURATION_LOCALE = 0x0004,
+    ACONFIGURATION_TOUCHSCREEN = 0x0008,
+    ACONFIGURATION_KEYBOARD = 0x0010,
+    ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+    ACONFIGURATION_NAVIGATION = 0x0040,
+    ACONFIGURATION_ORIENTATION = 0x0080,
+    ACONFIGURATION_DENSITY = 0x0100,
+    ACONFIGURATION_SCREEN_SIZE = 0x0200,
+    ACONFIGURATION_VERSION = 0x0400,
+    ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+    ACONFIGURATION_UI_MODE = 0x1000,
+    ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations.  Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'.  Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'.  Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'.  If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there.  If it is NULL, this decision is
+ * simply based on which configuration is more specific.  Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+        AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-16/include/android/keycodes.h b/ndk/platforms/android-16/include/android/keycodes.h
new file mode 100644
index 0000000..282e729
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/keycodes.h
@@ -0,0 +1,275 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+    AKEYCODE_LANGUAGE_SWITCH = 204,
+    AKEYCODE_MANNER_MODE     = 205,
+    AKEYCODE_3D_MODE         = 206,
+    AKEYCODE_CONTACTS        = 207,
+    AKEYCODE_CALENDAR        = 208,
+    AKEYCODE_MUSIC           = 209,
+    AKEYCODE_CALCULATOR      = 210,
+    AKEYCODE_ZENKAKU_HANKAKU = 211,
+    AKEYCODE_EISU            = 212,
+    AKEYCODE_MUHENKAN        = 213,
+    AKEYCODE_HENKAN          = 214,
+    AKEYCODE_KATAKANA_HIRAGANA = 215,
+    AKEYCODE_YEN             = 216,
+    AKEYCODE_RO              = 217,
+    AKEYCODE_KANA            = 218,
+    AKEYCODE_ASSIST          = 219,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-16/include/android/native_window_jni.h b/ndk/platforms/android-16/include/android/native_window_jni.h
new file mode 100644
index 0000000..b9e72ef
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/native_window_jni.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_NATIVE_WINDOW_JNI_H
+#define ANDROID_NATIVE_WINDOW_JNI_H
+
+#include <android/native_window.h>
+
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Return the ANativeWindow associated with a Java Surface object,
+ * for interacting with it through native code.  This acquires a reference
+ * on the ANativeWindow that is returned; be sure to use ANativeWindow_release()
+ * when done with it so that it doesn't leak.
+ */
+ANativeWindow* ANativeWindow_fromSurface(JNIEnv* env, jobject surface);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_NATIVE_WINDOW_H
diff --git a/ndk/platforms/android-16/include/android/rect.h b/ndk/platforms/android-16/include/android/rect.h
new file mode 100644
index 0000000..bcd42a9
--- /dev/null
+++ b/ndk/platforms/android-16/include/android/rect.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_RECT_H
+#define ANDROID_RECT_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ARect {
+#ifdef __cplusplus
+    typedef int32_t value_type;
+#endif
+    int32_t left;
+    int32_t top;
+    int32_t right;
+    int32_t bottom;
+} ARect;
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_RECT_H
diff --git a/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-arm/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-mips/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt
new file mode 100644
index 0000000..139e7cf
--- /dev/null
+++ b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.functions.txt
@@ -0,0 +1,173 @@
+AAsset_close
+AAssetDir_close
+AAssetDir_getNextFileName
+AAssetDir_rewind
+AAsset_getBuffer
+AAsset_getLength
+AAsset_getLength64
+AAsset_getRemainingLength
+AAsset_getRemainingLength64
+AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
+AAsset_openFileDescriptor
+AAsset_openFileDescriptor64
+AAsset_read
+AAsset_seek
+AAsset_seek64
+AConfiguration_copy
+AConfiguration_delete
+AConfiguration_diff
+AConfiguration_fromAssetManager
+AConfiguration_getCountry
+AConfiguration_getDensity
+AConfiguration_getKeyboard
+AConfiguration_getKeysHidden
+AConfiguration_getLanguage
+AConfiguration_getLayoutDirection
+AConfiguration_getMcc
+AConfiguration_getMnc
+AConfiguration_getNavHidden
+AConfiguration_getNavigation
+AConfiguration_getOrientation
+AConfiguration_getScreenHeightDp
+AConfiguration_getScreenLong
+AConfiguration_getScreenSize
+AConfiguration_getScreenWidthDp
+AConfiguration_getSdkVersion
+AConfiguration_getSmallestScreenWidthDp
+AConfiguration_getTouchscreen
+AConfiguration_getUiModeNight
+AConfiguration_getUiModeType
+AConfiguration_isBetterThan
+AConfiguration_match
+AConfiguration_new
+AConfiguration_setCountry
+AConfiguration_setDensity
+AConfiguration_setKeyboard
+AConfiguration_setKeysHidden
+AConfiguration_setLanguage
+AConfiguration_setLayoutDirection
+AConfiguration_setMcc
+AConfiguration_setMnc
+AConfiguration_setNavHidden
+AConfiguration_setNavigation
+AConfiguration_setOrientation
+AConfiguration_setScreenHeightDp
+AConfiguration_setScreenLong
+AConfiguration_setScreenSize
+AConfiguration_setScreenWidthDp
+AConfiguration_setSdkVersion
+AConfiguration_setSmallestScreenWidthDp
+AConfiguration_setTouchscreen
+AConfiguration_setUiModeNight
+AConfiguration_setUiModeType
+AInputEvent_getDeviceId
+AInputEvent_getSource
+AInputEvent_getType
+AInputQueue_attachLooper
+AInputQueue_detachLooper
+AInputQueue_finishEvent
+AInputQueue_getEvent
+AInputQueue_hasEvents
+AInputQueue_preDispatchEvent
+AKeyEvent_getAction
+AKeyEvent_getDownTime
+AKeyEvent_getEventTime
+AKeyEvent_getFlags
+AKeyEvent_getKeyCode
+AKeyEvent_getMetaState
+AKeyEvent_getRepeatCount
+AKeyEvent_getScanCode
+ALooper_acquire
+ALooper_addFd
+ALooper_forThread
+ALooper_pollAll
+ALooper_pollOnce
+ALooper_prepare
+ALooper_release
+ALooper_removeFd
+ALooper_wake
+AMotionEvent_getAction
+AMotionEvent_getAxisValue
+AMotionEvent_getButtonState
+AMotionEvent_getDownTime
+AMotionEvent_getEdgeFlags
+AMotionEvent_getEventTime
+AMotionEvent_getFlags
+AMotionEvent_getHistoricalAxisValue
+AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
+AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
+AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
+AMotionEvent_getHistoricalX
+AMotionEvent_getHistoricalY
+AMotionEvent_getHistorySize
+AMotionEvent_getMetaState
+AMotionEvent_getOrientation
+AMotionEvent_getPointerCount
+AMotionEvent_getPointerId
+AMotionEvent_getPressure
+AMotionEvent_getRawX
+AMotionEvent_getRawY
+AMotionEvent_getSize
+AMotionEvent_getToolMajor
+AMotionEvent_getToolMinor
+AMotionEvent_getToolType
+AMotionEvent_getTouchMajor
+AMotionEvent_getTouchMinor
+AMotionEvent_getX
+AMotionEvent_getXOffset
+AMotionEvent_getXPrecision
+AMotionEvent_getY
+AMotionEvent_getYOffset
+AMotionEvent_getYPrecision
+ANativeActivity_finish
+ANativeActivity_hideSoftInput
+ANativeActivity_setWindowFlags
+ANativeActivity_setWindowFormat
+ANativeActivity_showSoftInput
+ANativeWindow_acquire
+ANativeWindow_fromSurface
+ANativeWindow_getFormat
+ANativeWindow_getHeight
+ANativeWindow_getWidth
+ANativeWindow_lock
+ANativeWindow_release
+ANativeWindow_setBuffersGeometry
+ANativeWindow_unlockAndPost
+android_getTtsEngine
+AObbInfo_delete
+AObbInfo_getFlags
+AObbInfo_getPackageName
+AObbInfo_getVersion
+AObbScanner_getObbInfo
+ASensorEventQueue_disableSensor
+ASensorEventQueue_enableSensor
+ASensorEventQueue_getEvents
+ASensorEventQueue_hasEvents
+ASensorEventQueue_setEventRate
+ASensor_getMinDelay
+ASensor_getName
+ASensor_getResolution
+ASensor_getType
+ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
+AStorageManager_delete
+AStorageManager_getMountedObbPath
+AStorageManager_isObbMounted
+AStorageManager_mountObb
+AStorageManager_new
+AStorageManager_unmountObb
+getTtsEngine
diff --git a/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ndk/platforms/android-17/arch-x86/symbols/libandroid.so.variables.txt
@@ -0,0 +1 @@
+
diff --git a/ndk/platforms/android-17/include/android/configuration.h b/ndk/platforms/android-17/include/android/configuration.h
new file mode 100644
index 0000000..0f5c14a
--- /dev/null
+++ b/ndk/platforms/android-17/include/android/configuration.h
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+    ACONFIGURATION_ORIENTATION_ANY  = 0x0000,
+    ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+    ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+    ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+    ACONFIGURATION_TOUCHSCREEN_ANY  = 0x0000,
+    ACONFIGURATION_TOUCHSCREEN_NOTOUCH  = 0x0001,
+    ACONFIGURATION_TOUCHSCREEN_STYLUS  = 0x0002,
+    ACONFIGURATION_TOUCHSCREEN_FINGER  = 0x0003,
+
+    ACONFIGURATION_DENSITY_DEFAULT = 0,
+    ACONFIGURATION_DENSITY_LOW = 120,
+    ACONFIGURATION_DENSITY_MEDIUM = 160,
+    ACONFIGURATION_DENSITY_TV = 213,
+    ACONFIGURATION_DENSITY_HIGH = 240,
+    ACONFIGURATION_DENSITY_XHIGH = 320,
+    ACONFIGURATION_DENSITY_XXHIGH = 480,
+    ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+    ACONFIGURATION_KEYBOARD_ANY  = 0x0000,
+    ACONFIGURATION_KEYBOARD_NOKEYS  = 0x0001,
+    ACONFIGURATION_KEYBOARD_QWERTY  = 0x0002,
+    ACONFIGURATION_KEYBOARD_12KEY  = 0x0003,
+
+    ACONFIGURATION_NAVIGATION_ANY  = 0x0000,
+    ACONFIGURATION_NAVIGATION_NONAV  = 0x0001,
+    ACONFIGURATION_NAVIGATION_DPAD  = 0x0002,
+    ACONFIGURATION_NAVIGATION_TRACKBALL  = 0x0003,
+    ACONFIGURATION_NAVIGATION_WHEEL  = 0x0004,
+
+    ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+    ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+    ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+    ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+    ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+    ACONFIGURATION_SCREENSIZE_ANY  = 0x00,
+    ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+    ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+    ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+    ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+    ACONFIGURATION_SCREENLONG_ANY = 0x00,
+    ACONFIGURATION_SCREENLONG_NO = 0x1,
+    ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+    ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+    ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+    ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+    ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+    ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+    ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+    ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+    ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_LAYOUTDIR_ANY  = 0x00,
+    ACONFIGURATION_LAYOUTDIR_LTR  = 0x01,
+    ACONFIGURATION_LAYOUTDIR_RTL  = 0x02,
+
+    ACONFIGURATION_MCC = 0x0001,
+    ACONFIGURATION_MNC = 0x0002,
+    ACONFIGURATION_LOCALE = 0x0004,
+    ACONFIGURATION_TOUCHSCREEN = 0x0008,
+    ACONFIGURATION_KEYBOARD = 0x0010,
+    ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+    ACONFIGURATION_NAVIGATION = 0x0040,
+    ACONFIGURATION_ORIENTATION = 0x0080,
+    ACONFIGURATION_DENSITY = 0x0100,
+    ACONFIGURATION_SCREEN_SIZE = 0x0200,
+    ACONFIGURATION_VERSION = 0x0400,
+    ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+    ACONFIGURATION_UI_MODE = 0x1000,
+    ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+    ACONFIGURATION_LAYOUTDIR = 0x4000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's layout direction, or
+ * ACONFIGURATION_LAYOUTDIR_ANY if not set.
+ */
+int32_t AConfiguration_getLayoutDirection(AConfiguration* config);
+
+/**
+ * Set the configuration's layout direction.
+ */
+void AConfiguration_setLayoutDirection(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations.  Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'.  Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'.  Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'.  If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there.  If it is NULL, this decision is
+ * simply based on which configuration is more specific.  Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+        AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
new file mode 100644
index 0000000..1f1ef97
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.sample.teapot"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="11"
+        android:targetSdkVersion="19" />
+    <uses-feature android:glEsVersion="0x00020000"></uses-feature>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme"
+        android:hasCode="true"
+        android:name="com.sample.teapot.TeapotApplication"
+        >
+
+        <!-- Our activity is the built-in NativeActivity framework class.
+             This will take care of integrating with our NDK code. -->
+        <activity android:name="com.sample.teapot.TeapotNativeActivity"
+                android:label="@string/app_name"
+                android:configChanges="orientation|keyboardHidden">
+            <!-- Tell NativeActivity the name of or .so -->
+            <meta-data android:name="android.app.lib_name"
+                    android:value="TeapotNativeActivity" />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh
new file mode 100644
index 0000000..693e4fc
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/ShaderPlain.fsh
@@ -0,0 +1,33 @@
+//
+//  ShaderPlain.fsh
+//
+
+#define USE_PHONG (1)
+
+uniform lowp vec3       vMaterialAmbient;
+uniform mediump vec4       vMaterialSpecular;
+
+varying lowp vec4 colorDiffuse;
+
+#if USE_PHONG
+uniform highp vec3      vLight0;
+varying mediump vec3 position;
+varying mediump vec3 normal;
+#else
+varying lowp vec4 colorSpecular;
+#endif
+
+void main()
+{
+#if USE_PHONG
+    mediump vec3 halfVector = normalize(-vLight0 + position);
+    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+    mediump float fPower = vMaterialSpecular.w;
+    mediump float specular = pow(NdotH, fPower);
+
+    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+    gl_FragColor = colorDiffuse + colorSpecular;
+#else
+    gl_FragColor = colorDiffuse + colorSpecular;
+#endif
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh
new file mode 100644
index 0000000..f87a3c0
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/assets/Shaders/VS_ShaderPlain.vsh
@@ -0,0 +1,54 @@
+//
+//  ShaderPlain.vsh
+//
+
+#define USE_PHONG (1)
+
+attribute highp vec3    myVertex;
+attribute highp vec3    myNormal;
+attribute mediump vec2  myUV;
+attribute mediump vec4  myBone;
+
+varying mediump vec2    texCoord;
+varying lowp    vec4    colorDiffuse;
+
+#if USE_PHONG
+varying mediump vec3 position;
+varying mediump vec3 normal;
+#else
+varying lowp    vec4    colorSpecular;
+#endif
+
+uniform highp mat4      uMVMatrix;
+uniform highp mat4      uPMatrix;
+
+uniform highp vec3      vLight0;
+
+uniform lowp vec4       vMaterialDiffuse;
+uniform lowp vec3       vMaterialAmbient;
+uniform lowp vec4       vMaterialSpecular;
+
+void main(void)
+{
+    highp vec4 p = vec4(myVertex,1);
+    gl_Position = uPMatrix * p;
+
+    texCoord = myUV;
+
+    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);
+    highp vec3 ecPosition = p.xyz;
+
+    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );
+
+#if USE_PHONG
+    normal = worldNormal;
+    position = ecPosition;
+#else
+    highp vec3 halfVector = normalize(ecPosition - vLight0);
+
+    highp float NdotH = max(-dot(worldNormal, halfVector), 0.0);
+    float fPower = vMaterialSpecular.w;
+    highp float specular = min( pow(NdotH, fPower), 1.0);
+    colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+#endif
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/Android.mk b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
new file mode 100644
index 0000000..c35ab37
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
@@ -0,0 +1,28 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := TeapotNativeActivity
+LOCAL_SRC_FILES := TeapotNativeActivity.cpp \
+TeapotRenderer.cpp \
+
+LOCAL_C_INCLUDES :=
+
+LOCAL_CFLAGS :=
+
+LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv2
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
+
+ifneq ($(filter %armeabi-v7a,$(TARGET_ARCH_ABI)),)
+LOCAL_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
+LOCAL_LDLIBS += -lm_hard
+ifeq (,$(filter -fuse-ld=mcld,$(APP_LDFLAGS) $(LOCAL_LDFLAGS)))
+LOCAL_LDFLAGS += -Wl,--no-warn-mismatch
+endif
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module,android/ndk_helper)
+$(call import-module,android/native_app_glue)
+$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/Application.mk b/ndk/platforms/android-17/samples/Teapot/jni/Application.mk
new file mode 100644
index 0000000..9367158
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/Application.mk
@@ -0,0 +1,4 @@
+APP_PLATFORM := android-9
+APP_ABI := all
+
+APP_STL := stlport_static
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
new file mode 100644
index 0000000..9efff81
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
@@ -0,0 +1,488 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#include "TeapotRenderer.h"
+#include "NDKHelper.h"
+
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
+//-------------------------------------------------------------------------
+//Shared state for our app.
+//-------------------------------------------------------------------------
+struct android_app;
+class Engine
+{
+    TeapotRenderer renderer_;
+
+    ndk_helper::GLContext* gl_context_;
+
+    bool initialized_resources_;
+    bool has_focus_;
+
+    ndk_helper::DoubletapDetector doubletap_detector_;
+    ndk_helper::PinchDetector pinch_detector_;
+    ndk_helper::DragDetector drag_detector_;
+    ndk_helper::PerfMonitor monitor_;
+
+    ndk_helper::TapCamera tap_camera_;
+
+    android_app* app_;
+
+    ASensorManager* sensor_manager_;
+    const ASensor* accelerometer_sensor_;
+    ASensorEventQueue* sensor_event_queue_;
+
+    void UpdateFPS( float fFPS );
+    void ShowUI();
+    void TransformPosition( ndk_helper::Vec2& vec );
+
+public:
+    static void HandleCmd( struct android_app* app,
+            int32_t cmd );
+    static int32_t HandleInput( android_app* app,
+            AInputEvent* event );
+
+    Engine();
+    ~Engine();
+    void SetState( android_app* state );
+    int InitDisplay();
+    void LoadResources();
+    void UnloadResources();
+    void DrawFrame();
+    void TermDisplay();
+    void TrimMemory();
+    bool IsReady();
+
+    void UpdatePosition( AInputEvent* event,
+            int32_t iIndex,
+            float& fX,
+            float& fY );
+
+    void InitSensors();
+    void ProcessSensors( int32_t id );
+    void SuspendSensors();
+    void ResumeSensors();
+};
+
+//-------------------------------------------------------------------------
+//Ctor
+//-------------------------------------------------------------------------
+Engine::Engine() :
+                initialized_resources_( false ),
+                has_focus_( false ),
+                app_( NULL ),
+                sensor_manager_( NULL ),
+                accelerometer_sensor_( NULL ),
+                sensor_event_queue_( NULL )
+{
+    gl_context_ = ndk_helper::GLContext::GetInstance();
+}
+
+//-------------------------------------------------------------------------
+//Dtor
+//-------------------------------------------------------------------------
+Engine::~Engine()
+{
+}
+
+/**
+ * Load resources
+ */
+void Engine::LoadResources()
+{
+    renderer_.Init();
+    renderer_.Bind( &tap_camera_ );
+}
+
+/**
+ * Unload resources
+ */
+void Engine::UnloadResources()
+{
+    renderer_.Unload();
+}
+
+/**
+ * Initialize an EGL context for the current display.
+ */
+int Engine::InitDisplay()
+{
+    if( !initialized_resources_ )
+    {
+        gl_context_->Init( app_->window );
+        LoadResources();
+        initialized_resources_ = true;
+    }
+    else
+    {
+        // initialize OpenGL ES and EGL
+        if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
+        {
+            UnloadResources();
+            LoadResources();
+        }
+    }
+
+    ShowUI();
+
+    // Initialize GL state.
+    glEnable( GL_CULL_FACE );
+    glEnable( GL_DEPTH_TEST );
+    glDepthFunc( GL_LEQUAL );
+
+    //Note that screen size might have been changed
+    glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+    renderer_.UpdateViewport();
+
+    tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+    tap_camera_.SetPinchTransformFactor( 2.f, 2.f, 8.f );
+
+    return 0;
+}
+
+/**
+ * Just the current frame in the display.
+ */
+void Engine::DrawFrame()
+{
+    float fFPS;
+    if( monitor_.Update( fFPS ) )
+    {
+        UpdateFPS( fFPS );
+    }
+    renderer_.Update( monitor_.GetCurrentTime() );
+
+    // Just fill the screen with a color.
+    glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+    renderer_.Render();
+
+    // Swap
+    if( EGL_SUCCESS != gl_context_->Swap() )
+    {
+        UnloadResources();
+        LoadResources();
+    }
+}
+
+/**
+ * Tear down the EGL context currently associated with the display.
+ */
+void Engine::TermDisplay()
+{
+    gl_context_->Suspend();
+
+}
+
+void Engine::TrimMemory()
+{
+    LOGI( "Trimming memory" );
+    gl_context_->Invalidate();
+}
+/**
+ * Process the next input event.
+ */
+int32_t Engine::HandleInput( android_app* app,
+        AInputEvent* event )
+{
+    Engine* eng = (Engine*) app->userData;
+    if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
+    {
+        ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+        ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+        ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
+
+        //Double tap detector has a priority over other detectors
+        if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+        {
+            //Detect double tap
+            eng->tap_camera_.Reset( true );
+        }
+        else
+        {
+            //Handle drag state
+            if( dragState & ndk_helper::GESTURE_STATE_START )
+            {
+                //Otherwise, start dragging
+                ndk_helper::Vec2 v;
+                eng->drag_detector_.GetPointer( v );
+                eng->TransformPosition( v );
+                eng->tap_camera_.BeginDrag( v );
+            }
+            else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+            {
+                ndk_helper::Vec2 v;
+                eng->drag_detector_.GetPointer( v );
+                eng->TransformPosition( v );
+                eng->tap_camera_.Drag( v );
+            }
+            else if( dragState & ndk_helper::GESTURE_STATE_END )
+            {
+                eng->tap_camera_.EndDrag();
+            }
+
+            //Handle pinch state
+            if( pinchState & ndk_helper::GESTURE_STATE_START )
+            {
+                //Start new pinch
+                ndk_helper::Vec2 v1;
+                ndk_helper::Vec2 v2;
+                eng->pinch_detector_.GetPointers( v1, v2 );
+                eng->TransformPosition( v1 );
+                eng->TransformPosition( v2 );
+                eng->tap_camera_.BeginPinch( v1, v2 );
+            }
+            else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+            {
+                //Multi touch
+                //Start new pinch
+                ndk_helper::Vec2 v1;
+                ndk_helper::Vec2 v2;
+                eng->pinch_detector_.GetPointers( v1, v2 );
+                eng->TransformPosition( v1 );
+                eng->TransformPosition( v2 );
+                eng->tap_camera_.Pinch( v1, v2 );
+            }
+        }
+        return 1;
+    }
+    return 0;
+}
+
+/**
+ * Process the next main command.
+ */
+void Engine::HandleCmd( struct android_app* app,
+        int32_t cmd )
+{
+    Engine* eng = (Engine*) app->userData;
+    switch( cmd )
+    {
+    case APP_CMD_SAVE_STATE:
+        break;
+    case APP_CMD_INIT_WINDOW:
+        // The window is being shown, get it ready.
+        if( app->window != NULL )
+        {
+            eng->InitDisplay();
+            eng->DrawFrame();
+        }
+        break;
+    case APP_CMD_TERM_WINDOW:
+        // The window is being hidden or closed, clean it up.
+        eng->TermDisplay();
+        eng->has_focus_ = false;
+        break;
+    case APP_CMD_STOP:
+        break;
+    case APP_CMD_GAINED_FOCUS:
+        eng->ResumeSensors();
+        //Start animation
+        eng->has_focus_ = true;
+        break;
+    case APP_CMD_LOST_FOCUS:
+        eng->SuspendSensors();
+        // Also stop animating.
+        eng->has_focus_ = false;
+        eng->DrawFrame();
+        break;
+    case APP_CMD_LOW_MEMORY:
+        //Free up GL resources
+        eng->TrimMemory();
+        break;
+    }
+}
+
+//-------------------------------------------------------------------------
+//Sensor handlers
+//-------------------------------------------------------------------------
+void Engine::InitSensors()
+{
+    sensor_manager_ = ASensorManager_getInstance();
+    accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+            ASENSOR_TYPE_ACCELEROMETER );
+    sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+            LOOPER_ID_USER, NULL, NULL );
+}
+
+void Engine::ProcessSensors( int32_t id )
+{
+    // If a sensor has data, process it now.
+    if( id == LOOPER_ID_USER )
+    {
+        if( accelerometer_sensor_ != NULL )
+        {
+            ASensorEvent event;
+            while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
+            {
+            }
+        }
+    }
+}
+
+void Engine::ResumeSensors()
+{
+    // When our app gains focus, we start monitoring the accelerometer.
+    if( accelerometer_sensor_ != NULL )
+    {
+        ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
+        // We'd like to get 60 events per second (in us).
+        ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+                (1000L / 60) * 1000 );
+    }
+}
+
+void Engine::SuspendSensors()
+{
+    // When our app loses focus, we stop monitoring the accelerometer.
+    // This is to avoid consuming battery while not being used.
+    if( accelerometer_sensor_ != NULL )
+    {
+        ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
+    }
+}
+
+//-------------------------------------------------------------------------
+//Misc
+//-------------------------------------------------------------------------
+void Engine::SetState( android_app* state )
+{
+    app_ = state;
+    doubletap_detector_.SetConfiguration( app_->config );
+    drag_detector_.SetConfiguration( app_->config );
+    pinch_detector_.SetConfiguration( app_->config );
+}
+
+bool Engine::IsReady()
+{
+    if( has_focus_ )
+        return true;
+
+    return false;
+}
+
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
+{
+    vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+            / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+            - ndk_helper::Vec2( 1.f, 1.f );
+}
+
+void Engine::ShowUI()
+{
+    JNIEnv *jni;
+    app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+    //Default class retrieval
+    jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+    jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+    jni->CallVoidMethod( app_->activity->clazz, methodID );
+
+    app_->activity->vm->DetachCurrentThread();
+    return;
+}
+
+void Engine::UpdateFPS( float fFPS )
+{
+    JNIEnv *jni;
+    app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+    //Default class retrieval
+    jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+    jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+    jni->CallVoidMethod( app_->activity->clazz, methodID, fFPS );
+
+    app_->activity->vm->DetachCurrentThread();
+    return;
+}
+
+Engine g_engine;
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue.  It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void android_main( android_app* state )
+{
+    app_dummy();
+
+    g_engine.SetState( state );
+
+    //Init helper functions
+    ndk_helper::JNIHelper::Init( state->activity, HELPER_CLASS_NAME );
+
+    state->userData = &g_engine;
+    state->onAppCmd = Engine::HandleCmd;
+    state->onInputEvent = Engine::HandleInput;
+
+#ifdef USE_NDK_PROFILER
+    monstartup("libTeapotNativeActivity.so");
+#endif
+
+    // Prepare to monitor accelerometer
+    g_engine.InitSensors();
+
+    // loop waiting for stuff to do.
+    while( 1 )
+    {
+        // Read all pending events.
+        int id;
+        int events;
+        android_poll_source* source;
+
+        // If not animating, we will block forever waiting for events.
+        // If animating, we loop until all events are read, then continue
+        // to draw the next frame of animation.
+        while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+                >= 0 )
+        {
+            // Process this event.
+            if( source != NULL )
+                source->process( state, source );
+
+            g_engine.ProcessSensors( id );
+
+            // Check if we are exiting.
+            if( state->destroyRequested != 0 )
+            {
+                g_engine.TermDisplay();
+                return;
+            }
+        }
+
+        if( g_engine.IsReady() )
+        {
+            // Drawing is throttled to the screen update rate, so there
+            // is no need to do timing here.
+            g_engine.DrawFrame();
+        }
+    }
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
new file mode 100644
index 0000000..b7213dc
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// TeapotRenderer.cpp
+// Render a teapot
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include "TeapotRenderer.h"
+
+//--------------------------------------------------------------------------------
+// Teapot model data
+//--------------------------------------------------------------------------------
+#include "teapot.inl"
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+TeapotRenderer::TeapotRenderer()
+{
+
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+TeapotRenderer::~TeapotRenderer()
+{
+    Unload();
+}
+
+void TeapotRenderer::Init()
+{
+    //Settings
+    glFrontFace( GL_CCW );
+
+    //Load shader
+    LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh",
+            "Shaders/ShaderPlain.fsh" );
+
+    //Create Index buffer
+    num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+    glGenBuffers( 1, &ibo_ );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+    glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,
+            GL_STATIC_DRAW );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+
+    //Create VBO
+    num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+    int32_t iStride = sizeof(TEAPOT_VERTEX);
+    int32_t iIndex = 0;
+    TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+    for( int32_t i = 0; i < num_vertices_; ++i )
+    {
+        p[i].pos[0] = teapotPositions[iIndex];
+        p[i].pos[1] = teapotPositions[iIndex + 1];
+        p[i].pos[2] = teapotPositions[iIndex + 2];
+
+        p[i].normal[0] = teapotNormals[iIndex];
+        p[i].normal[1] = teapotNormals[iIndex + 1];
+        p[i].normal[2] = teapotNormals[iIndex + 2];
+        iIndex += 3;
+    }
+    glGenBuffers( 1, &vbo_ );
+    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+    glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+    glBindBuffer( GL_ARRAY_BUFFER, 0 );
+
+    delete[] p;
+
+    UpdateViewport();
+    mat_model_ = ndk_helper::Mat4::Translation( 0, 0, -15.f );
+
+    ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX( M_PI / 3 );
+    mat_model_ = mat * mat_model_;
+}
+
+void TeapotRenderer::UpdateViewport()
+{
+    //Init Projection matrices
+    int32_t viewport[4];
+    glGetIntegerv( GL_VIEWPORT, viewport );
+    float fAspect = (float) viewport[2] / (float) viewport[3];
+
+    const float CAM_NEAR = 5.f;
+    const float CAM_FAR = 10000.f;
+    bool bRotate = false;
+    mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
+}
+
+void TeapotRenderer::Unload()
+{
+    if( vbo_ )
+    {
+        glDeleteBuffers( 1, &vbo_ );
+        vbo_ = 0;
+    }
+
+    if( ibo_ )
+    {
+        glDeleteBuffers( 1, &ibo_ );
+        ibo_ = 0;
+    }
+
+    if( shader_param_.program_ )
+    {
+        glDeleteProgram( shader_param_.program_ );
+        shader_param_.program_ = 0;
+    }
+}
+
+void TeapotRenderer::Update( float fTime )
+{
+    const float CAM_X = 0.f;
+    const float CAM_Y = 0.f;
+    const float CAM_Z = 700.f;
+
+    mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+            ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
+
+    if( camera_ )
+    {
+        camera_->Update();
+        mat_view_ = camera_->GetTransformMatrix() * mat_view_
+                * camera_->GetRotationMatrix() * mat_model_;
+    }
+    else
+    {
+        mat_view_ = mat_view_ * mat_model_;
+    }
+}
+
+void TeapotRenderer::Render()
+{
+    //
+    // Feed Projection and Model View matrices to the shaders
+    ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;
+
+    // Bind the VBO
+    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+
+    int32_t iStride = sizeof(TEAPOT_VERTEX);
+    // Pass the vertex data
+    glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride,
+            BUFFER_OFFSET( 0 ) );
+    glEnableVertexAttribArray( ATTRIB_VERTEX );
+
+    glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+            BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+    glEnableVertexAttribArray( ATTRIB_NORMAL );
+
+    // Bind the IB
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+
+    glUseProgram( shader_param_.program_ );
+
+    TEAPOT_MATERIALS material = { { 1.0f, 0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f, 10.f }, {
+            0.1f, 0.1f, 0.1f }, };
+
+    //Update uniforms
+    glUniform4f( shader_param_.material_diffuse_, material.diffuse_color[0],
+            material.diffuse_color[1], material.diffuse_color[2], 1.f );
+
+    glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+            material.specular_color[1], material.specular_color[2],
+            material.specular_color[3] );
+    //
+    //using glUniform3fv here was troublesome
+    //
+    glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+            material.ambient_color[1], material.ambient_color[2] );
+
+    glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+    glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr() );
+    glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
+
+    glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
+
+    glBindBuffer( GL_ARRAY_BUFFER, 0 );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+}
+
+bool TeapotRenderer::LoadShaders( SHADER_PARAMS* params,
+        const char* strVsh,
+        const char* strFsh )
+{
+    GLuint program;
+    GLuint vert_shader, frag_shader;
+    char *vert_shader_pathname, *frag_shader_pathname;
+
+    // Create shader program
+    program = glCreateProgram();
+    LOGI( "Created Shader %d", program );
+
+    // Create and compile vertex shader
+    if( !ndk_helper::shader::CompileShader( &vert_shader, GL_VERTEX_SHADER, strVsh ) )
+    {
+        LOGI( "Failed to compile vertex shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Create and compile fragment shader
+    if( !ndk_helper::shader::CompileShader( &frag_shader, GL_FRAGMENT_SHADER, strFsh ) )
+    {
+        LOGI( "Failed to compile fragment shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Attach vertex shader to program
+    glAttachShader( program, vert_shader );
+
+    // Attach fragment shader to program
+    glAttachShader( program, frag_shader );
+
+    // Bind attribute locations
+    // this needs to be done prior to linking
+    glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+    glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
+    glBindAttribLocation( program, ATTRIB_UV, "myUV" );
+
+    // Link program
+    if( !ndk_helper::shader::LinkProgram( program ) )
+    {
+        LOGI( "Failed to link program: %d", program );
+
+        if( vert_shader )
+        {
+            glDeleteShader( vert_shader );
+            vert_shader = 0;
+        }
+        if( frag_shader )
+        {
+            glDeleteShader( frag_shader );
+            frag_shader = 0;
+        }
+        if( program )
+        {
+            glDeleteProgram( program );
+        }
+
+        return false;
+    }
+
+    // Get uniform locations
+    params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+    params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
+
+    params->light0_ = glGetUniformLocation( program, "vLight0" );
+    params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+    params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+    params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+    // Release vertex and fragment shaders
+    if( vert_shader )
+        glDeleteShader( vert_shader );
+    if( frag_shader )
+        glDeleteShader( frag_shader );
+
+    params->program_ = program;
+    return true;
+}
+
+bool TeapotRenderer::Bind( ndk_helper::TapCamera* camera )
+{
+    camera_ = camera;
+    return true;
+}
+
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
new file mode 100644
index 0000000..a04f219
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// Teapot Renderer.h
+// Renderer for teapots
+//--------------------------------------------------------------------------------
+#ifndef _TEAPOTRENDERER_H
+#define _TEAPOTRENDERER_H
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#define CLASS_NAME "android/app/NativeActivity"
+#define APPLICATION_CLASS_NAME "com/sample/teapot/TeapotApplication"
+
+#include "NDKHelper.h"
+
+#define BUFFER_OFFSET(i) ((char *)NULL + (i))
+
+struct TEAPOT_VERTEX
+{
+    float pos[3];
+    float normal[3];
+};
+
+enum SHADER_ATTRIBUTES
+{
+    ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_UV,
+};
+
+struct SHADER_PARAMS
+{
+    GLuint program_;
+    GLuint light0_;
+    GLuint material_diffuse_;
+    GLuint material_ambient_;
+    GLuint material_specular_;
+
+    GLuint matrix_projection_;
+    GLuint matrix_view_;
+};
+
+struct TEAPOT_MATERIALS
+{
+    float diffuse_color[3];
+    float specular_color[4];
+    float ambient_color[3];
+};
+
+class TeapotRenderer
+{
+    int32_t num_indices_;
+    int32_t num_vertices_;
+    GLuint ibo_;
+    GLuint vbo_;
+
+    SHADER_PARAMS shader_param_;
+    bool LoadShaders( SHADER_PARAMS* params, const char* strVsh, const char* strFsh );
+
+    ndk_helper::Mat4 mat_projection_;
+    ndk_helper::Mat4 mat_view_;
+    ndk_helper::Mat4 mat_model_;
+
+    ndk_helper::TapCamera* camera_;
+public:
+    TeapotRenderer();
+    virtual ~TeapotRenderer();
+    void Init();
+    void Render();
+    void Update( float dTime );
+    bool Bind( ndk_helper::TapCamera* camera );
+    void Unload();
+    void UpdateViewport();
+};
+
+#endif
+
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl b/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl
new file mode 100644
index 0000000..7f42b88
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/jni/teapot.inl
@@ -0,0 +1,2057 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//
+// Teapot.inl
+// Derived from WebGL sample
+// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js
+//
+
+float teapotPositions[] = { 17.83489990234375, 0, 30.573999404907227, 16.452699661254883, -7.000179767608643, 30.573999404907227,
+        16.223100662231445, -6.902520179748535, 31.51460075378418, 17.586000442504883, 0, 31.51460075378418,
+        16.48940086364746, -7.015810012817383, 31.828100204467773, 17.87470054626465, 0, 31.828100204467773,
+        17.031099319458008, -7.246280193328857, 31.51460075378418, 18.46190071105957, 0, 31.51460075378418,
+        17.62779998779297, -7.500199794769287, 30.573999404907227, 19.108800888061523, 0, 30.573999404907227,
+        12.662699699401855, -12.662699699401855, 30.573999404907227, 12.486100196838379, -12.486100196838379, 31.51460075378418,
+        12.690999984741211, -12.690999984741211, 31.828100204467773, 13.10789966583252, -13.10789966583252, 31.51460075378418,
+        13.56719970703125, -13.56719970703125, 30.573999404907227, 7.000179767608643, -16.452699661254883, 30.573999404907227,
+        6.902520179748535, -16.223100662231445, 31.51460075378418, 7.015810012817383, -16.48940086364746, 31.828100204467773,
+        7.246280193328857, -17.031099319458008, 31.51460075378418, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+        0, -17.83489990234375, 30.573999404907227, 0, -17.586000442504883, 31.51460075378418,
+        0, -17.87470054626465, 31.828100204467773, 0, -18.46190071105957, 31.51460075378418,
+        0, -19.108800888061523, 30.573999404907227, 0, -17.83489990234375, 30.573999404907227,
+        -7.483870029449463, -16.452699661254883, 30.573999404907227, -7.106579780578613, -16.223100662231445, 31.51460075378418,
+        0, -17.586000442504883, 31.51460075378418, -7.07627010345459, -16.48940086364746, 31.828100204467773,
+        0, -17.87470054626465, 31.828100204467773, -7.25383996963501, -17.031099319458008, 31.51460075378418,
+        0, -18.46190071105957, 31.51460075378418, -7.500199794769287, -17.62779998779297, 30.573999404907227,
+        0, -19.108800888061523, 30.573999404907227, -13.092700004577637, -12.662699699401855, 30.573999404907227,
+        -12.667499542236328, -12.486100196838379, 31.51460075378418, -12.744799613952637, -12.690999984741211, 31.828100204467773,
+        -13.11460018157959, -13.10789966583252, 31.51460075378418, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+        -16.61389923095703, -7.000179767608643, 30.573999404907227, -16.291099548339844, -6.902520179748535, 31.51460075378418,
+        -16.50950050354004, -7.015810012817383, 31.828100204467773, -17.033599853515625, -7.246280193328857, 31.51460075378418,
+        -17.62779998779297, -7.500199794769287, 30.573999404907227, -17.83489990234375, 0, 30.573999404907227,
+        -17.586000442504883, 0, 31.51460075378418, -17.87470054626465, 0, 31.828100204467773,
+        -18.46190071105957, 0, 31.51460075378418, -19.108800888061523, 0, 30.573999404907227,
+        -17.83489990234375, 0, 30.573999404907227, -16.452699661254883, 7.000179767608643, 30.573999404907227,
+        -16.223100662231445, 6.902520179748535, 31.51460075378418, -17.586000442504883, 0, 31.51460075378418,
+        -16.48940086364746, 7.015810012817383, 31.828100204467773, -17.87470054626465, 0, 31.828100204467773,
+        -17.031099319458008, 7.246280193328857, 31.51460075378418, -18.46190071105957, 0, 31.51460075378418,
+        -17.62779998779297, 7.500199794769287, 30.573999404907227, -19.108800888061523, 0, 30.573999404907227,
+        -12.662699699401855, 12.662699699401855, 30.573999404907227, -12.486100196838379, 12.486100196838379, 31.51460075378418,
+        -12.690999984741211, 12.690999984741211, 31.828100204467773, -13.10789966583252, 13.10789966583252, 31.51460075378418,
+        -13.56719970703125, 13.56719970703125, 30.573999404907227, -7.000179767608643, 16.452699661254883, 30.573999404907227,
+        -6.902520179748535, 16.223100662231445, 31.51460075378418, -7.015810012817383, 16.48940086364746, 31.828100204467773,
+        -7.246280193328857, 17.031099319458008, 31.51460075378418, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+        0, 17.83489990234375, 30.573999404907227, 0, 17.586000442504883, 31.51460075378418,
+        0, 17.87470054626465, 31.828100204467773, 0, 18.46190071105957, 31.51460075378418,
+        0, 19.108800888061523, 30.573999404907227, 0, 17.83489990234375, 30.573999404907227,
+        7.000179767608643, 16.452699661254883, 30.573999404907227, 6.902520179748535, 16.223100662231445, 31.51460075378418,
+        0, 17.586000442504883, 31.51460075378418, 7.015810012817383, 16.48940086364746, 31.828100204467773,
+        0, 17.87470054626465, 31.828100204467773, 7.246280193328857, 17.031099319458008, 31.51460075378418,
+        0, 18.46190071105957, 31.51460075378418, 7.500199794769287, 17.62779998779297, 30.573999404907227,
+        0, 19.108800888061523, 30.573999404907227, 12.662699699401855, 12.662699699401855, 30.573999404907227,
+        12.486100196838379, 12.486100196838379, 31.51460075378418, 12.690999984741211, 12.690999984741211, 31.828100204467773,
+        13.10789966583252, 13.10789966583252, 31.51460075378418, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+        16.452699661254883, 7.000179767608643, 30.573999404907227, 16.223100662231445, 6.902520179748535, 31.51460075378418,
+        16.48940086364746, 7.015810012817383, 31.828100204467773, 17.031099319458008, 7.246280193328857, 31.51460075378418,
+        17.62779998779297, 7.500199794769287, 30.573999404907227, 17.83489990234375, 0, 30.573999404907227,
+        17.586000442504883, 0, 31.51460075378418, 17.87470054626465, 0, 31.828100204467773,
+        18.46190071105957, 0, 31.51460075378418, 19.108800888061523, 0, 30.573999404907227,
+        19.108800888061523, 0, 30.573999404907227, 17.62779998779297, -7.500199794769287, 30.573999404907227,
+        19.785400390625, -8.418190002441406, 25.572900772094727, 21.447599411010742, 0, 25.572900772094727,
+        21.667600631713867, -9.218990325927734, 20.661399841308594, 23.487899780273438, 0, 20.661399841308594,
+        22.99880027770996, -9.785409927368164, 15.928999900817871, 24.930999755859375, 0, 15.928999900817871,
+        23.503799438476562, -10.000300407409668, 11.465299606323242, 25.4783992767334, 0, 11.465299606323242,
+        13.56719970703125, -13.56719970703125, 30.573999404907227, 15.227800369262695, -15.227800369262695, 25.572900772094727,
+        16.67639923095703, -16.67639923095703, 20.661399841308594, 17.701000213623047, -17.701000213623047, 15.928999900817871,
+        18.089599609375, -18.089599609375, 11.465299606323242, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+        8.418190002441406, -19.785400390625, 25.572900772094727, 9.218990325927734, -21.667600631713867, 20.661399841308594,
+        9.785409927368164, -22.99880027770996, 15.928999900817871, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+        0, -19.108800888061523, 30.573999404907227, 0, -21.447599411010742, 25.572900772094727,
+        0, -23.487899780273438, 20.661399841308594, 0, -24.930999755859375, 15.928999900817871,
+        0, -25.4783992767334, 11.465299606323242, 0, -19.108800888061523, 30.573999404907227,
+        -7.500199794769287, -17.62779998779297, 30.573999404907227, -8.418190002441406, -19.785400390625, 25.572900772094727,
+        0, -21.447599411010742, 25.572900772094727, -9.218990325927734, -21.667600631713867, 20.661399841308594,
+        0, -23.487899780273438, 20.661399841308594, -9.785409927368164, -22.99880027770996, 15.928999900817871,
+        0, -24.930999755859375, 15.928999900817871, -10.000300407409668, -23.503799438476562, 11.465299606323242,
+        0, -25.4783992767334, 11.465299606323242, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+        -15.227800369262695, -15.227800369262695, 25.572900772094727, -16.67639923095703, -16.67639923095703, 20.661399841308594,
+        -17.701000213623047, -17.701000213623047, 15.928999900817871, -18.089599609375, -18.089599609375, 11.465299606323242,
+        -17.62779998779297, -7.500199794769287, 30.573999404907227, -19.785400390625, -8.418190002441406, 25.572900772094727,
+        -21.667600631713867, -9.218990325927734, 20.661399841308594, -22.99880027770996, -9.785409927368164, 15.928999900817871,
+        -23.503799438476562, -10.000300407409668, 11.465299606323242, -19.108800888061523, 0, 30.573999404907227,
+        -21.447599411010742, 0, 25.572900772094727, -23.487899780273438, 0, 20.661399841308594,
+        -24.930999755859375, 0, 15.928999900817871, -25.4783992767334, 0, 11.465299606323242,
+        -19.108800888061523, 0, 30.573999404907227, -17.62779998779297, 7.500199794769287, 30.573999404907227,
+        -19.785400390625, 8.418190002441406, 25.572900772094727, -21.447599411010742, 0, 25.572900772094727,
+        -21.667600631713867, 9.218990325927734, 20.661399841308594, -23.487899780273438, 0, 20.661399841308594,
+        -22.99880027770996, 9.785409927368164, 15.928999900817871, -24.930999755859375, 0, 15.928999900817871,
+        -23.503799438476562, 10.000300407409668, 11.465299606323242, -25.4783992767334, 0, 11.465299606323242,
+        -13.56719970703125, 13.56719970703125, 30.573999404907227, -15.227800369262695, 15.227800369262695, 25.572900772094727,
+        -16.67639923095703, 16.67639923095703, 20.661399841308594, -17.701000213623047, 17.701000213623047, 15.928999900817871,
+        -18.089599609375, 18.089599609375, 11.465299606323242, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+        -8.418190002441406, 19.785400390625, 25.572900772094727, -9.218990325927734, 21.667600631713867, 20.661399841308594,
+        -9.785409927368164, 22.99880027770996, 15.928999900817871, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+        0, 19.108800888061523, 30.573999404907227, 0, 21.447599411010742, 25.572900772094727,
+        0, 23.487899780273438, 20.661399841308594, 0, 24.930999755859375, 15.928999900817871,
+        0, 25.4783992767334, 11.465299606323242, 0, 19.108800888061523, 30.573999404907227,
+        7.500199794769287, 17.62779998779297, 30.573999404907227, 8.418190002441406, 19.785400390625, 25.572900772094727,
+        0, 21.447599411010742, 25.572900772094727, 9.218990325927734, 21.667600631713867, 20.661399841308594,
+        0, 23.487899780273438, 20.661399841308594, 9.785409927368164, 22.99880027770996, 15.928999900817871,
+        0, 24.930999755859375, 15.928999900817871, 10.000300407409668, 23.503799438476562, 11.465299606323242,
+        0, 25.4783992767334, 11.465299606323242, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+        15.227800369262695, 15.227800369262695, 25.572900772094727, 16.67639923095703, 16.67639923095703, 20.661399841308594,
+        17.701000213623047, 17.701000213623047, 15.928999900817871, 18.089599609375, 18.089599609375, 11.465299606323242,
+        17.62779998779297, 7.500199794769287, 30.573999404907227, 19.785400390625, 8.418190002441406, 25.572900772094727,
+        21.667600631713867, 9.218990325927734, 20.661399841308594, 22.99880027770996, 9.785409927368164, 15.928999900817871,
+        23.503799438476562, 10.000300407409668, 11.465299606323242, 19.108800888061523, 0, 30.573999404907227,
+        21.447599411010742, 0, 25.572900772094727, 23.487899780273438, 0, 20.661399841308594,
+        24.930999755859375, 0, 15.928999900817871, 25.4783992767334, 0, 11.465299606323242,
+        25.4783992767334, 0, 11.465299606323242, 23.503799438476562, -10.000300407409668, 11.465299606323242,
+        22.5856990814209, -9.609620094299316, 7.688300132751465, 24.48310089111328, 0, 7.688300132751465,
+        20.565799713134766, -8.750229835510254, 4.89661979675293, 22.29360008239746, 0, 4.89661979675293,
+        18.54599952697754, -7.890830039978027, 3.0006699562072754, 20.104000091552734, 0, 3.0006699562072754,
+        17.62779998779297, -7.500199794769287, 1.9108799695968628, 19.108800888061523, 0, 1.9108799695968628,
+        18.089599609375, -18.089599609375, 11.465299606323242, 17.382999420166016, -17.382999420166016, 7.688300132751465,
+        15.828399658203125, -15.828399658203125, 4.89661979675293, 14.273900032043457, -14.273900032043457, 3.0006699562072754,
+        13.56719970703125, -13.56719970703125, 1.9108799695968628, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+        9.609620094299316, -22.5856990814209, 7.688300132751465, 8.750229835510254, -20.565799713134766, 4.89661979675293,
+        7.890830039978027, -18.54599952697754, 3.0006699562072754, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        0, -25.4783992767334, 11.465299606323242, 0, -24.48310089111328, 7.688300132751465,
+        0, -22.29360008239746, 4.89661979675293, 0, -20.104000091552734, 3.0006699562072754,
+        0, -19.108800888061523, 1.9108799695968628, 0, -25.4783992767334, 11.465299606323242,
+        -10.000300407409668, -23.503799438476562, 11.465299606323242, -9.609620094299316, -22.5856990814209, 7.688300132751465,
+        0, -24.48310089111328, 7.688300132751465, -8.750229835510254, -20.565799713134766, 4.89661979675293,
+        0, -22.29360008239746, 4.89661979675293, -7.890830039978027, -18.54599952697754, 3.0006699562072754,
+        0, -20.104000091552734, 3.0006699562072754, -7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        0, -19.108800888061523, 1.9108799695968628, -18.089599609375, -18.089599609375, 11.465299606323242,
+        -17.382999420166016, -17.382999420166016, 7.688300132751465, -15.828399658203125, -15.828399658203125, 4.89661979675293,
+        -14.273900032043457, -14.273900032043457, 3.0006699562072754, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+        -23.503799438476562, -10.000300407409668, 11.465299606323242, -22.5856990814209, -9.609620094299316, 7.688300132751465,
+        -20.565799713134766, -8.750229835510254, 4.89661979675293, -18.54599952697754, -7.890830039978027, 3.0006699562072754,
+        -17.62779998779297, -7.500199794769287, 1.9108799695968628, -25.4783992767334, 0, 11.465299606323242,
+        -24.48310089111328, 0, 7.688300132751465, -22.29360008239746, 0, 4.89661979675293,
+        -20.104000091552734, 0, 3.0006699562072754, -19.108800888061523, 0, 1.9108799695968628,
+        -25.4783992767334, 0, 11.465299606323242, -23.503799438476562, 10.000300407409668, 11.465299606323242,
+        -22.5856990814209, 9.609620094299316, 7.688300132751465, -24.48310089111328, 0, 7.688300132751465,
+        -20.565799713134766, 8.750229835510254, 4.89661979675293, -22.29360008239746, 0, 4.89661979675293,
+        -18.54599952697754, 7.890830039978027, 3.0006699562072754, -20.104000091552734, 0, 3.0006699562072754,
+        -17.62779998779297, 7.500199794769287, 1.9108799695968628, -19.108800888061523, 0, 1.9108799695968628,
+        -18.089599609375, 18.089599609375, 11.465299606323242, -17.382999420166016, 17.382999420166016, 7.688300132751465,
+        -15.828399658203125, 15.828399658203125, 4.89661979675293, -14.273900032043457, 14.273900032043457, 3.0006699562072754,
+        -13.56719970703125, 13.56719970703125, 1.9108799695968628, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+        -9.609620094299316, 22.5856990814209, 7.688300132751465, -8.750229835510254, 20.565799713134766, 4.89661979675293,
+        -7.890830039978027, 18.54599952697754, 3.0006699562072754, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        0, 25.4783992767334, 11.465299606323242, 0, 24.48310089111328, 7.688300132751465,
+        0, 22.29360008239746, 4.89661979675293, 0, 20.104000091552734, 3.0006699562072754,
+        0, 19.108800888061523, 1.9108799695968628, 0, 25.4783992767334, 11.465299606323242,
+        10.000300407409668, 23.503799438476562, 11.465299606323242, 9.609620094299316, 22.5856990814209, 7.688300132751465,
+        0, 24.48310089111328, 7.688300132751465, 8.750229835510254, 20.565799713134766, 4.89661979675293,
+        0, 22.29360008239746, 4.89661979675293, 7.890830039978027, 18.54599952697754, 3.0006699562072754,
+        0, 20.104000091552734, 3.0006699562072754, 7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        0, 19.108800888061523, 1.9108799695968628, 18.089599609375, 18.089599609375, 11.465299606323242,
+        17.382999420166016, 17.382999420166016, 7.688300132751465, 15.828399658203125, 15.828399658203125, 4.89661979675293,
+        14.273900032043457, 14.273900032043457, 3.0006699562072754, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+        23.503799438476562, 10.000300407409668, 11.465299606323242, 22.5856990814209, 9.609620094299316, 7.688300132751465,
+        20.565799713134766, 8.750229835510254, 4.89661979675293, 18.54599952697754, 7.890830039978027, 3.0006699562072754,
+        17.62779998779297, 7.500199794769287, 1.9108799695968628, 25.4783992767334, 0, 11.465299606323242,
+        24.48310089111328, 0, 7.688300132751465, 22.29360008239746, 0, 4.89661979675293,
+        20.104000091552734, 0, 3.0006699562072754, 19.108800888061523, 0, 1.9108799695968628,
+        19.108800888061523, 0, 1.9108799695968628, 17.62779998779297, -7.500199794769287, 1.9108799695968628,
+        17.228500366210938, -7.330269813537598, 1.2092299461364746, 18.675800323486328, 0, 1.2092299461364746,
+        15.093799591064453, -6.422039985656738, 0.5971490144729614, 16.361900329589844, 0, 0.5971490144729614,
+        9.819259643554688, -4.177840232849121, 0.16421599686145782, 10.644200325012207, 0, 0.16421599686145782,
+        0, 0, 0, 0, 0, 0,
+        13.56719970703125, -13.56719970703125, 1.9108799695968628, 13.25979995727539, -13.25979995727539, 1.2092299461364746,
+        11.616900444030762, -11.616900444030762, 0.5971490144729614, 7.557370185852051, -7.557370185852051, 0.16421599686145782,
+        0, 0, 0, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        7.330269813537598, -17.228500366210938, 1.2092299461364746, 6.422039985656738, -15.093799591064453, 0.5971490144729614,
+        4.177840232849121, -9.819259643554688, 0.16421599686145782, 0, 0, 0,
+        0, -19.108800888061523, 1.9108799695968628, 0, -18.675800323486328, 1.2092299461364746,
+        0, -16.361900329589844, 0.5971490144729614, 0, -10.644200325012207, 0.16421599686145782,
+        0, 0, 0, 0, -19.108800888061523, 1.9108799695968628,
+        -7.500199794769287, -17.62779998779297, 1.9108799695968628, -7.330269813537598, -17.228500366210938, 1.2092299461364746,
+        0, -18.675800323486328, 1.2092299461364746, -6.422039985656738, -15.093799591064453, 0.5971490144729614,
+        0, -16.361900329589844, 0.5971490144729614, -4.177840232849121, -9.819259643554688, 0.16421599686145782,
+        0, -10.644200325012207, 0.16421599686145782, 0, 0, 0,
+        0, 0, 0, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+        -13.25979995727539, -13.25979995727539, 1.2092299461364746, -11.616900444030762, -11.616900444030762, 0.5971490144729614,
+        -7.557370185852051, -7.557370185852051, 0.16421599686145782, 0, 0, 0,
+        -17.62779998779297, -7.500199794769287, 1.9108799695968628, -17.228500366210938, -7.330269813537598, 1.2092299461364746,
+        -15.093799591064453, -6.422039985656738, 0.5971490144729614, -9.819259643554688, -4.177840232849121, 0.16421599686145782,
+        0, 0, 0, -19.108800888061523, 0, 1.9108799695968628,
+        -18.675800323486328, 0, 1.2092299461364746, -16.361900329589844, 0, 0.5971490144729614,
+        -10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+        -19.108800888061523, 0, 1.9108799695968628, -17.62779998779297, 7.500199794769287, 1.9108799695968628,
+        -17.228500366210938, 7.330269813537598, 1.2092299461364746, -18.675800323486328, 0, 1.2092299461364746,
+        -15.093799591064453, 6.422039985656738, 0.5971490144729614, -16.361900329589844, 0, 0.5971490144729614,
+        -9.819259643554688, 4.177840232849121, 0.16421599686145782, -10.644200325012207, 0, 0.16421599686145782,
+        0, 0, 0, 0, 0, 0,
+        -13.56719970703125, 13.56719970703125, 1.9108799695968628, -13.25979995727539, 13.25979995727539, 1.2092299461364746,
+        -11.616900444030762, 11.616900444030762, 0.5971490144729614, -7.557370185852051, 7.557370185852051, 0.16421599686145782,
+        0, 0, 0, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        -7.330269813537598, 17.228500366210938, 1.2092299461364746, -6.422039985656738, 15.093799591064453, 0.5971490144729614,
+        -4.177840232849121, 9.819259643554688, 0.16421599686145782, 0, 0, 0,
+        0, 19.108800888061523, 1.9108799695968628, 0, 18.675800323486328, 1.2092299461364746,
+        0, 16.361900329589844, 0.5971490144729614, 0, 10.644200325012207, 0.16421599686145782,
+        0, 0, 0, 0, 19.108800888061523, 1.9108799695968628,
+        7.500199794769287, 17.62779998779297, 1.9108799695968628, 7.330269813537598, 17.228500366210938, 1.2092299461364746,
+        0, 18.675800323486328, 1.2092299461364746, 6.422039985656738, 15.093799591064453, 0.5971490144729614,
+        0, 16.361900329589844, 0.5971490144729614, 4.177840232849121, 9.819259643554688, 0.16421599686145782,
+        0, 10.644200325012207, 0.16421599686145782, 0, 0, 0,
+        0, 0, 0, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+        13.25979995727539, 13.25979995727539, 1.2092299461364746, 11.616900444030762, 11.616900444030762, 0.5971490144729614,
+        7.557370185852051, 7.557370185852051, 0.16421599686145782, 0, 0, 0,
+        17.62779998779297, 7.500199794769287, 1.9108799695968628, 17.228500366210938, 7.330269813537598, 1.2092299461364746,
+        15.093799591064453, 6.422039985656738, 0.5971490144729614, 9.819259643554688, 4.177840232849121, 0.16421599686145782,
+        0, 0, 0, 19.108800888061523, 0, 1.9108799695968628,
+        18.675800323486328, 0, 1.2092299461364746, 16.361900329589844, 0, 0.5971490144729614,
+        10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+        -20.382699966430664, 0, 25.796899795532227, -20.1835994720459, -2.149739980697632, 26.244699478149414,
+        -26.511600494384766, -2.149739980697632, 26.192899703979492, -26.334299087524414, 0, 25.752099990844727,
+        -31.156299591064453, -2.149739980697632, 25.830400466918945, -30.733299255371094, 0, 25.438600540161133,
+        -34.016998291015625, -2.149739980697632, 24.846500396728516, -33.46030044555664, 0, 24.587600708007812,
+        -34.99290084838867, -2.149739980697632, 22.930500030517578, -34.39580154418945, 0, 22.930500030517578,
+        -19.74570083618164, -2.8663198947906494, 27.229999542236328, -26.901599884033203, -2.8663198947906494, 27.162799835205078,
+        -32.08679962158203, -2.8663198947906494, 26.69260025024414, -35.241798400878906, -2.8663198947906494, 25.416200637817383,
+        -36.30670166015625, -2.8663198947906494, 22.930500030517578, -19.30780029296875, -2.149739980697632, 28.215299606323242,
+        -27.29159927368164, -2.149739980697632, 28.132699966430664, -33.017398834228516, -2.149739980697632, 27.55470085144043,
+        -36.46649932861328, -2.149739980697632, 25.98579978942871, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+        -19.108800888061523, 0, 28.66320037841797, -27.468900680541992, 0, 28.57360076904297,
+        -33.440399169921875, 0, 27.94659996032715, -37.02330017089844, 0, 26.244699478149414,
+        -38.21760177612305, 0, 22.930500030517578, -19.108800888061523, 0, 28.66320037841797,
+        -19.30780029296875, 2.149739980697632, 28.215299606323242, -27.29159927368164, 2.149739980697632, 28.132699966430664,
+        -27.468900680541992, 0, 28.57360076904297, -33.017398834228516, 2.149739980697632, 27.55470085144043,
+        -33.440399169921875, 0, 27.94659996032715, -36.46649932861328, 2.149739980697632, 25.98579978942871,
+        -37.02330017089844, 0, 26.244699478149414, -37.620399475097656, 2.149739980697632, 22.930500030517578,
+        -38.21760177612305, 0, 22.930500030517578, -19.74570083618164, 2.8663198947906494, 27.229999542236328,
+        -26.901599884033203, 2.8663198947906494, 27.162799835205078, -32.08679962158203, 2.8663198947906494, 26.69260025024414,
+        -35.241798400878906, 2.8663198947906494, 25.416200637817383, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+        -20.1835994720459, 2.149739980697632, 26.244699478149414, -26.511600494384766, 2.149739980697632, 26.192899703979492,
+        -31.156299591064453, 2.149739980697632, 25.830400466918945, -34.016998291015625, 2.149739980697632, 24.846500396728516,
+        -34.99290084838867, 2.149739980697632, 22.930500030517578, -20.382699966430664, 0, 25.796899795532227,
+        -26.334299087524414, 0, 25.752099990844727, -30.733299255371094, 0, 25.438600540161133,
+        -33.46030044555664, 0, 24.587600708007812, -34.39580154418945, 0, 22.930500030517578,
+        -34.39580154418945, 0, 22.930500030517578, -34.99290084838867, -2.149739980697632, 22.930500030517578,
+        -34.44089889526367, -2.149739980697632, 20.082199096679688, -33.89820098876953, 0, 20.33289909362793,
+        -32.711299896240234, -2.149739980697632, 16.81529998779297, -32.32569885253906, 0, 17.197900772094727,
+        -29.69420051574707, -2.149739980697632, 13.590499877929688, -29.558900833129883, 0, 14.062899589538574,
+        -25.279300689697266, -2.149739980697632, 10.8681001663208, -25.4783992767334, 0, 11.465299606323242,
+        -36.30670166015625, -2.8663198947906494, 22.930500030517578, -35.6348991394043, -2.8663198947906494, 19.530500411987305,
+        -33.55979919433594, -2.8663198947906494, 15.973699569702148, -29.99180030822754, -2.8663198947906494, 12.551300048828125,
+        -24.841400146484375, -2.8663198947906494, 9.554389953613281, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+        -36.82889938354492, -2.149739980697632, 18.97879981994629, -34.408199310302734, -2.149739980697632, 15.132100105285645,
+        -30.289499282836914, -2.149739980697632, 11.512200355529785, -24.403499603271484, -2.149739980697632, 8.240659713745117,
+        -38.21760177612305, 0, 22.930500030517578, -37.37160110473633, 0, 18.728099822998047,
+        -34.79389953613281, 0, 14.749600410461426, -30.424800872802734, 0, 11.039799690246582,
+        -24.204500198364258, 0, 7.643509864807129, -38.21760177612305, 0, 22.930500030517578,
+        -37.620399475097656, 2.149739980697632, 22.930500030517578, -36.82889938354492, 2.149739980697632, 18.97879981994629,
+        -37.37160110473633, 0, 18.728099822998047, -34.408199310302734, 2.149739980697632, 15.132100105285645,
+        -34.79389953613281, 0, 14.749600410461426, -30.289499282836914, 2.149739980697632, 11.512200355529785,
+        -30.424800872802734, 0, 11.039799690246582, -24.403499603271484, 2.149739980697632, 8.240659713745117,
+        -24.204500198364258, 0, 7.643509864807129, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+        -35.6348991394043, 2.8663198947906494, 19.530500411987305, -33.55979919433594, 2.8663198947906494, 15.973699569702148,
+        -29.99180030822754, 2.8663198947906494, 12.551300048828125, -24.841400146484375, 2.8663198947906494, 9.554389953613281,
+        -34.99290084838867, 2.149739980697632, 22.930500030517578, -34.44089889526367, 2.149739980697632, 20.082199096679688,
+        -32.711299896240234, 2.149739980697632, 16.81529998779297, -29.69420051574707, 2.149739980697632, 13.590499877929688,
+        -25.279300689697266, 2.149739980697632, 10.8681001663208, -34.39580154418945, 0, 22.930500030517578,
+        -33.89820098876953, 0, 20.33289909362793, -32.32569885253906, 0, 17.197900772094727,
+        -29.558900833129883, 0, 14.062899589538574, -25.4783992767334, 0, 11.465299606323242,
+        21.656600952148438, 0, 18.15329933166504, 21.656600952148438, -4.729420185089111, 16.511199951171875,
+        28.233999252319336, -4.270359992980957, 18.339000701904297, 27.76740074157715, 0, 19.55660057067871,
+        31.011899948120117, -3.2604401111602783, 22.221399307250977, 30.4148006439209, 0, 22.930500030517578,
+        32.59560012817383, -2.2505099773406982, 26.764400482177734, 31.867900848388672, 0, 27.020999908447266,
+        35.5900993347168, -1.791450023651123, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+        21.656600952148438, -6.3059000968933105, 12.89840030670166, 29.260299682617188, -5.693819999694824, 15.660200119018555,
+        32.32569885253906, -4.347249984741211, 20.661399841308594, 34.19670104980469, -3.0006699562072754, 26.199899673461914,
+        38.21760177612305, -2.3886001110076904, 30.573999404907227, 21.656600952148438, -4.729420185089111, 9.285670280456543,
+        30.286699295043945, -4.270359992980957, 12.981499671936035, 33.639400482177734, -3.2604401111602783, 19.101299285888672,
+        35.79790115356445, -2.2505099773406982, 25.635400772094727, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+        21.656600952148438, 0, 7.643509864807129, 30.75320053100586, 0, 11.763799667358398,
+        34.23659896850586, 0, 18.392200469970703, 36.52560043334961, 0, 25.378799438476562,
+        42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 0, 7.643509864807129,
+        21.656600952148438, 4.729420185089111, 9.285670280456543, 30.286699295043945, 4.270359992980957, 12.981499671936035,
+        30.75320053100586, 0, 11.763799667358398, 33.639400482177734, 3.2604401111602783, 19.101299285888672,
+        34.23659896850586, 0, 18.392200469970703, 35.79790115356445, 2.2505099773406982, 25.635400772094727,
+        36.52560043334961, 0, 25.378799438476562, 40.845001220703125, 1.791450023651123, 30.573999404907227,
+        42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 6.3059000968933105, 12.89840030670166,
+        29.260299682617188, 5.693819999694824, 15.660200119018555, 32.32569885253906, 4.347249984741211, 20.661399841308594,
+        34.19670104980469, 3.0006699562072754, 26.199899673461914, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+        21.656600952148438, 4.729420185089111, 16.511199951171875, 28.233999252319336, 4.270359992980957, 18.339000701904297,
+        31.011899948120117, 3.2604401111602783, 22.221399307250977, 32.59560012817383, 2.2505099773406982, 26.764400482177734,
+        35.5900993347168, 1.791450023651123, 30.573999404907227, 21.656600952148438, 0, 18.15329933166504,
+        27.76740074157715, 0, 19.55660057067871, 30.4148006439209, 0, 22.930500030517578,
+        31.867900848388672, 0, 27.020999908447266, 34.39580154418945, 0, 30.573999404907227,
+        34.39580154418945, 0, 30.573999404907227, 35.5900993347168, -1.791450023651123, 30.573999404907227,
+        36.59049987792969, -1.679479956626892, 31.137699127197266, 35.3114013671875, 0, 31.111499786376953,
+        37.18870162963867, -1.4331599473953247, 31.332599639892578, 35.98820114135742, 0, 31.290599822998047,
+        37.206600189208984, -1.1868300437927246, 31.1481990814209, 36.187198638916016, 0, 31.111499786376953,
+        36.46590042114258, -1.074869990348816, 30.573999404907227, 35.669700622558594, 0, 30.573999404907227,
+        38.21760177612305, -2.3886001110076904, 30.573999404907227, 39.40439987182617, -2.2393100261688232, 31.195499420166016,
+        39.829898834228516, -1.9108799695968628, 31.424999237060547, 39.44919967651367, -1.582450032234192, 31.229000091552734,
+        38.21760177612305, -1.4331599473953247, 30.573999404907227, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+        42.218299865722656, -1.679479956626892, 31.25320053100586, 42.47100067138672, -1.4331599473953247, 31.51740074157715,
+        41.69169998168945, -1.1868300437927246, 31.309900283813477, 39.969200134277344, -1.074869990348816, 30.573999404907227,
+        42.03929901123047, 0, 30.573999404907227, 43.49729919433594, 0, 31.279399871826172,
+        43.67150115966797, 0, 31.55929946899414, 42.71110153198242, 0, 31.346599578857422,
+        40.76539993286133, 0, 30.573999404907227, 42.03929901123047, 0, 30.573999404907227,
+        40.845001220703125, 1.791450023651123, 30.573999404907227, 42.218299865722656, 1.679479956626892, 31.25320053100586,
+        43.49729919433594, 0, 31.279399871826172, 42.47100067138672, 1.4331599473953247, 31.51740074157715,
+        43.67150115966797, 0, 31.55929946899414, 41.69169998168945, 1.1868300437927246, 31.309900283813477,
+        42.71110153198242, 0, 31.346599578857422, 39.969200134277344, 1.074869990348816, 30.573999404907227,
+        40.76539993286133, 0, 30.573999404907227, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+        39.40439987182617, 2.2393100261688232, 31.195499420166016, 39.829898834228516, 1.9108799695968628, 31.424999237060547,
+        39.44919967651367, 1.582450032234192, 31.229000091552734, 38.21760177612305, 1.4331599473953247, 30.573999404907227,
+        35.5900993347168, 1.791450023651123, 30.573999404907227, 36.59049987792969, 1.679479956626892, 31.137699127197266,
+        37.18870162963867, 1.4331599473953247, 31.332599639892578, 37.206600189208984, 1.1868300437927246, 31.1481990814209,
+        36.46590042114258, 1.074869990348816, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+        35.3114013671875, 0, 31.111499786376953, 35.98820114135742, 0, 31.290599822998047,
+        36.187198638916016, 0, 31.111499786376953, 35.669700622558594, 0, 30.573999404907227,
+        0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+        4.004499912261963, -1.7077000141143799, 39.501399993896484, 4.339280128479004, 0, 39.501399993896484,
+        3.8207099437713623, -1.6290700435638428, 37.97869873046875, 4.140230178833008, 0, 37.97869873046875,
+        2.314160108566284, -0.985912024974823, 36.09769821166992, 2.5080299377441406, 0, 36.09769821166992,
+        2.3503799438476562, -1.0000300407409668, 34.39580154418945, 2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, 3.0849199295043945, -3.0849199295043945, 39.501399993896484,
+        2.943150043487549, -2.943150043487549, 37.97869873046875, 1.782039999961853, -1.782039999961853, 36.09769821166992,
+        1.8089599609375, -1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+        1.7077000141143799, -4.004499912261963, 39.501399993896484, 1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+        0.985912024974823, -2.314160108566284, 36.09769821166992, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, -4.339280128479004, 39.501399993896484,
+        0, -4.140230178833008, 37.97869873046875, 0, -2.5080299377441406, 36.09769821166992,
+        0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        0, 0, 40.12839889526367, -1.7077000141143799, -4.004499912261963, 39.501399993896484,
+        0, -4.339280128479004, 39.501399993896484, -1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+        0, -4.140230178833008, 37.97869873046875, -0.985912024974823, -2.314160108566284, 36.09769821166992,
+        0, -2.5080299377441406, 36.09769821166992, -1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        -3.0849199295043945, -3.0849199295043945, 39.501399993896484, -2.943150043487549, -2.943150043487549, 37.97869873046875,
+        -1.782039999961853, -1.782039999961853, 36.09769821166992, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+        0, 0, 40.12839889526367, -4.004499912261963, -1.7077000141143799, 39.501399993896484,
+        -3.8207099437713623, -1.6290700435638428, 37.97869873046875, -2.314160108566284, -0.985912024974823, 36.09769821166992,
+        -2.3503799438476562, -1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+        -4.339280128479004, 0, 39.501399993896484, -4.140230178833008, 0, 37.97869873046875,
+        -2.5080299377441406, 0, 36.09769821166992, -2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+        -4.004499912261963, 1.7077000141143799, 39.501399993896484, -4.339280128479004, 0, 39.501399993896484,
+        -3.8207099437713623, 1.6290700435638428, 37.97869873046875, -4.140230178833008, 0, 37.97869873046875,
+        -2.314160108566284, 0.985912024974823, 36.09769821166992, -2.5080299377441406, 0, 36.09769821166992,
+        -2.3503799438476562, 1.0000300407409668, 34.39580154418945, -2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, -3.0849199295043945, 3.0849199295043945, 39.501399993896484,
+        -2.943150043487549, 2.943150043487549, 37.97869873046875, -1.782039999961853, 1.782039999961853, 36.09769821166992,
+        -1.8089599609375, 1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+        -1.7077000141143799, 4.004499912261963, 39.501399993896484, -1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+        -0.985912024974823, 2.314160108566284, 36.09769821166992, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, 4.339280128479004, 39.501399993896484,
+        0, 4.140230178833008, 37.97869873046875, 0, 2.5080299377441406, 36.09769821166992,
+        0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        0, 0, 40.12839889526367, 1.7077000141143799, 4.004499912261963, 39.501399993896484,
+        0, 4.339280128479004, 39.501399993896484, 1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+        0, 4.140230178833008, 37.97869873046875, 0.985912024974823, 2.314160108566284, 36.09769821166992,
+        0, 2.5080299377441406, 36.09769821166992, 1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        3.0849199295043945, 3.0849199295043945, 39.501399993896484, 2.943150043487549, 2.943150043487549, 37.97869873046875,
+        1.782039999961853, 1.782039999961853, 36.09769821166992, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+        0, 0, 40.12839889526367, 4.004499912261963, 1.7077000141143799, 39.501399993896484,
+        3.8207099437713623, 1.6290700435638428, 37.97869873046875, 2.314160108566284, 0.985912024974823, 36.09769821166992,
+        2.3503799438476562, 1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+        4.339280128479004, 0, 39.501399993896484, 4.140230178833008, 0, 37.97869873046875,
+        2.5080299377441406, 0, 36.09769821166992, 2.547840118408203, 0, 34.39580154418945,
+        2.547840118408203, 0, 34.39580154418945, 2.3503799438476562, -1.0000300407409668, 34.39580154418945,
+        5.361800193786621, -2.2813100814819336, 33.261199951171875, 5.812250137329102, 0, 33.261199951171875,
+        9.695320129394531, -4.125110149383545, 32.484901428222656, 10.50979995727539, 0, 32.484901428222656,
+        13.58810043334961, -5.781400203704834, 31.708599090576172, 14.729700088500977, 0, 31.708599090576172,
+        15.27750015258789, -6.5001702308654785, 30.573999404907227, 16.56089973449707, 0, 30.573999404907227,
+        1.8089599609375, -1.8089599609375, 34.39580154418945, 4.126699924468994, -4.126699924468994, 33.261199951171875,
+        7.461979866027832, -7.461979866027832, 32.484901428222656, 10.458100318908691, -10.458100318908691, 31.708599090576172,
+        11.758299827575684, -11.758299827575684, 30.573999404907227, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        2.2813100814819336, -5.361800193786621, 33.261199951171875, 4.125110149383545, -9.695320129394531, 32.484901428222656,
+        5.781400203704834, -13.58810043334961, 31.708599090576172, 6.5001702308654785, -15.27750015258789, 30.573999404907227,
+        0, -2.547840118408203, 34.39580154418945, 0, -5.812250137329102, 33.261199951171875,
+        0, -10.50979995727539, 32.484901428222656, 0, -14.729700088500977, 31.708599090576172,
+        0, -16.56089973449707, 30.573999404907227, 0, -2.547840118408203, 34.39580154418945,
+        -1.0000300407409668, -2.3503799438476562, 34.39580154418945, -2.2813100814819336, -5.361800193786621, 33.261199951171875,
+        0, -5.812250137329102, 33.261199951171875, -4.125110149383545, -9.695320129394531, 32.484901428222656,
+        0, -10.50979995727539, 32.484901428222656, -5.781400203704834, -13.58810043334961, 31.708599090576172,
+        0, -14.729700088500977, 31.708599090576172, -6.5001702308654785, -15.27750015258789, 30.573999404907227,
+        0, -16.56089973449707, 30.573999404907227, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+        -4.126699924468994, -4.126699924468994, 33.261199951171875, -7.461979866027832, -7.461979866027832, 32.484901428222656,
+        -10.458100318908691, -10.458100318908691, 31.708599090576172, -11.758299827575684, -11.758299827575684, 30.573999404907227,
+        -2.3503799438476562, -1.0000300407409668, 34.39580154418945, -5.361800193786621, -2.2813100814819336, 33.261199951171875,
+        -9.695320129394531, -4.125110149383545, 32.484901428222656, -13.58810043334961, -5.781400203704834, 31.708599090576172,
+        -15.27750015258789, -6.5001702308654785, 30.573999404907227, -2.547840118408203, 0, 34.39580154418945,
+        -5.812250137329102, 0, 33.261199951171875, -10.50979995727539, 0, 32.484901428222656,
+        -14.729700088500977, 0, 31.708599090576172, -16.56089973449707, 0, 30.573999404907227,
+        -2.547840118408203, 0, 34.39580154418945, -2.3503799438476562, 1.0000300407409668, 34.39580154418945,
+        -5.361800193786621, 2.2813100814819336, 33.261199951171875, -5.812250137329102, 0, 33.261199951171875,
+        -9.695320129394531, 4.125110149383545, 32.484901428222656, -10.50979995727539, 0, 32.484901428222656,
+        -13.58810043334961, 5.781400203704834, 31.708599090576172, -14.729700088500977, 0, 31.708599090576172,
+        -15.27750015258789, 6.5001702308654785, 30.573999404907227, -16.56089973449707, 0, 30.573999404907227,
+        -1.8089599609375, 1.8089599609375, 34.39580154418945, -4.126699924468994, 4.126699924468994, 33.261199951171875,
+        -7.461979866027832, 7.461979866027832, 32.484901428222656, -10.458100318908691, 10.458100318908691, 31.708599090576172,
+        -11.758299827575684, 11.758299827575684, 30.573999404907227, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        -2.2813100814819336, 5.361800193786621, 33.261199951171875, -4.125110149383545, 9.695320129394531, 32.484901428222656,
+        -5.781400203704834, 13.58810043334961, 31.708599090576172, -6.5001702308654785, 15.27750015258789, 30.573999404907227,
+        0, 2.547840118408203, 34.39580154418945, 0, 5.812250137329102, 33.261199951171875,
+        0, 10.50979995727539, 32.484901428222656, 0, 14.729700088500977, 31.708599090576172,
+        0, 16.56089973449707, 30.573999404907227, 0, 2.547840118408203, 34.39580154418945,
+        1.0000300407409668, 2.3503799438476562, 34.39580154418945, 2.2813100814819336, 5.361800193786621, 33.261199951171875,
+        0, 5.812250137329102, 33.261199951171875, 4.125110149383545, 9.695320129394531, 32.484901428222656,
+        0, 10.50979995727539, 32.484901428222656, 5.781400203704834, 13.58810043334961, 31.708599090576172,
+        0, 14.729700088500977, 31.708599090576172, 6.5001702308654785, 15.27750015258789, 30.573999404907227,
+        0, 16.56089973449707, 30.573999404907227, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+        4.126699924468994, 4.126699924468994, 33.261199951171875, 7.461979866027832, 7.461979866027832, 32.484901428222656,
+        10.458100318908691, 10.458100318908691, 31.708599090576172, 11.758299827575684, 11.758299827575684, 30.573999404907227,
+        2.3503799438476562, 1.0000300407409668, 34.39580154418945, 5.361800193786621, 2.2813100814819336, 33.261199951171875,
+        9.695320129394531, 4.125110149383545, 32.484901428222656, 13.58810043334961, 5.781400203704834, 31.708599090576172,
+        15.27750015258789, 6.5001702308654785, 30.573999404907227, 2.547840118408203, 0, 34.39580154418945,
+        5.812250137329102, 0, 33.261199951171875, 10.50979995727539, 0, 32.484901428222656,
+        14.729700088500977, 0, 31.708599090576172, 16.56089973449707, 0, 30.573999404907227 };
+
+float teapotNormals[] = { -0.9667419791221619, 0, -0.25575199723243713, -0.8930140137672424, 0.3698819875717163, -0.2563450038433075,
+        -0.8934370279312134, 0.36910200119018555, 0.2559970021247864, -0.9668239951133728, 0, 0.2554430067539215,
+        -0.0838799998164177, 0.03550700098276138, 0.9958429932594299, -0.09205400198698044, 0, 0.9957540035247803,
+        0.629721999168396, -0.2604379951953888, 0.7318620085716248, 0.6820489764213562, 0, 0.7313070297241211,
+        0.803725004196167, -0.3325839936733246, 0.4933690130710602, 0.8703010082244873, 0, 0.4925200045108795,
+        -0.6834070086479187, 0.6834070086479187, -0.2567310035228729, -0.6835309863090515, 0.6835309863090515, 0.25606799125671387,
+        -0.06492599844932556, 0.06492500007152557, 0.9957759976387024, 0.48139700293540955, -0.48139700293540955, 0.7324709892272949,
+        0.6148040294647217, -0.6148040294647217, 0.4939970076084137, -0.3698819875717163, 0.8930140137672424, -0.2563450038433075,
+        -0.36910200119018555, 0.8934370279312134, 0.2559959888458252, -0.03550700098276138, 0.0838790014386177, 0.9958429932594299,
+        0.26043900847435, -0.6297230124473572, 0.7318609952926636, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+        -0.002848000032827258, 0.9661769866943359, -0.25786298513412476, -0.001921999966725707, 0.9670090079307556, 0.2547360062599182,
+        -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376,
+        0, -0.8703010082244873, 0.4925200045108795, -0.002848000032827258, 0.9661769866943359, -0.25786298513412476,
+        0.37905800342559814, 0.852770984172821, -0.35929998755455017, 0.37711000442504883, 0.9140909910202026, 0.14908500015735626,
+        -0.001921999966725707, 0.9670090079307556, 0.2547360062599182, 0.0275030005723238, 0.12255500257015228, 0.9920809864997864,
+        -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, -0.26100900769233704, -0.6353650093078613, 0.7267630100250244,
+        0.00002300000051036477, -0.6820600032806396, 0.7312960028648376, -0.33248499035835266, -0.8042709827423096, 0.4925459921360016,
+        0, -0.8703010082244873, 0.4925200045108795, 0.6635469794273376, 0.6252639889717102, -0.4107919931411743,
+        0.712664008140564, 0.6976209878921509, 0.07372400164604187, 0.09972699731588364, 0.12198299914598465, 0.98750901222229,
+        -0.4873189926147461, -0.4885669946670532, 0.7237560153007507, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+        0.8800280094146729, 0.3387089967727661, -0.3329069912433624, 0.9172769784927368, 0.36149299144744873, 0.16711199283599854,
+        0.11358699947595596, 0.04806999862194061, 0.9923650026321411, -0.6341490149497986, -0.2618879973888397, 0.7275090217590332,
+        -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, 0.9666900038719177, -0.010453999973833561, -0.2557379901409149,
+        0.967441976070404, -0.00810300000011921, 0.25296199321746826, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+        -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        0.9666900038719177, -0.010453999973833561, -0.2557379901409149, 0.8930140137672424, -0.3698819875717163, -0.2563450038433075,
+        0.8934370279312134, -0.36910200119018555, 0.2559970021247864, 0.967441976070404, -0.00810300000011921, 0.25296199321746826,
+        0.0838799998164177, -0.03550700098276138, 0.9958429932594299, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+        -0.629721999168396, 0.2604379951953888, 0.7318620085716248, -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657,
+        -0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        0.6834070086479187, -0.6834070086479187, -0.2567310035228729, 0.6835309863090515, -0.6835309863090515, 0.25606799125671387,
+        0.06492599844932556, -0.06492500007152557, 0.9957759976387024, -0.48139700293540955, 0.48139700293540955, 0.7324709892272949,
+        -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, 0.3698819875717163, -0.8930140137672424, -0.2563450038433075,
+        0.36910200119018555, -0.8934370279312134, 0.2559959888458252, 0.03550700098276138, -0.0838790014386177, 0.9958429932594299,
+        -0.26043900847435, 0.6297230124473572, 0.7318609952926636, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        0, -0.9667419791221619, -0.25575199723243713, 0, -0.9668239951133728, 0.2554430067539215,
+        0, -0.09205400198698044, 0.9957540035247803, 0, 0.6820489764213562, 0.7313070297241211,
+        0, 0.8703010082244873, 0.4925200045108795, 0, -0.9667419791221619, -0.25575199723243713,
+        -0.3698819875717163, -0.8930140137672424, -0.2563450038433075, -0.36910200119018555, -0.8934370279312134, 0.2559970021247864,
+        0, -0.9668239951133728, 0.2554430067539215, -0.03550700098276138, -0.0838799998164177, 0.9958429932594299,
+        0, -0.09205400198698044, 0.9957540035247803, 0.2604379951953888, 0.629721999168396, 0.7318620085716248,
+        0, 0.6820489764213562, 0.7313070297241211, 0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        0, 0.8703010082244873, 0.4925200045108795, -0.6834070086479187, -0.6834070086479187, -0.2567310035228729,
+        -0.6835309863090515, -0.6835309863090515, 0.25606799125671387, -0.06492500007152557, -0.06492599844932556, 0.9957759976387024,
+        0.48139700293540955, 0.48139700293540955, 0.7324709892272949, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+        -0.8930140137672424, -0.3698819875717163, -0.2563450038433075, -0.8934370279312134, -0.36910200119018555, 0.2559959888458252,
+        -0.0838790014386177, -0.03550700098276138, 0.9958429932594299, 0.6297230124473572, 0.26043900847435, 0.7318609952926636,
+        0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.9667419791221619, 0, -0.25575199723243713,
+        -0.9668239951133728, 0, 0.2554430067539215, -0.09205400198698044, 0, 0.9957540035247803,
+        0.6820489764213562, 0, 0.7313070297241211, 0.8703010082244873, 0, 0.4925200045108795,
+        0.8703010082244873, 0, 0.4925200045108795, 0.803725004196167, -0.3325839936733246, 0.4933690130710602,
+        0.8454390168190002, -0.34983500838279724, 0.40354499220848083, 0.9153209924697876, 0, 0.4027250111103058,
+        0.8699960112571716, -0.36004599928855896, 0.33685898780822754, 0.9418079853057861, 0, 0.33615100383758545,
+        0.9041929841041565, -0.37428000569343567, 0.20579099655151367, 0.9786900281906128, 0, 0.20534199476242065,
+        0.9218789935112, -0.38175201416015625, -0.06636899709701538, 0.9978039860725403, 0, -0.06623899936676025,
+        0.6148040294647217, -0.6148040294647217, 0.4939970076084137, 0.6468020081520081, -0.6468020081520081, 0.40409600734710693,
+        0.6656550168991089, -0.6656550168991089, 0.3373520076274872, 0.6919230222702026, -0.6919230222702026, 0.20611999928951263,
+        0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+        0.34983500838279724, -0.8454390168190002, 0.40354499220848083, 0.36004701256752014, -0.8699960112571716, 0.33685800433158875,
+        0.37428000569343567, -0.9041929841041565, 0.20579099655151367, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0, -0.8703010082244873, 0.4925200045108795, 0, -0.9153209924697876, 0.4027250111103058,
+        0, -0.9418079853057861, 0.33615100383758545, 0, -0.9786900281906128, 0.20534199476242065,
+        0, -0.9978039860725403, -0.06623899936676025, 0, -0.8703010082244873, 0.4925200045108795,
+        -0.33248499035835266, -0.8042709827423096, 0.4925459921360016, -0.34983500838279724, -0.8454390168190002, 0.40354499220848083,
+        0, -0.9153209924697876, 0.4027250111103058, -0.36004599928855896, -0.8699960112571716, 0.33685898780822754,
+        0, -0.9418079853057861, 0.33615100383758545, -0.37428000569343567, -0.9041929841041565, 0.20579099655151367,
+        0, -0.9786900281906128, 0.20534199476242065, -0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0, -0.9978039860725403, -0.06623899936676025, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+        -0.6468020081520081, -0.6468020081520081, 0.40409600734710693, -0.6656550168991089, -0.6656550168991089, 0.3373520076274872,
+        -0.6919230222702026, -0.6919230222702026, 0.20611999928951263, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+        -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, -0.8454390168190002, -0.34983500838279724, 0.40354499220848083,
+        -0.8699960112571716, -0.36004701256752014, 0.33685800433158875, -0.9041929841041565, -0.37428000569343567, 0.20579099655151367,
+        -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        -0.9153209924697876, 0, 0.4027250111103058, -0.9418079853057861, 0, 0.33615100383758545,
+        -0.9786900281906128, 0, 0.20534199476242065, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.8703219890594482, 0.00005400000009103678, 0.492482990026474, -0.803725004196167, 0.3325839936733246, 0.4933690130710602,
+        -0.8454390168190002, 0.34983500838279724, 0.40354499220848083, -0.9153209924697876, 0, 0.4027250111103058,
+        -0.8699960112571716, 0.36004599928855896, 0.33685898780822754, -0.9418079853057861, 0, 0.33615100383758545,
+        -0.9041929841041565, 0.37428000569343567, 0.20579099655151367, -0.9786900281906128, 0, 0.20534199476242065,
+        -0.9218789935112, 0.38175201416015625, -0.06636899709701538, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, -0.6468020081520081, 0.6468020081520081, 0.40409600734710693,
+        -0.6656550168991089, 0.6656550168991089, 0.3373520076274872, -0.6919230222702026, 0.6919230222702026, 0.20611999928951263,
+        -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        -0.34983500838279724, 0.8454390168190002, 0.40354499220848083, -0.36004701256752014, 0.8699960112571716, 0.33685800433158875,
+        -0.37428000569343567, 0.9041929841041565, 0.20579099655151367, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        0, 0.8703010082244873, 0.4925200045108795, 0, 0.9153209924697876, 0.4027250111103058,
+        0, 0.9418079853057861, 0.33615100383758545, 0, 0.9786900281906128, 0.20534199476242065,
+        0, 0.9978039860725403, -0.06623899936676025, 0, 0.8703010082244873, 0.4925200045108795,
+        0.3325839936733246, 0.803725004196167, 0.4933690130710602, 0.34983500838279724, 0.8454390168190002, 0.40354499220848083,
+        0, 0.9153209924697876, 0.4027250111103058, 0.36004599928855896, 0.8699960112571716, 0.33685898780822754,
+        0, 0.9418079853057861, 0.33615100383758545, 0.37428000569343567, 0.9041929841041565, 0.20579099655151367,
+        0, 0.9786900281906128, 0.20534199476242065, 0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        0, 0.9978039860725403, -0.06623899936676025, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+        0.6468020081520081, 0.6468020081520081, 0.40409600734710693, 0.6656550168991089, 0.6656550168991089, 0.3373520076274872,
+        0.6919230222702026, 0.6919230222702026, 0.20611999928951263, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+        0.803725004196167, 0.3325839936733246, 0.4933690130710602, 0.8454390168190002, 0.34983500838279724, 0.40354499220848083,
+        0.8699960112571716, 0.36004701256752014, 0.33685800433158875, 0.9041929841041565, 0.37428000569343567, 0.20579099655151367,
+        0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8703010082244873, 0, 0.4925200045108795,
+        0.9153209924697876, 0, 0.4027250111103058, 0.9418079853057861, 0, 0.33615100383758545,
+        0.9786900281906128, 0, 0.20534199476242065, 0.9978039860725403, 0, -0.06623899936676025,
+        0.9978039860725403, 0, -0.06623899936676025, 0.9218789935112, -0.38175201416015625, -0.06636899709701538,
+        0.8314369916915894, -0.3441790044307709, -0.4361799955368042, 0.9001820087432861, 0, -0.4355129897594452,
+        0.6735119819641113, -0.2785939872264862, -0.6846650242805481, 0.7296109795570374, 0, -0.6838629841804504,
+        0.6403989791870117, -0.26487401127815247, -0.7209240198135376, 0.6939510107040405, 0, -0.7200220227241516,
+        0.7329490184783936, -0.303166002035141, -0.6089959740638733, 0.7939500212669373, 0, -0.6079840064048767,
+        0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.6360920071601868, -0.6360920071601868, -0.4367780089378357,
+        0.5149649977684021, -0.5149649977684021, -0.6852890253067017, 0.48965099453926086, -0.48965099453926086, -0.7214459776878357,
+        0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0.3441790044307709, -0.8314369916915894, -0.4361799955368042, 0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+        0.26487401127815247, -0.6403989791870117, -0.7209240198135376, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0, -0.9978039860725403, -0.06623899936676025, 0, -0.9001820087432861, -0.4355129897594452,
+        0, -0.7296109795570374, -0.6838629841804504, 0, -0.6939510107040405, -0.7200220227241516,
+        0, -0.7939500212669373, -0.6079840064048767, 0, -0.9978039860725403, -0.06623899936676025,
+        -0.38175201416015625, -0.9218789935112, -0.06636899709701538, -0.3441790044307709, -0.8314369916915894, -0.4361799955368042,
+        0, -0.9001820087432861, -0.4355129897594452, -0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+        0, -0.7296109795570374, -0.6838629841804504, -0.26487401127815247, -0.6403989791870117, -0.7209240198135376,
+        0, -0.6939510107040405, -0.7200220227241516, -0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0, -0.7939500212669373, -0.6079840064048767, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+        -0.6360920071601868, -0.6360920071601868, -0.4367780089378357, -0.5149649977684021, -0.5149649977684021, -0.6852890253067017,
+        -0.48965099453926086, -0.48965099453926086, -0.7214459776878357, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+        -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8314369916915894, -0.3441790044307709, -0.4361799955368042,
+        -0.6735119819641113, -0.2785939872264862, -0.6846650242805481, -0.6403989791870117, -0.26487401127815247, -0.7209240198135376,
+        -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.9001820087432861, 0, -0.4355129897594452, -0.7296109795570374, 0, -0.6838629841804504,
+        -0.6939510107040405, 0, -0.7200220227241516, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.9978039860725403, 0, -0.06623899936676025, -0.9218789935112, 0.38175201416015625, -0.06636899709701538,
+        -0.8314369916915894, 0.3441790044307709, -0.4361799955368042, -0.9001820087432861, 0, -0.4355129897594452,
+        -0.6735119819641113, 0.2785939872264862, -0.6846650242805481, -0.7296109795570374, 0, -0.6838629841804504,
+        -0.6403989791870117, 0.26487401127815247, -0.7209240198135376, -0.6939510107040405, 0, -0.7200220227241516,
+        -0.7329490184783936, 0.303166002035141, -0.6089959740638733, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.6360920071601868, 0.6360920071601868, -0.4367780089378357,
+        -0.5149649977684021, 0.5149649977684021, -0.6852890253067017, -0.48965099453926086, 0.48965099453926086, -0.7214459776878357,
+        -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        -0.3441790044307709, 0.8314369916915894, -0.4361799955368042, -0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+        -0.26487401127815247, 0.6403989791870117, -0.7209240198135376, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        0, 0.9978039860725403, -0.06623899936676025, 0, 0.9001820087432861, -0.4355129897594452,
+        0, 0.7296109795570374, -0.6838629841804504, 0, 0.6939510107040405, -0.7200220227241516,
+        0, 0.7939500212669373, -0.6079840064048767, 0, 0.9978039860725403, -0.06623899936676025,
+        0.38175201416015625, 0.9218789935112, -0.06636899709701538, 0.3441790044307709, 0.8314369916915894, -0.4361799955368042,
+        0, 0.9001820087432861, -0.4355129897594452, 0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+        0, 0.7296109795570374, -0.6838629841804504, 0.26487401127815247, 0.6403989791870117, -0.7209240198135376,
+        0, 0.6939510107040405, -0.7200220227241516, 0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        0, 0.7939500212669373, -0.6079840064048767, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+        0.6360920071601868, 0.6360920071601868, -0.4367780089378357, 0.5149649977684021, 0.5149649977684021, -0.6852890253067017,
+        0.48965099453926086, 0.48965099453926086, -0.7214459776878357, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+        0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8314369916915894, 0.3441790044307709, -0.4361799955368042,
+        0.6735119819641113, 0.2785939872264862, -0.6846650242805481, 0.6403989791870117, 0.26487401127815247, -0.7209240198135376,
+        0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.9978039860725403, 0, -0.06623899936676025,
+        0.9001820087432861, 0, -0.4355129897594452, 0.7296109795570374, 0, -0.6838629841804504,
+        0.6939510107040405, 0, -0.7200220227241516, 0.7939500212669373, 0, -0.6079840064048767,
+        0.7939500212669373, 0, -0.6079840064048767, 0.7329490184783936, -0.303166002035141, -0.6089959740638733,
+        0.576229989528656, -0.23821599781513214, -0.7818009853363037, 0.6238600015640259, 0, -0.7815359830856323,
+        0.16362899541854858, -0.06752700358629227, -0.9842079877853394, 0.17729100584983826, 0, -0.984158992767334,
+        0.04542100057005882, -0.018735000863671303, -0.9987919926643372, 0.04920699819922447, 0, -0.9987890124320984,
+        0, 0, -1, 0, 0, -1,
+        0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.44041600823402405, -0.44041600823402405, -0.7823479771614075,
+        0.12490200251340866, -0.12490200251340866, -0.9842759966850281, 0.034662000834941864, -0.034662000834941864, -0.9987980127334595,
+        0, 0, -1, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0.23821599781513214, -0.576229989528656, -0.7818009853363037, 0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+        0.018735000863671303, -0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+        0, -0.7939500212669373, -0.6079840064048767, 0, -0.6238600015640259, -0.7815359830856323,
+        0, -0.17729100584983826, -0.984158992767334, 0, -0.04920699819922447, -0.9987890124320984,
+        0, 0, -1, 0, -0.7939500212669373, -0.6079840064048767,
+        -0.303166002035141, -0.7329490184783936, -0.6089959740638733, -0.23821599781513214, -0.576229989528656, -0.7818009853363037,
+        0, -0.6238600015640259, -0.7815359830856323, -0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+        0, -0.17729100584983826, -0.984158992767334, -0.018735000863671303, -0.04542100057005882, -0.9987919926643372,
+        0, -0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+        0, 0, -1, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+        -0.44041600823402405, -0.44041600823402405, -0.7823479771614075, -0.12490200251340866, -0.12490200251340866, -0.9842759966850281,
+        -0.034662000834941864, -0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+        -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.576229989528656, -0.23821599781513214, -0.7818009853363037,
+        -0.16362899541854858, -0.06752700358629227, -0.9842079877853394, -0.04542100057005882, -0.018735000863671303, -0.9987919926643372,
+        0, 0, -1, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.6238600015640259, 0, -0.7815359830856323, -0.17729100584983826, 0, -0.984158992767334,
+        -0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+        -0.7939500212669373, 0, -0.6079840064048767, -0.7329490184783936, 0.303166002035141, -0.6089959740638733,
+        -0.576229989528656, 0.23821599781513214, -0.7818009853363037, -0.6238600015640259, 0, -0.7815359830856323,
+        -0.16362899541854858, 0.06752700358629227, -0.9842079877853394, -0.17729100584983826, 0, -0.984158992767334,
+        -0.04542100057005882, 0.018735000863671303, -0.9987919926643372, -0.04920699819922447, 0, -0.9987890124320984,
+        0, 0, -1, 0, 0, -1,
+        -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.44041600823402405, 0.44041600823402405, -0.7823479771614075,
+        -0.12490200251340866, 0.12490200251340866, -0.9842759966850281, -0.034662000834941864, 0.034662000834941864, -0.9987980127334595,
+        0, 0, -1, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        -0.23821599781513214, 0.576229989528656, -0.7818009853363037, -0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+        -0.018735000863671303, 0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+        0, 0.7939500212669373, -0.6079840064048767, 0, 0.6238600015640259, -0.7815359830856323,
+        0, 0.17729100584983826, -0.984158992767334, 0, 0.04920699819922447, -0.9987890124320984,
+        0, 0, -1, 0, 0.7939500212669373, -0.6079840064048767,
+        0.303166002035141, 0.7329490184783936, -0.6089959740638733, 0.23821599781513214, 0.576229989528656, -0.7818009853363037,
+        0, 0.6238600015640259, -0.7815359830856323, 0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+        0, 0.17729100584983826, -0.984158992767334, 0.018735000863671303, 0.04542100057005882, -0.9987919926643372,
+        0, 0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+        0, 0, -1, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+        0.44041600823402405, 0.44041600823402405, -0.7823479771614075, 0.12490200251340866, 0.12490200251340866, -0.9842759966850281,
+        0.034662000834941864, 0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+        0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.576229989528656, 0.23821599781513214, -0.7818009853363037,
+        0.16362899541854858, 0.06752700358629227, -0.9842079877853394, 0.04542100057005882, 0.018735000863671303, -0.9987919926643372,
+        0, 0, -1, 0.7939500212669373, 0, -0.6079840064048767,
+        0.6238600015640259, 0, -0.7815359830856323, 0.17729100584983826, 0, -0.984158992767334,
+        0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+        0.007784999907016754, 0.00021499999274965376, -0.999970018863678, 0.007038000039756298, -0.5829259753227234, -0.8124949932098389,
+        0.0361270010471344, -0.5456140041351318, -0.837257981300354, 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303,
+        0.16184599697589874, -0.5630490183830261, -0.8104209899902344, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+        0.4823650121688843, -0.6427459716796875, -0.5951480269432068, 0.6122999787330627, 0.010459000244736671, -0.790556013584137,
+        0.7387199997901917, -0.6641989946365356, -0.11459299921989441, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        -0.0019079999765381217, -0.9867690205574036, 0.1621209979057312, 0.002761000068858266, -0.9998499751091003, 0.017105000093579292,
+        0.010532000102102757, -0.9972469806671143, 0.07339800149202347, -0.06604000180959702, -0.9893029928207397, 0.13006900250911713,
+        -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.009201999753713608, -0.4902929961681366, 0.8715090155601501,
+        -0.04860600084066391, -0.5394579768180847, 0.8406090140342712, -0.22329799830913544, -0.5527390241622925, 0.8028810024261475,
+        -0.5963649749755859, -0.5751349925994873, 0.5599709749221802, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+        -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111, -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943,
+        -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.7497230172157288, -0.004267000127583742, 0.6617379784584045,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111,
+        -0.008791999891400337, 0.49032899737358093, 0.8714929819107056, -0.04649300128221512, 0.5387560129165649, 0.8411779999732971,
+        -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943, -0.21790899336338043, 0.5491610169410706, 0.8068069815635681,
+        -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.5972909927368164, 0.5741199851036072, 0.560027003288269,
+        -0.7497230172157288, -0.004267000127583742, 0.6617379784584045, -0.8040000200271606, 0.5912910103797913, 0.0629120022058487,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.0018050000071525574, 0.986840009689331, 0.16169099509716034,
+        0.0020310000982135534, 0.999891996383667, 0.014553000219166279, 0.009215000085532665, 0.9981520175933838, 0.060068998485803604,
+        -0.059335000813007355, 0.9917230010032654, 0.11386600136756897, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+        0.006417000200599432, 0.5830950140953064, -0.812379002571106, 0.03378299996256828, 0.5453730225563049, -0.8375130295753479,
+        0.1571130007505417, 0.562188982963562, -0.8119469881057739, 0.4844059944152832, 0.6465290188789368, -0.5893650054931641,
+        0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.007784999907016754, 0.00021499999274965376, -0.999970018863678,
+        0.03913800045847893, 0.0009879999561235309, -0.9992330074310303, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+        0.6122999787330627, 0.010459000244736671, -0.790556013584137, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        0.9861519932746887, 0.006668999791145325, -0.16570700705051422, 0.7387199997901917, -0.6641989946365356, -0.11459299921989441,
+        0.7256090044975281, -0.6373609900474548, 0.25935098528862, 0.94651198387146, 0.0033569999504834414, 0.3226499855518341,
+        0.6459450125694275, -0.6077200174331665, 0.46198800206184387, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+        0.5316150188446045, -0.5586140155792236, 0.6366599798202515, 0.6500110030174255, 0.006936000194400549, 0.759893000125885,
+        0.4249640107154846, -0.5955389738082886, 0.6817179918289185, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+        -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.04956100136041641, -0.9985759854316711, -0.01975500024855137,
+        -0.03781700134277344, -0.998649001121521, -0.035624999552965164, -0.0379129983484745, -0.9986140131950378, -0.03651199862360954,
+        -0.1688539981842041, -0.9395300149917603, -0.2979460060596466, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+        -0.7423409819602966, -0.5995240211486816, -0.2991659939289093, -0.6196020245552063, -0.5795029997825623, -0.5294060111045837,
+        -0.483707994222641, -0.5438370108604431, -0.6857600212097168, -0.44529199600219727, -0.4131770133972168, -0.7943549752235413,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682,
+        -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.5662239789962769, -0.003461000043898821, -0.8242440223693848,
+        -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288,
+        -0.8040000200271606, 0.5912910103797913, 0.0629120022058487, -0.7446749806404114, 0.5989770293235779, -0.29442399740219116,
+        -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682, -0.6219490170478821, 0.5781649947166443, -0.5281140208244324,
+        -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.48117101192474365, 0.5428280234336853, -0.6883400082588196,
+        -0.5662239789962769, -0.003461000043898821, -0.8242440223693848, -0.43805500864982605, 0.41574400663375854, -0.7970349788665771,
+        -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+        -0.04433799907565117, 0.9988710284233093, -0.017055999487638474, -0.026177000254392624, 0.9992600083351135, -0.02816700004041195,
+        -0.025293000042438507, 0.9992780089378357, -0.028332000598311424, -0.15748199820518494, 0.9441670179367065, -0.28939300775527954,
+        0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.7282440066337585, 0.63714200258255, 0.25240999460220337,
+        0.6470540165901184, 0.6082550287246704, 0.4597249925136566, 0.5229939818382263, 0.5621700286865234, 0.6406570076942444,
+        0.4099780023097992, 0.6046689748764038, 0.6828569769859314, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        0.94651198387146, 0.0033569999504834414, 0.3226499855518341, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+        0.6500110030174255, 0.006936000194400549, 0.759893000125885, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+        -0.230786994099617, 0.006523000076413155, 0.9729819893836975, -0.15287800133228302, -0.7101899981498718, 0.6872109770774841,
+        -0.31672099232673645, -0.7021129727363586, 0.6377500295639038, -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308,
+        -0.6010670065879822, -0.645330011844635, 0.471451997756958, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+        -0.635890007019043, -0.629800021648407, 0.4460900127887726, -0.8775539994239807, -0.01909100078046322, 0.47909700870513916,
+        -0.4357450008392334, -0.670009970664978, 0.6010090112686157, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        0.11111299693584442, -0.9901599884033203, -0.08506900072097778, 0.22330999374389648, -0.9747260212898254, 0.006539999973028898,
+        0.19009700417518616, -0.9694579839706421, 0.15496399998664856, 0.005270000081509352, -0.9818699955940247, 0.18948200345039368,
+        -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.3439059853553772, -0.5994120240211487, -0.7227950096130371,
+        0.5724899768829346, -0.5916270017623901, -0.5676559805870056, 0.7874360084533691, -0.5605109930038452, -0.2564600110054016,
+        0.6470969915390015, -0.6981409788131714, -0.3063740134239197, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+        0.4109260141849518, -0.0012839999981224537, -0.9116680026054382, 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177,
+        0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.8469099998474121, 0.01385399978607893, -0.5315560102462769,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382,
+        0.3411880135536194, 0.6009309887886047, -0.7228230237960815, 0.5786640048027039, 0.591838002204895, -0.5611389875411987,
+        0.6715199947357178, 0.0008989999769255519, -0.7409859895706177, 0.7848690152168274, 0.5665420293807983, -0.25102001428604126,
+        0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.6426810026168823, 0.7039899826049805, -0.3022570013999939,
+        0.8469099998474121, 0.01385399978607893, -0.5315560102462769, 0.4185889959335327, 0.7581170201301575, -0.5000420212745667,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.11580599844455719, 0.9901139736175537, -0.07913900166749954,
+        0.23281100392341614, 0.9724410176277161, 0.012564999982714653, 0.20666299760341644, 0.9662799835205078, 0.15360000729560852,
+        0.02449899911880493, 0.9865779876708984, 0.16144299507141113, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+        -0.13491199910640717, 0.7135509848594666, 0.6874909996986389, -0.31953999400138855, 0.7050619721412659, 0.6330729722976685,
+        -0.6039019823074341, 0.6499029994010925, 0.4614419937133789, -0.6318150162696838, 0.6400719881057739, 0.43716898560523987,
+        -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.230786994099617, 0.006523000076413155, 0.9729819893836975,
+        -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+        -0.8775539994239807, -0.01909100078046322, 0.47909700870513916, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        -0.6961889863014221, -0.02449600026011467, 0.7174400091171265, -0.4357450008392334, -0.670009970664978, 0.6010090112686157,
+        -0.25985801219940186, -0.5525479912757874, 0.7919380068778992, -0.42579901218414307, -0.010804999619722366, 0.9047530293464661,
+        0.009537000209093094, 0.021669000387191772, 0.9997199773788452, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+        0.4101540148258209, 0.8490809798240662, 0.3329179883003235, 0.9995980262756348, -0.01155600044876337, 0.02587899938225746,
+        0.5415220260620117, 0.6370009779930115, -0.5486199855804443, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+        -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.046310000121593475, -0.8891720175743103, 0.45522499084472656,
+        -0.010688000358641148, -0.14889900386333466, 0.9887949824333191, -0.04437499865889549, 0.7291200160980225, 0.6829460263252258,
+        0.12282499670982361, 0.9923850297927856, 0.009232000447809696, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+        0.48183900117874146, -0.857479989528656, -0.18044300377368927, 0.45527198910713196, -0.49992498755455017, 0.7367510199546814,
+        -0.22054199874401093, 0.3582780063152313, 0.9071930050849915, -0.23591899871826172, 0.7157959938049316, 0.6572499871253967,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.7280910015106201, 0.015584999695420265, -0.6853029727935791,
+        0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.26009801030158997, -0.0007999999797903001, 0.965582013130188,
+        -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.5359240174293518, 0.010503999888896942, -0.8442010283470154,
+        0.4185889959335327, 0.7581170201301575, -0.5000420212745667, 0.4801650047302246, 0.8588529825210571, -0.17836299538612366,
+        0.7280910015106201, 0.015584999695420265, -0.6853029727935791, 0.4881030023097992, 0.49794700741767883, 0.7168020009994507,
+        0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.2220049947500229, -0.36189401149749756, 0.9053990244865417,
+        -0.26009801030158997, -0.0007999999797903001, 0.965582013130188, -0.23540399968624115, -0.7104769945144653, 0.6631799936294556,
+        -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+        0.058719001710414886, 0.8971999883651733, 0.437703013420105, 0.0013249999610707164, 0.164000004529953, 0.9864590167999268,
+        -0.04418899863958359, -0.7303190231323242, 0.6816750168800354, 0.13880200684070587, -0.9897300004959106, -0.034189000725746155,
+        -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.25888898968696594, 0.5453789830207825, 0.7972059845924377,
+        0.012268000282347202, -0.01928500086069107, 0.9997389912605286, 0.3986299932003021, -0.8456630110740662, 0.3548929989337921,
+        0.5375639796257019, -0.6107370257377625, -0.5813990235328674, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        -0.42579901218414307, -0.010804999619722366, 0.9047530293464661, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+        0.9995980262756348, -0.01155600044876337, 0.02587899938225746, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+        0, 0, 1, 0, 0, 1,
+        0.7626410126686096, -0.31482499837875366, 0.5650339722633362, 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283,
+        0.8479819893836975, -0.3500339984893799, -0.39799800515174866, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+        0.8641409873962402, -0.35644200444221497, -0.3552600145339966, 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396,
+        0.7209920287132263, -0.29793301224708557, 0.6256250143051147, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0, 0, 1, 0.5833569765090942, -0.5833380222320557, 0.5651649832725525,
+        0.648485004901886, -0.6484479904174805, -0.3987259864807129, 0.6608719825744629, -0.6607480049133301, -0.35589399933815,
+        0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+        0.31482499837875366, -0.762628972530365, 0.5650510191917419, 0.35004499554634094, -0.8479880094528198, -0.39797601103782654,
+        0.35647401213645935, -0.8641520142555237, -0.35519900918006897, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+        0, 0, 1, -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283,
+        -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0, 0, 1, -0.31482499837875366, -0.7626410126686096, 0.5650339722633362,
+        -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283, -0.3500339984893799, -0.8479819893836975, -0.39799800515174866,
+        -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.35644200444221497, -0.8641409873962402, -0.3552600145339966,
+        -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396, -0.29793301224708557, -0.7209920287132263, 0.6256250143051147,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        -0.5833380222320557, -0.5833569765090942, 0.5651649832725525, -0.6484479904174805, -0.648485004901886, -0.3987259864807129,
+        -0.6607480049133301, -0.6608719825744629, -0.35589399933815, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+        0, 0, 1, -0.762628972530365, -0.31482499837875366, 0.5650510191917419,
+        -0.8479880094528198, -0.35004499554634094, -0.39797601103782654, -0.8641520142555237, -0.35647401213645935, -0.35519900918006897,
+        -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+        -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+        -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        0, 0, 1, 0, 0, 1,
+        -0.7626410126686096, 0.31482499837875366, 0.5650339722633362, -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283,
+        -0.8479819893836975, 0.3500339984893799, -0.39799800515174866, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+        -0.8641409873962402, 0.35644200444221497, -0.3552600145339966, -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396,
+        -0.7209920287132263, 0.29793301224708557, 0.6256250143051147, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        0, 0, 1, -0.5833569765090942, 0.5833380222320557, 0.5651649832725525,
+        -0.648485004901886, 0.6484479904174805, -0.3987259864807129, -0.6608719825744629, 0.6607480049133301, -0.35589399933815,
+        -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+        -0.31482499837875366, 0.762628972530365, 0.5650510191917419, -0.35004499554634094, 0.8479880094528198, -0.39797601103782654,
+        -0.35647401213645935, 0.8641520142555237, -0.35519900918006897, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+        0, 0, 1, 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283,
+        0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0, 0, 1, 0.31482499837875366, 0.7626410126686096, 0.5650339722633362,
+        0.00001700000029813964, 0.8245400190353394, 0.5658029913902283, 0.3500339984893799, 0.8479819893836975, -0.39799800515174866,
+        0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.35644200444221497, 0.8641409873962402, -0.3552600145339966,
+        0.00011200000153621659, 0.9352689981460571, -0.3539389967918396, 0.29793301224708557, 0.7209920287132263, 0.6256250143051147,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0.5833380222320557, 0.5833569765090942, 0.5651649832725525, 0.6484479904174805, 0.648485004901886, -0.3987259864807129,
+        0.6607480049133301, 0.6608719825744629, -0.35589399933815, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+        0, 0, 1, 0.762628972530365, 0.31482499837875366, 0.5650510191917419,
+        0.8479880094528198, 0.35004499554634094, -0.39797601103782654, 0.8641520142555237, 0.35647401213645935, -0.35519900918006897,
+        0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+        0.8245400190353394, -0.00001700000029813964, 0.5658029913902283, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+        0.9352689981460571, -0.00011200000153621659, -0.3539389967918396, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0.7807120084762573, -0.00007500000356230885, 0.6248909831047058, 0.7209920287132263, -0.29793301224708557, 0.6256250143051147,
+        0.21797800064086914, -0.0902160033583641, 0.9717749953269958, 0.23658299446105957, 0, 0.9716110229492188,
+        0.1595889925956726, -0.06596100330352783, 0.9849770069122314, 0.17308400571346283, 0, 0.9849069714546204,
+        0.3504979908466339, -0.1447400003671646, 0.9253119826316833, 0.37970298528671265, 0, 0.925108015537262,
+        0.48558899760246277, -0.20147399604320526, 0.8506529927253723, 0.5266720056533813, 0, 0.8500679731369019,
+        0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0.16663099825382233, -0.16663099825382233, 0.9718379974365234,
+        0.12190800160169601, -0.12190800160169601, 0.9850260019302368, 0.2676680088043213, -0.2676680088043213, 0.9255849719047546,
+        0.37131500244140625, -0.37131500244140625, 0.8510289788246155, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+        0.0902160033583641, -0.21797800064086914, 0.9717749953269958, 0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+        0.1447400003671646, -0.3504979908466339, 0.9253119826316833, 0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, -0.23658299446105957, 0.9716110229492188,
+        0, -0.17308400571346283, 0.9849069714546204, 0, -0.37970298528671265, 0.925108015537262,
+        0, -0.5266720056533813, 0.8500679731369019, -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894,
+        -0.29793301224708557, -0.7209920287132263, 0.6256250143051147, -0.0902160033583641, -0.21797800064086914, 0.9717749953269958,
+        0, -0.23658299446105957, 0.9716110229492188, -0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+        0, -0.17308400571346283, 0.9849069714546204, -0.1447400003671646, -0.3504979908466339, 0.9253119826316833,
+        0, -0.37970298528671265, 0.925108015537262, -0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+        0, -0.5266720056533813, 0.8500679731369019, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+        -0.16663099825382233, -0.16663099825382233, 0.9718379974365234, -0.12190800160169601, -0.12190800160169601, 0.9850260019302368,
+        -0.2676680088043213, -0.2676680088043213, 0.9255849719047546, -0.37131500244140625, -0.37131500244140625, 0.8510289788246155,
+        -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, -0.21797800064086914, -0.0902160033583641, 0.9717749953269958,
+        -0.1595889925956726, -0.06596100330352783, 0.9849770069122314, -0.3504979908466339, -0.1447400003671646, 0.9253119826316833,
+        -0.48558899760246277, -0.20147399604320526, 0.8506529927253723, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        -0.23658299446105957, 0, 0.9716110229492188, -0.17308400571346283, 0, 0.9849069714546204,
+        -0.37970298528671265, 0, 0.925108015537262, -0.5266720056533813, 0, 0.8500679731369019,
+        -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894, -0.7209920287132263, 0.29793301224708557, 0.6256250143051147,
+        -0.21797800064086914, 0.0902160033583641, 0.9717749953269958, -0.23658299446105957, 0, 0.9716110229492188,
+        -0.1595889925956726, 0.06596100330352783, 0.9849770069122314, -0.17308400571346283, 0, 0.9849069714546204,
+        -0.3504979908466339, 0.1447400003671646, 0.9253119826316833, -0.37970298528671265, 0, 0.925108015537262,
+        -0.48558899760246277, 0.20147399604320526, 0.8506529927253723, -0.5266720056533813, 0, 0.8500679731369019,
+        -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, -0.16663099825382233, 0.16663099825382233, 0.9718379974365234,
+        -0.12190800160169601, 0.12190800160169601, 0.9850260019302368, -0.2676680088043213, 0.2676680088043213, 0.9255849719047546,
+        -0.37131500244140625, 0.37131500244140625, 0.8510289788246155, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+        -0.0902160033583641, 0.21797800064086914, 0.9717749953269958, -0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+        -0.1447400003671646, 0.3504979908466339, 0.9253119826316833, -0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0.23658299446105957, 0.9716110229492188,
+        0, 0.17308400571346283, 0.9849069714546204, 0, 0.37970298528671265, 0.925108015537262,
+        0, 0.5266720056533813, 0.8500679731369019, 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894,
+        0.29793301224708557, 0.7209920287132263, 0.6256250143051147, 0.0902160033583641, 0.21797800064086914, 0.9717749953269958,
+        0, 0.23658299446105957, 0.9716110229492188, 0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+        0, 0.17308400571346283, 0.9849069714546204, 0.1447400003671646, 0.3504979908466339, 0.9253119826316833,
+        0, 0.37970298528671265, 0.925108015537262, 0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+        0, 0.5266720056533813, 0.8500679731369019, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+        0.16663099825382233, 0.16663099825382233, 0.9718379974365234, 0.12190800160169601, 0.12190800160169601, 0.9850260019302368,
+        0.2676680088043213, 0.2676680088043213, 0.9255849719047546, 0.37131500244140625, 0.37131500244140625, 0.8510289788246155,
+        0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0.21797800064086914, 0.0902160033583641, 0.9717749953269958,
+        0.1595889925956726, 0.06596100330352783, 0.9849770069122314, 0.3504979908466339, 0.1447400003671646, 0.9253119826316833,
+        0.48558899760246277, 0.20147399604320526, 0.8506529927253723, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0.23658299446105957, 0, 0.9716110229492188, 0.17308400571346283, 0, 0.9849069714546204,
+        0.37970298528671265, 0, 0.925108015537262, 0.5266720056533813, 0, 0.8500679731369019 };
+
+float teapotTangents[] = { 0.012897999957203865, 0.998727023601532, -0.048757001757621765, 0.3861910104751587, 0.9210079908370972, -0.016421999782323837,
+        0.38136398792266846, 0.9230089783668518, 0.000155999994603917, 0.012866999953985214, 0.9987300038337708, 0.04870200157165527,
+        0.3750790059566498, 0.9061710238456726, -0.0007169999880716205, 0.19210100173950195, 0.9812139868736267, 0.01775900088250637,
+        0.3782620131969452, 0.9142940044403076, -0.00011300000187475234, 0.10451500117778778, 0.9897350072860718, -0.09747499972581863,
+        0.3655939996242523, 0.9257190227508545, 0.028463000431656837, 0.04767199978232384, 0.9953050017356873, -0.08423800021409988,
+        0.7092679738998413, 0.7031199932098389, -0.016364000737667084, 0.7061989903450012, 0.7061989903450012, 0,
+        0.6937360167503357, 0.6937360167503357, 0, 0.6997770071029663, 0.6997770071029663, 0,
+        0.6924030184745789, 0.7150859832763672, 0.02822900004684925, 0.9243540167808533, 0.37810400128364563, -0.01657800003886223,
+        0.9230089783668518, 0.38136398792266846, -0.000155999994603917, 0.9061710238456726, 0.3750790059566498, 0.0007169999880716205,
+        0.9142940044403076, 0.3782620131969452, 0.00011300000187475234, 0.9133660197257996, 0.39544400572776794, 0.028490999713540077,
+        0.9987040162086487, 0.015853000804781914, 0.04836999997496605, 0.9987369775772095, 0.014649000018835068, -0.04806999862194061,
+        0.9812150001525879, 0.19211700558662415, -0.01754000037908554, 0.9897350072860718, 0.10452800244092941, 0.09745799750089645,
+        0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9988179802894592, -0.009758999571204185, -0.047600001096725464,
+        0.9094679951667786, -0.4095839858055115, -0.012636999599635601, 0.9240090250968933, -0.3811509907245636, -0.0003150000120513141,
+        0.9987890124320984, -0.01066299993544817, 0.04801800101995468, 0.9072269797325134, -0.37142300605773926, 0.0207310002297163,
+        0.9814350008964539, -0.19095200300216675, 0.01795700006186962, 0.914870023727417, -0.3771440088748932, -0.0011480000102892518,
+        0.989749014377594, -0.10442499816417694, -0.09742700308561325, 0.925815999507904, -0.3653950095176697, 0.028308000415563583,
+        0.9953050017356873, -0.04767199978232384, -0.08423800021409988, 0.6768929958343506, -0.7314029932022095, -0.01988700032234192,
+        0.6994619965553284, -0.7145140171051025, -0.00029799999902024865, 0.6940590143203735, -0.6933979988098145, 0.015560000203549862,
+        0.7002580165863037, -0.6996300220489502, -0.000783999974373728, 0.715142011642456, -0.6923869848251343, 0.028078999370336533,
+        0.351936012506485, -0.933899998664856, -0.019843999296426773, 0.36654001474380493, -0.9298419952392578, -0.0005210000090301037,
+        0.37116900086402893, -0.9084830284118652, 0.00152299995534122, 0.3776479959487915, -0.9147650003433228, -0.00011000000085914508,
+        0.39533698558807373, -0.9134349822998047, 0.028410999104380608, 0.0013210000470280647, -0.9989479780197144, 0.045830998569726944,
+        0.003897000104188919, -0.9988909959793091, -0.04690299928188324, 0.18705999851226807, -0.9821630120277405, -0.018818000331521034,
+        0.10363999754190445, -0.9898579716682434, 0.09715499728918076, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+        -0.02296699956059456, -0.9986780285835266, -0.04599199816584587, -0.3861910104751587, -0.9210079908370972, -0.016421999782323837,
+        -0.38136398792266846, -0.9230089783668518, 0.000155999994603917, -0.020431000739336014, -0.9987260103225708, 0.04614400118589401,
+        -0.3750790059566498, -0.9061710238456726, -0.0007169999880716205, -0.19216600060462952, -0.9812189936637878, 0.01677200011909008,
+        -0.3782620131969452, -0.9142940044403076, -0.00011300000187475234, -0.10471200197935104, -0.9897390007972717, -0.09722500294446945,
+        -0.3655939996242523, -0.9257190227508545, 0.028463000431656837, -0.047710999846458435, -0.9953050017356873, -0.08420699834823608,
+        -0.7092679738998413, -0.7031199932098389, -0.016364000737667084, -0.7061989903450012, -0.7061989903450012, 0,
+        -0.6937360167503357, -0.6937360167503357, 0, -0.6997770071029663, -0.6997770071029663, 0,
+        -0.6924030184745789, -0.7150859832763672, 0.02822900004684925, -0.9243540167808533, -0.37810400128364563, -0.01657800003886223,
+        -0.9230089783668518, -0.38136398792266846, -0.000155999994603917, -0.9061710238456726, -0.3750790059566498, 0.0007169999880716205,
+        -0.9142940044403076, -0.3782620131969452, 0.00011300000187475234, -0.9133660197257996, -0.39544400572776794, 0.028490999713540077,
+        -0.998727023601532, -0.012897999957203865, 0.048757001757621765, -0.9987300038337708, -0.012866999953985214, -0.04870200157165527,
+        -0.9812139868736267, -0.19210100173950195, -0.01775900088250637, -0.9897350072860718, -0.10451500117778778, 0.09747499972581863,
+        -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.998727023601532, 0.012897999957203865, -0.048757001757621765,
+        -0.9210079908370972, 0.3861910104751587, -0.016421999782323837, -0.9230089783668518, 0.38136398792266846, 0.000155999994603917,
+        -0.9987300038337708, 0.012866999953985214, 0.04870200157165527, -0.9061710238456726, 0.3750790059566498, -0.0007169999880716205,
+        -0.9812139868736267, 0.19210100173950195, 0.01775900088250637, -0.9142940044403076, 0.3782620131969452, -0.00011300000187475234,
+        -0.9897350072860718, 0.10451500117778778, -0.09747499972581863, -0.9257190227508545, 0.3655939996242523, 0.028463000431656837,
+        -0.9953050017356873, 0.04767199978232384, -0.08423800021409988, -0.7031199932098389, 0.7092679738998413, -0.016364000737667084,
+        -0.7061989903450012, 0.7061989903450012, 0, -0.6937360167503357, 0.6937360167503357, 0,
+        -0.6997770071029663, 0.6997770071029663, 0, -0.7150859832763672, 0.6924030184745789, 0.02822900004684925,
+        -0.37810400128364563, 0.9243540167808533, -0.01657800003886223, -0.38136398792266846, 0.9230089783668518, -0.000155999994603917,
+        -0.3750790059566498, 0.9061710238456726, 0.0007169999880716205, -0.3782620131969452, 0.9142940044403076, 0.00011300000187475234,
+        -0.39544400572776794, 0.9133660197257996, 0.028490999713540077, -0.012897999957203865, 0.998727023601532, 0.048757001757621765,
+        -0.012866999953985214, 0.9987300038337708, -0.04870200157165527, -0.19210100173950195, 0.9812139868736267, -0.01775900088250637,
+        -0.10451500117778778, 0.9897350072860718, 0.09747499972581863, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+        0.04767199978232384, 0.9953050017356873, -0.08423800021409988, 0.39544400572776794, 0.9133660197257996, -0.028490999713540077,
+        0.38111698627471924, 0.9210190176963806, -0.000015999999959603883, 0.031922999769449234, 0.9968529939651489, -0.07255599647760391,
+        0.3815299868583679, 0.9219080209732056, 0.0000019999999949504854, 0.022261999547481537, 0.9978039860725403, -0.06237399950623512,
+        0.3821389973163605, 0.9231889843940735, 0.00001700000029813964, 0.008317999541759491, 0.9991790056228638, -0.03964800015091896,
+        0.38228899240493774, 0.9239469766616821, -0.004430000204592943, 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146,
+        0.7150859832763672, 0.6924030184745789, -0.02822900004684925, 0.7048519849777222, 0.7048519849777222, 0,
+        0.7055330276489258, 0.7055330276489258, 0, 0.7065179944038391, 0.7065179944038391, 0,
+        0.7068390250205994, 0.707252025604248, -0.004379999823868275, 0.9257190227508545, 0.3655939996242523, -0.028463000431656837,
+        0.9210180044174194, 0.38111698627471924, 0.000015999999959603883, 0.9219080209732056, 0.3815299868583679, -0.0000019999999949504854,
+        0.9231889843940735, 0.3821389973163605, -0.00001700000029813964, 0.9237229824066162, 0.38283199071884155, -0.004399999976158142,
+        0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9968529939651489, 0.031922999769449234, 0.07255599647760391,
+        0.9978039860725403, 0.022261999547481537, 0.06237399950623512, 0.9991790056228638, 0.008317999541759491, 0.03964800015091896,
+        0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9953050017356873, -0.04767199978232384, -0.08423800021409988,
+        0.9135000109672546, -0.3951619863510132, -0.02861100062727928, 0.9210190176963806, -0.38111698627471924, -0.000015999999959603883,
+        0.9968529939651489, -0.031922999769449234, -0.07255599647760391, 0.9219080209732056, -0.3815299868583679, 0.0000019999999949504854,
+        0.9978039860725403, -0.022261999547481537, -0.06237399950623512, 0.9231889843940735, -0.3821389973163605, 0.00001700000029813964,
+        0.9991790056228638, -0.008317999541759491, -0.03964800015091896, 0.9239469766616821, -0.38228899240493774, -0.004430000204592943,
+        0.9999139904975891, -0.0008660000166855752, 0.013048999942839146, 0.6925899982452393, -0.7149369716644287, -0.028262000530958176,
+        0.7048519849777222, -0.7048519849777222, 0, 0.7055330276489258, -0.7055330276489258, 0,
+        0.7065179944038391, -0.7065179944038391, 0, 0.707252025604248, -0.7068390250205994, -0.004379999823868275,
+        0.3656100034713745, -0.9257280230522156, -0.02841299958527088, 0.38111698627471924, -0.9210180044174194, 0.000015999999959603883,
+        0.3815299868583679, -0.9219080209732056, -0.0000019999999949504854, 0.3821389973163605, -0.9231889843940735, -0.00001700000029813964,
+        0.38283199071884155, -0.9237229824066162, -0.004399999976158142, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+        0.031922999769449234, -0.9968529939651489, 0.07255599647760391, 0.022261999547481537, -0.9978039860725403, 0.06237399950623512,
+        0.008317999541759491, -0.9991790056228638, 0.03964800015091896, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+        -0.047710999846458435, -0.9953050017356873, -0.08420699834823608, -0.39544400572776794, -0.9133660197257996, -0.028490999713540077,
+        -0.38111698627471924, -0.9210190176963806, -0.000015999999959603883, -0.031922999769449234, -0.9968529939651489, -0.07255599647760391,
+        -0.3815299868583679, -0.9219080209732056, 0.0000019999999949504854, -0.022261999547481537, -0.9978039860725403, -0.06237399950623512,
+        -0.3821389973163605, -0.9231889843940735, 0.00001700000029813964, -0.008317999541759491, -0.9991790056228638, -0.03964800015091896,
+        -0.38228899240493774, -0.9239469766616821, -0.004430000204592943, -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146,
+        -0.7150859832763672, -0.6924030184745789, -0.02822900004684925, -0.7048519849777222, -0.7048519849777222, 0,
+        -0.7055330276489258, -0.7055330276489258, 0, -0.7065179944038391, -0.7065179944038391, 0,
+        -0.7068390250205994, -0.707252025604248, -0.004379999823868275, -0.9257190227508545, -0.3655939996242523, -0.028463000431656837,
+        -0.9210180044174194, -0.38111698627471924, 0.000015999999959603883, -0.9219080209732056, -0.3815299868583679, -0.0000019999999949504854,
+        -0.9231889843940735, -0.3821389973163605, -0.00001700000029813964, -0.9237229824066162, -0.38283199071884155, -0.004399999976158142,
+        -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.9968529939651489, -0.031922999769449234, 0.07255599647760391,
+        -0.9978039860725403, -0.022261999547481537, 0.06237399950623512, -0.9991790056228638, -0.008317999541759491, 0.03964800015091896,
+        -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9953050017356873, 0.04767199978232384, -0.08423800021409988,
+        -0.9133660197257996, 0.39544400572776794, -0.028490999713540077, -0.9210190176963806, 0.38111698627471924, -0.000015999999959603883,
+        -0.9968529939651489, 0.031922999769449234, -0.07255599647760391, -0.9219080209732056, 0.3815299868583679, 0.0000019999999949504854,
+        -0.9978039860725403, 0.022261999547481537, -0.06237399950623512, -0.9231889843940735, 0.3821389973163605, 0.00001700000029813964,
+        -0.9991790056228638, 0.008317999541759491, -0.03964800015091896, -0.9239469766616821, 0.38228899240493774, -0.004430000204592943,
+        -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146, -0.6924030184745789, 0.7150859832763672, -0.02822900004684925,
+        -0.7048519849777222, 0.7048519849777222, 0, -0.7055330276489258, 0.7055330276489258, 0,
+        -0.7065179944038391, 0.7065179944038391, 0, -0.707252025604248, 0.7068390250205994, -0.004379999823868275,
+        -0.3655939996242523, 0.9257190227508545, -0.028463000431656837, -0.38111698627471924, 0.9210180044174194, 0.000015999999959603883,
+        -0.3815299868583679, 0.9219080209732056, -0.0000019999999949504854, -0.3821389973163605, 0.9231889843940735, -0.00001700000029813964,
+        -0.38283199071884155, 0.9237229824066162, -0.004399999976158142, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+        -0.031922999769449234, 0.9968529939651489, 0.07255599647760391, -0.022261999547481537, 0.9978039860725403, 0.06237399950623512,
+        -0.008317999541759491, 0.9991790056228638, 0.03964800015091896, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+        0.0008660000166855752, 0.9999139904975891, 0.013048999942839146, 0.38283199071884155, 0.9237229824066162, 0.004399999976158142,
+        0.38101500272750854, 0.9204739928245544, -0.00003899999865097925, 0.03731299936771393, 0.9963229894638062, 0.07712399959564209,
+        0.37877199053764343, 0.9154880046844482, 0.00008399999933317304, 0.09151100367307663, 0.9910060167312622, 0.097632996737957,
+        0.378387987613678, 0.9145749807357788, 0.00009999999747378752, 0.10134600102901459, 0.9900450110435486, 0.09767600148916245,
+        0.356795996427536, 0.9266510009765625, -0.03188199922442436, 0.07246600091457367, 0.9928709864616394, 0.09463199973106384,
+        0.707252025604248, 0.7068390250205994, 0.004379999823868275, 0.7044739723205566, 0.7044739723205566, 0,
+        0.7006790041923523, 0.7006790041923523, 0, 0.6999930143356323, 0.6999930143356323, 0,
+        0.6847820281982422, 0.7192310094833374, -0.03167999908328056, 0.9239469766616821, 0.38228899240493774, 0.004430000204592943,
+        0.9204739928245544, 0.38101500272750854, 0.00003899999865097925, 0.9154880046844482, 0.37877199053764343, -0.00008399999933317304,
+        0.9145749807357788, 0.378387987613678, -0.00009999999747378752, 0.9078760147094727, 0.40216198563575745, -0.03206299990415573,
+        0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9963229894638062, 0.03731299936771393, -0.07712399959564209,
+        0.9910060167312622, 0.09151100367307663, -0.097632996737957, 0.9900450110435486, 0.10134600102901459, -0.09767600148916245,
+        0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146,
+        0.9237229824066162, -0.38283199071884155, 0.004399999976158142, 0.9204739928245544, -0.38101500272750854, -0.00003899999865097925,
+        0.9963229894638062, -0.03731299936771393, 0.07712399959564209, 0.9154880046844482, -0.37877199053764343, 0.00008399999933317304,
+        0.9910060167312622, -0.09151100367307663, 0.097632996737957, 0.9145749807357788, -0.378387987613678, 0.00009999999747378752,
+        0.9900450110435486, -0.10134600102901459, 0.09767600148916245, 0.9266510009765625, -0.356795996427536, -0.03188199922442436,
+        0.9928709864616394, -0.07246600091457367, 0.09463199973106384, 0.7068390250205994, -0.707252025604248, 0.004379999823868275,
+        0.7044739723205566, -0.7044739723205566, 0, 0.7006790041923523, -0.7006790041923523, 0,
+        0.6999930143356323, -0.6999930143356323, 0, 0.7192310094833374, -0.6847820281982422, -0.03167999908328056,
+        0.38228899240493774, -0.9239469766616821, 0.004430000204592943, 0.38101500272750854, -0.9204739928245544, 0.00003899999865097925,
+        0.37877199053764343, -0.9154880046844482, -0.00008399999933317304, 0.378387987613678, -0.9145749807357788, -0.00009999999747378752,
+        0.40216198563575745, -0.9078760147094727, -0.03206299990415573, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+        0.03731299936771393, -0.9963229894638062, -0.07712399959564209, 0.09151100367307663, -0.9910060167312622, -0.097632996737957,
+        0.10134600102901459, -0.9900450110435486, -0.09767600148916245, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+        -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146, -0.38283199071884155, -0.9237229824066162, 0.004399999976158142,
+        -0.38101500272750854, -0.9204739928245544, -0.00003899999865097925, -0.03731299936771393, -0.9963229894638062, 0.07712399959564209,
+        -0.37877199053764343, -0.9154880046844482, 0.00008399999933317304, -0.09151100367307663, -0.9910060167312622, 0.097632996737957,
+        -0.378387987613678, -0.9145749807357788, 0.00009999999747378752, -0.10134600102901459, -0.9900450110435486, 0.09767600148916245,
+        -0.356795996427536, -0.9266510009765625, -0.03188199922442436, -0.07246600091457367, -0.9928709864616394, 0.09463199973106384,
+        -0.707252025604248, -0.7068390250205994, 0.004379999823868275, -0.7044739723205566, -0.7044739723205566, 0,
+        -0.7006790041923523, -0.7006790041923523, 0, -0.6999930143356323, -0.6999930143356323, 0,
+        -0.6847820281982422, -0.7192310094833374, -0.03167999908328056, -0.9239469766616821, -0.38228899240493774, 0.004430000204592943,
+        -0.9204739928245544, -0.38101500272750854, 0.00003899999865097925, -0.9154880046844482, -0.37877199053764343, -0.00008399999933317304,
+        -0.9145749807357788, -0.378387987613678, -0.00009999999747378752, -0.9078760147094727, -0.40216198563575745, -0.03206299990415573,
+        -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9963229894638062, -0.03731299936771393, -0.07712399959564209,
+        -0.9910060167312622, -0.09151100367307663, -0.097632996737957, -0.9900450110435486, -0.10134600102901459, -0.09767600148916245,
+        -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146,
+        -0.9237229824066162, 0.38283199071884155, 0.004399999976158142, -0.9204739928245544, 0.38101500272750854, -0.00003899999865097925,
+        -0.9963229894638062, 0.03731299936771393, 0.07712399959564209, -0.9154880046844482, 0.37877199053764343, 0.00008399999933317304,
+        -0.9910060167312622, 0.09151100367307663, 0.097632996737957, -0.9145749807357788, 0.378387987613678, 0.00009999999747378752,
+        -0.9900450110435486, 0.10134600102901459, 0.09767600148916245, -0.9266510009765625, 0.356795996427536, -0.03188199922442436,
+        -0.9928709864616394, 0.07246600091457367, 0.09463199973106384, -0.7068390250205994, 0.707252025604248, 0.004379999823868275,
+        -0.7044739723205566, 0.7044739723205566, 0, -0.7006790041923523, 0.7006790041923523, 0,
+        -0.6999930143356323, 0.6999930143356323, 0, -0.7192310094833374, 0.6847820281982422, -0.03167999908328056,
+        -0.38228899240493774, 0.9239469766616821, 0.004430000204592943, -0.38101500272750854, 0.9204739928245544, 0.00003899999865097925,
+        -0.37877199053764343, 0.9154880046844482, -0.00008399999933317304, -0.378387987613678, 0.9145749807357788, -0.00009999999747378752,
+        -0.40216198563575745, 0.9078760147094727, -0.03206299990415573, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+        -0.03731299936771393, 0.9963229894638062, -0.07712399959564209, -0.09151100367307663, 0.9910060167312622, -0.097632996737957,
+        -0.10134600102901459, 0.9900450110435486, -0.09767600148916245, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+        0.07246600091457367, 0.9928709864616394, 0.09463199973106384, 0.40216198563575745, 0.9078760147094727, 0.03206299990415573,
+        0.37766799330711365, 0.912958025932312, 0.00018099999579135329, 0.11919300258159637, 0.9883019924163818, 0.09514500200748444,
+        0.37516000866889954, 0.906607985496521, 0.00016799999866634607, 0.187733992934227, 0.9816380143165588, 0.03381900116801262,
+        0.2823430001735687, 0.767549991607666, -0.1682250052690506, 0.12883399426937103, 0.6540690064430237, -0.32698601484298706,
+        0.06457000225782394, 0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+        0.7192320227622986, 0.6847820281982422, 0.03167999908328056, 0.6987630128860474, 0.6987630128860474, 0,
+        0.694034993648529, 0.694034993648529, 0, 0.5551990270614624, 0.6008960008621216, -0.16825300455093384,
+        0.1854030042886734, 0.27701398730278015, -0.6666669845581055, 0.9266499876976013, 0.3567950129508972, 0.03188199922442436,
+        0.912958025932312, 0.37766799330711365, -0.00018099999579135329, 0.906607985496521, 0.37516000866889954, -0.00016799999866634607,
+        0.742605984210968, 0.3426159918308258, -0.1683180034160614, 0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+        0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9883019924163818, 0.11919300258159637, -0.09514500200748444,
+        0.9816370010375977, 0.187733992934227, -0.03381900116801262, 0.9811030030250549, 0.19325199723243713, -0.009519999846816063,
+        0.49052900075912476, 0.0968559980392456, -0.5, 0.9928709864616394, -0.07246600091457367, 0.09463199973106384,
+        0.9078760147094727, -0.40216198563575745, 0.03206299990415573, 0.912958025932312, -0.37766799330711365, 0.00018099999579135329,
+        0.9883019924163818, -0.11919300258159637, 0.09514500200748444, 0.906607985496521, -0.37516000866889954, 0.00016799999866634607,
+        0.9816380143165588, -0.187733992934227, 0.03381900116801262, 0.767549991607666, -0.2823430001735687, -0.1682250052690506,
+        0.6540690064430237, -0.12883399426937103, -0.32698601484298706, 0.32701900601387024, -0.06457000225782394, -0.6666669845581055,
+        0, 0, -1, 0.6847820281982422, -0.7192320227622986, 0.03167999908328056,
+        0.6987630128860474, -0.6987630128860474, 0, 0.694034993648529, -0.694034993648529, 0,
+        0.6008960008621216, -0.5551990270614624, -0.16825300455093384, 0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+        0.3567950129508972, -0.9266499876976013, 0.03188199922442436, 0.37766799330711365, -0.912958025932312, -0.00018099999579135329,
+        0.37516000866889954, -0.906607985496521, -0.00016799999866634607, 0.3426159918308258, -0.742605984210968, -0.1683180034160614,
+        0.1854030042886734, -0.27701398730278015, -0.6666669845581055, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+        0.11919300258159637, -0.9883019924163818, -0.09514500200748444, 0.187733992934227, -0.9816370010375977, -0.03381900116801262,
+        0.19325199723243713, -0.9811030030250549, -0.009519999846816063, 0.0968559980392456, -0.49052900075912476, -0.5,
+        -0.07246600091457367, -0.9928709864616394, 0.09463199973106384, -0.40216198563575745, -0.9078760147094727, 0.03206299990415573,
+        -0.37766799330711365, -0.912958025932312, 0.00018099999579135329, -0.11919300258159637, -0.9883019924163818, 0.09514500200748444,
+        -0.37516000866889954, -0.906607985496521, 0.00016799999866634607, -0.187733992934227, -0.9816380143165588, 0.03381900116801262,
+        -0.2823430001735687, -0.767549991607666, -0.1682250052690506, -0.12883399426937103, -0.6540690064430237, -0.32698601484298706,
+        -0.06457000225782394, -0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+        -0.7192320227622986, -0.6847820281982422, 0.03167999908328056, -0.6987630128860474, -0.6987630128860474, 0,
+        -0.694034993648529, -0.694034993648529, 0, -0.5551990270614624, -0.6008960008621216, -0.16825300455093384,
+        -0.1854030042886734, -0.27701398730278015, -0.6666669845581055, -0.9266499876976013, -0.3567950129508972, 0.03188199922442436,
+        -0.912958025932312, -0.37766799330711365, -0.00018099999579135329, -0.906607985496521, -0.37516000866889954, -0.00016799999866634607,
+        -0.742605984210968, -0.3426159918308258, -0.1683180034160614, -0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+        -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9883019924163818, -0.11919300258159637, -0.09514500200748444,
+        -0.9816370010375977, -0.187733992934227, -0.03381900116801262, -0.9811030030250549, -0.19325199723243713, -0.009519999846816063,
+        -0.49052900075912476, -0.0968559980392456, -0.5, -0.9928709864616394, 0.07246600091457367, 0.09463199973106384,
+        -0.9078760147094727, 0.40216198563575745, 0.03206299990415573, -0.912958025932312, 0.37766799330711365, 0.00018099999579135329,
+        -0.9883019924163818, 0.11919300258159637, 0.09514500200748444, -0.906607985496521, 0.37516000866889954, 0.00016799999866634607,
+        -0.9816380143165588, 0.187733992934227, 0.03381900116801262, -0.767549991607666, 0.2823430001735687, -0.1682250052690506,
+        -0.6540690064430237, 0.12883399426937103, -0.32698601484298706, -0.32701900601387024, 0.06457000225782394, -0.6666669845581055,
+        0, 0, -1, -0.6847820281982422, 0.7192320227622986, 0.03167999908328056,
+        -0.6987630128860474, 0.6987630128860474, 0, -0.694034993648529, 0.694034993648529, 0,
+        -0.6008960008621216, 0.5551990270614624, -0.16825300455093384, -0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+        -0.3567950129508972, 0.9266499876976013, 0.03188199922442436, -0.37766799330711365, 0.912958025932312, -0.00018099999579135329,
+        -0.37516000866889954, 0.906607985496521, -0.00016799999866634607, -0.3426159918308258, 0.742605984210968, -0.1683180034160614,
+        -0.1854030042886734, 0.27701398730278015, -0.6666669845581055, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+        -0.11919300258159637, 0.9883019924163818, -0.09514500200748444, -0.187733992934227, 0.9816370010375977, -0.03381900116801262,
+        -0.19325199723243713, 0.9811030030250549, -0.009519999846816063, -0.0968559980392456, 0.49052900075912476, -0.5,
+        -0.006597999949008226, 0.9961680173873901, 0.0001630000042496249, -0.043907999992370605, 0.779125988483429, -0.55936598777771,
+        0.23287899792194366, 0.79271000623703, -0.506534993648529, 0.11139900237321854, 0.9923329949378967, 0.0053449999541044235,
+        0.4521920084953308, 0.7370989918708801, -0.42180201411247253, 0.17797799408435822, 0.9827970266342163, 0.036841001361608505,
+        0.6075379848480225, 0.7066869735717773, -0.270797997713089, 0.11894699931144714, 0.9864829778671265, 0.10517799854278564,
+        0.6583719849586487, 0.7438470125198364, -0.06727500259876251, 0.0010629999451339245, 0.99891597032547, 0.04653400182723999,
+        -0.1622990071773529, -0.14869500696659088, -0.9069569706916809, 0.3020159900188446, -0.014301000162959099, -0.8847119808197021,
+        0.7048640251159668, -0.042514998465776443, -0.6788020133972168, 0.8948519825935364, -0.11078000068664551, -0.38824599981307983,
+        0.9622920155525208, -0.09367900341749191, -0.14349600672721863, -0.12511900067329407, -0.8479049801826477, -0.4783349931240082,
+        0.11315400153398514, -0.8153669834136963, -0.5167160034179688, 0.3956319987773895, -0.7910019755363464, -0.4345270097255707,
+        0.5244609713554382, -0.8012329936027527, -0.2643829882144928, 0.571465015411377, -0.7902160286903381, -0.12332800030708313,
+        -0.0943560004234314, -0.9955379962921143, -0.0010989999864250422, 0.012040999718010426, -0.9965500235557556, 0,
+        0.09501499682664871, -0.9936969876289368, 0.02440500073134899, 0.03737499937415123, -0.9978089928627014, 0.035909999161958694,
+        -0.0008800000068731606, -0.9973530173301697, -0.04031199961900711, 0.007164000067859888, -0.9961649775505066, -0.00002700000004551839,
+        0.043988000601530075, -0.8330309987068176, 0.4691329896450043, -0.2334270030260086, -0.7983189821243286, 0.49840399622917175,
+        -0.10737399756908417, -0.9927549958229065, -0.007029999978840351, -0.45147499442100525, -0.7576299905776978, 0.39375001192092896,
+        -0.15364399552345276, -0.9863160252571106, -0.048294998705387115, -0.5575600266456604, -0.7753210067749023, 0.2001740038394928,
+        -0.07242999970912933, -0.9923030138015747, -0.08845999836921692, -0.5877019762992859, -0.8041930198669434, 0.04768599942326546,
+        0.0005830000154674053, -0.9997940063476562, -0.020301999524235725, 0.13663700222969055, -0.14665700495243073, 0.8966140151023865,
+        -0.3045389950275421, -0.012237999588251114, 0.8833180069923401, -0.7020289897918701, -0.033987998962402344, 0.6724730134010315,
+        -0.8890330195426941, -0.09636799991130829, 0.37605398893356323, -0.9668099880218506, -0.08601800352334976, 0.1358419954776764,
+        0.12022499740123749, 0.7918559908866882, 0.5693140029907227, -0.11313500255346298, 0.8111780285835266, 0.5236610174179077,
+        -0.39790698885917664, 0.7734419703483582, 0.45853298902511597, -0.5793390274047852, 0.7346490025520325, 0.32973799109458923,
+        -0.6447499990463257, 0.7340419888496399, 0.12459299713373184, 0.09378799796104431, 0.9955919981002808, 0.000944000028539449,
+        -0.01607999950647354, 0.9964879751205444, 0.00035600000410340726, -0.11933200061321259, 0.9912199974060059, -0.01737299934029579,
+        -0.08618299663066864, 0.9940080046653748, -0.053598999977111816, -0.004110999871045351, 0.9980229735374451, 0.015703000128269196,
+        0.010142000392079353, 0.9933879971504211, 0.10034400224685669, 0.6597890257835388, 0.7114480137825012, 0.12964099645614624,
+        0.5634239912033081, 0.7594000101089478, 0.289902001619339, -0.021227000281214714, 0.9976930022239685, 0.05189099907875061,
+        0.3972559869289398, 0.7709670066833496, 0.45872700214385986, -0.05054600164294243, 0.9957669973373413, 0.060869000852108,
+        0.11805199831724167, 0.7611619830131531, 0.5692800283432007, -0.11414600163698196, 0.9869359731674194, 0.08862999826669693,
+        -0.0012870000209659338, 0.7195389866828918, 0.6293820142745972, -0.18971200287342072, 0.9752820134162903, 0.11328700184822083,
+        0.9685969948768616, -0.08966200053691864, 0.13331100344657898, 0.8902140259742737, -0.051961999386548996, 0.39323100447654724,
+        0.6728280186653137, -0.050324998795986176, 0.6965069770812988, 0.25133201479911804, -0.04306900128722191, 0.9169719815254211,
+        -0.19813700020313263, -0.2512879967689514, 0.9046909809112549, 0.5937719941139221, -0.8024669885635376, 0.03307799994945526,
+        0.5571249723434448, -0.7907459735870361, 0.2022089958190918, 0.4313510060310364, -0.8083119988441467, 0.37996000051498413,
+        0.19395600259304047, -0.8197799921035767, 0.5133119821548462, -0.1517219990491867, -0.8084930181503296, 0.5055829882621765,
+        0.0035200000274926424, -0.9997940063476562, 0.019979000091552734, 0.01159599982202053, -0.9981369972229004, -0.02326199971139431,
+        0.01310999970883131, -0.9988970160484314, -0.008480999618768692, -0.02485400065779686, -0.9978809952735901, 0.021263999864459038,
+        -0.11335399746894836, -0.9881970286369324, 0.06441199779510498, -0.0035459999926388264, -0.9954169988632202, -0.07682599872350693,
+        -0.5816869735717773, -0.7760900259017944, -0.13957500457763672, -0.5260769724845886, -0.790789008140564, -0.2781960070133209,
+        0.017288999632000923, -0.9983699917793274, -0.03728000074625015, -0.36800798773765564, -0.7982890009880066, -0.4405499994754791,
+        0.03743100166320801, -0.9973520040512085, -0.03640099987387657, -0.09636899828910828, -0.7829139828681946, -0.5500450134277344,
+        0.10426300019025803, -0.9894949793815613, -0.06746900081634521, 0.10083399713039398, -0.8161320090293884, -0.48112401366233826,
+        0.18510299921035767, -0.9776470065116882, -0.09971100091934204, -0.9615049958229065, -0.08203399926424026, -0.14958199858665466,
+        -0.8876789808273315, -0.04622500017285347, -0.39955899119377136, -0.6675580143928528, -0.03723999857902527, -0.7007560133934021,
+        -0.245511993765831, -0.03216199949383736, -0.9151920080184937, 0.15477199852466583, -0.24929499626159668, -0.8975690007209778,
+        -0.6700729727745056, 0.7402250170707703, -0.01942499913275242, -0.5923460125923157, 0.7624830007553101, -0.21566900610923767,
+        -0.45611900091171265, 0.7868310213088989, -0.39906400442123413, -0.21001900732517242, 0.8031420111656189, -0.5333020091056824,
+        0.05119999870657921, 0.7096909880638123, -0.6591699719429016, -0.014175999909639359, 0.9989240169525146, -0.04416000097990036,
+        -0.0065449997782707214, 0.9983869791030884, 0.008813999593257904, 0.0023960000835359097, 0.9989259839057922, -0.016711000353097916,
+        0.03813000023365021, 0.9969249963760376, -0.04171599820256233, 0.11744900047779083, 0.986670970916748, -0.0799890011548996,
+        -0.02072799950838089, -0.997963011264801, 0.0017740000039339066, 0.10236400365829468, -0.695684015750885, -0.6961740255355835,
+        0.28174999356269836, -0.7065439820289612, -0.6379269957542419, -0.027713999152183533, -0.9983959794044495, -0.016395000740885735,
+        0.4621469974517822, -0.7501789927482605, -0.43765199184417725, -0.014942999929189682, -0.9960020184516907, -0.04751100018620491,
+        0.6121799945831299, -0.7355859875679016, -0.1658719927072525, 0.08200599998235703, -0.9833409786224365, 0.11102399975061417,
+        0.7232419848442078, -0.6012910008430481, -0.14595800638198853, 0.32238098978996277, -0.9036369919776917, 0.28197699785232544,
+        0.1188960000872612, 0.09661199897527695, -0.9692260026931763, 0.3230240046977997, 0.06791900098323822, -0.9069269895553589,
+        0.6287810206413269, 0.00962899997830391, -0.711097002029419, 0.8952469825744629, -0.060169998556375504, -0.3366979956626892,
+        0.9689210057258606, -0.04508800059556961, -0.13095800578594208, 0.06500200182199478, 0.7708680033683777, -0.6083509922027588,
+        0.1816529929637909, 0.7457069754600525, -0.593995988368988, 0.37600401043891907, 0.7467949986457825, -0.4776870012283325,
+        0.6288849711418152, 0.7020969986915588, -0.27160701155662537, 0.8230010271072388, 0.5295370221138, -0.09450399875640869,
+        -0.12820099294185638, 0.9899809956550598, -0.05917999893426895, -0.11097600311040878, 0.9872509837150574, -0.09937400370836258,
+        -0.06767299771308899, 0.9865689873695374, -0.1427209973335266, -0.0003349999897181988, 0.9967420101165771, 0.025443999096751213,
+        0.29019099473953247, 0.9243509769439697, 0.1957239955663681, 0.07294999808073044, 0.9949049949645996, 0.03147900104522705,
+        -0.04948300123214722, 0.7695090174674988, 0.6163870096206665, -0.24193400144577026, 0.7750219702720642, 0.5679330229759216,
+        0.05620399862527847, 0.9959489703178406, 0.052143000066280365, -0.4294399917125702, 0.779321014881134, 0.41615501046180725,
+        0.023887999355793, 0.9943940043449402, 0.07553800195455551, -0.6655910015106201, 0.6939520239830017, 0.20106400549411774,
+        -0.09678799659013748, 0.9791589975357056, -0.12869000434875488, -0.7716730237007141, 0.5443729758262634, 0.1793539971113205,
+        -0.417836993932724, 0.8721759915351868, -0.2544029951095581, -0.09499499946832657, 0.08934500068426132, 0.9787889719009399,
+        -0.3299880027770996, 0.06701900064945221, 0.9273520112037659, -0.6511250138282776, 0.023523999378085136, 0.7280719876289368,
+        -0.9116759896278381, -0.033263999968767166, 0.34162598848342896, -0.9896330237388611, -0.013496000319719315, 0.07834099978208542,
+        -0.07044100016355515, -0.6954740285873413, 0.7080140113830566, -0.21969600021839142, -0.6959800124168396, 0.6642320156097412,
+        -0.4075010120868683, -0.7370589971542358, 0.5047789812088013, -0.5866039991378784, -0.7473030090332031, 0.24636299908161163,
+        -0.799036979675293, -0.5617390275001526, 0.05794600024819374, 0.07605399936437607, -0.9967970252037048, 0.02472200058400631,
+        0.08756300061941147, -0.9926980137825012, 0.05929899960756302, 0.07250799983739853, -0.9901790022850037, 0.11122000217437744,
+        0.015556000173091888, -0.9970260262489319, -0.011235999874770641, -0.194814994931221, -0.9439409971237183, -0.22127500176429749,
+        0.3417310118675232, -0.8896859884262085, 0.3012309968471527, 0.8375009894371033, -0.4931910037994385, 0.05739299952983856,
+        0.8273029923439026, -0.4684619903564453, -0.05539099872112274, 0.5311300158500671, -0.8121910095214844, 0.24026300013065338,
+        0.8069959878921509, -0.47689300775527954, 0.002638000063598156, 0.644743025302887, -0.7642210125923157, -0.015455000102519989,
+        0.8856800198554993, -0.4464530050754547, 0.047488000243902206, -0.011536000296473503, -0.999845027923584, -0.0008730000117793679,
+        0.7597830295562744, -0.6229599714279175, 0.026636000722646713, 0.321245014667511, -0.8855000138282776, 0.3356960117816925,
+        0.998091995716095, -0.005673000123351812, 0.025262000039219856, 0.9941530227661133, 0.046904999762773514, -0.00951599981635809,
+        0.9838590025901794, -0.00041700000292621553, 0.010572000406682491, 0.990556001663208, 0.01886500045657158, 0.04422200098633766,
+        0.9921990036964417, -0.12290599942207336, 0.011202000081539154, 0.828000009059906, 0.5258169770240784, -0.0846100002527237,
+        0.8704839944839478, 0.4878079891204834, 0.00635599996894598, 0.7773939967155457, 0.5659670233726501, -0.09634699672460556,
+        0.8190580010414124, 0.4740380048751831, 0.01190400030463934, 0.9017590284347534, 0.3486430048942566, -0.05601400136947632,
+        0.41038599610328674, 0.870602011680603, 0.27135801315307617, 0.3019320070743561, 0.8897680044174194, 0.34101900458335876,
+        0.13912299275398254, 0.9423390030860901, -0.3042120039463043, 0.6167309880256653, 0.7692840099334717, 0.1667650043964386,
+        0.5558350086212158, 0.8010749816894531, 0.21867799758911133, -0.4410029947757721, 0.8555399775505066, -0.2693159878253937,
+        -0.8639690279960632, 0.464356005191803, -0.019222000613808632, -0.8705710172653198, 0.4855479896068573, -0.005623999983072281,
+        -0.33969300985336304, 0.8762779831886292, -0.34097298979759216, -0.7608209848403931, 0.5840269923210144, 0.11236599832773209,
+        -0.16763299703598022, 0.9419429898262024, 0.29091599583625793, -0.8260639905929565, 0.47304999828338623, -0.0134699996560812,
+        -0.6006280183792114, 0.7822970151901245, -0.1611420065164566, -0.8495870232582092, 0.4440779983997345, 0.17417700588703156,
+        -0.5251449942588806, 0.8236340284347534, -0.21412399411201477, -0.9991480112075806, 0.0017519999528303742, 0.007890000008046627,
+        -0.9946579933166504, 0.06129400059580803, 0.007796999998390675, -0.9840919971466064, 0.008732999674975872, -0.0001289999927394092,
+        -0.9916059970855713, 0.015207000076770782, -0.04798699915409088, -0.9899899959564209, -0.13816699385643005, -0.019433999434113503,
+        -0.7927820086479187, -0.5669599771499634, 0.06795799732208252, -0.8363490104675293, -0.4685719907283783, 0.048955000936985016,
+        -0.8138830065727234, -0.4743089973926544, 0.0008379999781027436, -0.8869869709014893, -0.4417180120944977, -0.05625399947166443,
+        -0.7898640036582947, -0.5522750020027161, -0.15016800165176392, -0.297340989112854, -0.8998129963874817, -0.3192580044269562,
+        -0.49759799242019653, -0.8317790031433105, -0.24411599338054657, -0.6295620203018188, -0.7765420079231262, 0.01261799968779087,
+        -0.011338000185787678, -0.9998990297317505, -0.008561000227928162, -0.3547320067882538, -0.8679590225219727, -0.3453510105609894,
+        0.09618999809026718, 0.49066001176834106, -0.5, 0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+        0.32566601037979126, 0.76139897108078, -0.18199099600315094, 0.062401000410318375, 0.9939020276069641, -0.09090700000524521,
+        0.3803209960460663, 0.9214360117912292, -0.00007100000220816582, 0.030918000265955925, 0.9969729781150818, 0.07133600115776062,
+        0.3804109990596771, 0.9220889806747437, 0.0001630000042496249, 0.02471200004220009, 0.9975799918174744, 0.06498300284147263,
+        0.35510900616645813, 0.926891028881073, 0.03216100111603737, 0.07657899707555771, 0.9924740195274353, -0.09555599838495255,
+        0.27721700072288513, 0.1851000040769577, -0.6666669845581055, 0.5929989814758301, 0.5781109929084778, -0.18205299973487854,
+        0.7048519849777222, 0.7048519849777222, 0, 0.7052720189094543, 0.7054179906845093, -0.00002499999936844688,
+        0.6835219860076904, 0.7199410200119019, 0.03204600140452385, 0.3271070122718811, 0.06412599980831146, -0.6666669845581055,
+        0.7694699764251709, 0.3061000108718872, -0.18225300312042236, 0.9214379787445068, 0.38033199310302734, 0.0000670000008540228,
+        0.9220880270004272, 0.3804430067539215, -0.00016799999866634607, 0.9071130156517029, 0.403003990650177, 0.032437000423669815,
+        0, 0, -1, 0.6626030206680298, 0.04157499969005585, -0.272724986076355,
+        0.9969789981842041, 0.03082600049674511, -0.07129299640655518, 0.9975910186767578, 0.024447999894618988, -0.06492199748754501,
+        0.9925040006637573, 0.07630900293588638, 0.09545700252056122, 0.49066001176834106, -0.09618999809026718, -0.5,
+        0.27721700072288513, -0.1851000040769577, -0.6666669845581055, 0.76139897108078, -0.32566601037979126, -0.18199099600315094,
+        0.9939020276069641, -0.062401000410318375, -0.09090700000524521, 0.9214360117912292, -0.3803209960460663, -0.00007100000220816582,
+        0.9969729781150818, -0.030918000265955925, 0.07133600115776062, 0.9220889806747437, -0.3804109990596771, 0.0001630000042496249,
+        0.9975799918174744, -0.02471200004220009, 0.06498300284147263, 0.926891028881073, -0.35510900616645813, 0.03216100111603737,
+        0.9924740195274353, -0.07657899707555771, -0.09555599838495255, 0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+        0.5781109929084778, -0.5929989814758301, -0.18205299973487854, 0.7048519849777222, -0.7048519849777222, 0,
+        0.7054179906845093, -0.7052720189094543, -0.00002499999936844688, 0.7199410200119019, -0.6835219860076904, 0.03204600140452385,
+        0.06412599980831146, -0.3271070122718811, -0.6666669845581055, 0.3061000108718872, -0.7694699764251709, -0.18225300312042236,
+        0.38033199310302734, -0.9214379787445068, 0.0000670000008540228, 0.3804430067539215, -0.9220880270004272, -0.00016799999866634607,
+        0.403003990650177, -0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+        0.04157499969005585, -0.6626030206680298, -0.272724986076355, 0.03082600049674511, -0.9969789981842041, -0.07129299640655518,
+        0.024447999894618988, -0.9975910186767578, -0.06492199748754501, 0.07630900293588638, -0.9925040006637573, 0.09545700252056122,
+        -0.09618999809026718, -0.49066001176834106, -0.5, -0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+        -0.32566601037979126, -0.76139897108078, -0.18199099600315094, -0.062401000410318375, -0.9939020276069641, -0.09090700000524521,
+        -0.3803209960460663, -0.9214360117912292, -0.00007100000220816582, -0.030918000265955925, -0.9969729781150818, 0.07133600115776062,
+        -0.3804109990596771, -0.9220889806747437, 0.0001630000042496249, -0.02471200004220009, -0.9975799918174744, 0.06498300284147263,
+        -0.35510900616645813, -0.926891028881073, 0.03216100111603737, -0.07657899707555771, -0.9924740195274353, -0.09555599838495255,
+        -0.27721700072288513, -0.1851000040769577, -0.6666669845581055, -0.5929989814758301, -0.5781109929084778, -0.18205299973487854,
+        -0.7048519849777222, -0.7048519849777222, 0, -0.7052720189094543, -0.7054179906845093, -0.00002499999936844688,
+        -0.6835219860076904, -0.7199410200119019, 0.03204600140452385, -0.3271070122718811, -0.06412599980831146, -0.6666669845581055,
+        -0.7694699764251709, -0.3061000108718872, -0.18225300312042236, -0.9214379787445068, -0.38033199310302734, 0.0000670000008540228,
+        -0.9220880270004272, -0.3804430067539215, -0.00016799999866634607, -0.9071130156517029, -0.403003990650177, 0.032437000423669815,
+        0, 0, -1, -0.6626030206680298, -0.04157499969005585, -0.272724986076355,
+        -0.9969789981842041, -0.03082600049674511, -0.07129299640655518, -0.9975910186767578, -0.024447999894618988, -0.06492199748754501,
+        -0.9925040006637573, -0.07630900293588638, 0.09545700252056122, -0.49066001176834106, 0.09618999809026718, -0.5,
+        -0.27721700072288513, 0.1851000040769577, -0.6666669845581055, -0.76139897108078, 0.32566601037979126, -0.18199099600315094,
+        -0.9939020276069641, 0.062401000410318375, -0.09090700000524521, -0.9214360117912292, 0.3803209960460663, -0.00007100000220816582,
+        -0.9969729781150818, 0.030918000265955925, 0.07133600115776062, -0.9220889806747437, 0.3804109990596771, 0.0001630000042496249,
+        -0.9975799918174744, 0.02471200004220009, 0.06498300284147263, -0.926891028881073, 0.35510900616645813, 0.03216100111603737,
+        -0.9924740195274353, 0.07657899707555771, -0.09555599838495255, -0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+        -0.5781109929084778, 0.5929989814758301, -0.18205299973487854, -0.7048519849777222, 0.7048519849777222, 0,
+        -0.7054179906845093, 0.7052720189094543, -0.00002499999936844688, -0.7199410200119019, 0.6835219860076904, 0.03204600140452385,
+        -0.06412599980831146, 0.3271070122718811, -0.6666669845581055, -0.3061000108718872, 0.7694699764251709, -0.18225300312042236,
+        -0.38033199310302734, 0.9214379787445068, 0.0000670000008540228, -0.3804430067539215, 0.9220880270004272, -0.00016799999866634607,
+        -0.403003990650177, 0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+        -0.04157499969005585, 0.6626030206680298, -0.272724986076355, -0.03082600049674511, 0.9969789981842041, -0.07129299640655518,
+        -0.024447999894618988, 0.9975910186767578, -0.06492199748754501, -0.07630900293588638, 0.9925040006637573, 0.09545700252056122,
+        0.07657899707555771, 0.9924740195274353, -0.09555599838495255, 0.40307098627090454, 0.9070649743080139, -0.03255299851298332,
+        0.3753640055656433, 0.9070209860801697, 0.000007000000096013537, 0.18306200206279755, 0.9820899963378906, -0.04457399994134903,
+        0.3751649856567383, 0.9065750241279602, -0.00007400000322377309, 0.18801499903202057, 0.9816100001335144, -0.03304100036621094,
+        0.3759070038795471, 0.908607006072998, -0.00026199998683296144, 0.16623400151729584, 0.983722984790802, -0.06822899729013443,
+        0.33324098587036133, 0.9290030002593994, 0.029803000390529633, 0.14071400463581085, 0.9862040281295776, -0.08718100190162659,
+        0.7198299765586853, 0.6836559772491455, -0.032017000019550323, 0.6943539977073669, 0.6943539977073669, 0,
+        0.694034993648529, 0.694034993648529, 0, 0.6955100297927856, 0.6955100297927856, 0,
+        0.6639170050621033, 0.7306150197982788, 0.029100999236106873, 0.9268649816513062, 0.35523301362991333, -0.03203999996185303,
+        0.9070209860801697, 0.3753649890422821, -0.000007000000096013537, 0.9065750241279602, 0.3751649856567383, 0.00007300000288523734,
+        0.908607006072998, 0.3759070038795471, 0.00026199998683296144, 0.8926259875297546, 0.4211460053920746, 0.028991999104619026,
+        0.9924740195274353, 0.07646500319242477, 0.09565100073814392, 0.9820899963378906, 0.18306200206279755, 0.04457399994134903,
+        0.9816100001335144, 0.18801499903202057, 0.03304100036621094, 0.983722984790802, 0.16623400151729584, 0.06822899729013443,
+        0.9862040281295776, 0.14071400463581085, 0.08718100190162659, 0.9924740195274353, -0.07657899707555771, -0.09555599838495255,
+        0.9070649743080139, -0.40307098627090454, -0.03255299851298332, 0.9070209860801697, -0.3753640055656433, 0.000007000000096013537,
+        0.9820899963378906, -0.18306200206279755, -0.04457399994134903, 0.9065750241279602, -0.3751649856567383, -0.00007400000322377309,
+        0.9816100001335144, -0.18801499903202057, -0.03304100036621094, 0.908607006072998, -0.3759070038795471, -0.00026199998683296144,
+        0.983722984790802, -0.16623400151729584, -0.06822899729013443, 0.9290030002593994, -0.33324098587036133, 0.029803000390529633,
+        0.9862040281295776, -0.14071400463581085, -0.08718100190162659, 0.6836559772491455, -0.7198299765586853, -0.032017000019550323,
+        0.6943539977073669, -0.6943539977073669, 0, 0.694034993648529, -0.694034993648529, 0,
+        0.6955100297927856, -0.6955100297927856, 0, 0.7306150197982788, -0.6639170050621033, 0.029100999236106873,
+        0.35523301362991333, -0.9268649816513062, -0.03203999996185303, 0.3753649890422821, -0.9070209860801697, -0.000007000000096013537,
+        0.3751649856567383, -0.9065750241279602, 0.00007300000288523734, 0.3759070038795471, -0.908607006072998, 0.00026199998683296144,
+        0.4211460053920746, -0.8926259875297546, 0.028991999104619026, 0.07646500319242477, -0.9924740195274353, 0.09565100073814392,
+        0.18306200206279755, -0.9820899963378906, 0.04457399994134903, 0.18801499903202057, -0.9816100001335144, 0.03304100036621094,
+        0.16623400151729584, -0.983722984790802, 0.06822899729013443, 0.14071400463581085, -0.9862040281295776, 0.08718100190162659,
+        -0.07657899707555771, -0.9924740195274353, -0.09555599838495255, -0.40307098627090454, -0.9070649743080139, -0.03255299851298332,
+        -0.3753640055656433, -0.9070209860801697, 0.000007000000096013537, -0.18306200206279755, -0.9820899963378906, -0.04457399994134903,
+        -0.3751649856567383, -0.9065750241279602, -0.00007400000322377309, -0.18801499903202057, -0.9816100001335144, -0.03304100036621094,
+        -0.3759070038795471, -0.908607006072998, -0.00026199998683296144, -0.16623400151729584, -0.983722984790802, -0.06822899729013443,
+        -0.33324098587036133, -0.9290030002593994, 0.029803000390529633, -0.14071400463581085, -0.9862040281295776, -0.08718100190162659,
+        -0.7198299765586853, -0.6836559772491455, -0.032017000019550323, -0.6943539977073669, -0.6943539977073669, 0,
+        -0.694034993648529, -0.694034993648529, 0, -0.6955100297927856, -0.6955100297927856, 0,
+        -0.6639170050621033, -0.7306150197982788, 0.029100999236106873, -0.9268649816513062, -0.35523301362991333, -0.03203999996185303,
+        -0.9070209860801697, -0.3753649890422821, -0.000007000000096013537, -0.9065750241279602, -0.3751649856567383, 0.00007300000288523734,
+        -0.908607006072998, -0.3759070038795471, 0.00026199998683296144, -0.8926259875297546, -0.4211460053920746, 0.028991999104619026,
+        -0.9924740195274353, -0.07646500319242477, 0.09565100073814392, -0.9820899963378906, -0.18306200206279755, 0.04457399994134903,
+        -0.9816100001335144, -0.18801499903202057, 0.03304100036621094, -0.983722984790802, -0.16623400151729584, 0.06822899729013443,
+        -0.9862040281295776, -0.14071400463581085, 0.08718100190162659, -0.9924740195274353, 0.07657899707555771, -0.09555599838495255,
+        -0.9070649743080139, 0.40307098627090454, -0.03255299851298332, -0.9070209860801697, 0.3753640055656433, 0.000007000000096013537,
+        -0.9820899963378906, 0.18306200206279755, -0.04457399994134903, -0.9065750241279602, 0.3751649856567383, -0.00007400000322377309,
+        -0.9816100001335144, 0.18801499903202057, -0.03304100036621094, -0.908607006072998, 0.3759070038795471, -0.00026199998683296144,
+        -0.983722984790802, 0.16623400151729584, -0.06822899729013443, -0.9290030002593994, 0.33324098587036133, 0.029803000390529633,
+        -0.9862040281295776, 0.14071400463581085, -0.08718100190162659, -0.6836559772491455, 0.7198299765586853, -0.032017000019550323,
+        -0.6943539977073669, 0.6943539977073669, 0, -0.694034993648529, 0.694034993648529, 0,
+        -0.6955100297927856, 0.6955100297927856, 0, -0.7306150197982788, 0.6639170050621033, 0.029100999236106873,
+        -0.35523301362991333, 0.9268649816513062, -0.03203999996185303, -0.3753649890422821, 0.9070209860801697, -0.000007000000096013537,
+        -0.3751649856567383, 0.9065750241279602, 0.00007300000288523734, -0.3759070038795471, 0.908607006072998, 0.00026199998683296144,
+        -0.4211460053920746, 0.8926259875297546, 0.028991999104619026, -0.07646500319242477, 0.9924740195274353, 0.09565100073814392,
+        -0.18306200206279755, 0.9820899963378906, 0.04457399994134903, -0.18801499903202057, 0.9816100001335144, 0.03304100036621094,
+        -0.16623400151729584, 0.983722984790802, 0.06822899729013443, -0.14071400463581085, 0.9862040281295776, 0.08718100190162659 };
+
+
+float  teapotBinormals[] = { 0.2554270029067993, -0.05043400079011917, -0.9655119776725769, 0.2302899956703186, -0.11379700154066086, -0.9664459824562073,
+        -0.23653900623321533, 0.09789499640464783, -0.9666780233383179, -0.2551180124282837, 0.05037299916148186, -0.9655969738960266,
+        -0.9201610088348389, 0.38079801201820374, -0.09108299762010574, -0.9770479798316956, 0.1929199993610382, -0.09032399952411652,
+        -0.6762400269508362, 0.2798590064048767, 0.6814529895782471, -0.723800003528595, 0.1429159939289093, 0.6750479936599731,
+        -0.4681990146636963, 0.1581760048866272, 0.869350016117096, -0.4902079999446869, 0.09679199755191803, 0.8662149906158447,
+        0.16952399909496307, -0.1934960037469864, -0.9663439989089966, -0.18106800317764282, 0.18106800317764282, -0.9666590094566345,
+        -0.7041199803352356, 0.7041199803352356, -0.09181900322437286, -0.5179349780082703, 0.5179349780082703, 0.6807990074157715,
+        -0.37217798829078674, 0.3260670006275177, 0.8690019845962524, 0.08221600204706192, -0.243368998169899, -0.9664430022239685,
+        -0.09789499640464783, 0.23653900623321533, -0.9666780233383179, -0.38079801201820374, 0.9201610088348389, -0.09108199924230576,
+        -0.2798590064048767, 0.6762400269508362, 0.6814540028572083, -0.21894000470638275, 0.44305500388145447, 0.8693490028381348,
+        0.050822000950574875, -0.2573910057544708, -0.9649699926376343, -0.05021600052714348, 0.25432100892066956, -0.965815007686615,
+        -0.19291600584983826, 0.9770249724388123, -0.09059000015258789, -0.14291299879550934, 0.7237870097160339, 0.6750609874725342,
+        -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.048507001250982285, -0.2576940059661865, -0.965008020401001,
+        -0.15833300352096558, -0.3227809965610504, -0.933135986328125, 0.05656199902296066, 0.13793900609016418, -0.9888240098953247,
+        0.049150001257658005, 0.2545199990272522, -0.9658179879188538, 0.378387987613678, 0.9173290133476257, -0.12381099909543991,
+        0.1917950063943863, 0.9772530198097229, -0.09050799906253815, 0.2777239978313446, 0.6716070175170898, 0.6868870258331299,
+        0.14281700551509857, 0.7238019704818726, 0.6750659942626953, 0.15788200497627258, 0.4674209952354431, 0.8698220252990723,
+        0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.3139069974422455, -0.2657270133495331, -0.9115110039710999,
+        0.05247500166296959, 0.05178600177168846, -0.9972789883613586, 0.699787974357605, 0.6969379782676697, -0.15676100552082062,
+        0.511929988861084, 0.5116159915924072, 0.6900550127029419, 0.32515400648117065, 0.37111398577690125, 0.8697980046272278,
+        -0.3181929886341095, -0.09987600147724152, -0.9427499771118164, 0.1552799940109253, 0.06176299974322319, -0.9859380125999451,
+        0.9187250137329102, 0.3751460015773773, -0.1233299970626831, 0.6724870204925537, 0.2775439918041229, 0.6860979795455933,
+        0.4424299895763397, 0.21853800117969513, 0.8697689771652222, -0.255948007106781, -0.04464200139045715, -0.9656590223312378,
+        0.25306200981140137, 0.046362001448869705, -0.9663389921188354, 0.9778940081596375, 0.18800100684165955, -0.09153299778699875,
+        0.7238150238990784, 0.14205799996852875, 0.675212025642395, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+        -0.25491899251937866, 0.05033399909734726, -0.9656509757041931, -0.2302899956703186, 0.11379700154066086, -0.9664459824562073,
+        0.23653900623321533, -0.09789499640464783, -0.9666780233383179, 0.252265989780426, -0.04980999976396561, -0.9663749933242798,
+        0.9201610088348389, -0.38079801201820374, -0.09108299762010574, 0.9769039750099182, -0.19289200007915497, -0.09193000197410583,
+        0.6762400269508362, -0.2798590064048767, 0.6814529895782471, 0.7236610054969788, -0.14288799464702606, 0.6752020120620728,
+        0.4681990146636963, -0.1581760048866272, 0.869350016117096, 0.4901660084724426, -0.09678400307893753, 0.8662390112876892,
+        -0.16952399909496307, 0.1934960037469864, -0.9663439989089966, 0.18106800317764282, -0.18106800317764282, -0.9666590094566345,
+        0.7041199803352356, -0.7041199803352356, -0.09181900322437286, 0.5179349780082703, -0.5179349780082703, 0.6807990074157715,
+        0.37217798829078674, -0.3260670006275177, 0.8690019845962524, -0.08221600204706192, 0.243368998169899, -0.9664430022239685,
+        0.09789499640464783, -0.23653900623321533, -0.9666780233383179, 0.38079801201820374, -0.9201610088348389, -0.09108199924230576,
+        0.2798590064048767, -0.6762400269508362, 0.6814540028572083, 0.21894000470638275, -0.44305500388145447, 0.8693490028381348,
+        -0.05043400079011917, 0.2554270029067993, -0.9655119776725769, 0.05037299916148186, -0.2551180124282837, -0.9655969738960266,
+        0.1929199993610382, -0.9770479798316956, -0.09032399952411652, 0.1429159939289093, -0.723800003528595, 0.6750479936599731,
+        0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.05043400079011917, 0.2554270029067993, -0.9655119776725769,
+        0.11379700154066086, 0.2302899956703186, -0.9664459824562073, -0.09789499640464783, -0.23653900623321533, -0.9666780233383179,
+        -0.05037299916148186, -0.2551180124282837, -0.9655969738960266, -0.38079801201820374, -0.9201610088348389, -0.09108299762010574,
+        -0.1929199993610382, -0.9770479798316956, -0.09032399952411652, -0.2798590064048767, -0.6762400269508362, 0.6814529895782471,
+        -0.1429159939289093, -0.723800003528595, 0.6750479936599731, -0.1581760048866272, -0.4681990146636963, 0.869350016117096,
+        -0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.1934960037469864, 0.16952399909496307, -0.9663439989089966,
+        -0.18106800317764282, -0.18106800317764282, -0.9666590094566345, -0.7041199803352356, -0.7041199803352356, -0.09181900322437286,
+        -0.5179349780082703, -0.5179349780082703, 0.6807990074157715, -0.3260670006275177, -0.37217798829078674, 0.8690019845962524,
+        0.243368998169899, 0.08221600204706192, -0.9664430022239685, -0.23653900623321533, -0.09789499640464783, -0.9666780233383179,
+        -0.9201610088348389, -0.38079801201820374, -0.09108199924230576, -0.6762400269508362, -0.2798590064048767, 0.6814540028572083,
+        -0.44305500388145447, -0.21894000470638275, 0.8693490028381348, 0.2554270029067993, 0.05043400079011917, -0.9655119776725769,
+        -0.2551180124282837, -0.05037299916148186, -0.9655969738960266, -0.9770479798316956, -0.1929199993610382, -0.09032399952411652,
+        -0.723800003528595, -0.1429159939289093, 0.6750479936599731, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+        -0.4902079999446869, 0.09679199755191803, 0.8662149906158447, -0.44305500388145447, 0.21893900632858276, 0.8693490028381348,
+        -0.37287598848342896, 0.15431199967861176, 0.9149600267410278, -0.4014579951763153, 0.07926800101995468, 0.9124410152435303,
+        -0.3112579882144928, 0.12881100177764893, 0.9415550231933594, -0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+        -0.19015200436115265, 0.07869099825620651, 0.9785959720611572, -0.20517399907112122, 0.040511999279260635, 0.977886974811554,
+        0.06301800161600113, -0.021289000287652016, 0.9977849721908569, 0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        -0.3260670006275177, 0.37217798829078674, 0.8690019845962524, -0.285739004611969, 0.285739004611969, 0.9147170186042786,
+        -0.23854400217533112, 0.23854400217533112, 0.9413790106773376, -0.14574900269508362, 0.14574900269508362, 0.9785270094871521,
+        0.05011200159788132, -0.04390300065279007, 0.9977779984474182, -0.1581760048866272, 0.4681999981403351, 0.869350016117096,
+        -0.15431199967861176, 0.37287598848342896, 0.9149600267410278, -0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+        -0.07869099825620651, 0.19015100598335266, 0.9785959720611572, 0.02946699969470501, -0.05963199958205223, 0.9977849721908569,
+        -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.07926800101995468, 0.4014579951763153, 0.9124410152435303,
+        -0.0662280023097992, 0.33541300892829895, 0.939740002155304, -0.040511999279260635, 0.20517399907112122, 0.977886974811554,
+        0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.09679199755191803, 0.4902079999446869, 0.8662149906158447,
+        0.21858200430870056, 0.4423219859600067, 0.86981201171875, 0.15431199967861176, 0.37287598848342896, 0.9149600267410278,
+        0.07926800101995468, 0.4014579951763153, 0.9124410152435303, 0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+        0.0662280023097992, 0.33541300892829895, 0.939740002155304, 0.07869099825620651, 0.19015200436115265, 0.9785959720611572,
+        0.040511999279260635, 0.20517399907112122, 0.977886974811554, -0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+        -0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.3711329996585846, 0.3251489996910095, 0.8697919845581055,
+        0.285739004611969, 0.285739004611969, 0.9147170186042786, 0.23854400217533112, 0.23854400217533112, 0.9413790106773376,
+        0.14574900269508362, 0.14574900269508362, 0.9785270094871521, -0.04390300065279007, -0.05011200159788132, 0.9977779984474182,
+        0.46750199794769287, 0.15794099867343903, 0.8697680234909058, 0.37287598848342896, 0.15431199967861176, 0.9149600267410278,
+        0.3112579882144928, 0.12881100177764893, 0.9415550231933594, 0.19015100598335266, 0.07869099825620651, 0.9785959720611572,
+        -0.05963199958205223, -0.02946699969470501, 0.9977849721908569, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+        0.4014579951763153, 0.07926800101995468, 0.9124410152435303, 0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+        0.20517399907112122, 0.040511999279260635, 0.977886974811554, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        0.4901660084724426, -0.09678400307893753, 0.8662390112876892, 0.44305500388145447, -0.21893900632858276, 0.8693490028381348,
+        0.37287598848342896, -0.15431199967861176, 0.9149600267410278, 0.4014579951763153, -0.07926800101995468, 0.9124410152435303,
+        0.3112579882144928, -0.12881100177764893, 0.9415550231933594, 0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+        0.19015200436115265, -0.07869099825620651, 0.9785959720611572, 0.20517399907112122, -0.040511999279260635, 0.977886974811554,
+        -0.06301800161600113, 0.021289000287652016, 0.9977849721908569, -0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.3260670006275177, -0.37217798829078674, 0.8690019845962524, 0.285739004611969, -0.285739004611969, 0.9147170186042786,
+        0.23854400217533112, -0.23854400217533112, 0.9413790106773376, 0.14574900269508362, -0.14574900269508362, 0.9785270094871521,
+        -0.05011200159788132, 0.04390300065279007, 0.9977779984474182, 0.1581760048866272, -0.4681999981403351, 0.869350016117096,
+        0.15431199967861176, -0.37287598848342896, 0.9149600267410278, 0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+        0.07869099825620651, -0.19015100598335266, 0.9785959720611572, -0.02946699969470501, 0.05963199958205223, 0.9977849721908569,
+        0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.07926800101995468, -0.4014579951763153, 0.9124410152435303,
+        0.0662280023097992, -0.33541300892829895, 0.939740002155304, 0.040511999279260635, -0.20517399907112122, 0.977886974811554,
+        -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.09679199755191803, -0.4902079999446869, 0.8662149906158447,
+        -0.21893900632858276, -0.44305500388145447, 0.8693490028381348, -0.15431199967861176, -0.37287598848342896, 0.9149600267410278,
+        -0.07926800101995468, -0.4014579951763153, 0.9124410152435303, -0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+        -0.0662280023097992, -0.33541300892829895, 0.939740002155304, -0.07869099825620651, -0.19015200436115265, 0.9785959720611572,
+        -0.040511999279260635, -0.20517399907112122, 0.977886974811554, 0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+        0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.37217798829078674, -0.3260670006275177, 0.8690019845962524,
+        -0.285739004611969, -0.285739004611969, 0.9147170186042786, -0.23854400217533112, -0.23854400217533112, 0.9413790106773376,
+        -0.14574900269508362, -0.14574900269508362, 0.9785270094871521, 0.04390300065279007, 0.05011200159788132, 0.9977779984474182,
+        -0.4681999981403351, -0.1581760048866272, 0.869350016117096, -0.37287598848342896, -0.15431199967861176, 0.9149600267410278,
+        -0.3112579882144928, -0.12881100177764893, 0.9415550231933594, -0.19015100598335266, -0.07869099825620651, 0.9785959720611572,
+        0.05963199958205223, 0.02946699969470501, 0.9977849721908569, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+        -0.4014579951763153, -0.07926800101995468, 0.9124410152435303, -0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+        -0.20517399907112122, -0.040511999279260635, 0.977886974811554, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.06623400002717972, -0.013078000396490097, 0.9977179765701294, 0.05963199958205223, -0.02946699969470501, 0.9977849721908569,
+        0.40303200483322144, -0.1667889952659607, 0.8998590111732483, 0.4339120090007782, -0.08567699790000916, 0.8968719840049744,
+        0.6326310038566589, -0.2618109881877899, 0.7288579940795898, 0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+        0.6661339998245239, -0.27567601203918457, 0.6930140256881714, 0.7128540277481079, -0.14075499773025513, 0.6870430111885071,
+        0.5777599811553955, -0.19519099593162537, 0.792523980140686, 0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        0.04390300065279007, -0.05011200159788132, 0.9977779984474182, 0.30884799361228943, -0.30884799361228943, 0.8995699882507324,
+        0.48457300662994385, -0.48457300662994385, 0.7282710075378418, 0.510138988494873, -0.510138988494873, 0.6924710273742676,
+        0.4591110050678253, -0.40222999453544617, 0.7921029925346375, 0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+        0.16678999364376068, -0.40303200483322144, 0.8998590111732483, 0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+        0.27567601203918457, -0.6661339998245239, 0.6930140256881714, 0.2701770067214966, -0.546737015247345, 0.7925170063972473,
+        0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.08567599952220917, -0.4339120090007782, 0.8968719840049744,
+        0.13381600379943848, -0.6777120232582092, 0.723048985004425, 0.14075499773025513, -0.7128540277481079, 0.6870430111885071,
+        0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.013078000396490097, -0.06623400002717972, 0.9977179765701294,
+        -0.02946699969470501, -0.05963199958205223, 0.9977849721908569, -0.1667889952659607, -0.40303200483322144, 0.8998590111732483,
+        -0.08567699790000916, -0.4339120090007782, 0.8968719840049744, -0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+        -0.13381600379943848, -0.6777120232582092, 0.723048985004425, -0.27567601203918457, -0.6661339998245239, 0.6930140256881714,
+        -0.14075499773025513, -0.7128540277481079, 0.6870430111885071, -0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+        -0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.05011200159788132, -0.04390300065279007, 0.9977779984474182,
+        -0.30884799361228943, -0.30884799361228943, 0.8995699882507324, -0.48457300662994385, -0.48457300662994385, 0.7282710075378418,
+        -0.510138988494873, -0.510138988494873, 0.6924710273742676, -0.40222999453544617, -0.4591110050678253, 0.7921029925346375,
+        -0.06301800161600113, -0.021289000287652016, 0.9977849721908569, -0.40303200483322144, -0.16678999364376068, 0.8998590111732483,
+        -0.6326310038566589, -0.2618109881877899, 0.7288579940795898, -0.6661339998245239, -0.27567601203918457, 0.6930140256881714,
+        -0.546737015247345, -0.2701770067214966, 0.7925170063972473, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        -0.4339120090007782, -0.08567599952220917, 0.8968719840049744, -0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+        -0.7128540277481079, -0.14075499773025513, 0.6870430111885071, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        -0.06623400002717972, 0.013078000396490097, 0.9977179765701294, -0.05963199958205223, 0.02946699969470501, 0.9977849721908569,
+        -0.40303200483322144, 0.1667889952659607, 0.8998590111732483, -0.4339120090007782, 0.08567699790000916, 0.8968719840049744,
+        -0.6326310038566589, 0.2618109881877899, 0.7288579940795898, -0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+        -0.6661339998245239, 0.27567601203918457, 0.6930140256881714, -0.7128540277481079, 0.14075499773025513, 0.6870430111885071,
+        -0.5777599811553955, 0.19519099593162537, 0.792523980140686, -0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        -0.04390300065279007, 0.05011200159788132, 0.9977779984474182, -0.30884799361228943, 0.30884799361228943, 0.8995699882507324,
+        -0.48457300662994385, 0.48457300662994385, 0.7282710075378418, -0.510138988494873, 0.510138988494873, 0.6924710273742676,
+        -0.4591110050678253, 0.40222999453544617, 0.7921029925346375, -0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+        -0.16678999364376068, 0.40303200483322144, 0.8998590111732483, -0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+        -0.27567601203918457, 0.6661339998245239, 0.6930140256881714, -0.2701770067214966, 0.546737015247345, 0.7925170063972473,
+        -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.08567599952220917, 0.4339120090007782, 0.8968719840049744,
+        -0.13381600379943848, 0.6777120232582092, 0.723048985004425, -0.14075499773025513, 0.7128540277481079, 0.6870430111885071,
+        -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.013078000396490097, 0.06623400002717972, 0.9977179765701294,
+        0.02946699969470501, 0.05963199958205223, 0.9977849721908569, 0.1667889952659607, 0.40303200483322144, 0.8998590111732483,
+        0.08567699790000916, 0.4339120090007782, 0.8968719840049744, 0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+        0.13381600379943848, 0.6777120232582092, 0.723048985004425, 0.27567601203918457, 0.6661339998245239, 0.6930140256881714,
+        0.14075499773025513, 0.7128540277481079, 0.6870430111885071, 0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+        0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.05011200159788132, 0.04390300065279007, 0.9977779984474182,
+        0.30884799361228943, 0.30884799361228943, 0.8995699882507324, 0.48457300662994385, 0.48457300662994385, 0.7282710075378418,
+        0.510138988494873, 0.510138988494873, 0.6924710273742676, 0.40222999453544617, 0.4591110050678253, 0.7921029925346375,
+        0.06301800161600113, 0.021289000287652016, 0.9977849721908569, 0.40303200483322144, 0.16678999364376068, 0.8998590111732483,
+        0.6326310038566589, 0.2618109881877899, 0.7288579940795898, 0.6661339998245239, 0.27567601203918457, 0.6930140256881714,
+        0.546737015247345, 0.2701770067214966, 0.7925170063972473, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.4339120090007782, 0.08567599952220917, 0.8968719840049744, 0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+        0.7128540277481079, 0.14075499773025513, 0.6870430111885071, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        0.6036490201950073, -0.11919199675321579, 0.7882900238037109, 0.546737015247345, -0.2701770067214966, 0.7925170063972473,
+        0.7223830223083496, -0.2989569902420044, 0.623528003692627, 0.7723940014839172, -0.15251100063323975, 0.616562008857727,
+        0.9094089865684509, -0.3763520121574402, 0.1770150065422058, 0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+        0.9408230185508728, -0.3353259861469269, 0.04907499998807907, 0.9843119978904724, -0.16964000463485718, 0.048493001610040665,
+        0.9810580015182495, -0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+        0.40222999453544617, -0.4591110050678253, 0.7921029925346375, 0.5532029867172241, -0.5532029867172241, 0.622842013835907,
+        0.6959879994392395, -0.6959879994392395, 0.17663900554180145, 0.7403979897499084, -0.6703829765319824, 0.048958998173475266,
+        0.8310419917106628, -0.5562090277671814, 0, 0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+        0.2989560067653656, -0.7223830223083496, 0.623528003692627, 0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+        0.4275760054588318, -0.902646005153656, 0.04906899854540825, 0.5562090277671814, -0.8310419917106628, 0,
+        0.11919199675321579, -0.6036490201950073, 0.7882900238037109, 0.15251100063323975, -0.7723940014839172, 0.616562008857727,
+        0.19075599312782288, -0.9660869836807251, 0.1740349978208542, 0.19348600506782532, -0.9799140095710754, 0.048277001827955246,
+        0.1937119960784912, -0.9810580015182495, 0, -0.11919199675321579, -0.6036490201950073, 0.7882900238037109,
+        -0.2701770067214966, -0.546737015247345, 0.7925170063972473, -0.2989569902420044, -0.7223830223083496, 0.623528003692627,
+        -0.15251100063323975, -0.7723940014839172, 0.616562008857727, -0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+        -0.19075599312782288, -0.9660869836807251, 0.1740349978208542, -0.3353259861469269, -0.9408230185508728, 0.04907499998807907,
+        -0.16964000463485718, -0.9843119978904724, 0.04849399998784065, -0.1937119960784912, -0.9810580015182495, 0,
+        0.7071070075035095, -0.7071070075035095, 0, -0.4591110050678253, -0.40222999453544617, 0.7921029925346375,
+        -0.5532029867172241, -0.5532029867172241, 0.622842013835907, -0.6959879994392395, -0.6959879994392395, 0.17663900554180145,
+        -0.6703829765319824, -0.7403979897499084, 0.048958998173475266, -0.5562090277671814, -0.8310419917106628, 0,
+        -0.5777599811553955, -0.19519099593162537, 0.792523980140686, -0.7223830223083496, -0.2989560067653656, 0.623528003692627,
+        -0.9094089865684509, -0.3763520121574402, 0.1770150065422058, -0.902646005153656, -0.4275760054588318, 0.04906899854540825,
+        -0.8310419917106628, -0.5562090277671814, 0, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        -0.7723940014839172, -0.15251100063323975, 0.616562008857727, -0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+        -0.9799140095710754, -0.19348600506782532, 0.048277001827955246, -0.9810580015182495, -0.1937119960784912, 0,
+        -0.6036490201950073, 0.11919199675321579, 0.7882900238037109, -0.546737015247345, 0.2701770067214966, 0.7925170063972473,
+        -0.7223830223083496, 0.2989569902420044, 0.623528003692627, -0.7723940014839172, 0.15251100063323975, 0.616562008857727,
+        -0.9094089865684509, 0.3763520121574402, 0.1770150065422058, -0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+        -0.9408230185508728, 0.3353259861469269, 0.04907499998807907, -0.9843119978904724, 0.16964000463485718, 0.04849399998784065,
+        -0.9810580015182495, 0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+        -0.40222999453544617, 0.4591110050678253, 0.7921029925346375, -0.5532029867172241, 0.5532029867172241, 0.622842013835907,
+        -0.6959879994392395, 0.6959879994392395, 0.17663900554180145, -0.7403979897499084, 0.6703829765319824, 0.048958998173475266,
+        -0.8310419917106628, 0.5562090277671814, 0, -0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+        -0.2989560067653656, 0.7223830223083496, 0.623528003692627, -0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+        -0.4275760054588318, 0.902646005153656, 0.04906899854540825, -0.5562090277671814, 0.8310419917106628, 0,
+        -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, -0.15251100063323975, 0.7723940014839172, 0.616562008857727,
+        -0.19075599312782288, 0.9660869836807251, 0.1740349978208542, -0.19348600506782532, 0.9799140095710754, 0.048277001827955246,
+        -0.1937119960784912, 0.9810580015182495, 0, 0.11919199675321579, 0.6036490201950073, 0.7882900238037109,
+        0.2701770067214966, 0.546737015247345, 0.7925170063972473, 0.2989569902420044, 0.7223830223083496, 0.623528003692627,
+        0.15251100063323975, 0.7723940014839172, 0.616562008857727, 0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+        0.19075599312782288, 0.9660869836807251, 0.1740349978208542, 0.3353259861469269, 0.9408230185508728, 0.04907499998807907,
+        0.16964000463485718, 0.9843119978904724, 0.04849399998784065, 0.1937119960784912, 0.9810580015182495, 0,
+        0.7071070075035095, -0.7071070075035095, 0, 0.4591110050678253, 0.40222999453544617, 0.7921029925346375,
+        0.5532029867172241, 0.5532029867172241, 0.622842013835907, 0.6959879994392395, 0.6959879994392395, 0.17663900554180145,
+        0.6703829765319824, 0.7403979897499084, 0.048958998173475266, 0.5562090277671814, 0.8310419917106628, 0,
+        0.5777599811553955, 0.19519099593162537, 0.792523980140686, 0.7223830223083496, 0.2989560067653656, 0.623528003692627,
+        0.9094089865684509, 0.3763520121574402, 0.1770150065422058, 0.902646005153656, 0.4275760054588318, 0.04906899854540825,
+        0.8310419917106628, 0.5562090277671814, 0, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        0.7723940014839172, 0.15251100063323975, 0.616562008857727, 0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+        0.9799150228500366, 0.19348600506782532, 0.048277001827955246, 0.9810580015182495, 0.1937119960784912, 0,
+        0.9999480247497559, 0.006622000131756067, 0.007786999922245741, 0.9989290237426758, 0.04125700145959854, -0.020945999771356583,
+        0.9700260162353516, -0.18230900168418884, 0.1606609970331192, 0.9929869771003723, -0.1116809993982315, 0.038782998919487,
+        0.8677089810371399, -0.30993399024009705, 0.38861599564552307, 0.9675049781799316, -0.18179599940776825, 0.17574100196361542,
+        0.6127229928970337, -0.23797500133514404, 0.753616988658905, 0.781611979007721, -0.1585649996995926, 0.6032750010490417,
+        0.13049399852752686, -0.02585900016129017, 0.9911119937896729, 0.16583800315856934, -0.04606600105762482, 0.9850770235061646,
+        0.9847609996795654, -0.03004699945449829, -0.17129500210285187, 0.9463850259780884, 0.008138000033795834, 0.3229379951953888,
+        0.6942890286445618, 0.06011800095438957, 0.7171810269355774, 0.405923992395401, 0.09244199842214584, 0.9092199802398682,
+        0.1477230042219162, 0.0024739999789744616, 0.9890260100364685, 0.991798996925354, -0.11557900160551071, -0.05454900115728378,
+        0.9920099973678589, 0.07202500104904175, 0.10358300060033798, 0.8882240056991577, 0.2238840013742447, 0.40116599202156067,
+        0.6046879887580872, 0.13691100478172302, 0.7846069931983948, 0.12908099591732025, -0.06111999973654747, 0.989749014377594,
+        0.9954820275306702, -0.09436299651861191, 0.010502999648451805, 0.9981970191001892, 0.012060999870300293, 0.05880200117826462,
+        0.9550639986991882, 0.09819000214338303, 0.27966299653053284, 0.6606940031051636, 0.05169999971985817, 0.7488729953765869,
+        0.07273799926042557, -0.04034300148487091, 0.9965350031852722, 0.9999179840087891, 0.007191000040620565, 0.010560999624431133,
+        0.9989050030708313, 0.04436499997973442, -0.014883999712765217, 0.9694769978523254, -0.17860299348831177, 0.1679760068655014,
+        0.9924619793891907, -0.10775599628686905, 0.058378998190164566, 0.8567489981651306, -0.28829601407051086, 0.4276289939880371,
+        0.9473999738693237, -0.16112199425697327, 0.27653801441192627, 0.5627779960632324, -0.19747799634933472, 0.8026729822158813,
+        0.6577669978141785, -0.11438000202178955, 0.7444859743118286, 0.07901199907064438, 0.0013689999468624592, 0.9968730211257935,
+        0.07274100184440613, -0.02020600065588951, 0.9971460103988647, 0.9888780117034912, 0.025808999314904213, -0.14647500216960907,
+        0.9453979730606079, -0.006663000211119652, 0.3258500099182129, 0.6921399831771851, -0.04972299933433533, 0.7200480103492737,
+        0.3957499861717224, -0.08134900033473969, 0.9147480130195618, 0.13914500176906586, -0.00007899999764049426, 0.9902719855308533,
+        0.9924669861793518, -0.10311000049114227, -0.06616800278425217, 0.9926300048828125, 0.07926999777555466, 0.09165900200605392,
+        0.900858998298645, 0.2553130090236664, 0.3510949909687042, 0.6513699889183044, 0.18318000435829163, 0.7363160252571106,
+        0.15978699922561646, -0.02714099921286106, 0.9867780208587646, 0.9955620169639587, -0.09379199892282486, 0.0077309999614953995,
+        0.9991030097007751, 0.01610800065100193, 0.039149001240730286, 0.9764699935913086, 0.12068899720907211, 0.17871999740600586,
+        0.7859060168266296, 0.10103499889373779, 0.6100350022315979, 0.16579000651836395, -0.014832000248134136, 0.986050009727478,
+        0.1655299961566925, -0.10078699886798859, 0.9810410141944885, -0.0046790000051259995, -0.1750659942626953, 0.9845460057258606,
+        -0.3859579861164093, -0.06494200229644775, 0.9202280044555664, -0.3219670057296753, -0.05600599944591522, 0.9450929760932922,
+        -0.6471610069274902, -0.11495299637317657, 0.7536370158195496, -0.5616440176963806, -0.078855000436306, 0.8236119747161865,
+        -0.8379700183868408, -0.23749999701976776, 0.4913240075111389, -0.7512590289115906, -0.1447169929742813, 0.6439470052719116,
+        -0.9052090048789978, -0.2807050049304962, 0.3190630078315735, -0.8249419927597046, -0.2209009975194931, 0.5202630162239075,
+        -0.13363699615001678, 0.0291920006275177, 0.9905999898910522, -0.4039649963378906, 0.0019519999623298645, 0.9147719740867615,
+        -0.7191359996795654, 0.002443999983370304, 0.6948649883270264, -0.9637579917907715, 0.026884999126195908, 0.26541900634765625,
+        -0.9637719988822937, 0.2207069993019104, -0.14977200329303741, 0.03522900119423866, 0.06716900318861008, 0.9971190094947815,
+        -0.3620629906654358, -0.01676199957728386, 0.9320030212402344, -0.6534259915351868, 0.007120999973267317, 0.7569569945335388,
+        -0.8528590202331543, 0.11686599999666214, 0.5088940262794495, -0.8814889788627625, 0.3579840064048767, 0.3079349994659424,
+        0.0726580023765564, 0.02018200047314167, 0.9971529841423035, -0.37608298659324646, -0.025955000892281532, 0.926222026348114,
+        -0.6568350195884705, -0.015021000057458878, 0.7538840174674988, -0.8238760232925415, 0.03257700055837631, 0.5658339858055115,
+        -0.8688690066337585, 0.13078700006008148, 0.4774540066719055, 0.07265599817037582, -0.07700400054454803, 0.994379997253418,
+        -0.0343950018286705, -0.151870995759964, 0.9878020286560059, -0.40362000465393066, -0.05282000079751015, 0.9134010076522827,
+        -0.37586501240730286, -0.041078001260757446, 0.9257640242576599, -0.6878190040588379, -0.0810059979557991, 0.721347987651825,
+        -0.6558970212936401, -0.052101001143455505, 0.7530509829521179, -0.8708800077438354, -0.2062380015850067, 0.44613200426101685,
+        -0.8175939917564392, -0.12448199838399887, 0.5621780157089233, -0.8926960229873657, -0.3055669963359833, 0.33124300837516785,
+        -0.8565059900283813, -0.21024300158023834, 0.4713769853115082, -0.15155400335788727, -0.025412000715732574, 0.9881219863891602,
+        -0.41033700108528137, -0.0026420000940561295, 0.9119300246238708, -0.7240620255470276, 0.00047400000039488077, 0.6897349953651428,
+        -0.9655590057373047, -0.017078999429941177, 0.2596229910850525, -0.973825991153717, -0.19711799919605255, -0.1131730005145073,
+        0.06214199960231781, 0.08235500007867813, 0.9946640133857727, -0.3334290087223053, 0.007625999860465527, 0.9427440166473389,
+        -0.608610987663269, 0.04885999858379364, 0.7919629812240601, -0.8253309726715088, 0.14631199836730957, 0.5453640222549438,
+        -0.9105669856071472, 0.3146660029888153, 0.2680560052394867, 0.16523399949073792, 0.04589800164103508, 0.985185980796814,
+        -0.32260099053382874, -0.010471000336110592, 0.9464769959449768, -0.5639140009880066, 0.015166000463068485, 0.8256940245628357,
+        -0.758965015411377, 0.05617399886250496, 0.6487039923667908, -0.8382350206375122, 0.14245299994945526, 0.5263739824295044,
+        0.9727830290794373, -0.019794000312685966, 0.2308720052242279, 0.9828159809112549, -0.036465998739004135, 0.18095199763774872,
+        0.9050639867782593, -0.02252200059592724, 0.4246790111064911, 0.8354039788246155, -0.03220000118017197, 0.5486930012702942,
+        0.6465700268745422, -0.045921001583337784, 0.7614709734916687, 0.4826749861240387, -0.04895399883389473, 0.8744300007820129,
+        0.4453999996185303, 0.17256900668144226, 0.8785430192947388, 0.47231200337409973, 0.13768500089645386, 0.8706120252609253,
+        0.4824250042438507, 0.3898639976978302, 0.7843930125236511, 0.641398012638092, 0.4275979995727539, 0.6370000243186951,
+        0.9863939881324768, 0.0994419977068901, 0.13091400265693665, 0.9154840111732483, 0.2120320051908493, 0.34195101261138916,
+        0.7246469855308533, 0.245046004652977, 0.6440799832344055, 0.35685500502586365, 0.17885500192642212, 0.9168779850006104,
+        0.14101800322532654, 0.24263200163841248, 0.9598140120506287, 0.9366779923439026, 0.16484400629997253, 0.3089669942855835,
+        0.7982620000839233, 0.2441370040178299, 0.5506129860877991, 0.4769439995288849, 0.2904820144176483, 0.8295450210571289,
+        0.4125959873199463, -0.017246000468730927, 0.9107509851455688, 0.341374009847641, -0.37689098715782166, 0.8610560297966003,
+        0.9026100039482117, 0.14119599759578705, 0.40664398670196533, 0.7326020002365112, 0.1491979956626892, 0.6641039848327637,
+        0.38115599751472473, 0.15792299807071686, 0.9109230041503906, 0.5317370295524597, -0.02143399976193905, 0.846638023853302,
+        0.7915729880332947, -0.3539769947528839, 0.49810999631881714, 0.9087340235710144, -0.07959599792957306, 0.40971601009368896,
+        0.9386569857597351, -0.17680299282073975, 0.29607900977134705, 0.7781569957733154, -0.19467000663280487, 0.5971400141716003,
+        0.738847017288208, -0.07674700021743774, 0.6694890260696411, 0.43915998935699463, -0.22276799380779266, 0.870352029800415,
+        0.3863860070705414, -0.0790880024433136, 0.918940007686615, 0.3576120138168335, 0.07325199991464615, 0.9309930205345154,
+        0.5227140188217163, 0.16167999804019928, 0.8370360136032104, 0.4246380031108856, 0.3233239948749542, 0.845661997795105,
+        0.733618974685669, 0.48907899856567383, 0.4718089997768402, 0.9886019825935364, -0.10717800259590149, 0.10573200136423111,
+        0.9131960272789001, -0.22303399443626404, 0.3410690128803253, 0.7163559794425964, -0.25636500120162964, 0.6489310264587402,
+        0.35149699449539185, -0.15968100726604462, 0.922469973564148, 0.07999800145626068, -0.2107039988040924, 0.9742709994316101,
+        0.9883249998092651, 0.04732999950647354, 0.14482200145721436, 0.9210500121116638, 0.07413999736309052, 0.3823229968547821,
+        0.6804890036582947, 0.11895299702882767, 0.7230389714241028, 0.4935390055179596, -0.10269299894571304, 0.8636389970779419,
+        0.3912479877471924, -0.4752289950847626, 0.7880880236625671, 0.9700270295143127, 0.07970499992370605, 0.2295520007610321,
+        0.831250011920929, 0.10592100024223328, 0.5457149744033813, 0.4774230122566223, 0.13252699375152588, 0.8686220049858093,
+        0.47922399640083313, -0.0024129999801516533, 0.877689003944397, 0.6902980208396912, -0.29711300134658813, 0.6597059965133667,
+        0.6312130093574524, 0.4550989866256714, 0.628055989742279, 0.26494699716567993, 0.5426689982414246, 0.797065019607544,
+        0.4216960072517395, 0.6728450059890747, 0.6078259944915771, 0.7324270009994507, 0.5829970240592957, 0.35166099667549133,
+        0.5086709856987, 0.8606399893760681, -0.023507000878453255, 0.7640720009803772, 0.6449369788169861, -0.015798000618815422,
+        0.19029100239276886, 0.2773289978504181, -0.9417420029640198, 0.02588699944317341, 0.0005750000127591193, -0.9996650218963623,
+        -0.33045700192451477, -0.4387669861316681, -0.8356329798698425, -0.6271269917488098, -0.4645389914512634, -0.6252319812774658,
+        -0.02311599999666214, 0.2469020038843155, 0.9687650203704834, -0.012950999662280083, 0.45514100790023804, 0.8903250098228455,
+        -0.001180000021122396, 0.9888520240783691, 0.14889399707317352, 0.019520999863743782, 0.6841210126876831, -0.7291070222854614,
+        0.012253000400960445, 0.007784999907016754, -0.9998949766159058, 0.3314639925956726, -0.3832260072231293, 0.8621309995651245,
+        0.08274699747562408, -0.16047699749469757, 0.9835649728775024, -0.381630003452301, 0.638043999671936, 0.6687729954719543,
+        -0.44988399744033813, 0.787883996963501, -0.42052799463272095, -0.2780170142650604, 0.5983560085296631, -0.7514500021934509,
+        0.7378140091896057, -0.4918749928474426, 0.4622659981250763, 0.6153389811515808, -0.45540300011634827, 0.6434019804000854,
+        -0.43678900599479675, 0.33411499857902527, 0.8352140188217163, -0.7429530024528503, 0.6388909816741943, -0.1995989978313446,
+        -0.7432950139045715, 0.5977380275726318, -0.3003700077533722, 0.7197920083999634, 0.5168960094451904, 0.4633769989013672,
+        0.22183099389076233, 0.4485720098018646, 0.8657789826393127, 0.08203200250864029, 0.15848000347614288, 0.9839479923248291,
+        0.5953459739685059, 0.4811680018901825, 0.6434599757194519, -0.37556400895118713, -0.6215270161628723, 0.6875,
+        -0.42666301131248474, -0.33534398674964905, 0.8399419784545898, -0.44476398825645447, -0.7887529730796814, -0.42432600259780884,
+        -0.7557309865951538, -0.6222699880599976, -0.20408600568771362, -0.4292669892311096, -0.5361850261688232, -0.7267979979515076,
+        -0.7655900120735168, -0.5671039819717407, -0.30375200510025024, 0.007348000071942806, -0.21113499999046326, 0.9774289727210999,
+        -0.01990099996328354, -0.4373210072517395, 0.8990849852561951, -0.008775000460445881, -0.9864199757575989, 0.16400499641895294,
+        0.024855999276041985, -0.6829339861869812, -0.7300570011138916, 0.014514000155031681, 0.03655200079083443, -0.9992259740829468,
+        0.40192899107933044, -0.4676550030708313, 0.7872430086135864, 0.41696101427078247, -0.6813820004463196, 0.6015490293502808,
+        0.5033609867095947, -0.8637740015983582, -0.022839000448584557, 0.2058819979429245, -0.2945750057697296, -0.9331870079040527,
+        -0.2351589947938919, 0.5535579919815063, -0.7989199757575989, 0.6533820033073425, -0.435588002204895, 0.619156002998352,
+        0.7555500268936157, -0.554410994052887, 0.3489600121974945, 0.7765160202980042, -0.6298360228538513, -0.01814199984073639,
+        0.025975000113248825, 0.008264999836683273, -0.9996280074119568, -0.6086519956588745, 0.49536699056625366, -0.6198019981384277,
+        -0.9813200235366821, 0.19238099455833435, 0, -0.831650972366333, 0.5552989840507507, 0,
+        -0.4425640106201172, 0.38308998942375183, 0.8107889890670776, -0.5623509883880615, 0.11026400327682495, 0.8195139765739441,
+        0.367917001247406, -0.15178599953651428, 0.917385995388031, 0.3960669934749603, -0.07774800062179565, 0.9149240255355835,
+        0.3283520042896271, -0.13562799990177155, 0.9347670078277588, 0.3530749976634979, -0.06952299922704697, 0.9330080151557922,
+        -0.5935590267181396, 0.20035800337791443, 0.7794510126113892, -0.6201800107955933, 0.12245599925518036, 0.7748429775238037,
+        -0.5552989840507507, 0.831650972366333, 0, -0.2616960108280182, 0.523730993270874, 0.8106920123100281,
+        0.2819640040397644, -0.2819199860095978, 0.9170699715614319, 0.25169798731803894, -0.25161200761795044, 0.9345269799232483,
+        -0.4710330069065094, 0.41249701380729675, 0.7797269821166992, -0.19238099455833435, 0.9813200235366821, 0,
+        -0.04031100124120712, 0.5840420126914978, 0.8107219934463501, 0.1517850011587143, -0.3678950071334839, 0.9173960089683533,
+        0.13561999797821045, -0.3282899856567383, 0.9347900152206421, -0.27737799286842346, 0.561601996421814, 0.779528021812439,
+        -1, 0, 0, 0.29074999690055847, 0.5413560271263123, 0.7889220118522644,
+        0.07767199724912643, -0.39607399702072144, 0.9149270057678223, 0.0693729966878891, -0.3530940115451813, 0.9330130219459534,
+        -0.12221000343561172, 0.6202139854431152, 0.7748550176620483, 0.19238099455833435, 0.9813200235366821, 0,
+        0.5552989840507507, 0.831650972366333, 0, 0.38308998942375183, 0.4425640106201172, 0.8107889890670776,
+        0.11026400327682495, 0.5623509883880615, 0.8195139765739441, -0.15178599953651428, -0.367917001247406, 0.917385995388031,
+        -0.07774800062179565, -0.3960669934749603, 0.9149240255355835, -0.13562799990177155, -0.3283520042896271, 0.9347670078277588,
+        -0.06952299922704697, -0.3530749976634979, 0.9330080151557922, 0.20035800337791443, 0.5935590267181396, 0.7794510126113892,
+        0.12245599925518036, 0.6201800107955933, 0.7748429775238037, 0.831650972366333, 0.5552989840507507, 0,
+        0.523730993270874, 0.2616960108280182, 0.8106920123100281, -0.2819199860095978, -0.2819640040397644, 0.9170699715614319,
+        -0.25161200761795044, -0.25169798731803894, 0.9345269799232483, 0.41249701380729675, 0.4710330069065094, 0.7797269821166992,
+        0.9813200235366821, 0.19238099455833435, 0, 0.5840420126914978, 0.04031100124120712, 0.8107219934463501,
+        -0.3678950071334839, -0.1517850011587143, 0.9173960089683533, -0.3282899856567383, -0.13561999797821045, 0.9347900152206421,
+        0.561601996421814, 0.27737799286842346, 0.779528021812439, -1, 0, 0,
+        0.5413560271263123, -0.29074999690055847, 0.7889220118522644, -0.39607399702072144, -0.07767199724912643, 0.9149270057678223,
+        -0.3530940115451813, -0.0693729966878891, 0.9330130219459534, 0.6202139854431152, 0.12221000343561172, 0.7748550176620483,
+        0.9813200235366821, -0.19238099455833435, 0, 0.831650972366333, -0.5552989840507507, 0,
+        0.4425640106201172, -0.38308998942375183, 0.8107889890670776, 0.5623509883880615, -0.11026400327682495, 0.8195139765739441,
+        -0.367917001247406, 0.15178599953651428, 0.917385995388031, -0.3960669934749603, 0.07774800062179565, 0.9149240255355835,
+        -0.3283520042896271, 0.13562799990177155, 0.9347670078277588, -0.3530749976634979, 0.06952299922704697, 0.9330080151557922,
+        0.5935590267181396, -0.20035800337791443, 0.7794510126113892, 0.6201800107955933, -0.12245599925518036, 0.7748429775238037,
+        0.5552989840507507, -0.831650972366333, 0, 0.2616960108280182, -0.523730993270874, 0.8106920123100281,
+        -0.2819640040397644, 0.2819199860095978, 0.9170699715614319, -0.25169798731803894, 0.25161200761795044, 0.9345269799232483,
+        0.4710330069065094, -0.41249701380729675, 0.7797269821166992, 0.19238099455833435, -0.9813200235366821, 0,
+        0.04031100124120712, -0.5840420126914978, 0.8107219934463501, -0.1517850011587143, 0.3678950071334839, 0.9173960089683533,
+        -0.13561999797821045, 0.3282899856567383, 0.9347900152206421, 0.27737799286842346, -0.561601996421814, 0.779528021812439,
+        -1, 0, 0, -0.29074999690055847, -0.5413560271263123, 0.7889220118522644,
+        -0.07767199724912643, 0.39607399702072144, 0.9149270057678223, -0.0693729966878891, 0.3530940115451813, 0.9330130219459534,
+        0.12221000343561172, -0.6202139854431152, 0.7748550176620483, -0.19238099455833435, -0.9813200235366821, 0,
+        -0.5552989840507507, -0.831650972366333, 0, -0.38308998942375183, -0.4425640106201172, 0.8107889890670776,
+        -0.11026400327682495, -0.5623509883880615, 0.8195139765739441, 0.15178599953651428, 0.367917001247406, 0.917385995388031,
+        0.07774800062179565, 0.3960669934749603, 0.9149240255355835, 0.13562799990177155, 0.3283520042896271, 0.9347670078277588,
+        0.06952299922704697, 0.3530749976634979, 0.9330080151557922, -0.20035800337791443, -0.5935590267181396, 0.7794510126113892,
+        -0.12245599925518036, -0.6201800107955933, 0.7748429775238037, -0.831650972366333, -0.5552989840507507, 0,
+        -0.523730993270874, -0.2616960108280182, 0.8106920123100281, 0.2819199860095978, 0.2819640040397644, 0.9170699715614319,
+        0.25161200761795044, 0.25169798731803894, 0.9345269799232483, -0.41249701380729675, -0.4710330069065094, 0.7797269821166992,
+        -0.9813200235366821, -0.19238099455833435, 0, -0.5840420126914978, -0.04031100124120712, 0.8107219934463501,
+        0.3678950071334839, 0.1517850011587143, 0.9173960089683533, 0.3282899856567383, 0.13561999797821045, 0.9347900152206421,
+        -0.561601996421814, -0.27737799286842346, 0.779528021812439, -1, 0, 0,
+        -0.5413560271263123, 0.29074999690055847, 0.7889220118522644, 0.39607399702072144, 0.07767199724912643, 0.9149270057678223,
+        0.3530940115451813, 0.0693729966878891, 0.9330130219459534, -0.6202139854431152, -0.12221000343561172, 0.7748550176620483,
+        -0.6201800107955933, 0.12245599925518036, 0.7748429775238037, -0.5616469979286194, 0.27755099534988403, 0.7794349789619446,
+        -0.8979210257530212, 0.37159600853919983, 0.23590999841690063, -0.9542099833488464, 0.18841099739074707, 0.23234599828720093,
+        -0.9101200103759766, 0.3766449987888336, 0.17268399894237518, -0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+        -0.8549879789352417, 0.35383298993110657, 0.3792079985141754, -0.9100499749183655, 0.17969100177288055, 0.3735229969024658,
+        -0.8064150214195251, 0.2724289894104004, 0.5248600244522095, -0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+        -0.4125959873199463, 0.47094500064849854, 0.7797279953956604, -0.687192976474762, 0.687192976474762, 0.23565199971199036,
+        -0.6965190172195435, 0.6965190172195435, 0.17240400612354279, -0.6544880270957947, 0.6544870138168335, 0.37853899598121643,
+        -0.6404970288276672, 0.5611429810523987, 0.5242909789085388, -0.20047900080680847, 0.5933949947357178, 0.7795450091362,
+        -0.3715969920158386, 0.8979210257530212, 0.23590999841690063, -0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+        -0.35383298993110657, 0.8549879789352417, 0.3792079985141754, -0.3770729899406433, 0.7630789875984192, 0.5249059796333313,
+        -0.12245900183916092, 0.6201940178871155, 0.7748309969902039, -0.18841099739074707, 0.9542099833488464, 0.23234599828720093,
+        -0.19089600443840027, 0.966795027256012, 0.16990099847316742, -0.17969200015068054, 0.9100499749183655, 0.3735229969024658,
+        -0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.12245599925518036, 0.6201800107955933, 0.7748429775238037,
+        0.27755099534988403, 0.5616469979286194, 0.7794349789619446, 0.37159600853919983, 0.8979210257530212, 0.23590999841690063,
+        0.18841099739074707, 0.9542099833488464, 0.23234599828720093, 0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+        0.19089600443840027, 0.966795027256012, 0.16990099847316742, 0.35383298993110657, 0.8549879789352417, 0.3792079985141754,
+        0.17969100177288055, 0.9100499749183655, 0.3735229969024658, 0.2724289894104004, 0.8064150214195251, 0.5248600244522095,
+        0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.47094500064849854, 0.4125959873199463, 0.7797279953956604,
+        0.687192976474762, 0.687192976474762, 0.23565199971199036, 0.6965190172195435, 0.6965190172195435, 0.17240400612354279,
+        0.6544870138168335, 0.6544880270957947, 0.37853899598121643, 0.5611429810523987, 0.6404970288276672, 0.5242909789085388,
+        0.5933949947357178, 0.20047900080680847, 0.7795450091362, 0.8979210257530212, 0.3715969920158386, 0.23590999841690063,
+        0.9101200103759766, 0.3766449987888336, 0.17268399894237518, 0.8549879789352417, 0.35383298993110657, 0.3792079985141754,
+        0.7630789875984192, 0.3770729899406433, 0.5249059796333313, 0.6201940178871155, 0.12245900183916092, 0.7748309969902039,
+        0.9542099833488464, 0.18841099739074707, 0.23234599828720093, 0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+        0.9100499749183655, 0.17969200015068054, 0.3735229969024658, 0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+        0.6201800107955933, -0.12245599925518036, 0.7748429775238037, 0.5616469979286194, -0.27755099534988403, 0.7794349789619446,
+        0.8979210257530212, -0.37159600853919983, 0.23590999841690063, 0.9542099833488464, -0.18841099739074707, 0.23234599828720093,
+        0.9101200103759766, -0.3766449987888336, 0.17268399894237518, 0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+        0.8549879789352417, -0.35383298993110657, 0.3792079985141754, 0.9100499749183655, -0.17969100177288055, 0.3735229969024658,
+        0.8064150214195251, -0.2724289894104004, 0.5248600244522095, 0.8383409976959229, -0.16553199291229248, 0.5194069743156433,
+        0.4125959873199463, -0.47094500064849854, 0.7797279953956604, 0.687192976474762, -0.687192976474762, 0.23565199971199036,
+        0.6965190172195435, -0.6965190172195435, 0.17240400612354279, 0.6544880270957947, -0.6544870138168335, 0.37853899598121643,
+        0.6404970288276672, -0.5611429810523987, 0.5242909789085388, 0.20047900080680847, -0.5933949947357178, 0.7795450091362,
+        0.3715969920158386, -0.8979210257530212, 0.23590999841690063, 0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+        0.35383298993110657, -0.8549879789352417, 0.3792079985141754, 0.3770729899406433, -0.7630789875984192, 0.5249059796333313,
+        0.12245900183916092, -0.6201940178871155, 0.7748309969902039, 0.18841099739074707, -0.9542099833488464, 0.23234599828720093,
+        0.19089600443840027, -0.966795027256012, 0.16990099847316742, 0.17969200015068054, -0.9100499749183655, 0.3735229969024658,
+        0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.12245599925518036, -0.6201800107955933, 0.7748429775238037,
+        -0.27755099534988403, -0.5616469979286194, 0.7794349789619446, -0.37159600853919983, -0.8979210257530212, 0.23590999841690063,
+        -0.18841099739074707, -0.9542099833488464, 0.23234599828720093, -0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+        -0.19089600443840027, -0.966795027256012, 0.16990099847316742, -0.35383298993110657, -0.8549879789352417, 0.3792079985141754,
+        -0.17969100177288055, -0.9100499749183655, 0.3735229969024658, -0.2724289894104004, -0.8064150214195251, 0.5248600244522095,
+        -0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.47094500064849854, -0.4125959873199463, 0.7797279953956604,
+        -0.687192976474762, -0.687192976474762, 0.23565199971199036, -0.6965190172195435, -0.6965190172195435, 0.17240400612354279,
+        -0.6544870138168335, -0.6544880270957947, 0.37853899598121643, -0.5611429810523987, -0.6404970288276672, 0.5242909789085388,
+        -0.5933949947357178, -0.20047900080680847, 0.7795450091362, -0.8979210257530212, -0.3715969920158386, 0.23590999841690063,
+        -0.9101200103759766, -0.3766449987888336, 0.17268399894237518, -0.8549879789352417, -0.35383298993110657, 0.3792079985141754,
+        -0.7630789875984192, -0.3770729899406433, 0.5249059796333313, -0.6201940178871155, -0.12245900183916092, 0.7748309969902039,
+        -0.9542099833488464, -0.18841099739074707, 0.23234599828720093, -0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+        -0.9100499749183655, -0.17969200015068054, 0.3735229969024658, -0.8383409976959229, -0.16553199291229248, 0.5194069743156433 };
+
+
+float  teapotTexCoords[] = { 2, 2, 0, 1.75, 2, 0, 1.75, 1.975000023841858,
+        0, 2, 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2,
+        1.9500000476837158, 0, 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0,
+        1.75, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.5, 2,
+        0, 1.5, 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5,
+        1.9249999523162842, 0, 1.5, 1.899999976158142, 0, 1.25, 2, 0,
+        1.25, 1.975000023841858, 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842,
+        0, 1.25, 1.899999976158142, 0, 1, 2, 0, 1,
+        1.975000023841858, 0, 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0,
+        1, 1.899999976158142, 0, 1, 2, 0, 0.75, 2,
+        0, 0.75, 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75,
+        1.9500000476837158, 0, 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0,
+        1, 1.9249999523162842, 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142,
+        0, 0.5, 2, 0, 0.5, 1.975000023841858, 0, 0.5,
+        1.9500000476837158, 0, 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0,
+        0.25, 2, 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158,
+        0, 0.25, 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0,
+        2, 0, 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0,
+        0, 1.9249999523162842, 0, 0, 1.899999976158142, 0, 2, 2,
+        0, 1.75, 2, 0, 1.75, 1.975000023841858, 0, 2,
+        1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2, 1.9500000476837158, 0,
+        1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0, 1.75, 1.899999976158142,
+        0, 2, 1.899999976158142, 0, 1.5, 2, 0, 1.5,
+        1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5, 1.9249999523162842, 0,
+        1.5, 1.899999976158142, 0, 1.25, 2, 0, 1.25, 1.975000023841858,
+        0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842, 0, 1.25,
+        1.899999976158142, 0, 1, 2, 0, 1, 1.975000023841858, 0,
+        1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0, 1, 1.899999976158142,
+        0, 1, 2, 0, 0.75, 2, 0, 0.75,
+        1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75, 1.9500000476837158, 0,
+        1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0, 1, 1.9249999523162842,
+        0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142, 0, 0.5,
+        2, 0, 0.5, 1.975000023841858, 0, 0.5, 1.9500000476837158, 0,
+        0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0, 0.25, 2,
+        0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158, 0, 0.25,
+        1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0, 2, 0,
+        0, 1.975000023841858, 0, 0, 1.9500000476837158, 0, 0, 1.9249999523162842,
+        0, 0, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.75,
+        1.899999976158142, 0, 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0,
+        1.75, 1.4500000476837158, 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858,
+        0, 2, 1.225000023841858, 0, 1.75, 1, 0, 2,
+        1, 0, 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0,
+        1.5, 1.4500000476837158, 0, 1.5, 1.225000023841858, 0, 1.5, 1,
+        0, 1.25, 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25,
+        1.4500000476837158, 0, 1.25, 1.225000023841858, 0, 1.25, 1, 0,
+        1, 1.899999976158142, 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158,
+        0, 1, 1.225000023841858, 0, 1, 1, 0, 1,
+        1.899999976158142, 0, 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0,
+        1, 1.6749999523162842, 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158,
+        0, 0.75, 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75,
+        1, 0, 1, 1, 0, 0.5, 1.899999976158142, 0,
+        0.5, 1.6749999523162842, 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858,
+        0, 0.5, 1, 0, 0.25, 1.899999976158142, 0, 0.25,
+        1.6749999523162842, 0, 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0,
+        0.25, 1, 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842,
+        0, 0, 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0,
+        1, 0, 2, 1.899999976158142, 0, 1.75, 1.899999976158142, 0,
+        1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0, 1.75, 1.4500000476837158,
+        0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858, 0, 2,
+        1.225000023841858, 0, 1.75, 1, 0, 2, 1, 0,
+        1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0, 1.5, 1.4500000476837158,
+        0, 1.5, 1.225000023841858, 0, 1.5, 1, 0, 1.25,
+        1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25, 1.4500000476837158, 0,
+        1.25, 1.225000023841858, 0, 1.25, 1, 0, 1, 1.899999976158142,
+        0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158, 0, 1,
+        1.225000023841858, 0, 1, 1, 0, 1, 1.899999976158142, 0,
+        0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0, 1, 1.6749999523162842,
+        0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158, 0, 0.75,
+        1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75, 1, 0,
+        1, 1, 0, 0.5, 1.899999976158142, 0, 0.5, 1.6749999523162842,
+        0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858, 0, 0.5,
+        1, 0, 0.25, 1.899999976158142, 0, 0.25, 1.6749999523162842, 0,
+        0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0, 0.25, 1,
+        0, 0, 1.899999976158142, 0, 0, 1.6749999523162842, 0, 0,
+        1.4500000476837158, 0, 0, 1.225000023841858, 0, 0, 1, 0,
+        2, 1, 0, 1.75, 1, 0, 1.75, 0.8500000238418579,
+        0, 2, 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2,
+        0.699999988079071, 0, 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0,
+        1.75, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.5, 1,
+        0, 1.5, 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5,
+        0.550000011920929, 0, 1.5, 0.4000000059604645, 0, 1.25, 1, 0,
+        1.25, 0.8500000238418579, 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929,
+        0, 1.25, 0.4000000059604645, 0, 1, 1, 0, 1,
+        0.8500000238418579, 0, 1, 0.699999988079071, 0, 1, 0.550000011920929, 0,
+        1, 0.4000000059604645, 0, 1, 1, 0, 0.75, 1,
+        0, 0.75, 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75,
+        0.699999988079071, 0, 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0,
+        1, 0.550000011920929, 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645,
+        0, 0.5, 1, 0, 0.5, 0.8500000238418579, 0, 0.5,
+        0.699999988079071, 0, 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0,
+        0.25, 1, 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071,
+        0, 0.25, 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0,
+        1, 0, 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0,
+        0, 0.550000011920929, 0, 0, 0.4000000059604645, 0, 2, 1,
+        0, 1.75, 1, 0, 1.75, 0.8500000238418579, 0, 2,
+        0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2, 0.699999988079071, 0,
+        1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0, 1.75, 0.4000000059604645,
+        0, 2, 0.4000000059604645, 0, 1.5, 1, 0, 1.5,
+        0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5, 0.550000011920929, 0,
+        1.5, 0.4000000059604645, 0, 1.25, 1, 0, 1.25, 0.8500000238418579,
+        0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929, 0, 1.25,
+        0.4000000059604645, 0, 1, 1, 0, 1, 0.8500000238418579, 0,
+        1, 0.699999988079071, 0, 1, 0.550000011920929, 0, 1, 0.4000000059604645,
+        0, 1, 1, 0, 0.75, 1, 0, 0.75,
+        0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75, 0.699999988079071, 0,
+        1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0, 1, 0.550000011920929,
+        0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645, 0, 0.5,
+        1, 0, 0.5, 0.8500000238418579, 0, 0.5, 0.699999988079071, 0,
+        0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0, 0.25, 1,
+        0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071, 0, 0.25,
+        0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0, 1, 0,
+        0, 0.8500000238418579, 0, 0, 0.699999988079071, 0, 0, 0.550000011920929,
+        0, 0, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.75,
+        0.4000000059604645, 0, 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0,
+        1.75, 0.20000000298023224, 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612,
+        0, 2, 0.10000000149011612, 0, 1.75, 0, 0, 2,
+        0, 0, 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0,
+        1.5, 0.20000000298023224, 0, 1.5, 0.10000000149011612, 0, 1.5, 0,
+        0, 1.25, 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25,
+        0.20000000298023224, 0, 1.25, 0.10000000149011612, 0, 1.25, 0, 0,
+        1, 0.4000000059604645, 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224,
+        0, 1, 0.10000000149011612, 0, 1, 0, 0, 1,
+        0.4000000059604645, 0, 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0,
+        1, 0.30000001192092896, 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224,
+        0, 0.75, 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75,
+        0, 0, 1, 0, 0, 0.5, 0.4000000059604645, 0,
+        0.5, 0.30000001192092896, 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612,
+        0, 0.5, 0, 0, 0.25, 0.4000000059604645, 0, 0.25,
+        0.30000001192092896, 0, 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0,
+        0.25, 0, 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896,
+        0, 0, 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0,
+        0, 0, 2, 0.4000000059604645, 0, 1.75, 0.4000000059604645, 0,
+        1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0, 1.75, 0.20000000298023224,
+        0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612, 0, 2,
+        0.10000000149011612, 0, 1.75, 0, 0, 2, 0, 0,
+        1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0, 1.5, 0.20000000298023224,
+        0, 1.5, 0.10000000149011612, 0, 1.5, 0, 0, 1.25,
+        0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25, 0.20000000298023224, 0,
+        1.25, 0.10000000149011612, 0, 1.25, 0, 0, 1, 0.4000000059604645,
+        0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224, 0, 1,
+        0.10000000149011612, 0, 1, 0, 0, 1, 0.4000000059604645, 0,
+        0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0, 1, 0.30000001192092896,
+        0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224, 0, 0.75,
+        0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75, 0, 0,
+        1, 0, 0, 0.5, 0.4000000059604645, 0, 0.5, 0.30000001192092896,
+        0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612, 0, 0.5,
+        0, 0, 0.25, 0.4000000059604645, 0, 0.25, 0.30000001192092896, 0,
+        0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0, 0.25, 0,
+        0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896, 0, 0,
+        0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0, 0, 0,
+        1, 1, 0, 0.875, 1, 0, 0.875, 0.875,
+        0, 1, 0.875, 0, 0.875, 0.75, 0, 1,
+        0.75, 0, 0.875, 0.625, 0, 1, 0.625, 0,
+        0.875, 0.5, 0, 1, 0.5, 0, 0.75, 1,
+        0, 0.75, 0.875, 0, 0.75, 0.75, 0, 0.75,
+        0.625, 0, 0.75, 0.5, 0, 0.625, 1, 0,
+        0.625, 0.875, 0, 0.625, 0.75, 0, 0.625, 0.625,
+        0, 0.625, 0.5, 0, 0.5, 1, 0, 0.5,
+        0.875, 0, 0.5, 0.75, 0, 0.5, 0.625, 0,
+        0.5, 0.5, 0, 0.5, 1, 0, 0.375, 1,
+        0, 0.375, 0.875, 0, 0.5, 0.875, 0, 0.375,
+        0.75, 0, 0.5, 0.75, 0, 0.375, 0.625, 0,
+        0.5, 0.625, 0, 0.375, 0.5, 0, 0.5, 0.5,
+        0, 0.25, 1, 0, 0.25, 0.875, 0, 0.25,
+        0.75, 0, 0.25, 0.625, 0, 0.25, 0.5, 0,
+        0.125, 1, 0, 0.125, 0.875, 0, 0.125, 0.75,
+        0, 0.125, 0.625, 0, 0.125, 0.5, 0, 0,
+        1, 0, 0, 0.875, 0, 0, 0.75, 0,
+        0, 0.625, 0, 0, 0.5, 0, 1, 0.5,
+        0, 0.875, 0.5, 0, 0.875, 0.375, 0, 1,
+        0.375, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+        0.875, 0.125, 0, 1, 0.125, 0, 0.875, 0,
+        0, 1, 0, 0, 0.75, 0.5, 0, 0.75,
+        0.375, 0, 0.75, 0.25, 0, 0.75, 0.125, 0,
+        0.75, 0, 0, 0.625, 0.5, 0, 0.625, 0.375,
+        0, 0.625, 0.25, 0, 0.625, 0.125, 0, 0.625,
+        0, 0, 0.5, 0.5, 0, 0.5, 0.375, 0,
+        0.5, 0.25, 0, 0.5, 0.125, 0, 0.5, 0,
+        0, 0.5, 0.5, 0, 0.375, 0.5, 0, 0.375,
+        0.375, 0, 0.5, 0.375, 0, 0.375, 0.25, 0,
+        0.5, 0.25, 0, 0.375, 0.125, 0, 0.5, 0.125,
+        0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+        0.5, 0, 0.25, 0.375, 0, 0.25, 0.25, 0,
+        0.25, 0.125, 0, 0.25, 0, 0, 0.125, 0.5,
+        0, 0.125, 0.375, 0, 0.125, 0.25, 0, 0.125,
+        0.125, 0, 0.125, 0, 0, 0, 0.5, 0,
+        0, 0.375, 0, 0, 0.25, 0, 0, 0.125,
+        0, 0, 0, 0, 0.5, 0, 0, 0.625,
+        0, 0, 0.625, 0.22499999403953552, 0, 0.5, 0.22499999403953552, 0,
+        0.625, 0.44999998807907104, 0, 0.5, 0.44999998807907104, 0, 0.625, 0.675000011920929,
+        0, 0.5, 0.675000011920929, 0, 0.625, 0.8999999761581421, 0, 0.5,
+        0.8999999761581421, 0, 0.75, 0, 0, 0.75, 0.22499999403953552, 0,
+        0.75, 0.44999998807907104, 0, 0.75, 0.675000011920929, 0, 0.75, 0.8999999761581421,
+        0, 0.875, 0, 0, 0.875, 0.22499999403953552, 0, 0.875,
+        0.44999998807907104, 0, 0.875, 0.675000011920929, 0, 0.875, 0.8999999761581421, 0,
+        1, 0, 0, 1, 0.22499999403953552, 0, 1, 0.44999998807907104,
+        0, 1, 0.675000011920929, 0, 1, 0.8999999761581421, 0, 0,
+        0, 0, 0.125, 0, 0, 0.125, 0.22499999403953552, 0,
+        0, 0.22499999403953552, 0, 0.125, 0.44999998807907104, 0, 0, 0.44999998807907104,
+        0, 0.125, 0.675000011920929, 0, 0, 0.675000011920929, 0, 0.125,
+        0.8999999761581421, 0, 0, 0.8999999761581421, 0, 0.25, 0, 0,
+        0.25, 0.22499999403953552, 0, 0.25, 0.44999998807907104, 0, 0.25, 0.675000011920929,
+        0, 0.25, 0.8999999761581421, 0, 0.375, 0, 0, 0.375,
+        0.22499999403953552, 0, 0.375, 0.44999998807907104, 0, 0.375, 0.675000011920929, 0,
+        0.375, 0.8999999761581421, 0, 0.5, 0, 0, 0.5, 0.22499999403953552,
+        0, 0.5, 0.44999998807907104, 0, 0.5, 0.675000011920929, 0, 0.5,
+        0.8999999761581421, 0, 0.5, 0.8999999761581421, 0, 0.625, 0.8999999761581421, 0,
+        0.625, 0.925000011920929, 0, 0.5, 0.925000011920929, 0, 0.625, 0.949999988079071,
+        0, 0.5, 0.949999988079071, 0, 0.625, 0.9750000238418579, 0, 0.5,
+        0.9750000238418579, 0, 0.625, 1, 0, 0.5, 1, 0,
+        0.75, 0.8999999761581421, 0, 0.75, 0.925000011920929, 0, 0.75, 0.949999988079071,
+        0, 0.75, 0.9750000238418579, 0, 0.75, 1, 0, 0.875,
+        0.8999999761581421, 0, 0.875, 0.925000011920929, 0, 0.875, 0.949999988079071, 0,
+        0.875, 0.9750000238418579, 0, 0.875, 1, 0, 1, 0.8999999761581421,
+        0, 1, 0.925000011920929, 0, 1, 0.949999988079071, 0, 1,
+        0.9750000238418579, 0, 1, 1, 0, 0, 0.8999999761581421, 0,
+        0.125, 0.8999999761581421, 0, 0.125, 0.925000011920929, 0, 0, 0.925000011920929,
+        0, 0.125, 0.949999988079071, 0, 0, 0.949999988079071, 0, 0.125,
+        0.9750000238418579, 0, 0, 0.9750000238418579, 0, 0.125, 1, 0,
+        0, 1, 0, 0.25, 0.8999999761581421, 0, 0.25, 0.925000011920929,
+        0, 0.25, 0.949999988079071, 0, 0.25, 0.9750000238418579, 0, 0.25,
+        1, 0, 0.375, 0.8999999761581421, 0, 0.375, 0.925000011920929, 0,
+        0.375, 0.949999988079071, 0, 0.375, 0.9750000238418579, 0, 0.375, 1,
+        0, 0.5, 0.8999999761581421, 0, 0.5, 0.925000011920929, 0, 0.5,
+        0.949999988079071, 0, 0.5, 0.9750000238418579, 0, 0.5, 1, 0,
+        1, 1, 0, 0.875, 1, 0, 0.875, 0.75,
+        0, 1, 0.75, 0, 0.875, 0.5, 0, 1,
+        0.5, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+        0.875, 0, 0, 1, 0, 0, 0.75, 1,
+        0, 0.75, 0.75, 0, 0.75, 0.5, 0, 0.75,
+        0.25, 0, 0.75, 0, 0, 0.625, 1, 0,
+        0.625, 0.75, 0, 0.625, 0.5, 0, 0.625, 0.25,
+        0, 0.625, 0, 0, 0.5, 1, 0, 0.5,
+        0.75, 0, 0.5, 0.5, 0, 0.5, 0.25, 0,
+        0.5, 0, 0, 0.5, 1, 0, 0.375, 1,
+        0, 0.375, 0.75, 0, 0.5, 0.75, 0, 0.375,
+        0.5, 0, 0.5, 0.5, 0, 0.375, 0.25, 0,
+        0.5, 0.25, 0, 0.375, 0, 0, 0.5, 0,
+        0, 0.25, 1, 0, 0.25, 0.75, 0, 0.25,
+        0.5, 0, 0.25, 0.25, 0, 0.25, 0, 0,
+        0.125, 1, 0, 0.125, 0.75, 0, 0.125, 0.5,
+        0, 0.125, 0.25, 0, 0.125, 0, 0, 0,
+        1, 0, 0, 0.75, 0, 0, 0.5, 0,
+        0, 0.25, 0, 0, 0, 0, 1, 1,
+        0, 0.875, 1, 0, 0.875, 0.75, 0, 1,
+        0.75, 0, 0.875, 0.5, 0, 1, 0.5, 0,
+        0.875, 0.25, 0, 1, 0.25, 0, 0.875, 0,
+        0, 1, 0, 0, 0.75, 1, 0, 0.75,
+        0.75, 0, 0.75, 0.5, 0, 0.75, 0.25, 0,
+        0.75, 0, 0, 0.625, 1, 0, 0.625, 0.75,
+        0, 0.625, 0.5, 0, 0.625, 0.25, 0, 0.625,
+        0, 0, 0.5, 1, 0, 0.5, 0.75, 0,
+        0.5, 0.5, 0, 0.5, 0.25, 0, 0.5, 0,
+        0, 0.5, 1, 0, 0.375, 1, 0, 0.375,
+        0.75, 0, 0.5, 0.75, 0, 0.375, 0.5, 0,
+        0.5, 0.5, 0, 0.375, 0.25, 0, 0.5, 0.25,
+        0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+        1, 0, 0.25, 0.75, 0, 0.25, 0.5, 0,
+        0.25, 0.25, 0, 0.25, 0, 0, 0.125, 1,
+        0, 0.125, 0.75, 0, 0.125, 0.5, 0, 0.125,
+        0.25, 0, 0.125, 0, 0, 0, 1, 0,
+        0, 0.75, 0, 0, 0.5, 0, 0, 0.25,
+        0, 0, 0, 0, 1, 1, 0, 0.875,
+        1, 0, 0.875, 0.75, 0, 1, 0.75, 0,
+        0.875, 0.5, 0, 1, 0.5, 0, 0.875, 0.25,
+        0, 1, 0.25, 0, 0.875, 0, 0, 1,
+        0, 0, 0.75, 1, 0, 0.75, 0.75, 0,
+        0.75, 0.5, 0, 0.75, 0.25, 0, 0.75, 0,
+        0, 0.625, 1, 0, 0.625, 0.75, 0, 0.625,
+        0.5, 0, 0.625, 0.25, 0, 0.625, 0, 0,
+        0.5, 1, 0, 0.5, 0.75, 0, 0.5, 0.5,
+        0, 0.5, 0.25, 0, 0.5, 0, 0, 0.5,
+        1, 0, 0.375, 1, 0, 0.375, 0.75, 0,
+        0.5, 0.75, 0, 0.375, 0.5, 0, 0.5, 0.5,
+        0, 0.375, 0.25, 0, 0.5, 0.25, 0, 0.375,
+        0, 0, 0.5, 0, 0, 0.25, 1, 0,
+        0.25, 0.75, 0, 0.25, 0.5, 0, 0.25, 0.25,
+        0, 0.25, 0, 0, 0.125, 1, 0, 0.125,
+        0.75, 0, 0.125, 0.5, 0, 0.125, 0.25, 0,
+        0.125, 0, 0, 0, 1, 0, 0, 0.75,
+        0, 0, 0.5, 0, 0, 0.25, 0, 0,
+        0, 0, 1, 1, 0, 0.875, 1, 0,
+        0.875, 0.75, 0, 1, 0.75, 0, 0.875, 0.5,
+        0, 1, 0.5, 0, 0.875, 0.25, 0, 1,
+        0.25, 0, 0.875, 0, 0, 1, 0, 0,
+        0.75, 1, 0, 0.75, 0.75, 0, 0.75, 0.5,
+        0, 0.75, 0.25, 0, 0.75, 0, 0, 0.625,
+        1, 0, 0.625, 0.75, 0, 0.625, 0.5, 0,
+        0.625, 0.25, 0, 0.625, 0, 0, 0.5, 1,
+        0, 0.5, 0.75, 0, 0.5, 0.5, 0, 0.5,
+        0.25, 0, 0.5, 0, 0, 0.5, 1, 0,
+        0.375, 1, 0, 0.375, 0.75, 0, 0.5, 0.75,
+        0, 0.375, 0.5, 0, 0.5, 0.5, 0, 0.375,
+        0.25, 0, 0.5, 0.25, 0, 0.375, 0, 0,
+        0.5, 0, 0, 0.25, 1, 0, 0.25, 0.75,
+        0, 0.25, 0.5, 0, 0.25, 0.25, 0, 0.25,
+        0, 0, 0.125, 1, 0, 0.125, 0.75, 0,
+        0.125, 0.5, 0, 0.125, 0.25, 0, 0.125, 0,
+        0, 0, 1, 0, 0, 0.75, 0, 0,
+        0.5, 0, 0, 0.25, 0, 0, 0, 0 };
+
+uint16_t  teapotIndices[] = { 0, 1, 2, 2, 3, 0, 3, 2, 4, 4, 5, 3, 5, 4, 6, 6, 7, 5, 7, 6, 8, 8, 9, 7,
+        1, 10, 11, 11, 2, 1, 2, 11, 12, 12, 4, 2, 4, 12, 13, 13, 6, 4, 6, 13, 14, 14, 8, 6,
+        10, 15, 16, 16, 11, 10, 11, 16, 17, 17, 12, 11, 12, 17, 18, 18, 13, 12, 13, 18, 19, 19, 14, 13,
+        15, 20, 21, 21, 16, 15, 16, 21, 22, 22, 17, 16, 17, 22, 23, 23, 18, 17, 18, 23, 24, 24, 19, 18,
+        25, 26, 27, 27, 28, 25, 28, 27, 29, 29, 30, 28, 30, 29, 31, 31, 32, 30, 32, 31, 33, 33, 34, 32,
+        26, 35, 36, 36, 27, 26, 27, 36, 37, 37, 29, 27, 29, 37, 38, 38, 31, 29, 31, 38, 39, 39, 33, 31,
+        35, 40, 41, 41, 36, 35, 36, 41, 42, 42, 37, 36, 37, 42, 43, 43, 38, 37, 38, 43, 44, 44, 39, 38,
+        40, 45, 46, 46, 41, 40, 41, 46, 47, 47, 42, 41, 42, 47, 48, 48, 43, 42, 43, 48, 49, 49, 44, 43,
+        50, 51, 52, 52, 53, 50, 53, 52, 54, 54, 55, 53, 55, 54, 56, 56, 57, 55, 57, 56, 58, 58, 59, 57,
+        51, 60, 61, 61, 52, 51, 52, 61, 62, 62, 54, 52, 54, 62, 63, 63, 56, 54, 56, 63, 64, 64, 58, 56,
+        60, 65, 66, 66, 61, 60, 61, 66, 67, 67, 62, 61, 62, 67, 68, 68, 63, 62, 63, 68, 69, 69, 64, 63,
+        65, 70, 71, 71, 66, 65, 66, 71, 72, 72, 67, 66, 67, 72, 73, 73, 68, 67, 68, 73, 74, 74, 69, 68,
+        75, 76, 77, 77, 78, 75, 78, 77, 79, 79, 80, 78, 80, 79, 81, 81, 82, 80, 82, 81, 83, 83, 84, 82,
+        76, 85, 86, 86, 77, 76, 77, 86, 87, 87, 79, 77, 79, 87, 88, 88, 81, 79, 81, 88, 89, 89, 83, 81,
+        85, 90, 91, 91, 86, 85, 86, 91, 92, 92, 87, 86, 87, 92, 93, 93, 88, 87, 88, 93, 94, 94, 89, 88,
+        90, 95, 96, 96, 91, 90, 91, 96, 97, 97, 92, 91, 92, 97, 98, 98, 93, 92, 93, 98, 99, 99, 94, 93,
+        100, 101, 102, 102, 103, 100, 103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108, 108, 109, 107,
+        101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102, 104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106,
+        110, 115, 116, 116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112, 113, 118, 119, 119, 114, 113,
+        115, 120, 121, 121, 116, 115, 116, 121, 122, 122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,
+        125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131, 131, 132, 130, 132, 131, 133, 133, 134, 132,
+        126, 135, 136, 136, 127, 126, 127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139, 139, 133, 131,
+        135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136, 137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138,
+        140, 145, 146, 146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142, 143, 148, 149, 149, 144, 143,
+        150, 151, 152, 152, 153, 150, 153, 152, 154, 154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,
+        151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163, 163, 156, 154, 156, 163, 164, 164, 158, 156,
+        160, 165, 166, 166, 161, 160, 161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169, 169, 164, 163,
+        165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166, 167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168,
+        175, 176, 177, 177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180, 182, 181, 183, 183, 184, 182,
+        176, 185, 186, 186, 177, 176, 177, 186, 187, 187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,
+        185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193, 193, 188, 187, 188, 193, 194, 194, 189, 188,
+        190, 195, 196, 196, 191, 190, 191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199, 199, 194, 193,
+        200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203, 205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207,
+        201, 210, 211, 211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204, 206, 213, 214, 214, 208, 206,
+        210, 215, 216, 216, 211, 210, 211, 216, 217, 217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,
+        215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223, 223, 218, 217, 218, 223, 224, 224, 219, 218,
+        225, 226, 227, 227, 228, 225, 228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233, 233, 234, 232,
+        226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227, 229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231,
+        235, 240, 241, 241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237, 238, 243, 244, 244, 239, 238,
+        240, 245, 246, 246, 241, 240, 241, 246, 247, 247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,
+        250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256, 256, 257, 255, 257, 256, 258, 258, 259, 257,
+        251, 260, 261, 261, 252, 251, 252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264, 264, 258, 256,
+        260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261, 262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263,
+        265, 270, 271, 271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267, 268, 273, 274, 274, 269, 268,
+        275, 276, 277, 277, 278, 275, 278, 277, 279, 279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,
+        276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288, 288, 281, 279, 281, 288, 289, 289, 283, 281,
+        285, 290, 291, 291, 286, 285, 286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294, 294, 289, 288,
+        290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291, 292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293,
+        300, 301, 302, 302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305, 307, 306, 308, 308, 309, 307,
+        301, 310, 311, 311, 302, 301, 302, 311, 312, 312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,
+        310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318, 318, 313, 312, 313, 318, 319, 319, 314, 313,
+        315, 320, 321, 321, 316, 315, 316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324, 324, 319, 318,
+        325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328, 330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332,
+        326, 335, 336, 336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329, 331, 338, 339, 339, 333, 331,
+        335, 340, 341, 341, 336, 335, 336, 341, 342, 342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,
+        340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348, 348, 343, 342, 343, 348, 349, 349, 344, 343,
+        350, 351, 352, 352, 353, 350, 353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358, 358, 359, 357,
+        351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352, 354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356,
+        360, 365, 366, 366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362, 363, 368, 369, 369, 364, 363,
+        365, 370, 371, 371, 366, 365, 366, 371, 372, 372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,
+        375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381, 381, 382, 380, 382, 381, 383, 383, 384, 382,
+        376, 385, 386, 386, 377, 376, 377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389, 389, 383, 381,
+        385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386, 387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388,
+        390, 395, 396, 396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392, 393, 398, 399, 399, 394, 393,
+        400, 401, 402, 402, 403, 400, 403, 402, 404, 404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,
+        401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413, 413, 406, 404, 406, 413, 414, 414, 408, 406,
+        410, 415, 416, 416, 411, 410, 411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419, 419, 414, 413,
+        415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416, 417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418,
+        425, 426, 427, 427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430, 432, 431, 433, 433, 434, 432,
+        426, 435, 436, 436, 427, 426, 427, 436, 437, 437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,
+        435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443, 443, 438, 437, 438, 443, 444, 444, 439, 438,
+        440, 445, 446, 446, 441, 440, 441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449, 449, 444, 443,
+        450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453, 455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457,
+        451, 460, 461, 461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454, 456, 463, 464, 464, 458, 456,
+        460, 465, 466, 466, 461, 460, 461, 466, 467, 467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,
+        465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473, 473, 468, 467, 468, 473, 474, 474, 469, 468,
+        475, 476, 477, 477, 478, 475, 478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483, 483, 484, 482,
+        476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477, 479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481,
+        485, 490, 491, 491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487, 488, 493, 494, 494, 489, 488,
+        490, 495, 496, 496, 491, 490, 491, 496, 497, 497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,
+        500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506, 506, 507, 505, 507, 506, 508, 508, 509, 507,
+        501, 510, 511, 511, 502, 501, 502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514, 514, 508, 506,
+        510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511, 512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513,
+        515, 520, 521, 521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517, 518, 523, 524, 524, 519, 518,
+        525, 526, 527, 527, 528, 525, 528, 527, 529, 529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,
+        526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538, 538, 531, 529, 531, 538, 539, 539, 533, 531,
+        535, 540, 541, 541, 536, 535, 536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544, 544, 539, 538,
+        540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541, 542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543,
+        550, 551, 552, 552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555, 557, 556, 558, 558, 559, 557,
+        551, 560, 561, 561, 552, 551, 552, 561, 562, 562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,
+        560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568, 568, 563, 562, 563, 568, 569, 569, 564, 563,
+        565, 570, 571, 571, 566, 565, 566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574, 574, 569, 568,
+        575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578, 580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582,
+        576, 585, 586, 586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579, 581, 588, 589, 589, 583, 581,
+        585, 590, 591, 591, 586, 585, 586, 591, 592, 592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,
+        590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598, 598, 593, 592, 593, 598, 599, 599, 594, 593,
+        600, 601, 602, 602, 603, 600, 603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608, 608, 609, 607,
+        601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602, 604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606,
+        610, 615, 616, 616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612, 613, 618, 619, 619, 614, 613,
+        615, 620, 621, 621, 616, 615, 616, 621, 622, 622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,
+        625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631, 631, 632, 630, 632, 631, 633, 633, 634, 632,
+        626, 635, 636, 636, 627, 626, 627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639, 639, 633, 631,
+        635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636, 637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638,
+        640, 645, 646, 646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642, 643, 648, 649, 649, 644, 643,
+        650, 651, 652, 652, 653, 650, 653, 652, 654, 654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,
+        651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663, 663, 656, 654, 656, 663, 664, 664, 658, 656,
+        660, 665, 666, 666, 661, 660, 661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669, 669, 664, 663,
+        665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666, 667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668,
+        675, 676, 677, 677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680, 682, 681, 683, 683, 684, 682,
+        676, 685, 686, 686, 677, 676, 677, 686, 687, 687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,
+        685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693, 693, 688, 687, 688, 693, 694, 694, 689, 688,
+        690, 695, 696, 696, 691, 690, 691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699, 699, 694, 693,
+        700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703, 705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707,
+        701, 710, 711, 711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704, 706, 713, 714, 714, 708, 706,
+        710, 715, 716, 716, 711, 710, 711, 716, 717, 717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,
+        715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723, 723, 718, 717, 718, 723, 724, 724, 719, 718,
+        725, 726, 727, 727, 728, 725, 728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733, 733, 734, 732,
+        726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727, 729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731,
+        735, 740, 741, 741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737, 738, 743, 744, 744, 739, 738,
+        740, 745, 746, 746, 741, 740, 741, 746, 747, 747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,
+        750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756, 756, 757, 755, 757, 756, 758, 758, 759, 757,
+        751, 760, 761, 761, 752, 751, 752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764, 764, 758, 756,
+        760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761, 762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763,
+        765, 770, 771, 771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767, 768, 773, 774, 774, 769, 768,
+        775, 776, 777, 777, 778, 775, 778, 777, 779, 779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,
+        776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788, 788, 781, 779, 781, 788, 789, 789, 783, 781,
+        785, 790, 791, 791, 786, 785, 786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794, 794, 789, 788,
+        790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791, 792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793 };
diff --git a/ndk/platforms/android-17/samples/Teapot/lint.xml b/ndk/platforms/android-17/samples/Teapot/lint.xml
new file mode 100644
index 0000000..ee0eead
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/lint.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+</lint>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/project.properties b/ndk/platforms/android-17/samples/Teapot/project.properties
new file mode 100644
index 0000000..d5ad9f8
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=Google Inc.:Google APIs:19
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..ea01cbf
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..a3d6a18
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8f80897
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png b/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..b779a2b
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml b/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml
new file mode 100644
index 0000000..36b64f3
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/layout/widgets.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="top"
+    android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/textViewFPS"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="right"
+        android:text="0.0 FPS"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="@android:color/white" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml
new file mode 100644
index 0000000..541752f
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <!--
+        Base application theme for API 11+. This theme completely replaces
+        AppBaseTheme from res/values/styles.xml on API 11+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+        <!-- API 11 theme customizations can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml
new file mode 100644
index 0000000..f20e015
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+        Base application theme for API 14+. This theme completely replaces
+        AppBaseTheme from BOTH res/values/styles.xml and
+        res/values-v11/styles.xml on API 14+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- API 14 theme customizations can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml b/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml
new file mode 100644
index 0000000..a13b1f0
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values/strings.xml
@@ -0,0 +1,5 @@
+<resources>
+
+    <string name="app_name">Teapot</string>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml b/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml
new file mode 100644
index 0000000..4a10ca4
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+    <!--
+        Base application theme, dependent on API level. This theme is replaced
+        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Light">
+        <!--
+            Theme customizations available in newer API levels can go in
+            res/values-vXX/styles.xml, while customizations related to
+            backward-compatibility can go here.
+        -->
+    </style>
+
+    <!-- Application theme. -->
+    <style name="AppTheme" parent="AppBaseTheme">
+        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
new file mode 100644
index 0000000..3385a5d
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.helper;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+public class NDKHelper
+{
+    private static Context context;
+
+    public static void setContext(Context c)
+    {
+        Log.i("NDKHelper", "setContext:" + c);
+        context = c;
+    }
+
+    //
+    // Load Bitmap
+    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+    // etc separately
+    //
+    private int nextPOT(int i)
+    {
+        int pot = 1;
+        while (pot < i)
+            pot <<= 1;
+        return pot;
+    }
+
+    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
+    {
+        if (bitmapToScale == null)
+            return null;
+        // get the original width and height
+        int width = bitmapToScale.getWidth();
+        int height = bitmapToScale.getHeight();
+        // create a matrix for the manipulation
+        Matrix matrix = new Matrix();
+
+        // resize the bit map
+        matrix.postScale(newWidth / width, newHeight / height);
+
+        // recreate the new Bitmap and set it back
+        return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+                bitmapToScale.getHeight(), matrix, true);
+    }
+
+    public boolean loadTexture(String path)
+    {
+        Bitmap bitmap = null;
+        try
+        {
+            String str = path;
+            if (!path.startsWith("/"))
+            {
+                str = "/" + path;
+            }
+
+            File file = new File(context.getExternalFilesDir(null), str);
+            if (file.canRead())
+            {
+                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
+            } else
+            {
+                bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+                        .open(path));
+            }
+            // Matrix matrix = new Matrix();
+            // // resize the bit map
+            // matrix.postScale(-1F, 1F);
+            //
+            // // recreate the new Bitmap and set it back
+            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+            // bitmap.getHeight(), matrix, true);
+
+        } catch (Exception e)
+        {
+            Log.w("NDKHelper", "Coundn't load a file:" + path);
+            return false;
+        }
+
+        if (bitmap != null)
+        {
+            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
+        }
+        return true;
+
+    }
+
+    public Bitmap openBitmap(String path, boolean iScalePOT)
+    {
+        Bitmap bitmap = null;
+        try
+        {
+            bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+                    .open(path));
+            if (iScalePOT)
+            {
+                int originalWidth = getBitmapWidth(bitmap);
+                int originalHeight = getBitmapHeight(bitmap);
+                int width = nextPOT(originalWidth);
+                int height = nextPOT(originalHeight);
+                if (originalWidth != width || originalHeight != height)
+                {
+                    // Scale it
+                    bitmap = scaleBitmap(bitmap, width, height);
+                }
+            }
+
+        } catch (Exception e)
+        {
+            Log.w("NDKHelper", "Coundn't load a file:" + path);
+        }
+
+        return bitmap;
+    }
+
+    public int getBitmapWidth(Bitmap bmp)
+    {
+        return bmp.getWidth();
+    }
+
+    public int getBitmapHeight(Bitmap bmp)
+    {
+        return bmp.getHeight();
+    }
+
+    public void getBitmapPixels(Bitmap bmp, int[] pixels)
+    {
+        int w = bmp.getWidth();
+        int h = bmp.getHeight();
+        bmp.getPixels(pixels, 0, w, 0, 0, w, h);
+    }
+
+    public void closeBitmap(Bitmap bmp)
+    {
+        bmp.recycle();
+    }
+
+    public static String getNativeLibraryDirectory(Context appContext)
+    {
+        ApplicationInfo ai = context.getApplicationInfo();
+
+        Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
+
+        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+        {
+            return ai.nativeLibraryDir;
+        }
+        return "/system/lib/";
+    }
+
+    public int getNativeAudioBufferSize()
+    {
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        if (SDK_INT >= 17)
+        {
+            AudioManager am = (AudioManager) context
+                    .getSystemService(Context.AUDIO_SERVICE);
+            String framesPerBuffer = am
+                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+            return Integer.parseInt(framesPerBuffer);
+        } else
+        {
+            return 0;
+        }
+    }
+
+    public int getNativeAudioSampleRate()
+    {
+        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+    }
+
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
new file mode 100644
index 0000000..3b24bc4
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.teapot;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.opengl.GLUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+public class TeapotApplication extends Application {
+    public void onCreate(){
+        Log.w("native-activity", "onCreate");
+
+        final PackageManager pm = getApplicationContext().getPackageManager();
+        ApplicationInfo ai;
+        try {
+            ai = pm.getApplicationInfo( this.getPackageName(), 0);
+        } catch (final NameNotFoundException e) {
+            ai = null;
+        }
+        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
+        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();
+    }
+}
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
new file mode 100644
index 0000000..9e296e4
--- /dev/null
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.teapot;
+
+import android.app.NativeActivity;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.WindowManager.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+public class TeapotNativeActivity extends NativeActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        //Hide toolbar
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        if(SDK_INT >= 19)
+        {
+            setImmersiveSticky();
+
+            View decorView = getWindow().getDecorView();
+            decorView.setOnSystemUiVisibilityChangeListener
+                    (new View.OnSystemUiVisibilityChangeListener() {
+                @Override
+                public void onSystemUiVisibilityChange(int visibility) {
+                    setImmersiveSticky();
+                }
+            });
+        }
+
+    }
+
+    protected void onResume() {
+        super.onResume();
+
+        //Hide toolbar
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        if(SDK_INT >= 11 && SDK_INT < 14)
+        {
+            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
+        }
+        else if(SDK_INT >= 14 && SDK_INT < 19)
+        {
+            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
+        }
+        else if(SDK_INT >= 19)
+        {
+            setImmersiveSticky();
+        }
+
+    }
+    // Our popup window, you will call it from your C/C++ code later
+
+    void setImmersiveSticky() {
+        View decorView = getWindow().getDecorView();
+        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+    }
+
+    TeapotNativeActivity _activity;
+    PopupWindow _popupWindow;
+    TextView _label;
+
+    public void showUI()
+    {
+        if( _popupWindow != null )
+            return;
+
+        _activity = this;
+
+        this.runOnUiThread(new Runnable()  {
+            @Override
+            public void run()  {
+                LayoutInflater layoutInflater
+                = (LayoutInflater)getBaseContext()
+                .getSystemService(LAYOUT_INFLATER_SERVICE);
+                View popupView = layoutInflater.inflate(R.layout.widgets, null);
+                _popupWindow = new PopupWindow(
+                        popupView,
+                        LayoutParams.WRAP_CONTENT,
+                        LayoutParams.WRAP_CONTENT);
+
+                LinearLayout mainLayout = new LinearLayout(_activity);
+                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+                params.setMargins(0, 0, 0, 0);
+                _activity.setContentView(mainLayout, params);
+
+                // Show our UI over NativeActivity window
+                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.LEFT, 10, 10);
+                _popupWindow.update();
+
+                _label = (TextView)popupView.findViewById(R.id.textViewFPS);
+
+            }});
+    }
+
+    protected void onPause()
+    {
+        super.onPause();
+        if (_popupWindow != null) {
+            _popupWindow.dismiss();
+            _popupWindow = null;
+        }
+    }
+
+    public void updateFPS(final float fFPS)
+    {
+        if( _label == null )
+            return;
+
+        _activity = this;
+        this.runOnUiThread(new Runnable()  {
+            @Override
+            public void run()  {
+                _label.setText(String.format("%2.2f FPS", fFPS));
+
+            }});
+    }
+}
+
+
diff --git a/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..7701917
--- /dev/null
+++ b/ndk/platforms/android-18/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,239 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-18/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..b7360ba
--- /dev/null
+++ b/ndk/platforms/android-18/arch-mips/symbols/libm.so.functions.txt
@@ -0,0 +1,191 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-18/arch-mips/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt b/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..e78f0e3
--- /dev/null
+++ b/ndk/platforms/android-18/arch-x86/symbols/libm.so.functions.txt
@@ -0,0 +1,202 @@
+__exp__D
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__log__D
+__signbit
+__signbitf
+__signbitl
+_scan_nan
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+feclearexcept
+fedisableexcept
+feenableexcept
+fegetenv
+fegetexcept
+fegetexceptflag
+fegetround
+feholdexcept
+feraiseexcept
+fesetenv
+fesetexceptflag
+fesetround
+fetestexcept
+feupdateenv
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+log2
+log2f
+log2l
+logb
+logbf
+logbl
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nan
+nanf
+nanl
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttoward
+nexttowardf
+nexttowardl
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+tgammaf
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt b/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..6e5cdee
--- /dev/null
+++ b/ndk/platforms/android-18/arch-x86/symbols/libm.so.variables.txt
@@ -0,0 +1,3 @@
+__fe_dfl_env
+__has_sse
+signgam
diff --git a/ndk/platforms/android-18/include/android/bitmap.h b/ndk/platforms/android-18/include/android/bitmap.h
new file mode 100644
index 0000000..6e18763
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/bitmap.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_BITMAP_H
+#define ANDROID_BITMAP_H
+
+#include <stdint.h>
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ANDROID_BITMAP_RESULT_SUCCESS            0
+#define ANDROID_BITMAP_RESULT_BAD_PARAMETER     -1
+#define ANDROID_BITMAP_RESULT_JNI_EXCEPTION     -2
+#define ANDROID_BITMAP_RESULT_ALLOCATION_FAILED -3
+
+/* Backward compatibility: this macro used to be misspelled. */
+#define ANDROID_BITMAP_RESUT_SUCCESS ANDROID_BITMAP_RESULT_SUCCESS
+
+enum AndroidBitmapFormat {
+    ANDROID_BITMAP_FORMAT_NONE      = 0,
+    ANDROID_BITMAP_FORMAT_RGBA_8888 = 1,
+    ANDROID_BITMAP_FORMAT_RGB_565   = 4,
+    ANDROID_BITMAP_FORMAT_RGBA_4444 = 7,
+    ANDROID_BITMAP_FORMAT_A_8       = 8,
+};
+
+typedef struct {
+    uint32_t    width;
+    uint32_t    height;
+    uint32_t    stride;
+    int32_t     format;
+    uint32_t    flags;      // 0 for now
+} AndroidBitmapInfo;
+
+/**
+ * Given a java bitmap object, fill out the AndroidBitmap struct for it.
+ * If the call fails, the info parameter will be ignored
+ */
+int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,
+                          AndroidBitmapInfo* info);
+
+/**
+ * Given a java bitmap object, attempt to lock the pixel address.
+ * Locking will ensure that the memory for the pixels will not move
+ * until the unlockPixels call, and ensure that, if the pixels had been
+ * previously purged, they will have been restored.
+ *
+ * If this call succeeds, it must be balanced by a call to
+ * AndroidBitmap_unlockPixels, after which time the address of the pixels should
+ * no longer be used.
+ *
+ * If this succeeds, *addrPtr will be set to the pixel address. If the call
+ * fails, addrPtr will be ignored.
+ */
+int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr);
+
+/**
+ * Call this to balanace a successful call to AndroidBitmap_lockPixels
+ */
+int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ndk/platforms/android-18/include/android/configuration.h b/ndk/platforms/android-18/include/android/configuration.h
new file mode 100644
index 0000000..d5cddb3
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/configuration.h
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_CONFIGURATION_H
+#define ANDROID_CONFIGURATION_H
+
+#include <android/asset_manager.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct AConfiguration;
+typedef struct AConfiguration AConfiguration;
+
+enum {
+    ACONFIGURATION_ORIENTATION_ANY  = 0x0000,
+    ACONFIGURATION_ORIENTATION_PORT = 0x0001,
+    ACONFIGURATION_ORIENTATION_LAND = 0x0002,
+    ACONFIGURATION_ORIENTATION_SQUARE = 0x0003,
+
+    ACONFIGURATION_TOUCHSCREEN_ANY  = 0x0000,
+    ACONFIGURATION_TOUCHSCREEN_NOTOUCH  = 0x0001,
+    ACONFIGURATION_TOUCHSCREEN_STYLUS  = 0x0002,
+    ACONFIGURATION_TOUCHSCREEN_FINGER  = 0x0003,
+
+    ACONFIGURATION_DENSITY_DEFAULT = 0,
+    ACONFIGURATION_DENSITY_LOW = 120,
+    ACONFIGURATION_DENSITY_MEDIUM = 160,
+    ACONFIGURATION_DENSITY_TV = 213,
+    ACONFIGURATION_DENSITY_HIGH = 240,
+    ACONFIGURATION_DENSITY_XHIGH = 320,
+    ACONFIGURATION_DENSITY_XXHIGH = 480,
+    ACONFIGURATION_DENSITY_XXXHIGH = 640,
+    ACONFIGURATION_DENSITY_NONE = 0xffff,
+
+    ACONFIGURATION_KEYBOARD_ANY  = 0x0000,
+    ACONFIGURATION_KEYBOARD_NOKEYS  = 0x0001,
+    ACONFIGURATION_KEYBOARD_QWERTY  = 0x0002,
+    ACONFIGURATION_KEYBOARD_12KEY  = 0x0003,
+
+    ACONFIGURATION_NAVIGATION_ANY  = 0x0000,
+    ACONFIGURATION_NAVIGATION_NONAV  = 0x0001,
+    ACONFIGURATION_NAVIGATION_DPAD  = 0x0002,
+    ACONFIGURATION_NAVIGATION_TRACKBALL  = 0x0003,
+    ACONFIGURATION_NAVIGATION_WHEEL  = 0x0004,
+
+    ACONFIGURATION_KEYSHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_KEYSHIDDEN_NO = 0x0001,
+    ACONFIGURATION_KEYSHIDDEN_YES = 0x0002,
+    ACONFIGURATION_KEYSHIDDEN_SOFT = 0x0003,
+
+    ACONFIGURATION_NAVHIDDEN_ANY = 0x0000,
+    ACONFIGURATION_NAVHIDDEN_NO = 0x0001,
+    ACONFIGURATION_NAVHIDDEN_YES = 0x0002,
+
+    ACONFIGURATION_SCREENSIZE_ANY  = 0x00,
+    ACONFIGURATION_SCREENSIZE_SMALL = 0x01,
+    ACONFIGURATION_SCREENSIZE_NORMAL = 0x02,
+    ACONFIGURATION_SCREENSIZE_LARGE = 0x03,
+    ACONFIGURATION_SCREENSIZE_XLARGE = 0x04,
+
+    ACONFIGURATION_SCREENLONG_ANY = 0x00,
+    ACONFIGURATION_SCREENLONG_NO = 0x1,
+    ACONFIGURATION_SCREENLONG_YES = 0x2,
+
+    ACONFIGURATION_UI_MODE_TYPE_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_TYPE_NORMAL = 0x01,
+    ACONFIGURATION_UI_MODE_TYPE_DESK = 0x02,
+    ACONFIGURATION_UI_MODE_TYPE_CAR = 0x03,
+    ACONFIGURATION_UI_MODE_TYPE_TELEVISION = 0x04,
+    ACONFIGURATION_UI_MODE_TYPE_APPLIANCE = 0x05,
+
+    ACONFIGURATION_UI_MODE_NIGHT_ANY = 0x00,
+    ACONFIGURATION_UI_MODE_NIGHT_NO = 0x1,
+    ACONFIGURATION_UI_MODE_NIGHT_YES = 0x2,
+
+    ACONFIGURATION_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SCREEN_HEIGHT_DP_ANY = 0x0000,
+
+    ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY = 0x0000,
+
+    ACONFIGURATION_LAYOUTDIR_ANY  = 0x00,
+    ACONFIGURATION_LAYOUTDIR_LTR  = 0x01,
+    ACONFIGURATION_LAYOUTDIR_RTL  = 0x02,
+
+    ACONFIGURATION_MCC = 0x0001,
+    ACONFIGURATION_MNC = 0x0002,
+    ACONFIGURATION_LOCALE = 0x0004,
+    ACONFIGURATION_TOUCHSCREEN = 0x0008,
+    ACONFIGURATION_KEYBOARD = 0x0010,
+    ACONFIGURATION_KEYBOARD_HIDDEN = 0x0020,
+    ACONFIGURATION_NAVIGATION = 0x0040,
+    ACONFIGURATION_ORIENTATION = 0x0080,
+    ACONFIGURATION_DENSITY = 0x0100,
+    ACONFIGURATION_SCREEN_SIZE = 0x0200,
+    ACONFIGURATION_VERSION = 0x0400,
+    ACONFIGURATION_SCREEN_LAYOUT = 0x0800,
+    ACONFIGURATION_UI_MODE = 0x1000,
+    ACONFIGURATION_SMALLEST_SCREEN_SIZE = 0x2000,
+    ACONFIGURATION_LAYOUTDIR = 0x4000,
+};
+
+/**
+ * Create a new AConfiguration, initialized with no values set.
+ */
+AConfiguration* AConfiguration_new();
+
+/**
+ * Free an AConfiguration that was previously created with
+ * AConfiguration_new().
+ */
+void AConfiguration_delete(AConfiguration* config);
+
+/**
+ * Create and return a new AConfiguration based on the current configuration in
+ * use in the given AssetManager.
+ */
+void AConfiguration_fromAssetManager(AConfiguration* out, AAssetManager* am);
+
+/**
+ * Copy the contents of 'src' to 'dest'.
+ */
+void AConfiguration_copy(AConfiguration* dest, AConfiguration* src);
+
+/**
+ * Return the current MCC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMcc(AConfiguration* config);
+
+/**
+ * Set the current MCC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMcc(AConfiguration* config, int32_t mcc);
+
+/**
+ * Return the current MNC set in the configuration.  0 if not set.
+ */
+int32_t AConfiguration_getMnc(AConfiguration* config);
+
+/**
+ * Set the current MNC in the configuration.  0 to clear.
+ */
+void AConfiguration_setMnc(AConfiguration* config, int32_t mnc);
+
+/**
+ * Return the current language code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a language is not set, they will be 0.
+ */
+void AConfiguration_getLanguage(AConfiguration* config, char* outLanguage);
+
+/**
+ * Set the current language code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setLanguage(AConfiguration* config, const char* language);
+
+/**
+ * Return the current country code set in the configuration.  The output will
+ * be filled with an array of two characters.  They are not 0-terminated.  If
+ * a country is not set, they will be 0.
+ */
+void AConfiguration_getCountry(AConfiguration* config, char* outCountry);
+
+/**
+ * Set the current country code in the configuration, from the first two
+ * characters in the string.
+ */
+void AConfiguration_setCountry(AConfiguration* config, const char* country);
+
+/**
+ * Return the current ACONFIGURATION_ORIENTATION_* set in the configuration.
+ */
+int32_t AConfiguration_getOrientation(AConfiguration* config);
+
+/**
+ * Set the current orientation in the configuration.
+ */
+void AConfiguration_setOrientation(AConfiguration* config, int32_t orientation);
+
+/**
+ * Return the current ACONFIGURATION_TOUCHSCREEN_* set in the configuration.
+ */
+int32_t AConfiguration_getTouchscreen(AConfiguration* config);
+
+/**
+ * Set the current touchscreen in the configuration.
+ */
+void AConfiguration_setTouchscreen(AConfiguration* config, int32_t touchscreen);
+
+/**
+ * Return the current ACONFIGURATION_DENSITY_* set in the configuration.
+ */
+int32_t AConfiguration_getDensity(AConfiguration* config);
+
+/**
+ * Set the current density in the configuration.
+ */
+void AConfiguration_setDensity(AConfiguration* config, int32_t density);
+
+/**
+ * Return the current ACONFIGURATION_KEYBOARD_* set in the configuration.
+ */
+int32_t AConfiguration_getKeyboard(AConfiguration* config);
+
+/**
+ * Set the current keyboard in the configuration.
+ */
+void AConfiguration_setKeyboard(AConfiguration* config, int32_t keyboard);
+
+/**
+ * Return the current ACONFIGURATION_NAVIGATION_* set in the configuration.
+ */
+int32_t AConfiguration_getNavigation(AConfiguration* config);
+
+/**
+ * Set the current navigation in the configuration.
+ */
+void AConfiguration_setNavigation(AConfiguration* config, int32_t navigation);
+
+/**
+ * Return the current ACONFIGURATION_KEYSHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getKeysHidden(AConfiguration* config);
+
+/**
+ * Set the current keys hidden in the configuration.
+ */
+void AConfiguration_setKeysHidden(AConfiguration* config, int32_t keysHidden);
+
+/**
+ * Return the current ACONFIGURATION_NAVHIDDEN_* set in the configuration.
+ */
+int32_t AConfiguration_getNavHidden(AConfiguration* config);
+
+/**
+ * Set the current nav hidden in the configuration.
+ */
+void AConfiguration_setNavHidden(AConfiguration* config, int32_t navHidden);
+
+/**
+ * Return the current SDK (API) version set in the configuration.
+ */
+int32_t AConfiguration_getSdkVersion(AConfiguration* config);
+
+/**
+ * Set the current SDK version in the configuration.
+ */
+void AConfiguration_setSdkVersion(AConfiguration* config, int32_t sdkVersion);
+
+/**
+ * Return the current ACONFIGURATION_SCREENSIZE_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenSize(AConfiguration* config);
+
+/**
+ * Set the current screen size in the configuration.
+ */
+void AConfiguration_setScreenSize(AConfiguration* config, int32_t screenSize);
+
+/**
+ * Return the current ACONFIGURATION_SCREENLONG_* set in the configuration.
+ */
+int32_t AConfiguration_getScreenLong(AConfiguration* config);
+
+/**
+ * Set the current screen long in the configuration.
+ */
+void AConfiguration_setScreenLong(AConfiguration* config, int32_t screenLong);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_TYPE_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeType(AConfiguration* config);
+
+/**
+ * Set the current UI mode type in the configuration.
+ */
+void AConfiguration_setUiModeType(AConfiguration* config, int32_t uiModeType);
+
+/**
+ * Return the current ACONFIGURATION_UI_MODE_NIGHT_* set in the configuration.
+ */
+int32_t AConfiguration_getUiModeNight(AConfiguration* config);
+
+/**
+ * Set the current UI mode night in the configuration.
+ */
+void AConfiguration_setUiModeNight(AConfiguration* config, int32_t uiModeNight);
+
+/**
+ * Return the current configuration screen width in dp units, or
+ * ACONFIGURATION_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the current configuration screen height in dp units, or
+ * ACONFIGURATION_SCREEN_HEIGHT_DP_ANY if not set.
+ */
+int32_t AConfiguration_getScreenHeightDp(AConfiguration* config);
+
+/**
+ * Set the configuration's current screen width in dp units.
+ */
+void AConfiguration_setScreenHeightDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's smallest screen width in dp units, or
+ * ACONFIGURATION_SMALLEST_SCREEN_WIDTH_DP_ANY if not set.
+ */
+int32_t AConfiguration_getSmallestScreenWidthDp(AConfiguration* config);
+
+/**
+ * Set the configuration's smallest screen width in dp units.
+ */
+void AConfiguration_setSmallestScreenWidthDp(AConfiguration* config, int32_t value);
+
+/**
+ * Return the configuration's layout direction, or
+ * ACONFIGURATION_LAYOUTDIR_ANY if not set.
+ */
+int32_t AConfiguration_getLayoutDirection(AConfiguration* config);
+
+/**
+ * Set the configuration's layout direction.
+ */
+void AConfiguration_setLayoutDirection(AConfiguration* config, int32_t value);
+
+/**
+ * Perform a diff between two configurations.  Returns a bit mask of
+ * ACONFIGURATION_* constants, each bit set meaning that configuration element
+ * is different between them.
+ */
+int32_t AConfiguration_diff(AConfiguration* config1, AConfiguration* config2);
+
+/**
+ * Determine whether 'base' is a valid configuration for use within the
+ * environment 'requested'.  Returns 0 if there are any values in 'base'
+ * that conflict with 'requested'.  Returns 1 if it does not conflict.
+ */
+int32_t AConfiguration_match(AConfiguration* base, AConfiguration* requested);
+
+/**
+ * Determine whether the configuration in 'test' is better than the existing
+ * configuration in 'base'.  If 'requested' is non-NULL, this decision is based
+ * on the overall configuration given there.  If it is NULL, this decision is
+ * simply based on which configuration is more specific.  Returns non-0 if
+ * 'test' is better than 'base'.
+ *
+ * This assumes you have already filtered the configurations with
+ * AConfiguration_match().
+ */
+int32_t AConfiguration_isBetterThan(AConfiguration* base, AConfiguration* test,
+        AConfiguration* requested);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_CONFIGURATION_H
diff --git a/ndk/platforms/android-18/include/android/input.h b/ndk/platforms/android-18/include/android/input.h
new file mode 100644
index 0000000..fead769
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/input.h
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_INPUT_H
+#define _ANDROID_INPUT_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process input events in
+ * native code.
+ *
+ * NOTE: These functions MUST be implemented by /system/lib/libui.so
+ */
+
+#include <stdint.h>
+#include <sys/types.h>
+#include <android/keycodes.h>
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key states (may be returned by queries about the current state of a
+ * particular key code, scan code or switch).
+ */
+enum {
+    /* The key state is unknown or the requested key itself is not supported. */
+    AKEY_STATE_UNKNOWN = -1,
+
+    /* The key is up. */
+    AKEY_STATE_UP = 0,
+
+    /* The key is down. */
+    AKEY_STATE_DOWN = 1,
+
+    /* The key is down but is a virtual key press that is being emulated by the system. */
+    AKEY_STATE_VIRTUAL = 2
+};
+
+/*
+ * Meta key / modifer state.
+ */
+enum {
+    /* No meta keys are pressed. */
+    AMETA_NONE = 0,
+
+    /* This mask is used to check whether one of the ALT meta keys is pressed. */
+    AMETA_ALT_ON = 0x02,
+
+    /* This mask is used to check whether the left ALT meta key is pressed. */
+    AMETA_ALT_LEFT_ON = 0x10,
+
+    /* This mask is used to check whether the right ALT meta key is pressed. */
+    AMETA_ALT_RIGHT_ON = 0x20,
+
+    /* This mask is used to check whether one of the SHIFT meta keys is pressed. */
+    AMETA_SHIFT_ON = 0x01,
+
+    /* This mask is used to check whether the left SHIFT meta key is pressed. */
+    AMETA_SHIFT_LEFT_ON = 0x40,
+
+    /* This mask is used to check whether the right SHIFT meta key is pressed. */
+    AMETA_SHIFT_RIGHT_ON = 0x80,
+
+    /* This mask is used to check whether the SYM meta key is pressed. */
+    AMETA_SYM_ON = 0x04,
+
+    /* This mask is used to check whether the FUNCTION meta key is pressed. */
+    AMETA_FUNCTION_ON = 0x08,
+
+    /* This mask is used to check whether one of the CTRL meta keys is pressed. */
+    AMETA_CTRL_ON = 0x1000,
+
+    /* This mask is used to check whether the left CTRL meta key is pressed. */
+    AMETA_CTRL_LEFT_ON = 0x2000,
+
+    /* This mask is used to check whether the right CTRL meta key is pressed. */
+    AMETA_CTRL_RIGHT_ON = 0x4000,
+
+    /* This mask is used to check whether one of the META meta keys is pressed. */
+    AMETA_META_ON = 0x10000,
+
+    /* This mask is used to check whether the left META meta key is pressed. */
+    AMETA_META_LEFT_ON = 0x20000,
+
+    /* This mask is used to check whether the right META meta key is pressed. */
+    AMETA_META_RIGHT_ON = 0x40000,
+
+    /* This mask is used to check whether the CAPS LOCK meta key is on. */
+    AMETA_CAPS_LOCK_ON = 0x100000,
+
+    /* This mask is used to check whether the NUM LOCK meta key is on. */
+    AMETA_NUM_LOCK_ON = 0x200000,
+
+    /* This mask is used to check whether the SCROLL LOCK meta key is on. */
+    AMETA_SCROLL_LOCK_ON = 0x400000,
+};
+
+/*
+ * Input events.
+ *
+ * Input events are opaque structures.  Use the provided accessors functions to
+ * read their properties.
+ */
+struct AInputEvent;
+typedef struct AInputEvent AInputEvent;
+
+/*
+ * Input event types.
+ */
+enum {
+    /* Indicates that the input event is a key event. */
+    AINPUT_EVENT_TYPE_KEY = 1,
+
+    /* Indicates that the input event is a motion event. */
+    AINPUT_EVENT_TYPE_MOTION = 2
+};
+
+/*
+ * Key event actions.
+ */
+enum {
+    /* The key has been pressed down. */
+    AKEY_EVENT_ACTION_DOWN = 0,
+
+    /* The key has been released. */
+    AKEY_EVENT_ACTION_UP = 1,
+
+    /* Multiple duplicate key events have occurred in a row, or a complex string is
+     * being delivered.  The repeat_count property of the key event contains the number
+     * of times the given key code should be executed.
+     */
+    AKEY_EVENT_ACTION_MULTIPLE = 2
+};
+
+/*
+ * Key event flags.
+ */
+enum {
+    /* This mask is set if the device woke because of this key event. */
+    AKEY_EVENT_FLAG_WOKE_HERE = 0x1,
+
+    /* This mask is set if the key event was generated by a software keyboard. */
+    AKEY_EVENT_FLAG_SOFT_KEYBOARD = 0x2,
+
+    /* This mask is set if we don't want the key event to cause us to leave touch mode. */
+    AKEY_EVENT_FLAG_KEEP_TOUCH_MODE = 0x4,
+
+    /* This mask is set if an event was known to come from a trusted part
+     * of the system.  That is, the event is known to come from the user,
+     * and could not have been spoofed by a third party component. */
+    AKEY_EVENT_FLAG_FROM_SYSTEM = 0x8,
+
+    /* This mask is used for compatibility, to identify enter keys that are
+     * coming from an IME whose enter key has been auto-labelled "next" or
+     * "done".  This allows TextView to dispatch these as normal enter keys
+     * for old applications, but still do the appropriate action when
+     * receiving them. */
+    AKEY_EVENT_FLAG_EDITOR_ACTION = 0x10,
+
+    /* When associated with up key events, this indicates that the key press
+     * has been canceled.  Typically this is used with virtual touch screen
+     * keys, where the user can slide from the virtual key area on to the
+     * display: in that case, the application will receive a canceled up
+     * event and should not perform the action normally associated with the
+     * key.  Note that for this to work, the application can not perform an
+     * action for a key until it receives an up or the long press timeout has
+     * expired. */
+    AKEY_EVENT_FLAG_CANCELED = 0x20,
+
+    /* This key event was generated by a virtual (on-screen) hard key area.
+     * Typically this is an area of the touchscreen, outside of the regular
+     * display, dedicated to "hardware" buttons. */
+    AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY = 0x40,
+
+    /* This flag is set for the first key repeat that occurs after the
+     * long press timeout. */
+    AKEY_EVENT_FLAG_LONG_PRESS = 0x80,
+
+    /* Set when a key event has AKEY_EVENT_FLAG_CANCELED set because a long
+     * press action was executed while it was down. */
+    AKEY_EVENT_FLAG_CANCELED_LONG_PRESS = 0x100,
+
+    /* Set for AKEY_EVENT_ACTION_UP when this event's key code is still being
+     * tracked from its initial down.  That is, somebody requested that tracking
+     * started on the key down and a long press has not caused
+     * the tracking to be canceled. */
+    AKEY_EVENT_FLAG_TRACKING = 0x200,
+
+    /* Set when a key event has been synthesized to implement default behavior
+     * for an event that the application did not handle.
+     * Fallback key events are generated by unhandled trackball motions
+     * (to emulate a directional keypad) and by certain unhandled key presses
+     * that are declared in the key map (such as special function numeric keypad
+     * keys when numlock is off). */
+    AKEY_EVENT_FLAG_FALLBACK = 0x400,
+};
+
+/*
+ * Motion event actions.
+ */
+
+/* Bit shift for the action bits holding the pointer index as
+ * defined by AMOTION_EVENT_ACTION_POINTER_INDEX_MASK.
+ */
+#define AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT 8
+
+enum {
+    /* Bit mask of the parts of the action code that are the action itself.
+     */
+    AMOTION_EVENT_ACTION_MASK = 0xff,
+
+    /* Bits in the action code that represent a pointer index, used with
+     * AMOTION_EVENT_ACTION_POINTER_DOWN and AMOTION_EVENT_ACTION_POINTER_UP.  Shifting
+     * down by AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT provides the actual pointer
+     * index where the data for the pointer going up or down can be found.
+     */
+    AMOTION_EVENT_ACTION_POINTER_INDEX_MASK  = 0xff00,
+
+    /* A pressed gesture has started, the motion contains the initial starting location.
+     */
+    AMOTION_EVENT_ACTION_DOWN = 0,
+
+    /* A pressed gesture has finished, the motion contains the final release location
+     * as well as any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_UP = 1,
+
+    /* A change has happened during a press gesture (between AMOTION_EVENT_ACTION_DOWN and
+     * AMOTION_EVENT_ACTION_UP).  The motion contains the most recent point, as well as
+     * any intermediate points since the last down or move event.
+     */
+    AMOTION_EVENT_ACTION_MOVE = 2,
+
+    /* The current gesture has been aborted.
+     * You will not receive any more points in it.  You should treat this as
+     * an up event, but not perform any action that you normally would.
+     */
+    AMOTION_EVENT_ACTION_CANCEL = 3,
+
+    /* A movement has happened outside of the normal bounds of the UI element.
+     * This does not provide a full gesture, but only the initial location of the movement/touch.
+     */
+    AMOTION_EVENT_ACTION_OUTSIDE = 4,
+
+    /* A non-primary pointer has gone down.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_DOWN = 5,
+
+    /* A non-primary pointer has gone up.
+     * The bits in AMOTION_EVENT_ACTION_POINTER_INDEX_MASK indicate which pointer changed.
+     */
+    AMOTION_EVENT_ACTION_POINTER_UP = 6,
+
+    /* A change happened but the pointer is not down (unlike AMOTION_EVENT_ACTION_MOVE).
+     * The motion contains the most recent point, as well as any intermediate points since
+     * the last hover move event.
+     */
+    AMOTION_EVENT_ACTION_HOVER_MOVE = 7,
+
+    /* The motion event contains relative vertical and/or horizontal scroll offsets.
+     * Use getAxisValue to retrieve the information from AMOTION_EVENT_AXIS_VSCROLL
+     * and AMOTION_EVENT_AXIS_HSCROLL.
+     * The pointer may or may not be down when this event is dispatched.
+     * This action is always delivered to the winder under the pointer, which
+     * may not be the window currently touched.
+     */
+    AMOTION_EVENT_ACTION_SCROLL = 8,
+
+    /* The pointer is not down but has entered the boundaries of a window or view.
+     */
+    AMOTION_EVENT_ACTION_HOVER_ENTER = 9,
+
+    /* The pointer is not down but has exited the boundaries of a window or view.
+     */
+    AMOTION_EVENT_ACTION_HOVER_EXIT = 10,
+};
+
+/*
+ * Motion event flags.
+ */
+enum {
+    /* This flag indicates that the window that received this motion event is partly
+     * or wholly obscured by another visible window above it.  This flag is set to true
+     * even if the event did not directly pass through the obscured area.
+     * A security sensitive application can check this flag to identify situations in which
+     * a malicious application may have covered up part of its content for the purpose
+     * of misleading the user or hijacking touches.  An appropriate response might be
+     * to drop the suspect touches or to take additional precautions to confirm the user's
+     * actual intent.
+     */
+    AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED = 0x1,
+};
+
+/*
+ * Motion event edge touch flags.
+ */
+enum {
+    /* No edges intersected */
+    AMOTION_EVENT_EDGE_FLAG_NONE = 0,
+
+    /* Flag indicating the motion event intersected the top edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_TOP = 0x01,
+
+    /* Flag indicating the motion event intersected the bottom edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_BOTTOM = 0x02,
+
+    /* Flag indicating the motion event intersected the left edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_LEFT = 0x04,
+
+    /* Flag indicating the motion event intersected the right edge of the screen. */
+    AMOTION_EVENT_EDGE_FLAG_RIGHT = 0x08
+};
+
+/*
+ * Constants that identify each individual axis of a motion event.
+ * Refer to the documentation on the MotionEvent class for descriptions of each axis.
+ */
+enum {
+    AMOTION_EVENT_AXIS_X = 0,
+    AMOTION_EVENT_AXIS_Y = 1,
+    AMOTION_EVENT_AXIS_PRESSURE = 2,
+    AMOTION_EVENT_AXIS_SIZE = 3,
+    AMOTION_EVENT_AXIS_TOUCH_MAJOR = 4,
+    AMOTION_EVENT_AXIS_TOUCH_MINOR = 5,
+    AMOTION_EVENT_AXIS_TOOL_MAJOR = 6,
+    AMOTION_EVENT_AXIS_TOOL_MINOR = 7,
+    AMOTION_EVENT_AXIS_ORIENTATION = 8,
+    AMOTION_EVENT_AXIS_VSCROLL = 9,
+    AMOTION_EVENT_AXIS_HSCROLL = 10,
+    AMOTION_EVENT_AXIS_Z = 11,
+    AMOTION_EVENT_AXIS_RX = 12,
+    AMOTION_EVENT_AXIS_RY = 13,
+    AMOTION_EVENT_AXIS_RZ = 14,
+    AMOTION_EVENT_AXIS_HAT_X = 15,
+    AMOTION_EVENT_AXIS_HAT_Y = 16,
+    AMOTION_EVENT_AXIS_LTRIGGER = 17,
+    AMOTION_EVENT_AXIS_RTRIGGER = 18,
+    AMOTION_EVENT_AXIS_THROTTLE = 19,
+    AMOTION_EVENT_AXIS_RUDDER = 20,
+    AMOTION_EVENT_AXIS_WHEEL = 21,
+    AMOTION_EVENT_AXIS_GAS = 22,
+    AMOTION_EVENT_AXIS_BRAKE = 23,
+    AMOTION_EVENT_AXIS_DISTANCE = 24,
+    AMOTION_EVENT_AXIS_TILT = 25,
+    AMOTION_EVENT_AXIS_GENERIC_1 = 32,
+    AMOTION_EVENT_AXIS_GENERIC_2 = 33,
+    AMOTION_EVENT_AXIS_GENERIC_3 = 34,
+    AMOTION_EVENT_AXIS_GENERIC_4 = 35,
+    AMOTION_EVENT_AXIS_GENERIC_5 = 36,
+    AMOTION_EVENT_AXIS_GENERIC_6 = 37,
+    AMOTION_EVENT_AXIS_GENERIC_7 = 38,
+    AMOTION_EVENT_AXIS_GENERIC_8 = 39,
+    AMOTION_EVENT_AXIS_GENERIC_9 = 40,
+    AMOTION_EVENT_AXIS_GENERIC_10 = 41,
+    AMOTION_EVENT_AXIS_GENERIC_11 = 42,
+    AMOTION_EVENT_AXIS_GENERIC_12 = 43,
+    AMOTION_EVENT_AXIS_GENERIC_13 = 44,
+    AMOTION_EVENT_AXIS_GENERIC_14 = 45,
+    AMOTION_EVENT_AXIS_GENERIC_15 = 46,
+    AMOTION_EVENT_AXIS_GENERIC_16 = 47,
+
+    // NOTE: If you add a new axis here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
+};
+
+/*
+ * Constants that identify buttons that are associated with motion events.
+ * Refer to the documentation on the MotionEvent class for descriptions of each button.
+ */
+enum {
+    AMOTION_EVENT_BUTTON_PRIMARY = 1 << 0,
+    AMOTION_EVENT_BUTTON_SECONDARY = 1 << 1,
+    AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2,
+    AMOTION_EVENT_BUTTON_BACK = 1 << 3,
+    AMOTION_EVENT_BUTTON_FORWARD = 1 << 4,
+};
+
+/*
+ * Constants that identify tool types.
+ * Refer to the documentation on the MotionEvent class for descriptions of each tool type.
+ */
+enum {
+    AMOTION_EVENT_TOOL_TYPE_UNKNOWN = 0,
+    AMOTION_EVENT_TOOL_TYPE_FINGER = 1,
+    AMOTION_EVENT_TOOL_TYPE_STYLUS = 2,
+    AMOTION_EVENT_TOOL_TYPE_MOUSE = 3,
+    AMOTION_EVENT_TOOL_TYPE_ERASER = 4,
+};
+
+/*
+ * Input sources.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ */
+enum {
+    AINPUT_SOURCE_CLASS_MASK = 0x000000ff,
+
+    AINPUT_SOURCE_CLASS_NONE = 0x00000000,
+    AINPUT_SOURCE_CLASS_BUTTON = 0x00000001,
+    AINPUT_SOURCE_CLASS_POINTER = 0x00000002,
+    AINPUT_SOURCE_CLASS_NAVIGATION = 0x00000004,
+    AINPUT_SOURCE_CLASS_POSITION = 0x00000008,
+    AINPUT_SOURCE_CLASS_JOYSTICK = 0x00000010,
+};
+
+enum {
+    AINPUT_SOURCE_UNKNOWN = 0x00000000,
+
+    AINPUT_SOURCE_KEYBOARD = 0x00000100 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_DPAD = 0x00000200 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_GAMEPAD = 0x00000400 | AINPUT_SOURCE_CLASS_BUTTON,
+    AINPUT_SOURCE_TOUCHSCREEN = 0x00001000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_MOUSE = 0x00002000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_STYLUS = 0x00004000 | AINPUT_SOURCE_CLASS_POINTER,
+    AINPUT_SOURCE_TRACKBALL = 0x00010000 | AINPUT_SOURCE_CLASS_NAVIGATION,
+    AINPUT_SOURCE_TOUCHPAD = 0x00100000 | AINPUT_SOURCE_CLASS_POSITION,
+    AINPUT_SOURCE_TOUCH_NAVIGATION = 0x00200000 | AINPUT_SOURCE_CLASS_NONE,
+    AINPUT_SOURCE_JOYSTICK = 0x01000000 | AINPUT_SOURCE_CLASS_JOYSTICK,
+
+    AINPUT_SOURCE_ANY = 0xffffff00,
+};
+
+/*
+ * Keyboard types.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details.
+ */
+enum {
+    AINPUT_KEYBOARD_TYPE_NONE = 0,
+    AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC = 1,
+    AINPUT_KEYBOARD_TYPE_ALPHABETIC = 2,
+};
+
+/*
+ * Constants used to retrieve information about the range of motion for a particular
+ * coordinate of a motion event.
+ *
+ * Refer to the documentation on android.view.InputDevice for more details about input sources
+ * and their correct interpretation.
+ *
+ * DEPRECATION NOTICE: These constants are deprecated.  Use AMOTION_EVENT_AXIS_* constants instead.
+ */
+enum {
+    AINPUT_MOTION_RANGE_X = AMOTION_EVENT_AXIS_X,
+    AINPUT_MOTION_RANGE_Y = AMOTION_EVENT_AXIS_Y,
+    AINPUT_MOTION_RANGE_PRESSURE = AMOTION_EVENT_AXIS_PRESSURE,
+    AINPUT_MOTION_RANGE_SIZE = AMOTION_EVENT_AXIS_SIZE,
+    AINPUT_MOTION_RANGE_TOUCH_MAJOR = AMOTION_EVENT_AXIS_TOUCH_MAJOR,
+    AINPUT_MOTION_RANGE_TOUCH_MINOR = AMOTION_EVENT_AXIS_TOUCH_MINOR,
+    AINPUT_MOTION_RANGE_TOOL_MAJOR = AMOTION_EVENT_AXIS_TOOL_MAJOR,
+    AINPUT_MOTION_RANGE_TOOL_MINOR = AMOTION_EVENT_AXIS_TOOL_MINOR,
+    AINPUT_MOTION_RANGE_ORIENTATION = AMOTION_EVENT_AXIS_ORIENTATION,
+} __attribute__ ((deprecated));
+
+
+/*
+ * Input event accessors.
+ *
+ * Note that most functions can only be used on input events that are of a given type.
+ * Calling these functions on input events of other types will yield undefined behavior.
+ */
+
+/*** Accessors for all input events. ***/
+
+/* Get the input event type. */
+int32_t AInputEvent_getType(const AInputEvent* event);
+
+/* Get the id for the device that an input event came from.
+ *
+ * Input events can be generated by multiple different input devices.
+ * Use the input device id to obtain information about the input
+ * device that was responsible for generating a particular event.
+ *
+ * An input device id of 0 indicates that the event didn't come from a physical device;
+ * other numbers are arbitrary and you shouldn't depend on the values.
+ * Use the provided input device query API to obtain information about input devices.
+ */
+int32_t AInputEvent_getDeviceId(const AInputEvent* event);
+
+/* Get the input event source. */
+int32_t AInputEvent_getSource(const AInputEvent* event);
+
+/*** Accessors for key events only. ***/
+
+/* Get the key event action. */
+int32_t AKeyEvent_getAction(const AInputEvent* key_event);
+
+/* Get the key event flags. */
+int32_t AKeyEvent_getFlags(const AInputEvent* key_event);
+
+/* Get the key code of the key event.
+ * This is the physical key that was pressed, not the Unicode character. */
+int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event);
+
+/* Get the hardware key id of this key event.
+ * These values are not reliable and vary from device to device. */
+int32_t AKeyEvent_getScanCode(const AInputEvent* key_event);
+
+/* Get the meta key state. */
+int32_t AKeyEvent_getMetaState(const AInputEvent* key_event);
+
+/* Get the repeat count of the event.
+ * For both key up an key down events, this is the number of times the key has
+ * repeated with the first down starting at 0 and counting up from there.  For
+ * multiple key events, this is the number of down/up pairs that have occurred. */
+int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event);
+
+/* Get the time of the most recent key down event, in the
+ * java.lang.System.nanoTime() time base.  If this is a down event,
+ * this will be the same as eventTime.
+ * Note that when chording keys, this value is the down time of the most recently
+ * pressed key, which may not be the same physical key of this event. */
+int64_t AKeyEvent_getDownTime(const AInputEvent* key_event);
+
+/* Get the time this event occurred, in the
+ * java.lang.System.nanoTime() time base. */
+int64_t AKeyEvent_getEventTime(const AInputEvent* key_event);
+
+/*** Accessors for motion events only. ***/
+
+/* Get the combined motion event action code and pointer index. */
+int32_t AMotionEvent_getAction(const AInputEvent* motion_event);
+
+/* Get the motion event flags. */
+int32_t AMotionEvent_getFlags(const AInputEvent* motion_event);
+
+/* Get the state of any meta / modifier keys that were in effect when the
+ * event was generated. */
+int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event);
+
+/* Get the button state of all buttons that are pressed. */
+int32_t AMotionEvent_getButtonState(const AInputEvent* motion_event);
+
+/* Get a bitfield indicating which edges, if any, were touched by this motion event.
+ * For touch events, clients can use this to determine if the user's finger was
+ * touching the edge of the display. */
+int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event);
+
+/* Get the time when the user originally pressed down to start a stream of
+ * position events, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event);
+
+/* Get the time when this specific event was generated,
+ * in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event);
+
+/* Get the X coordinate offset.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getXOffset(const AInputEvent* motion_event);
+
+/* Get the precision of the Y coordinates being reported.
+ * For touch events on the screen, this is the delta that was added to the raw
+ * screen coordinates to adjust for the absolute position of the containing windows
+ * and views. */
+float AMotionEvent_getYOffset(const AInputEvent* motion_event);
+
+/* Get the precision of the X coordinates being reported.
+ * You can multiply this number with an X coordinate sample to find the
+ * actual hardware value of the X coordinate. */
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event);
+
+/* Get the precision of the Y coordinates being reported.
+ * You can multiply this number with a Y coordinate sample to find the
+ * actual hardware value of the Y coordinate. */
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event);
+
+/* Get the number of pointers of data contained in this event.
+ * Always >= 1. */
+size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event);
+
+/* Get the pointer identifier associated with a particular pointer
+ * data index in this event.  The identifier tells you the actual pointer
+ * number associated with the data, accounting for individual pointers
+ * going up and down since the start of the current gesture. */
+int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the tool type of a pointer for the given pointer index.
+ * The tool type indicates the type of tool used to make contact such as a
+ * finger or stylus, if known. */
+int32_t AMotionEvent_getToolType(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the original raw X coordinate of this event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views. */
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current X coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current Y coordinate of this event for the given pointer index.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current pressure of this event for the given pointer index.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current scaled value of the approximate size for the given pointer index.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index. */
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the current orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index);
+
+/* Get the value of the request axis for the given pointer index. */
+float AMotionEvent_getAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index);
+
+/* Get the number of historical points in this event.  These are movements that
+ * have occurred between this event and the previous event.  This only applies
+ * to AMOTION_EVENT_ACTION_MOVE events -- all other actions will have a size of 0.
+ * Historical samples are indexed from oldest to newest. */
+size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event);
+
+/* Get the time that a historical movement occurred between this event and
+ * the previous event, in the java.lang.System.nanoTime() time base. */
+int64_t AMotionEvent_getHistoricalEventTime(const AInputEvent* motion_event,
+        size_t history_index);
+
+/* Get the historical raw X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical raw Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * For touch events on the screen, this is the original location of the event
+ * on the screen, before it had been adjusted for the containing window
+ * and views.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical X coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical Y coordinate of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * Whole numbers are pixels; the value may have a fraction for input devices
+ * that are sub-pixel precise. */
+float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical pressure of this event for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
+ * although values higher than 1 may be generated depending on the calibration of
+ * the input device. */
+float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the current scaled value of the approximate size for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * This represents some approximation of the area of the screen being
+ * pressed; the actual value in pixels corresponding to the
+ * touch is normalized with the device specific range of values
+ * and scaled to a value between 0 and 1.  The value of size can be used to
+ * determine fat touch events. */
+float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical length of the major axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical length of the minor axis of an ellipse that describes the touch area
+ * at the point of contact for the given pointer index that
+ * occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical length of the major axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical length of the minor axis of an ellipse that describes the size
+ * of the approaching tool for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * The tool area represents the estimated size of the finger or pen that is
+ * touching the device independent of its actual touch area at the point of contact. */
+float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical orientation of the touch area and tool area in radians clockwise from
+ * vertical for the given pointer index that
+ * occurred between this event and the previous motion event.
+ * An angle of 0 degrees indicates that the major axis of contact is oriented
+ * upwards, is perfectly circular or is of unknown orientation.  A positive angle
+ * indicates that the major axis of contact is oriented to the right.  A negative angle
+ * indicates that the major axis of contact is oriented to the left.
+ * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
+ * (finger pointing fully right). */
+float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
+        size_t history_index);
+
+/* Get the historical value of the request axis for the given pointer index
+ * that occurred between this event and the previous motion event. */
+float AMotionEvent_getHistoricalAxisValue(const AInputEvent* motion_event,
+        int32_t axis, size_t pointer_index, size_t history_index);
+
+
+/*
+ * Input queue
+ *
+ * An input queue is the facility through which you retrieve input
+ * events.
+ */
+struct AInputQueue;
+typedef struct AInputQueue AInputQueue;
+
+/*
+ * Add this input queue to a looper for processing.  See
+ * ALooper_addFd() for information on the ident, callback, and data params.
+ */
+void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
+        int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Remove the input queue from the looper it is currently attached to.
+ */
+void AInputQueue_detachLooper(AInputQueue* queue);
+
+/*
+ * Returns true if there are one or more events available in the
+ * input queue.  Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int32_t AInputQueue_hasEvents(AInputQueue* queue);
+
+/*
+ * Returns the next available event from the queue.  Returns a negative
+ * value if no events are available or an error has occurred.
+ */
+int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent);
+
+/*
+ * Sends the key for standard pre-dispatching -- that is, possibly deliver
+ * it to the current IME to be consumed before the app.  Returns 0 if it
+ * was not pre-dispatched, meaning you can process it right now.  If non-zero
+ * is returned, you must abandon the current event processing and allow the
+ * event to appear again in the event queue (if it does not get consumed during
+ * pre-dispatching).
+ */
+int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event);
+
+/*
+ * Report that dispatching has finished with the given event.
+ * This must be called after receiving an event with AInputQueue_get_event().
+ */
+void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_INPUT_H
diff --git a/ndk/platforms/android-18/include/android/keycodes.h b/ndk/platforms/android-18/include/android/keycodes.h
new file mode 100644
index 0000000..cf38d1a
--- /dev/null
+++ b/ndk/platforms/android-18/include/android/keycodes.h
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+    AKEYCODE_LANGUAGE_SWITCH = 204,
+    AKEYCODE_MANNER_MODE     = 205,
+    AKEYCODE_3D_MODE         = 206,
+    AKEYCODE_CONTACTS        = 207,
+    AKEYCODE_CALENDAR        = 208,
+    AKEYCODE_MUSIC           = 209,
+    AKEYCODE_CALCULATOR      = 210,
+    AKEYCODE_ZENKAKU_HANKAKU = 211,
+    AKEYCODE_EISU            = 212,
+    AKEYCODE_MUHENKAN        = 213,
+    AKEYCODE_HENKAN          = 214,
+    AKEYCODE_KATAKANA_HIRAGANA = 215,
+    AKEYCODE_YEN             = 216,
+    AKEYCODE_RO              = 217,
+    AKEYCODE_KANA            = 218,
+    AKEYCODE_ASSIST          = 219,
+    AKEYCODE_BRIGHTNESS_DOWN = 220,
+    AKEYCODE_BRIGHTNESS_UP   = 221,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-18/include/math.h b/ndk/platforms/android-18/include/math.h
new file mode 100644
index 0000000..e24c001
--- /dev/null
+++ b/ndk/platforms/android-18/include/math.h
@@ -0,0 +1,720 @@
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+ * from: @(#)fdlibm.h 5.1 93/09/24
+ * $FreeBSD: src/lib/msun/src/math.h,v 1.61 2005/04/16 21:12:47 das Exp $
+ */
+
+#ifndef _MATH_H_
+#define	_MATH_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <limits.h>
+
+#define __pure2
+
+/*
+ * ANSI/POSIX
+ */
+extern const union __infinity_un {
+	unsigned char	__uc[8];
+	double		__ud;
+} __infinity;
+
+extern const union __nan_un {
+	unsigned char	__uc[sizeof(float)];
+	float		__uf;
+} __nan;
+
+/* #if __GNUC_PREREQ__(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800) */
+#if 1
+#define	__MATH_BUILTIN_CONSTANTS
+#endif
+
+/* #if __GNUC_PREREQ__(3, 0) && !defined(__INTEL_COMPILER) */
+#if 1
+#define	__MATH_BUILTIN_RELOPS
+#endif
+
+/* #ifdef __MATH_BUILTIN_CONSTANTS */
+#if 1
+#define	HUGE_VAL	__builtin_huge_val()
+#else
+#define	HUGE_VAL	(__infinity.__ud)
+#endif
+
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+#define	FP_ILOGB0	(-__INT_MAX)
+#define	FP_ILOGBNAN	__INT_MAX
+#else
+#define	FP_ILOGB0	(-INT_MAX)
+#define	FP_ILOGBNAN	INT_MAX
+#endif
+
+#ifdef __MATH_BUILTIN_CONSTANTS
+#define	HUGE_VALF	__builtin_huge_valf()
+#define	HUGE_VALL	__builtin_huge_vall()
+#define	INFINITY	__builtin_inf()
+#define	NAN		__builtin_nan("")
+#else
+#define	HUGE_VALF	(float)HUGE_VAL
+#define	HUGE_VALL	(long double)HUGE_VAL
+#define	INFINITY	HUGE_VALF
+#define	NAN		(__nan.__uf)
+#endif /* __MATH_BUILTIN_CONSTANTS */
+
+#define	MATH_ERRNO	1
+#define	MATH_ERREXCEPT	2
+#define	math_errhandling	MATH_ERREXCEPT
+
+/* XXX We need a <machine/math.h>. */
+#if defined(__ia64__) || defined(__sparc64__)
+#define	FP_FAST_FMA
+#endif
+#ifdef __ia64__
+#define	FP_FAST_FMAL
+#endif
+#define	FP_FAST_FMAF
+
+/* Symbolic constants to classify floating point numbers. */
+#define	FP_INFINITE	0x01
+#define	FP_NAN		0x02
+#define	FP_NORMAL	0x04
+#define	FP_SUBNORMAL	0x08
+#define	FP_ZERO		0x10
+#define	fpclassify(x) \
+    ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
+    : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
+    : __fpclassifyl(x))
+
+#define	isfinite(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isfinitef(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isfinite(x)	\
+    : __isfinitel(x))
+#define	isinf(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isinff(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isinf(x)	\
+    : __isinfl(x))
+#define	isnan(x)					\
+    ((sizeof (x) == sizeof (float)) ? isnanf(x)		\
+    : (sizeof (x) == sizeof (double)) ? isnan(x)	\
+    : __isnanl(x))
+#define	isnormal(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isnormalf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isnormal(x)	\
+    : __isnormall(x))
+
+#ifdef __MATH_BUILTIN_RELOPS
+#define	isgreater(x, y)		__builtin_isgreater((x), (y))
+#define	isgreaterequal(x, y)	__builtin_isgreaterequal((x), (y))
+#define	isless(x, y)		__builtin_isless((x), (y))
+#define	islessequal(x, y)	__builtin_islessequal((x), (y))
+#define	islessgreater(x, y)	__builtin_islessgreater((x), (y))
+#define	isunordered(x, y)	__builtin_isunordered((x), (y))
+#else
+#define	isgreater(x, y)		(!isunordered((x), (y)) && (x) > (y))
+#define	isgreaterequal(x, y)	(!isunordered((x), (y)) && (x) >= (y))
+#define	isless(x, y)		(!isunordered((x), (y)) && (x) < (y))
+#define	islessequal(x, y)	(!isunordered((x), (y)) && (x) <= (y))
+#define	islessgreater(x, y)	(!isunordered((x), (y)) && \
+					((x) > (y) || (y) > (x)))
+#define	isunordered(x, y)	(isnan(x) || isnan(y))
+#endif /* __MATH_BUILTIN_RELOPS */
+
+#define	signbit(x)					\
+    ((sizeof (x) == sizeof (float)) ? __signbitf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __signbit(x)	\
+    : __signbitl(x))
+
+#if 0
+typedef	__double_t	double_t;
+typedef	__float_t	float_t;
+#endif 
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+
+/*
+ * XOPEN/SVID
+ */
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+#define	M_E		2.7182818284590452354	/* e */
+#define	M_LOG2E		1.4426950408889634074	/* log 2e */
+#define	M_LOG10E	0.43429448190325182765	/* log 10e */
+#define	M_LN2		0.69314718055994530942	/* log e2 */
+#define	M_LN10		2.30258509299404568402	/* log e10 */
+#define	M_PI		3.14159265358979323846	/* pi */
+#define	M_PI_2		1.57079632679489661923	/* pi/2 */
+#define	M_PI_4		0.78539816339744830962	/* pi/4 */
+#define	M_1_PI		0.31830988618379067154	/* 1/pi */
+#define	M_2_PI		0.63661977236758134308	/* 2/pi */
+#define	M_2_SQRTPI	1.12837916709551257390	/* 2/sqrt(pi) */
+#define	M_SQRT2		1.41421356237309504880	/* sqrt(2) */
+#define	M_SQRT1_2	0.70710678118654752440	/* 1/sqrt(2) */
+
+#define	MAXFLOAT	((float)3.40282346638528860e+38)
+extern int signgam;
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+#if __BSD_VISIBLE
+#if 0
+/* Old value from 4.4BSD-Lite math.h; this is probably better. */
+#define	HUGE		HUGE_VAL
+#else
+#define	HUGE		MAXFLOAT
+#endif
+#endif /* __BSD_VISIBLE */
+
+/*
+ * Most of these functions depend on the rounding mode and have the side
+ * effect of raising floating-point exceptions, so they are not declared
+ * as __pure2.  In C99, FENV_ACCESS affects the purity of these functions.
+ */
+__BEGIN_DECLS
+/*
+ * ANSI/POSIX
+ */
+int	__fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int	__isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isinff(float) __NDK_FPABI_MATH__ __pure2;
+int     __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int	__isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int	__isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int	__signbit(double) __NDK_FPABI_MATH__ __pure2;
+int	__signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int	__signbitl(long double) __NDK_FPABI_MATH__ __pure2;
+
+double	acos(double) __NDK_FPABI_MATH__;
+double	asin(double) __NDK_FPABI_MATH__;
+double	atan(double) __NDK_FPABI_MATH__;
+double	atan2(double, double) __NDK_FPABI_MATH__;
+double	cos(double) __NDK_FPABI_MATH__;
+double	sin(double) __NDK_FPABI_MATH__;
+double	tan(double) __NDK_FPABI_MATH__;
+
+double	cosh(double) __NDK_FPABI_MATH__;
+double	sinh(double) __NDK_FPABI_MATH__;
+double	tanh(double) __NDK_FPABI_MATH__;
+
+double	exp(double) __NDK_FPABI_MATH__;
+double	frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	ldexp(double, int) __NDK_FPABI_MATH__;
+double	log(double) __NDK_FPABI_MATH__;
+double	log10(double) __NDK_FPABI_MATH__;
+double	modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+
+double	pow(double, double) __NDK_FPABI_MATH__;
+double	sqrt(double) __NDK_FPABI_MATH__;
+
+double	ceil(double) __NDK_FPABI_MATH__;
+double	fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	floor(double) __NDK_FPABI_MATH__;
+double	fmod(double, double) __NDK_FPABI_MATH__;
+
+/*
+ * These functions are not in C90.
+ */
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+double	acosh(double) __NDK_FPABI_MATH__;
+double	asinh(double) __NDK_FPABI_MATH__;
+double	atanh(double) __NDK_FPABI_MATH__;
+double	cbrt(double) __NDK_FPABI_MATH__;
+double	erf(double) __NDK_FPABI_MATH__;
+double	erfc(double) __NDK_FPABI_MATH__;
+double	exp2(double) __NDK_FPABI_MATH__;
+double	expm1(double) __NDK_FPABI_MATH__;
+double	fma(double, double, double) __NDK_FPABI_MATH__;
+double	hypot(double, double) __NDK_FPABI_MATH__;
+int	ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	(isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int	(isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double	lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double	log1p(double) __NDK_FPABI_MATH__;
+double	log2(double) __NDK_FPABI_MATH__;
+double	logb(double) __NDK_FPABI_MATH__;
+long	lrint(double) __NDK_FPABI_MATH__;
+long	lround(double) __NDK_FPABI_MATH__;
+double	nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double	nextafter(double, double) __NDK_FPABI_MATH__;
+double	remainder(double, double) __NDK_FPABI_MATH__;
+double	remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	rint(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __XSI_VISIBLE */
+double	j0(double) __NDK_FPABI_MATH__;
+double	j1(double) __NDK_FPABI_MATH__;
+double	jn(int, double) __NDK_FPABI_MATH__;
+double	scalb(double, double) __NDK_FPABI_MATH__;
+double	y0(double) __NDK_FPABI_MATH__;
+double	y1(double) __NDK_FPABI_MATH__;
+double	yn(int, double) __NDK_FPABI_MATH__;
+
+/* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
+double	gamma(double) __NDK_FPABI_MATH__;
+/* #endif */
+/* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
+
+/* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
+double	copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fdim(double, double) __NDK_FPABI_MATH__;
+double	fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	nearbyint(double) __NDK_FPABI_MATH__;
+double	round(double) __NDK_FPABI_MATH__;
+double	scalbln(double, long) __NDK_FPABI_MATH__;
+double	scalbn(double, int) __NDK_FPABI_MATH__;
+double	tgamma(double) __NDK_FPABI_MATH__;
+double	trunc(double) __NDK_FPABI_MATH__;
+/* #endif */
+
+/*
+ * BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+double	drem(double, double) __NDK_FPABI_MATH__;
+int	finite(double) __NDK_FPABI_MATH__ __pure2;
+int	isnanf(float) __NDK_FPABI_MATH__ __pure2;
+
+/*
+ * Reentrant version of gamma & lgamma; passes signgam back by reference
+ * as the second argument; user must allocate space for signgam.
+ */
+double	gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	lgamma_r(double, int *) __NDK_FPABI_MATH__;
+
+/*
+ * IEEE Test Vector
+ */
+double	significand(double) __NDK_FPABI_MATH__;
+/* #endif */ /* __BSD_VISIBLE */
+
+/* float versions of ANSI/POSIX functions */
+/*#if __ISO_C_VISIBLE >= 1999 */
+float	acosf(float) __NDK_FPABI_MATH__;
+float	asinf(float) __NDK_FPABI_MATH__;
+float	atanf(float) __NDK_FPABI_MATH__;
+float	atan2f(float, float) __NDK_FPABI_MATH__;
+float	cosf(float) __NDK_FPABI_MATH__;
+float	sinf(float) __NDK_FPABI_MATH__;
+float	tanf(float) __NDK_FPABI_MATH__;
+
+float	coshf(float) __NDK_FPABI_MATH__;
+float	sinhf(float) __NDK_FPABI_MATH__;
+float	tanhf(float) __NDK_FPABI_MATH__;
+
+float	exp2f(float) __NDK_FPABI_MATH__;
+float	expf(float) __NDK_FPABI_MATH__;
+float	expm1f(float) __NDK_FPABI_MATH__;
+float	frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	ldexpf(float, int) __NDK_FPABI_MATH__;
+float	log10f(float) __NDK_FPABI_MATH__;
+float	log1pf(float) __NDK_FPABI_MATH__;
+float	log2f(float) __NDK_FPABI_MATH__;
+float	logf(float) __NDK_FPABI_MATH__;
+float	modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+
+float	powf(float, float) __NDK_FPABI_MATH__;
+float	sqrtf(float) __NDK_FPABI_MATH__;
+
+float	ceilf(float) __NDK_FPABI_MATH__;
+float	fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	floorf(float) __NDK_FPABI_MATH__;
+float	fmodf(float, float) __NDK_FPABI_MATH__;
+float	roundf(float) __NDK_FPABI_MATH__;
+
+float	erff(float) __NDK_FPABI_MATH__;
+float	erfcf(float) __NDK_FPABI_MATH__;
+float	hypotf(float, float) __NDK_FPABI_MATH__;
+float	lgammaf(float) __NDK_FPABI_MATH__;
+float	tgammaf(float) __NDK_FPABI_MATH__;
+
+float	acoshf(float) __NDK_FPABI_MATH__;
+float	asinhf(float) __NDK_FPABI_MATH__;
+float	atanhf(float) __NDK_FPABI_MATH__;
+float	cbrtf(float) __NDK_FPABI_MATH__;
+float	logbf(float) __NDK_FPABI_MATH__;
+float	copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long	lrintf(float) __NDK_FPABI_MATH__;
+long	lroundf(float) __NDK_FPABI_MATH__;
+float	nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float	nearbyintf(float) __NDK_FPABI_MATH__;
+float	nextafterf(float, float) __NDK_FPABI_MATH__;
+float	remainderf(float, float) __NDK_FPABI_MATH__;
+float	remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	rintf(float) __NDK_FPABI_MATH__;
+float	scalblnf(float, long) __NDK_FPABI_MATH__;
+float	scalbnf(float, int) __NDK_FPABI_MATH__;
+float	truncf(float) __NDK_FPABI_MATH__;
+
+float	fdimf(float, float) __NDK_FPABI_MATH__;
+float	fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+/* #endif */
+
+/*
+ * float versions of BSD math library entry points
+ */
+/* #if __BSD_VISIBLE */
+float	dremf(float, float) __NDK_FPABI_MATH__;
+int	finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	gammaf(float) __NDK_FPABI_MATH__;
+float	j0f(float) __NDK_FPABI_MATH__;
+float	j1f(float) __NDK_FPABI_MATH__;
+float	jnf(int, float) __NDK_FPABI_MATH__;
+float	scalbf(float, float) __NDK_FPABI_MATH__;
+float	y0f(float) __NDK_FPABI_MATH__;
+float	y1f(float) __NDK_FPABI_MATH__;
+float	ynf(int, float) __NDK_FPABI_MATH__;
+
+/*
+ * Float versions of reentrant version of gamma & lgamma; passes
+ * signgam back by reference as the second argument; user must
+ * allocate space for signgam.
+ */
+float	gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+
+/*
+ * float version of IEEE Test Vector
+ */
+float	significandf(float) __NDK_FPABI_MATH__;
+/* #endif */	/* __BSD_VISIBLE */ 
+
+/*
+ * long double versions of ISO/POSIX math functions
+ */
+/* #if __ISO_C_VISIBLE >= 1999 */
+#if 0
+long double	acoshl(long double) __NDK_FPABI_MATH__;
+long double	acosl(long double) __NDK_FPABI_MATH__;
+long double	asinhl(long double) __NDK_FPABI_MATH__;
+long double	asinl(long double) __NDK_FPABI_MATH__;
+long double	atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	atanhl(long double) __NDK_FPABI_MATH__;
+long double	atanl(long double) __NDK_FPABI_MATH__;
+long double	cbrtl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	ceill(long double) __NDK_FPABI_MATH__;
+long double	copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	coshl(long double) __NDK_FPABI_MATH__;
+long double	cosl(long double) __NDK_FPABI_MATH__;
+long double	erfcl(long double) __NDK_FPABI_MATH__;
+long double	erfl(long double) __NDK_FPABI_MATH__;
+long double	exp2l(long double) __NDK_FPABI_MATH__;
+long double	expl(long double) __NDK_FPABI_MATH__;
+long double	expm1l(long double) __NDK_FPABI_MATH__;
+#endif
+long double	fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	floorl(long double) __NDK_FPABI_MATH__;
+long double	fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	fmodl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+long double	frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#if 0
+long double	hypotl(long double, long double) __NDK_FPABI_MATH__;
+#endif
+int		ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	ldexpl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double	lgammal(long double) __NDK_FPABI_MATH__;
+long long	llrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long long	llroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double	log10l(long double) __NDK_FPABI_MATH__;
+long double	log1pl(long double) __NDK_FPABI_MATH__;
+long double	log2l(long double) __NDK_FPABI_MATH__;
+#endif
+long double	logbl(long double) __NDK_FPABI_MATH__;
+#if 0
+long		lrintl(long double) __NDK_FPABI_MATH__;
+#endif
+long		lroundl(long double) __NDK_FPABI_MATH__;
+#if 0
+long double	modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+#endif
+long double	nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+#if 0
+long double	nearbyintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double		nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double	nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+#if 0
+long double	powl(long double, long double) __NDK_FPABI_MATH__;
+long double	remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	rintl(long double) __NDK_FPABI_MATH__;
+#endif
+long double	roundl(long double) __NDK_FPABI_MATH__;
+long double	scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	scalbnl(long double, int) __NDK_FPABI_MATH__;
+#if 0
+long double	sinhl(long double) __NDK_FPABI_MATH__;
+long double	sinl(long double) __NDK_FPABI_MATH__;
+long double	sqrtl(long double) __NDK_FPABI_MATH__;
+long double	tanhl(long double) __NDK_FPABI_MATH__;
+long double	tanl(long double) __NDK_FPABI_MATH__;
+long double	tgammal(long double) __NDK_FPABI_MATH__;
+#endif
+long double	truncl(long double) __NDK_FPABI_MATH__;
+
+/* BIONIC: GLibc compatibility - required by the ARM toolchain */
+#ifdef _GNU_SOURCE
+void  sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+#endif
+
+long double	log2l(long double) __NDK_FPABI_MATH__;
+
+/* builtin version of all the above math functions are annotated too */
+
+double	__builtin_acos(double) __NDK_FPABI_MATH__;
+double	__builtin_asin(double) __NDK_FPABI_MATH__;
+double	__builtin_atan(double) __NDK_FPABI_MATH__;
+double	__builtin_atan2(double, double) __NDK_FPABI_MATH__;
+double	__builtin_cos(double) __NDK_FPABI_MATH__;
+double	__builtin_sin(double) __NDK_FPABI_MATH__;
+double	__builtin_tan(double) __NDK_FPABI_MATH__;
+double	__builtin_cosh(double) __NDK_FPABI_MATH__;
+double	__builtin_sinh(double) __NDK_FPABI_MATH__;
+double	__builtin_tanh(double) __NDK_FPABI_MATH__;
+double	__builtin_exp(double) __NDK_FPABI_MATH__;
+double	__builtin_frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_ldexp(double, int) __NDK_FPABI_MATH__;
+double	__builtin_log(double) __NDK_FPABI_MATH__;
+double	__builtin_log10(double) __NDK_FPABI_MATH__;
+double	__builtin_modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_pow(double, double) __NDK_FPABI_MATH__;
+double	__builtin_sqrt(double) __NDK_FPABI_MATH__;
+double	__builtin_ceil(double) __NDK_FPABI_MATH__;
+double	__builtin_fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_floor(double) __NDK_FPABI_MATH__;
+double	__builtin_fmod(double, double) __NDK_FPABI_MATH__;
+double	__builtin_acosh(double) __NDK_FPABI_MATH__;
+double	__builtin_asinh(double) __NDK_FPABI_MATH__;
+double	__builtin_atanh(double) __NDK_FPABI_MATH__;
+double	__builtin_cbrt(double) __NDK_FPABI_MATH__;
+double	__builtin_erf(double) __NDK_FPABI_MATH__;
+double	__builtin_erfc(double) __NDK_FPABI_MATH__;
+double	__builtin_exp2(double) __NDK_FPABI_MATH__;
+double	__builtin_expm1(double) __NDK_FPABI_MATH__;
+double	__builtin_fma(double, double, double) __NDK_FPABI_MATH__;
+double	__builtin_hypot(double, double) __NDK_FPABI_MATH__;
+int	__builtin_ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	__builtin_isinf(double) __NDK_FPABI_MATH__ __pure2; */
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 5)
+int	__builtin_isnan(double) __NDK_FPABI_MATH__ __pure2;
+#else
+/* clang < 3.5 has faulty prototype for __builtin_isnan */
+#endif
+double	__builtin_lgamma(double) __NDK_FPABI_MATH__;
+long long __builtin_llrint(double) __NDK_FPABI_MATH__;
+long long __builtin_llround(double) __NDK_FPABI_MATH__;
+double	__builtin_log1p(double) __NDK_FPABI_MATH__;
+double	__builtin_log2(double) __NDK_FPABI_MATH__;
+double	__builtin_logb(double) __NDK_FPABI_MATH__;
+long	__builtin_lrint(double) __NDK_FPABI_MATH__;
+long	__builtin_lround(double) __NDK_FPABI_MATH__;
+double	__builtin_nan(const char *) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nextafter(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remainder(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	__builtin_rint(double) __NDK_FPABI_MATH__;
+double	__builtin_j0(double) __NDK_FPABI_MATH__;
+double	__builtin_j1(double) __NDK_FPABI_MATH__;
+double	__builtin_jn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_scalb(double, double) __NDK_FPABI_MATH__;
+double	__builtin_y0(double) __NDK_FPABI_MATH__;
+double	__builtin_y1(double) __NDK_FPABI_MATH__;
+double	__builtin_yn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_gamma(double) __NDK_FPABI_MATH__;
+double	__builtin_copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fdim(double, double) __NDK_FPABI_MATH__;
+double	__builtin_fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nearbyint(double) __NDK_FPABI_MATH__;
+double	__builtin_round(double) __NDK_FPABI_MATH__;
+double	__builtin_scalbln(double, long) __NDK_FPABI_MATH__;
+double	__builtin_scalbn(double, int) __NDK_FPABI_MATH__;
+double	__builtin_tgamma(double) __NDK_FPABI_MATH__;
+double	__builtin_trunc(double) __NDK_FPABI_MATH__;
+double	__builtin_drem(double, double) __NDK_FPABI_MATH__;
+int	__builtin_finite(double) __NDK_FPABI_MATH__ __pure2;
+int	__builtin_isnanf(float) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_lgamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_significand(double) __NDK_FPABI_MATH__;
+float	__builtin_acosf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanf(float) __NDK_FPABI_MATH__;
+float	__builtin_atan2f(float, float) __NDK_FPABI_MATH__;
+float	__builtin_cosf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanf(float) __NDK_FPABI_MATH__;
+float	__builtin_coshf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_exp2f(float) __NDK_FPABI_MATH__;
+float	__builtin_expf(float) __NDK_FPABI_MATH__;
+float	__builtin_expm1f(float) __NDK_FPABI_MATH__;
+float	__builtin_frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	__builtin_ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_ldexpf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_log10f(float) __NDK_FPABI_MATH__;
+float	__builtin_log1pf(float) __NDK_FPABI_MATH__;
+float	__builtin_log2f(float) __NDK_FPABI_MATH__;
+float	__builtin_logf(float) __NDK_FPABI_MATH__;
+float	__builtin_modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+float	__builtin_powf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_sqrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_ceilf(float) __NDK_FPABI_MATH__;
+float	__builtin_fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_floorf(float) __NDK_FPABI_MATH__;
+float	__builtin_fmodf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_roundf(float) __NDK_FPABI_MATH__;
+float	__builtin_erff(float) __NDK_FPABI_MATH__;
+float	__builtin_erfcf(float) __NDK_FPABI_MATH__;
+float	__builtin_hypotf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_tgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_acoshf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_cbrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_logbf(float) __NDK_FPABI_MATH__;
+float	__builtin_copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long __builtin_llrintf(float) __NDK_FPABI_MATH__;
+long long __builtin_llroundf(float) __NDK_FPABI_MATH__;
+long	__builtin_lrintf(float) __NDK_FPABI_MATH__;
+long	__builtin_lroundf(float) __NDK_FPABI_MATH__;
+float	__builtin_nanf(const char *) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_nearbyintf(float) __NDK_FPABI_MATH__;
+float	__builtin_nextafterf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remainderf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	__builtin_rintf(float) __NDK_FPABI_MATH__;
+float	__builtin_scalblnf(float, long) __NDK_FPABI_MATH__;
+float	__builtin_scalbnf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_truncf(float) __NDK_FPABI_MATH__;
+float	__builtin_fdimf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_dremf(float, float) __NDK_FPABI_MATH__;
+int	__builtin_finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_gammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_j0f(float) __NDK_FPABI_MATH__;
+float	__builtin_j1f(float) __NDK_FPABI_MATH__;
+float	__builtin_jnf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_scalbf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_y0f(float) __NDK_FPABI_MATH__;
+float	__builtin_y1f(float) __NDK_FPABI_MATH__;
+float	__builtin_ynf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_significandf(float) __NDK_FPABI_MATH__;
+long double	__builtin_acoshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_acosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cbrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_ceill(long double) __NDK_FPABI_MATH__;
+long double	__builtin_copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_coshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfcl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_exp2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expm1l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_floorl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fmodl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_hypotl(long double, long double) __NDK_FPABI_MATH__;
+int		__builtin_ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_ldexpl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_lgammal(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llrintl(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log10l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log1pl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logbl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lrintl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_nearbyintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_nextafterl(long double, long double) __NDK_FPABI_MATH__;
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)
+double		__builtin_nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, long double) __NDK_FPABI_MATH__;
+#else
+/* clang < 3.4 */
+double		__builtin_nexttoward(double, double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, float) __NDK_FPABI_MATH__;
+#endif
+long double	__builtin_nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_powl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	__builtin_rintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_roundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	__builtin_scalbnl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_sinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sqrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tgammal(long double) __NDK_FPABI_MATH__;
+long double	__builtin_truncl(long double) __NDK_FPABI_MATH__;
+void  __builtin_sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+long double	__builtin_log2l(long double) __NDK_FPABI_MATH__;
+
+/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+__END_DECLS
+
+#endif /* !_MATH_H_ */
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
new file mode 100644
index 0000000..6bef356
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.sample.moreteapots"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="11"
+        android:targetSdkVersion="19" />
+    <uses-feature android:glEsVersion="0x00020000"></uses-feature>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme"
+        android:hasCode="true"
+        android:name="com.sample.moreteapots.MoreTeapotsApplication"
+        >
+
+        <!-- Our activity is the built-in NativeActivity framework class.
+             This will take care of integrating with our NDK code. -->
+        <activity android:name="com.sample.moreteapots.MoreTeapotsNativeActivity"
+                android:label="@string/app_name"
+                android:configChanges="orientation|keyboardHidden">
+            <!-- Tell NativeActivity the name of or .so -->
+            <meta-data android:name="android.app.lib_name"
+                    android:value="MoreTeapotsNativeActivity" />
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh
new file mode 100644
index 0000000..9f97be8
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlain.fsh
@@ -0,0 +1,23 @@
+//
+//  ShaderPlain.fsh
+//
+
+uniform lowp vec3       vMaterialAmbient;
+uniform mediump vec4       vMaterialSpecular;
+
+varying lowp vec4 colorDiffuse;
+
+uniform highp vec3      vLight0;
+varying mediump vec3 position;
+varying mediump vec3 normal;
+
+void main()
+{
+    mediump vec3 halfVector = normalize(-vLight0 + position);
+    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+    mediump float fPower = vMaterialSpecular.w;
+    mediump float specular = pow(NdotH, fPower);
+
+    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+    gl_FragColor = colorDiffuse + colorSpecular;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh
new file mode 100644
index 0000000..440c90d
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/ShaderPlainES3.fsh
@@ -0,0 +1,21 @@
+#version 300 es
+precision mediump float;
+
+uniform mediump vec4  vMaterialSpecular;
+uniform highp vec3 vLight0;
+
+in lowp vec4 colorDiffuse;
+in vec3 position;
+in vec3 normal;
+out vec4 outColor;
+
+void main()
+{
+    mediump vec3 halfVector = normalize(-vLight0 + position);
+    mediump float NdotH = max(dot(normalize(normal), halfVector), 0.0);
+    mediump float fPower = vMaterialSpecular.w;
+    mediump float specular = pow(NdotH, fPower);
+
+    lowp vec4 colorSpecular = vec4( vMaterialSpecular.xyz * specular, 1 );
+    outColor = colorDiffuse + colorSpecular;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh
new file mode 100644
index 0000000..725b44f
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlain.vsh
@@ -0,0 +1,34 @@
+//
+//  ShaderPlain.vsh
+//
+
+attribute highp vec3    myVertex;
+attribute highp vec3    myNormal;
+
+varying lowp    vec4    colorDiffuse;
+
+varying mediump vec3 position;
+varying mediump vec3 normal;
+
+uniform highp mat4      uMVMatrix;
+uniform highp mat4      uPMatrix;
+
+uniform highp vec3      vLight0;
+
+uniform lowp vec4       vMaterialDiffuse;
+uniform lowp vec3       vMaterialAmbient;
+uniform lowp vec4       vMaterialSpecular;
+
+void main(void)
+{
+    highp vec4 p = vec4(myVertex,1);
+    gl_Position = uPMatrix * p;
+
+    highp vec3 worldNormal = vec3(mat3(uMVMatrix[0].xyz, uMVMatrix[1].xyz, uMVMatrix[2].xyz) * myNormal);
+    highp vec3 ecPosition = p.xyz;
+
+    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vMaterialDiffuse  + vec4( vMaterialAmbient, 1 );
+
+    normal = worldNormal;
+    position = ecPosition;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh
new file mode 100644
index 0000000..06197c7
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/assets/Shaders/VS_ShaderPlainES3.vsh
@@ -0,0 +1,42 @@
+#version 300 es
+precision mediump float;
+
+//
+//Shader with phoneshading + geometry instancing support
+//Parameters with %PARAM_NAME% will be replaced to actual parameter at compile time
+//
+
+const int NUM_OBJECTS = %NUM_TEAPOT%;
+layout(location=%LOCATION_VERTEX%) in highp vec3    myVertex;
+layout(location=%LOCATION_NORMAL%) in highp vec3    myNormal;
+
+layout(std140) uniform ParamBlock {
+    mat4      uPMatrix[NUM_OBJECTS];
+    mat4      uMVMatrix[NUM_OBJECTS];
+    vec3      vMaterialDiffuse[NUM_OBJECTS];
+};
+
+uniform highp vec3      vLight0;
+uniform lowp vec3       vMaterialAmbient;
+uniform lowp vec4       vMaterialSpecular;
+
+out lowp    vec4    colorDiffuse;
+
+out mediump vec3 position;
+out mediump vec3 normal;
+
+void main(void)
+{
+    highp vec4 p = vec4(myVertex,1);
+    gl_Position = uPMatrix[gl_InstanceID%ARB%] * p;
+
+    highp vec3 worldNormal = vec3(mat3(uMVMatrix[gl_InstanceID%ARB%][0].xyz,
+            uMVMatrix[gl_InstanceID%ARB%][1].xyz,
+            uMVMatrix[gl_InstanceID%ARB%][2].xyz) * myNormal);
+    highp vec3 ecPosition = p.xyz;
+
+    colorDiffuse = dot( worldNormal, normalize(-vLight0+ecPosition) ) * vec4(vMaterialDiffuse[gl_InstanceID%ARB%], 1.f)  + vec4( vMaterialAmbient, 1 );
+
+    normal = worldNormal;
+    position = ecPosition;
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
new file mode 100644
index 0000000..b4457b9
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE    := MoreTeapotsNativeActivity
+LOCAL_SRC_FILES := MoreTeapotsNativeActivity.cpp \
+MoreTeapotsRenderer.cpp \
+
+LOCAL_C_INCLUDES := 
+LOCAL_CFLAGS :=
+
+LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv2
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
+
+ifneq ($(filter %armeabi-v7a,$(TARGET_ARCH_ABI)),)
+LOCAL_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
+LOCAL_LDLIBS += -lm_hard
+ifeq (,$(filter -fuse-ld=mcld,$(APP_LDFLAGS) $(LOCAL_LDFLAGS)))
+LOCAL_LDFLAGS += -Wl,--no-warn-mismatch
+endif
+endif
+
+include $(BUILD_SHARED_LIBRARY)
+
+$(call import-module,android/ndk_helper)
+$(call import-module,android/native_app_glue)
+$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk b/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk
new file mode 100644
index 0000000..9367158
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/Application.mk
@@ -0,0 +1,4 @@
+APP_PLATFORM := android-9
+APP_ABI := all
+
+APP_STL := stlport_static
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
new file mode 100644
index 0000000..43b7361
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
@@ -0,0 +1,500 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#include "MoreTeapotsRenderer.h"
+
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
+//-------------------------------------------------------------------------
+//Constants
+//-------------------------------------------------------------------------
+const int32_t NUM_TEAPOTS_X = 8;
+const int32_t NUM_TEAPOTS_Y = 8;
+const int32_t NUM_TEAPOTS_Z = 8;
+
+//-------------------------------------------------------------------------
+//Shared state for our app.
+//-------------------------------------------------------------------------
+struct android_app;
+class Engine
+{
+    MoreTeapotsRenderer renderer_;
+
+    ndk_helper::GLContext* gl_context_;
+
+    bool initialized_resources_;
+    bool has_focus_;
+
+    ndk_helper::DoubletapDetector doubletap_detector_;
+    ndk_helper::PinchDetector pinch_detector_;
+    ndk_helper::DragDetector drag_detector_;
+    ndk_helper::PerfMonitor monitor_;
+
+    ndk_helper::TapCamera tap_camera_;
+
+    android_app* app_;
+
+    ASensorManager* sensor_manager_;
+    const ASensor* accelerometer_sensor_;
+    ASensorEventQueue* sensor_event_queue_;
+
+    void UpdateFPS( float fps );
+    void ShowUI();
+    void TransformPosition( ndk_helper::Vec2& vec );
+
+public:
+    static void HandleCmd( struct android_app* app,
+            int32_t cmd );
+    static int32_t HandleInput( android_app* app,
+            AInputEvent* event );
+
+    Engine();
+    ~Engine();
+    void SetState( android_app* state );
+    int InitDisplay();
+    void LoadResources();
+    void UnloadResources();
+    void DrawFrame();
+    void TermDisplay();
+    void TrimMemory();
+    bool IsReady();
+
+    void UpdatePosition( AInputEvent* event,
+            int32_t index,
+            float& x,
+            float& y );
+
+    void InitSensors();
+    void ProcessSensors( int32_t id );
+    void SuspendSensors();
+    void ResumeSensors();
+};
+
+//-------------------------------------------------------------------------
+//Ctor
+//-------------------------------------------------------------------------
+Engine::Engine() :
+                initialized_resources_( false ),
+                has_focus_( false ),
+                app_( NULL ),
+                sensor_manager_( NULL ),
+                accelerometer_sensor_( NULL ),
+                sensor_event_queue_( NULL )
+{
+    gl_context_ = ndk_helper::GLContext::GetInstance();
+}
+
+//-------------------------------------------------------------------------
+//Dtor
+//-------------------------------------------------------------------------
+Engine::~Engine()
+{
+}
+
+/**
+ * Load resources
+ */
+void Engine::LoadResources()
+{
+    renderer_.Init( NUM_TEAPOTS_X, NUM_TEAPOTS_Y, NUM_TEAPOTS_Z );
+    renderer_.Bind( &tap_camera_ );
+}
+
+/**
+ * Unload resources
+ */
+void Engine::UnloadResources()
+{
+    renderer_.Unload();
+}
+
+/**
+ * Initialize an EGL context for the current display.
+ */
+int Engine::InitDisplay()
+{
+    if( !initialized_resources_ )
+    {
+        gl_context_->Init( app_->window );
+        LoadResources();
+        initialized_resources_ = true;
+    }
+    else
+    {
+        // initialize OpenGL ES and EGL
+        if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
+        {
+            UnloadResources();
+            LoadResources();
+        }
+    }
+
+    ShowUI();
+
+    // Initialize GL state.
+    glEnable( GL_CULL_FACE );
+    glEnable( GL_DEPTH_TEST );
+    glDepthFunc( GL_LEQUAL );
+
+    //Note that screen size might have been changed
+    glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+    renderer_.UpdateViewport();
+
+    tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+    tap_camera_.SetPinchTransformFactor( 10.f, 10.f, 8.f );
+
+    return 0;
+}
+
+/**
+ * Just the current frame in the display.
+ */
+void Engine::DrawFrame()
+{
+    float fps;
+    if( monitor_.Update( fps ) )
+    {
+        UpdateFPS( fps );
+    }
+    double dTime = monitor_.GetCurrentTime();
+    renderer_.Update( dTime );
+
+    // Just fill the screen with a color.
+    glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+    renderer_.Render();
+
+    // Swap
+    if( EGL_SUCCESS != gl_context_->Swap() )
+    {
+        UnloadResources();
+        LoadResources();
+    }
+}
+
+/**
+ * Tear down the EGL context currently associated with the display.
+ */
+void Engine::TermDisplay()
+{
+    gl_context_->Suspend();
+
+}
+
+void Engine::TrimMemory()
+{
+    LOGI( "Trimming memory" );
+    gl_context_->Invalidate();
+}
+/**
+ * Process the next input event.
+ */
+int32_t Engine::HandleInput( android_app* app,
+        AInputEvent* event )
+{
+    Engine* eng = (Engine*) app->userData;
+    if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
+    {
+        ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+        ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+        ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
+
+        //Double tap detector has a priority over other detectors
+        if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+        {
+            //Detect double tap
+            eng->tap_camera_.Reset( true );
+        }
+        else
+        {
+            //Handle drag state
+            if( dragState & ndk_helper::GESTURE_STATE_START )
+            {
+                //Otherwise, start dragging
+                ndk_helper::Vec2 v;
+                eng->drag_detector_.GetPointer( v );
+                eng->TransformPosition( v );
+                eng->tap_camera_.BeginDrag( v );
+            }
+            else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+            {
+                ndk_helper::Vec2 v;
+                eng->drag_detector_.GetPointer( v );
+                eng->TransformPosition( v );
+                eng->tap_camera_.Drag( v );
+            }
+            else if( dragState & ndk_helper::GESTURE_STATE_END )
+            {
+                eng->tap_camera_.EndDrag();
+            }
+
+            //Handle pinch state
+            if( pinchState & ndk_helper::GESTURE_STATE_START )
+            {
+                //Start new pinch
+                ndk_helper::Vec2 v1;
+                ndk_helper::Vec2 v2;
+                eng->pinch_detector_.GetPointers( v1, v2 );
+                eng->TransformPosition( v1 );
+                eng->TransformPosition( v2 );
+                eng->tap_camera_.BeginPinch( v1, v2 );
+            }
+            else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+            {
+                //Multi touch
+                //Start new pinch
+                ndk_helper::Vec2 v1;
+                ndk_helper::Vec2 v2;
+                eng->pinch_detector_.GetPointers( v1, v2 );
+                eng->TransformPosition( v1 );
+                eng->TransformPosition( v2 );
+                eng->tap_camera_.Pinch( v1, v2 );
+            }
+        }
+        return 1;
+    }
+    return 0;
+}
+
+/**
+ * Process the next main command.
+ */
+void Engine::HandleCmd( struct android_app* app,
+        int32_t cmd )
+{
+    Engine* eng = (Engine*) app->userData;
+    switch( cmd )
+    {
+    case APP_CMD_SAVE_STATE:
+        break;
+    case APP_CMD_INIT_WINDOW:
+        // The window is being shown, get it ready.
+        if( app->window != NULL )
+        {
+            eng->InitDisplay();
+            eng->DrawFrame();
+        }
+        break;
+    case APP_CMD_TERM_WINDOW:
+        // The window is being hidden or closed, clean it up.
+        eng->TermDisplay();
+        eng->has_focus_ = false;
+        break;
+    case APP_CMD_STOP:
+        break;
+    case APP_CMD_GAINED_FOCUS:
+        eng->ResumeSensors();
+        //Start animation
+        eng->has_focus_ = true;
+        break;
+    case APP_CMD_LOST_FOCUS:
+        eng->SuspendSensors();
+        // Also stop animating.
+        eng->has_focus_ = false;
+        eng->DrawFrame();
+        break;
+    case APP_CMD_LOW_MEMORY:
+        //Free up GL resources
+        eng->TrimMemory();
+        break;
+    }
+}
+
+//-------------------------------------------------------------------------
+//Sensor handlers
+//-------------------------------------------------------------------------
+void Engine::InitSensors()
+{
+    sensor_manager_ = ASensorManager_getInstance();
+    accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+            ASENSOR_TYPE_ACCELEROMETER );
+    sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+            LOOPER_ID_USER, NULL, NULL );
+}
+
+void Engine::ProcessSensors( int32_t id )
+{
+    // If a sensor has data, process it now.
+    if( id == LOOPER_ID_USER )
+    {
+        if( accelerometer_sensor_ != NULL )
+        {
+            ASensorEvent event;
+            while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
+            {
+            }
+        }
+    }
+}
+
+void Engine::ResumeSensors()
+{
+    // When our app gains focus, we start monitoring the accelerometer.
+    if( accelerometer_sensor_ != NULL )
+    {
+        ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
+        // We'd like to get 60 events per second (in us).
+        ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+                (1000L / 60) * 1000 );
+    }
+}
+
+void Engine::SuspendSensors()
+{
+    // When our app loses focus, we stop monitoring the accelerometer.
+    // This is to avoid consuming battery while not being used.
+    if( accelerometer_sensor_ != NULL )
+    {
+        ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
+    }
+}
+
+//-------------------------------------------------------------------------
+//Misc
+//-------------------------------------------------------------------------
+void Engine::SetState( android_app* state )
+{
+    app_ = state;
+    doubletap_detector_.SetConfiguration( app_->config );
+    drag_detector_.SetConfiguration( app_->config );
+    pinch_detector_.SetConfiguration( app_->config );
+}
+
+bool Engine::IsReady()
+{
+    if( has_focus_ )
+        return true;
+
+    return false;
+}
+
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
+{
+    vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+            / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+            - ndk_helper::Vec2( 1.f, 1.f );
+}
+
+void Engine::ShowUI()
+{
+    JNIEnv *jni;
+    app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+    //Default class retrieval
+    jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+    jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+    jni->CallVoidMethod( app_->activity->clazz, methodID );
+
+    app_->activity->vm->DetachCurrentThread();
+    return;
+}
+
+void Engine::UpdateFPS( float fps )
+{
+    JNIEnv *jni;
+    app_->activity->vm->AttachCurrentThread( &jni, NULL );
+
+    //Default class retrieval
+    jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+    jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+    jni->CallVoidMethod( app_->activity->clazz, methodID, fps );
+
+    app_->activity->vm->DetachCurrentThread();
+    return;
+}
+
+Engine g_engine;
+
+/**
+ * This is the main entry point of a native application that is using
+ * android_native_app_glue.  It runs in its own thread, with its own
+ * event loop for receiving input events and doing other things.
+ */
+void android_main( android_app* state )
+{
+    app_dummy();
+
+    g_engine.SetState( state );
+
+    //Init helper functions
+    ndk_helper::JNIHelper::GetInstance()->Init( state->activity, HELPER_CLASS_NAME );
+
+    state->userData = &g_engine;
+    state->onAppCmd = Engine::HandleCmd;
+    state->onInputEvent = Engine::HandleInput;
+
+#ifdef USE_NDK_PROFILER
+    monstartup("libMoreTeapotsNativeActivity.so");
+#endif
+
+    // Prepare to monitor accelerometer
+    g_engine.InitSensors();
+
+    // loop waiting for stuff to do.
+    while( 1 )
+    {
+        // Read all pending events.
+        int id;
+        int events;
+        android_poll_source* source;
+
+        // If not animating, we will block forever waiting for events.
+        // If animating, we loop until all events are read, then continue
+        // to draw the next frame of animation.
+        while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+                >= 0 )
+        {
+            // Process this event.
+            if( source != NULL )
+                source->process( state, source );
+
+            g_engine.ProcessSensors( id );
+
+            // Check if we are exiting.
+            if( state->destroyRequested != 0 )
+            {
+                g_engine.TermDisplay();
+                return;
+            }
+        }
+
+        if( g_engine.IsReady() )
+        {
+            // Drawing is throttled to the screen update rate, so there
+            // is no need to do timing here.
+            g_engine.DrawFrame();
+        }
+    }
+}
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
new file mode 100644
index 0000000..4adf4ed
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
@@ -0,0 +1,555 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// MoreTeapotsRenderer.cpp
+// Render teapots
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include "MoreTeapotsRenderer.h"
+
+//--------------------------------------------------------------------------------
+// Teapot model data
+//--------------------------------------------------------------------------------
+#include "teapot.inl"
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+MoreTeapotsRenderer::MoreTeapotsRenderer() :
+                geometry_instancing_support_( false )
+{
+
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+MoreTeapotsRenderer::~MoreTeapotsRenderer()
+{
+    Unload();
+}
+
+//--------------------------------------------------------------------------------
+// Init
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Init( const int32_t numX,
+        const int32_t numY,
+        const int32_t numZ )
+{
+    if( ndk_helper::GLContext::GetInstance()->GetGLVersion() >= 3.0 )
+    {
+        geometry_instancing_support_ = true;
+    }
+    else if( ndk_helper::GLContext::GetInstance()->CheckExtension( "GL_NV_draw_instanced" )
+            && ndk_helper::GLContext::GetInstance()->CheckExtension(
+                    "GL_NV_uniform_buffer_object" ) )
+    {
+        LOGI( "Supported via extension!" );
+        //_bGeometryInstancingSupport = true;
+        //_bARBSupport = true; //Need to patch shaders
+        //Currently this has been disabled
+    }
+
+    //Settings
+    glFrontFace( GL_CCW );
+
+    //Create Index buffer
+    num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+    glGenBuffers( 1, &ibo_ );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+    glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices, GL_STATIC_DRAW );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+
+    //Create VBO
+    num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+    int32_t iStride = sizeof(TEAPOT_VERTEX);
+    int32_t iIndex = 0;
+    TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+    for( int32_t i = 0; i < num_vertices_; ++i )
+    {
+        p[i].pos[0] = teapotPositions[iIndex];
+        p[i].pos[1] = teapotPositions[iIndex + 1];
+        p[i].pos[2] = teapotPositions[iIndex + 2];
+
+        p[i].normal[0] = teapotNormals[iIndex];
+        p[i].normal[1] = teapotNormals[iIndex + 1];
+        p[i].normal[2] = teapotNormals[iIndex + 2];
+        iIndex += 3;
+    }
+    glGenBuffers( 1, &vbo_ );
+    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+    glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+    glBindBuffer( GL_ARRAY_BUFFER, 0 );
+    delete[] p;
+
+    //Init Projection matrices
+    teapot_x_ = numX;
+    teapot_y_ = numY;
+    teapot_z_ = numZ;
+    vec_mat_models_.reserve( teapot_x_ * teapot_y_ * teapot_z_ );
+
+    UpdateViewport();
+
+    const float total_width = 500.f;
+    float gap_x = total_width / (teapot_x_ - 1);
+    float gap_y = total_width / (teapot_y_ - 1);
+    float gap_z = total_width / (teapot_z_ - 1);
+    float offset_x = -total_width / 2.f;
+    float offset_y = -total_width / 2.f;
+    float offset_z = -total_width / 2.f;
+
+    for( int32_t iX = 0; iX < teapot_x_; ++iX )
+        for( int32_t iY = 0; iY < teapot_y_; ++iY )
+            for( int32_t iZ = 0; iZ < teapot_z_; ++iZ )
+            {
+                vec_mat_models_.push_back(
+                        ndk_helper::Mat4::Translation( iX * gap_x + offset_x, iY * gap_y + offset_y,
+                                iZ * gap_z + offset_z ) );
+                vec_colors_.push_back(
+                        ndk_helper::Vec3( random() / float( RAND_MAX * 1.1 ),
+                                random() / float( RAND_MAX * 1.1 ),
+                                random() / float( RAND_MAX * 1.1 ) ) );
+
+                float fX = random() / float( RAND_MAX ) - 0.5f;
+                float fY = random() / float( RAND_MAX ) - 0.5f;
+                vec_rotations_.push_back( ndk_helper::Vec2( fX * 0.05f, fY * 0.05f ) );
+                vec_current_rotations_.push_back( ndk_helper::Vec2( fX * M_PI, fY * M_PI ) );
+            }
+
+    if( geometry_instancing_support_ )
+    {
+        //
+        //Create parameter dictionary for shader patch
+        std::map<std::string, std::string> param;
+        param[std::string( "%NUM_TEAPOT%" )] = ToString( teapot_x_ * teapot_y_ * teapot_z_ );
+        param[std::string( "%LOCATION_VERTEX%" )] = ToString( ATTRIB_VERTEX );
+        param[std::string( "%LOCATION_NORMAL%" )] = ToString( ATTRIB_NORMAL );
+        if( arb_support_ )
+            param[std::string( "%ARB%" )] = std::string( "ARB" );
+        else
+            param[std::string( "%ARB%" )] = std::string( "" );
+
+        //Load shader
+        bool b = LoadShadersES3( &shader_param_, "Shaders/VS_ShaderPlainES3.vsh",
+                "Shaders/ShaderPlainES3.fsh", param );
+        if( b )
+        {
+            //
+            //Create uniform buffer
+            //
+            GLuint bindingPoint = 1;
+            GLuint blockIndex;
+            blockIndex = glGetUniformBlockIndex( shader_param_.program_, "ParamBlock" );
+            glUniformBlockBinding( shader_param_.program_, blockIndex, bindingPoint );
+
+            //Retrieve array stride value
+            int32_t iNumIndices;
+            glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
+                    GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &iNumIndices );
+            GLint i[iNumIndices];
+            GLint stride[iNumIndices];
+            glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
+                    GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, i );
+            glGetActiveUniformsiv( shader_param_.program_, iNumIndices, (GLuint*) i,
+                    GL_UNIFORM_ARRAY_STRIDE, stride );
+
+            ubo_matrix_stride_ = stride[0] / sizeof(float);
+            ubo_vector_stride_ = stride[2] / sizeof(float);
+
+            glGenBuffers( 1, &ubo_ );
+            glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+            glBindBufferBase( GL_UNIFORM_BUFFER, bindingPoint, ubo_ );
+
+            //Store color value which wouldn't be updated every frame
+            int32_t iSize = teapot_x_ * teapot_y_ * teapot_z_
+                    * (ubo_matrix_stride_ + ubo_matrix_stride_ + ubo_vector_stride_); //Mat4 + Mat4 + Vec3 + 1 stride
+            float* pBuffer = new float[iSize];
+            float* pColor = pBuffer + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_ * 2;
+            for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+            {
+                memcpy( pColor, &vec_colors_[i], 3 * sizeof(float) );
+                pColor += ubo_vector_stride_; //Assuming std140 layout which is 4 DWORD stride for vectors
+            }
+
+            glBufferData( GL_UNIFORM_BUFFER, iSize * sizeof(float), pBuffer, GL_DYNAMIC_DRAW );
+            delete[] pBuffer;
+        }
+        else
+        {
+            LOGI( "Shader compilation failed!! Falls back to ES2.0 pass" );
+            //This happens some devices.
+            geometry_instancing_support_ = false;
+            //Load shader for GLES2.0
+            LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+        }
+    }
+    else
+    {
+        //Load shader for GLES2.0
+        LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+    }
+}
+
+void MoreTeapotsRenderer::UpdateViewport()
+{
+    int32_t viewport[4];
+    glGetIntegerv( GL_VIEWPORT, viewport );
+    float fAspect = (float) viewport[2] / (float) viewport[3];
+
+    const float CAM_NEAR = 5.f;
+    const float CAM_FAR = 10000.f;
+    bool bRotate = false;
+    mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
+}
+
+//--------------------------------------------------------------------------------
+// Unload
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Unload()
+{
+    if( vbo_ )
+    {
+        glDeleteBuffers( 1, &vbo_ );
+        vbo_ = 0;
+    }
+    if( ubo_ )
+    {
+        glDeleteBuffers( 1, &ubo_ );
+        ubo_ = 0;
+    }
+    if( ibo_ )
+    {
+        glDeleteBuffers( 1, &ibo_ );
+        ibo_ = 0;
+    }
+    if( shader_param_.program_ )
+    {
+        glDeleteProgram( shader_param_.program_ );
+        shader_param_.program_ = 0;
+    }
+}
+
+//--------------------------------------------------------------------------------
+// Update
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Update( float fTime )
+{
+    const float CAM_X = 0.f;
+    const float CAM_Y = 0.f;
+    const float CAM_Z = 2000.f;
+
+    mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+            ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
+
+    if( camera_ )
+    {
+        camera_->Update();
+        mat_view_ = camera_->GetTransformMatrix() * mat_view_ * camera_->GetRotationMatrix();
+    }
+}
+
+//--------------------------------------------------------------------------------
+// Render
+//--------------------------------------------------------------------------------
+void MoreTeapotsRenderer::Render()
+{
+    // Bind the VBO
+    glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+
+    int32_t iStride = sizeof(TEAPOT_VERTEX);
+    // Pass the vertex data
+    glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, BUFFER_OFFSET( 0 ) );
+    glEnableVertexAttribArray( ATTRIB_VERTEX );
+
+    glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+            BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+    glEnableVertexAttribArray( ATTRIB_NORMAL );
+
+    // Bind the IB
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+
+    glUseProgram( shader_param_.program_ );
+
+    TEAPOT_MATERIALS material = { { 1.0f, 1.0f, 1.0f, 10.f }, { 0.1f, 0.1f, 0.1f }, };
+
+    //Update uniforms
+    //
+    //using glUniform3fv here was troublesome..
+    //
+    glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+            material.specular_color[1], material.specular_color[2], material.specular_color[3] );
+    glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+            material.ambient_color[1], material.ambient_color[2] );
+
+    glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
+
+    if( geometry_instancing_support_ )
+    {
+        //
+        //Geometry instancing, new feature in GLES3.0
+        //
+
+        //Update UBO
+        glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+        float* p = (float*) glMapBufferRange( GL_UNIFORM_BUFFER, 0,
+                teapot_x_ * teapot_y_ * teapot_z_ * (ubo_matrix_stride_ * 2) * sizeof(float),
+                GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT );
+        float* pMVPMat = p;
+        float* pMVMat = p + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_;
+        for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+        {
+            //Rotation
+            float fX, fY;
+            vec_current_rotations_[i] += vec_rotations_[i];
+            vec_current_rotations_[i].Value( fX, fY );
+            ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( fX )
+                    * ndk_helper::Mat4::RotationY( fY );
+
+            // Feed Projection and Model View matrices to the shaders
+            ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+            ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
+
+            memcpy( pMVPMat, mat_vp.Ptr(), sizeof(mat_v) );
+            pMVPMat += ubo_matrix_stride_;
+
+            memcpy( pMVMat, mat_v.Ptr(), sizeof(mat_v) );
+            pMVMat += ubo_matrix_stride_;
+        }
+        glUnmapBuffer( GL_UNIFORM_BUFFER );
+
+        //Instanced rendering
+        glDrawElementsInstanced( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0),
+                teapot_x_ * teapot_y_ * teapot_z_ );
+
+    }
+    else
+    {
+        //Regular rendering pass
+        for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
+        {
+            //Set diffuse
+            float x, y, z;
+            vec_colors_[i].Value( x, y, z );
+            glUniform4f( shader_param_.material_diffuse_, x, y, z, 1.f );
+
+            //Rotation
+            vec_current_rotations_[i] += vec_rotations_[i];
+            vec_current_rotations_[i].Value( x, y );
+            ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( x )
+                    * ndk_helper::Mat4::RotationY( y );
+
+            // Feed Projection and Model View matrices to the shaders
+            ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+            ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
+            glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+            glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_v.Ptr() );
+
+            glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
+
+        }
+    }
+
+    glBindBuffer( GL_ARRAY_BUFFER, 0 );
+    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
+}
+
+//--------------------------------------------------------------------------------
+// LoadShaders
+//--------------------------------------------------------------------------------
+bool MoreTeapotsRenderer::LoadShaders( SHADER_PARAMS* params,
+        const char* strVsh,
+        const char* strFsh )
+{
+    //
+    //Shader load for GLES2
+    //In GLES2.0, shader attribute locations need to be explicitly specified before linking
+    //
+    GLuint program;
+    GLuint vertShader, fragShader;
+    char *vertShaderPathname, *fragShaderPathname;
+
+    // Create shader program
+    program = glCreateProgram();
+    LOGI( "Created Shader %d", program );
+
+    // Create and compile vertex shader
+    if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh ) )
+    {
+        LOGI( "Failed to compile vertex shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Create and compile fragment shader
+    if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh ) )
+    {
+        LOGI( "Failed to compile fragment shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Attach vertex shader to program
+    glAttachShader( program, vertShader );
+
+    // Attach fragment shader to program
+    glAttachShader( program, fragShader );
+
+    // Bind attribute locations
+    // this needs to be done prior to linking
+    glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+    glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
+
+    // Link program
+    if( !ndk_helper::shader::LinkProgram( program ) )
+    {
+        LOGI( "Failed to link program: %d", program );
+
+        if( vertShader )
+        {
+            glDeleteShader( vertShader );
+            vertShader = 0;
+        }
+        if( fragShader )
+        {
+            glDeleteShader( fragShader );
+            fragShader = 0;
+        }
+        if( program )
+        {
+            glDeleteProgram( program );
+        }
+        return false;
+    }
+
+    // Get uniform locations
+    params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+    params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
+
+    params->light0_ = glGetUniformLocation( program, "vLight0" );
+    params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+    params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+    params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+    // Release vertex and fragment shaders
+    if( vertShader )
+        glDeleteShader( vertShader );
+    if( fragShader )
+        glDeleteShader( fragShader );
+
+    params->program_ = program;
+    return true;
+}
+
+bool MoreTeapotsRenderer::LoadShadersES3( SHADER_PARAMS* params,
+        const char* strVsh,
+        const char* strFsh,
+        std::map<std::string, std::string>&shaderParams )
+{
+    //
+    //Shader load for GLES3
+    //In GLES3.0, shader attribute index can be described in a shader code directly with layout() attribute
+    //
+    GLuint program;
+    GLuint vertShader, fragShader;
+    char *vertShaderPathname, *fragShaderPathname;
+
+    // Create shader program
+    program = glCreateProgram();
+    LOGI( "Created Shader %d", program );
+
+    // Create and compile vertex shader
+    if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh, shaderParams ) )
+    {
+        LOGI( "Failed to compile vertex shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Create and compile fragment shader
+    if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh,
+            shaderParams ) )
+    {
+        LOGI( "Failed to compile fragment shader" );
+        glDeleteProgram( program );
+        return false;
+    }
+
+    // Attach vertex shader to program
+    glAttachShader( program, vertShader );
+
+    // Attach fragment shader to program
+    glAttachShader( program, fragShader );
+
+    // Link program
+    if( !ndk_helper::shader::LinkProgram( program ) )
+    {
+        LOGI( "Failed to link program: %d", program );
+
+        if( vertShader )
+        {
+            glDeleteShader( vertShader );
+            vertShader = 0;
+        }
+        if( fragShader )
+        {
+            glDeleteShader( fragShader );
+            fragShader = 0;
+        }
+        if( program )
+        {
+            glDeleteProgram( program );
+        }
+
+        return false;
+    }
+
+    // Get uniform locations
+    params->light0_ = glGetUniformLocation( program, "vLight0" );
+    params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+    params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
+
+    // Release vertex and fragment shaders
+    if( vertShader )
+        glDeleteShader( vertShader );
+    if( fragShader )
+        glDeleteShader( fragShader );
+
+    params->program_ = program;
+    return true;
+}
+
+//--------------------------------------------------------------------------------
+// Bind
+//--------------------------------------------------------------------------------
+bool MoreTeapotsRenderer::Bind( ndk_helper::TapCamera* camera )
+{
+    camera_ = camera;
+    return true;
+}
+
+//--------------------------------------------------------------------------------
+// Helper functions
+//--------------------------------------------------------------------------------
+std::string MoreTeapotsRenderer::ToString( const int32_t i )
+{
+    char str[64];
+    snprintf( str, sizeof(str), "%d", i );
+    return std::string( str );
+}
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
new file mode 100644
index 0000000..346d873
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// MoreTeapotsRenderer.h
+// Renderer for teapots
+//--------------------------------------------------------------------------------
+#ifndef _MoreTeapotsRenderer_H
+#define _MoreTeapotsRenderer_H
+
+//--------------------------------------------------------------------------------
+// Include files
+//--------------------------------------------------------------------------------
+#include <jni.h>
+#include <errno.h>
+
+#include <vector>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include <cpu-features.h>
+
+#define CLASS_NAME "android/app/NativeActivity"
+#define APPLICATION_CLASS_NAME "com/sample/moreteapotss/MoreTeapotsApplication"
+
+#include "NDKHelper.h"
+
+#define BUFFER_OFFSET(i) ((char *)NULL + (i))
+
+struct TEAPOT_VERTEX
+{
+    float pos[3];
+    float normal[3];
+};
+
+enum SHADER_ATTRIBUTES
+{
+    ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_COLOR, ATTRIB_UV
+};
+
+struct SHADER_PARAMS
+{
+    GLuint program_;
+    GLuint light0_;
+    GLuint material_diffuse_;
+    GLuint material_ambient_;
+    GLuint material_specular_;
+
+    GLuint matrix_projection_;
+    GLuint matrix_view_;
+};
+
+struct TEAPOT_MATERIALS
+{
+    float specular_color[4];
+    float ambient_color[3];
+};
+
+class MoreTeapotsRenderer
+{
+    int32_t num_indices_;
+    int32_t num_vertices_;
+    GLuint ibo_;
+    GLuint vbo_;
+    GLuint ubo_;
+
+    SHADER_PARAMS shader_param_;
+    bool LoadShaders( SHADER_PARAMS* params,
+            const char* strVsh,
+            const char* strFsh );
+    bool LoadShadersES3( SHADER_PARAMS* params,
+            const char* strVsh,
+            const char* strFsh,
+            std::map<std::string, std::string>&shaderParameters );
+
+    ndk_helper::Mat4 mat_projection_;
+    ndk_helper::Mat4 mat_view_;
+    std::vector<ndk_helper::Mat4> vec_mat_models_;
+    std::vector<ndk_helper::Vec3> vec_colors_;
+    std::vector<ndk_helper::Vec2> vec_rotations_;
+    std::vector<ndk_helper::Vec2> vec_current_rotations_;
+
+    ndk_helper::TapCamera* camera_;
+
+    int32_t teapot_x_;
+    int32_t teapot_y_;
+    int32_t teapot_z_;
+    int32_t ubo_matrix_stride_;
+    int32_t ubo_vector_stride_;
+    bool geometry_instancing_support_;
+    bool arb_support_;
+
+    std::string ToString( const int32_t i );
+public:
+    MoreTeapotsRenderer();
+    virtual ~MoreTeapotsRenderer();
+    void Init( const int32_t numX,
+            const int32_t numY,
+            const int32_t numZ );
+    void Render();
+    void Update( float dTime );
+    bool Bind( ndk_helper::TapCamera* camera );
+    void Unload();
+    void UpdateViewport();
+};
+
+#endif
+
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl b/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl
new file mode 100644
index 0000000..7f42b88
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/teapot.inl
@@ -0,0 +1,2057 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//
+// Teapot.inl
+// Derived from WebGL sample
+// https://github.com/KhronosGroup/WebGL/blob/master/sdk/demos/google/shiny-teapot/teapot-streams.js
+//
+
+float teapotPositions[] = { 17.83489990234375, 0, 30.573999404907227, 16.452699661254883, -7.000179767608643, 30.573999404907227,
+        16.223100662231445, -6.902520179748535, 31.51460075378418, 17.586000442504883, 0, 31.51460075378418,
+        16.48940086364746, -7.015810012817383, 31.828100204467773, 17.87470054626465, 0, 31.828100204467773,
+        17.031099319458008, -7.246280193328857, 31.51460075378418, 18.46190071105957, 0, 31.51460075378418,
+        17.62779998779297, -7.500199794769287, 30.573999404907227, 19.108800888061523, 0, 30.573999404907227,
+        12.662699699401855, -12.662699699401855, 30.573999404907227, 12.486100196838379, -12.486100196838379, 31.51460075378418,
+        12.690999984741211, -12.690999984741211, 31.828100204467773, 13.10789966583252, -13.10789966583252, 31.51460075378418,
+        13.56719970703125, -13.56719970703125, 30.573999404907227, 7.000179767608643, -16.452699661254883, 30.573999404907227,
+        6.902520179748535, -16.223100662231445, 31.51460075378418, 7.015810012817383, -16.48940086364746, 31.828100204467773,
+        7.246280193328857, -17.031099319458008, 31.51460075378418, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+        0, -17.83489990234375, 30.573999404907227, 0, -17.586000442504883, 31.51460075378418,
+        0, -17.87470054626465, 31.828100204467773, 0, -18.46190071105957, 31.51460075378418,
+        0, -19.108800888061523, 30.573999404907227, 0, -17.83489990234375, 30.573999404907227,
+        -7.483870029449463, -16.452699661254883, 30.573999404907227, -7.106579780578613, -16.223100662231445, 31.51460075378418,
+        0, -17.586000442504883, 31.51460075378418, -7.07627010345459, -16.48940086364746, 31.828100204467773,
+        0, -17.87470054626465, 31.828100204467773, -7.25383996963501, -17.031099319458008, 31.51460075378418,
+        0, -18.46190071105957, 31.51460075378418, -7.500199794769287, -17.62779998779297, 30.573999404907227,
+        0, -19.108800888061523, 30.573999404907227, -13.092700004577637, -12.662699699401855, 30.573999404907227,
+        -12.667499542236328, -12.486100196838379, 31.51460075378418, -12.744799613952637, -12.690999984741211, 31.828100204467773,
+        -13.11460018157959, -13.10789966583252, 31.51460075378418, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+        -16.61389923095703, -7.000179767608643, 30.573999404907227, -16.291099548339844, -6.902520179748535, 31.51460075378418,
+        -16.50950050354004, -7.015810012817383, 31.828100204467773, -17.033599853515625, -7.246280193328857, 31.51460075378418,
+        -17.62779998779297, -7.500199794769287, 30.573999404907227, -17.83489990234375, 0, 30.573999404907227,
+        -17.586000442504883, 0, 31.51460075378418, -17.87470054626465, 0, 31.828100204467773,
+        -18.46190071105957, 0, 31.51460075378418, -19.108800888061523, 0, 30.573999404907227,
+        -17.83489990234375, 0, 30.573999404907227, -16.452699661254883, 7.000179767608643, 30.573999404907227,
+        -16.223100662231445, 6.902520179748535, 31.51460075378418, -17.586000442504883, 0, 31.51460075378418,
+        -16.48940086364746, 7.015810012817383, 31.828100204467773, -17.87470054626465, 0, 31.828100204467773,
+        -17.031099319458008, 7.246280193328857, 31.51460075378418, -18.46190071105957, 0, 31.51460075378418,
+        -17.62779998779297, 7.500199794769287, 30.573999404907227, -19.108800888061523, 0, 30.573999404907227,
+        -12.662699699401855, 12.662699699401855, 30.573999404907227, -12.486100196838379, 12.486100196838379, 31.51460075378418,
+        -12.690999984741211, 12.690999984741211, 31.828100204467773, -13.10789966583252, 13.10789966583252, 31.51460075378418,
+        -13.56719970703125, 13.56719970703125, 30.573999404907227, -7.000179767608643, 16.452699661254883, 30.573999404907227,
+        -6.902520179748535, 16.223100662231445, 31.51460075378418, -7.015810012817383, 16.48940086364746, 31.828100204467773,
+        -7.246280193328857, 17.031099319458008, 31.51460075378418, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+        0, 17.83489990234375, 30.573999404907227, 0, 17.586000442504883, 31.51460075378418,
+        0, 17.87470054626465, 31.828100204467773, 0, 18.46190071105957, 31.51460075378418,
+        0, 19.108800888061523, 30.573999404907227, 0, 17.83489990234375, 30.573999404907227,
+        7.000179767608643, 16.452699661254883, 30.573999404907227, 6.902520179748535, 16.223100662231445, 31.51460075378418,
+        0, 17.586000442504883, 31.51460075378418, 7.015810012817383, 16.48940086364746, 31.828100204467773,
+        0, 17.87470054626465, 31.828100204467773, 7.246280193328857, 17.031099319458008, 31.51460075378418,
+        0, 18.46190071105957, 31.51460075378418, 7.500199794769287, 17.62779998779297, 30.573999404907227,
+        0, 19.108800888061523, 30.573999404907227, 12.662699699401855, 12.662699699401855, 30.573999404907227,
+        12.486100196838379, 12.486100196838379, 31.51460075378418, 12.690999984741211, 12.690999984741211, 31.828100204467773,
+        13.10789966583252, 13.10789966583252, 31.51460075378418, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+        16.452699661254883, 7.000179767608643, 30.573999404907227, 16.223100662231445, 6.902520179748535, 31.51460075378418,
+        16.48940086364746, 7.015810012817383, 31.828100204467773, 17.031099319458008, 7.246280193328857, 31.51460075378418,
+        17.62779998779297, 7.500199794769287, 30.573999404907227, 17.83489990234375, 0, 30.573999404907227,
+        17.586000442504883, 0, 31.51460075378418, 17.87470054626465, 0, 31.828100204467773,
+        18.46190071105957, 0, 31.51460075378418, 19.108800888061523, 0, 30.573999404907227,
+        19.108800888061523, 0, 30.573999404907227, 17.62779998779297, -7.500199794769287, 30.573999404907227,
+        19.785400390625, -8.418190002441406, 25.572900772094727, 21.447599411010742, 0, 25.572900772094727,
+        21.667600631713867, -9.218990325927734, 20.661399841308594, 23.487899780273438, 0, 20.661399841308594,
+        22.99880027770996, -9.785409927368164, 15.928999900817871, 24.930999755859375, 0, 15.928999900817871,
+        23.503799438476562, -10.000300407409668, 11.465299606323242, 25.4783992767334, 0, 11.465299606323242,
+        13.56719970703125, -13.56719970703125, 30.573999404907227, 15.227800369262695, -15.227800369262695, 25.572900772094727,
+        16.67639923095703, -16.67639923095703, 20.661399841308594, 17.701000213623047, -17.701000213623047, 15.928999900817871,
+        18.089599609375, -18.089599609375, 11.465299606323242, 7.500199794769287, -17.62779998779297, 30.573999404907227,
+        8.418190002441406, -19.785400390625, 25.572900772094727, 9.218990325927734, -21.667600631713867, 20.661399841308594,
+        9.785409927368164, -22.99880027770996, 15.928999900817871, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+        0, -19.108800888061523, 30.573999404907227, 0, -21.447599411010742, 25.572900772094727,
+        0, -23.487899780273438, 20.661399841308594, 0, -24.930999755859375, 15.928999900817871,
+        0, -25.4783992767334, 11.465299606323242, 0, -19.108800888061523, 30.573999404907227,
+        -7.500199794769287, -17.62779998779297, 30.573999404907227, -8.418190002441406, -19.785400390625, 25.572900772094727,
+        0, -21.447599411010742, 25.572900772094727, -9.218990325927734, -21.667600631713867, 20.661399841308594,
+        0, -23.487899780273438, 20.661399841308594, -9.785409927368164, -22.99880027770996, 15.928999900817871,
+        0, -24.930999755859375, 15.928999900817871, -10.000300407409668, -23.503799438476562, 11.465299606323242,
+        0, -25.4783992767334, 11.465299606323242, -13.56719970703125, -13.56719970703125, 30.573999404907227,
+        -15.227800369262695, -15.227800369262695, 25.572900772094727, -16.67639923095703, -16.67639923095703, 20.661399841308594,
+        -17.701000213623047, -17.701000213623047, 15.928999900817871, -18.089599609375, -18.089599609375, 11.465299606323242,
+        -17.62779998779297, -7.500199794769287, 30.573999404907227, -19.785400390625, -8.418190002441406, 25.572900772094727,
+        -21.667600631713867, -9.218990325927734, 20.661399841308594, -22.99880027770996, -9.785409927368164, 15.928999900817871,
+        -23.503799438476562, -10.000300407409668, 11.465299606323242, -19.108800888061523, 0, 30.573999404907227,
+        -21.447599411010742, 0, 25.572900772094727, -23.487899780273438, 0, 20.661399841308594,
+        -24.930999755859375, 0, 15.928999900817871, -25.4783992767334, 0, 11.465299606323242,
+        -19.108800888061523, 0, 30.573999404907227, -17.62779998779297, 7.500199794769287, 30.573999404907227,
+        -19.785400390625, 8.418190002441406, 25.572900772094727, -21.447599411010742, 0, 25.572900772094727,
+        -21.667600631713867, 9.218990325927734, 20.661399841308594, -23.487899780273438, 0, 20.661399841308594,
+        -22.99880027770996, 9.785409927368164, 15.928999900817871, -24.930999755859375, 0, 15.928999900817871,
+        -23.503799438476562, 10.000300407409668, 11.465299606323242, -25.4783992767334, 0, 11.465299606323242,
+        -13.56719970703125, 13.56719970703125, 30.573999404907227, -15.227800369262695, 15.227800369262695, 25.572900772094727,
+        -16.67639923095703, 16.67639923095703, 20.661399841308594, -17.701000213623047, 17.701000213623047, 15.928999900817871,
+        -18.089599609375, 18.089599609375, 11.465299606323242, -7.500199794769287, 17.62779998779297, 30.573999404907227,
+        -8.418190002441406, 19.785400390625, 25.572900772094727, -9.218990325927734, 21.667600631713867, 20.661399841308594,
+        -9.785409927368164, 22.99880027770996, 15.928999900817871, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+        0, 19.108800888061523, 30.573999404907227, 0, 21.447599411010742, 25.572900772094727,
+        0, 23.487899780273438, 20.661399841308594, 0, 24.930999755859375, 15.928999900817871,
+        0, 25.4783992767334, 11.465299606323242, 0, 19.108800888061523, 30.573999404907227,
+        7.500199794769287, 17.62779998779297, 30.573999404907227, 8.418190002441406, 19.785400390625, 25.572900772094727,
+        0, 21.447599411010742, 25.572900772094727, 9.218990325927734, 21.667600631713867, 20.661399841308594,
+        0, 23.487899780273438, 20.661399841308594, 9.785409927368164, 22.99880027770996, 15.928999900817871,
+        0, 24.930999755859375, 15.928999900817871, 10.000300407409668, 23.503799438476562, 11.465299606323242,
+        0, 25.4783992767334, 11.465299606323242, 13.56719970703125, 13.56719970703125, 30.573999404907227,
+        15.227800369262695, 15.227800369262695, 25.572900772094727, 16.67639923095703, 16.67639923095703, 20.661399841308594,
+        17.701000213623047, 17.701000213623047, 15.928999900817871, 18.089599609375, 18.089599609375, 11.465299606323242,
+        17.62779998779297, 7.500199794769287, 30.573999404907227, 19.785400390625, 8.418190002441406, 25.572900772094727,
+        21.667600631713867, 9.218990325927734, 20.661399841308594, 22.99880027770996, 9.785409927368164, 15.928999900817871,
+        23.503799438476562, 10.000300407409668, 11.465299606323242, 19.108800888061523, 0, 30.573999404907227,
+        21.447599411010742, 0, 25.572900772094727, 23.487899780273438, 0, 20.661399841308594,
+        24.930999755859375, 0, 15.928999900817871, 25.4783992767334, 0, 11.465299606323242,
+        25.4783992767334, 0, 11.465299606323242, 23.503799438476562, -10.000300407409668, 11.465299606323242,
+        22.5856990814209, -9.609620094299316, 7.688300132751465, 24.48310089111328, 0, 7.688300132751465,
+        20.565799713134766, -8.750229835510254, 4.89661979675293, 22.29360008239746, 0, 4.89661979675293,
+        18.54599952697754, -7.890830039978027, 3.0006699562072754, 20.104000091552734, 0, 3.0006699562072754,
+        17.62779998779297, -7.500199794769287, 1.9108799695968628, 19.108800888061523, 0, 1.9108799695968628,
+        18.089599609375, -18.089599609375, 11.465299606323242, 17.382999420166016, -17.382999420166016, 7.688300132751465,
+        15.828399658203125, -15.828399658203125, 4.89661979675293, 14.273900032043457, -14.273900032043457, 3.0006699562072754,
+        13.56719970703125, -13.56719970703125, 1.9108799695968628, 10.000300407409668, -23.503799438476562, 11.465299606323242,
+        9.609620094299316, -22.5856990814209, 7.688300132751465, 8.750229835510254, -20.565799713134766, 4.89661979675293,
+        7.890830039978027, -18.54599952697754, 3.0006699562072754, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        0, -25.4783992767334, 11.465299606323242, 0, -24.48310089111328, 7.688300132751465,
+        0, -22.29360008239746, 4.89661979675293, 0, -20.104000091552734, 3.0006699562072754,
+        0, -19.108800888061523, 1.9108799695968628, 0, -25.4783992767334, 11.465299606323242,
+        -10.000300407409668, -23.503799438476562, 11.465299606323242, -9.609620094299316, -22.5856990814209, 7.688300132751465,
+        0, -24.48310089111328, 7.688300132751465, -8.750229835510254, -20.565799713134766, 4.89661979675293,
+        0, -22.29360008239746, 4.89661979675293, -7.890830039978027, -18.54599952697754, 3.0006699562072754,
+        0, -20.104000091552734, 3.0006699562072754, -7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        0, -19.108800888061523, 1.9108799695968628, -18.089599609375, -18.089599609375, 11.465299606323242,
+        -17.382999420166016, -17.382999420166016, 7.688300132751465, -15.828399658203125, -15.828399658203125, 4.89661979675293,
+        -14.273900032043457, -14.273900032043457, 3.0006699562072754, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+        -23.503799438476562, -10.000300407409668, 11.465299606323242, -22.5856990814209, -9.609620094299316, 7.688300132751465,
+        -20.565799713134766, -8.750229835510254, 4.89661979675293, -18.54599952697754, -7.890830039978027, 3.0006699562072754,
+        -17.62779998779297, -7.500199794769287, 1.9108799695968628, -25.4783992767334, 0, 11.465299606323242,
+        -24.48310089111328, 0, 7.688300132751465, -22.29360008239746, 0, 4.89661979675293,
+        -20.104000091552734, 0, 3.0006699562072754, -19.108800888061523, 0, 1.9108799695968628,
+        -25.4783992767334, 0, 11.465299606323242, -23.503799438476562, 10.000300407409668, 11.465299606323242,
+        -22.5856990814209, 9.609620094299316, 7.688300132751465, -24.48310089111328, 0, 7.688300132751465,
+        -20.565799713134766, 8.750229835510254, 4.89661979675293, -22.29360008239746, 0, 4.89661979675293,
+        -18.54599952697754, 7.890830039978027, 3.0006699562072754, -20.104000091552734, 0, 3.0006699562072754,
+        -17.62779998779297, 7.500199794769287, 1.9108799695968628, -19.108800888061523, 0, 1.9108799695968628,
+        -18.089599609375, 18.089599609375, 11.465299606323242, -17.382999420166016, 17.382999420166016, 7.688300132751465,
+        -15.828399658203125, 15.828399658203125, 4.89661979675293, -14.273900032043457, 14.273900032043457, 3.0006699562072754,
+        -13.56719970703125, 13.56719970703125, 1.9108799695968628, -10.000300407409668, 23.503799438476562, 11.465299606323242,
+        -9.609620094299316, 22.5856990814209, 7.688300132751465, -8.750229835510254, 20.565799713134766, 4.89661979675293,
+        -7.890830039978027, 18.54599952697754, 3.0006699562072754, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        0, 25.4783992767334, 11.465299606323242, 0, 24.48310089111328, 7.688300132751465,
+        0, 22.29360008239746, 4.89661979675293, 0, 20.104000091552734, 3.0006699562072754,
+        0, 19.108800888061523, 1.9108799695968628, 0, 25.4783992767334, 11.465299606323242,
+        10.000300407409668, 23.503799438476562, 11.465299606323242, 9.609620094299316, 22.5856990814209, 7.688300132751465,
+        0, 24.48310089111328, 7.688300132751465, 8.750229835510254, 20.565799713134766, 4.89661979675293,
+        0, 22.29360008239746, 4.89661979675293, 7.890830039978027, 18.54599952697754, 3.0006699562072754,
+        0, 20.104000091552734, 3.0006699562072754, 7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        0, 19.108800888061523, 1.9108799695968628, 18.089599609375, 18.089599609375, 11.465299606323242,
+        17.382999420166016, 17.382999420166016, 7.688300132751465, 15.828399658203125, 15.828399658203125, 4.89661979675293,
+        14.273900032043457, 14.273900032043457, 3.0006699562072754, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+        23.503799438476562, 10.000300407409668, 11.465299606323242, 22.5856990814209, 9.609620094299316, 7.688300132751465,
+        20.565799713134766, 8.750229835510254, 4.89661979675293, 18.54599952697754, 7.890830039978027, 3.0006699562072754,
+        17.62779998779297, 7.500199794769287, 1.9108799695968628, 25.4783992767334, 0, 11.465299606323242,
+        24.48310089111328, 0, 7.688300132751465, 22.29360008239746, 0, 4.89661979675293,
+        20.104000091552734, 0, 3.0006699562072754, 19.108800888061523, 0, 1.9108799695968628,
+        19.108800888061523, 0, 1.9108799695968628, 17.62779998779297, -7.500199794769287, 1.9108799695968628,
+        17.228500366210938, -7.330269813537598, 1.2092299461364746, 18.675800323486328, 0, 1.2092299461364746,
+        15.093799591064453, -6.422039985656738, 0.5971490144729614, 16.361900329589844, 0, 0.5971490144729614,
+        9.819259643554688, -4.177840232849121, 0.16421599686145782, 10.644200325012207, 0, 0.16421599686145782,
+        0, 0, 0, 0, 0, 0,
+        13.56719970703125, -13.56719970703125, 1.9108799695968628, 13.25979995727539, -13.25979995727539, 1.2092299461364746,
+        11.616900444030762, -11.616900444030762, 0.5971490144729614, 7.557370185852051, -7.557370185852051, 0.16421599686145782,
+        0, 0, 0, 7.500199794769287, -17.62779998779297, 1.9108799695968628,
+        7.330269813537598, -17.228500366210938, 1.2092299461364746, 6.422039985656738, -15.093799591064453, 0.5971490144729614,
+        4.177840232849121, -9.819259643554688, 0.16421599686145782, 0, 0, 0,
+        0, -19.108800888061523, 1.9108799695968628, 0, -18.675800323486328, 1.2092299461364746,
+        0, -16.361900329589844, 0.5971490144729614, 0, -10.644200325012207, 0.16421599686145782,
+        0, 0, 0, 0, -19.108800888061523, 1.9108799695968628,
+        -7.500199794769287, -17.62779998779297, 1.9108799695968628, -7.330269813537598, -17.228500366210938, 1.2092299461364746,
+        0, -18.675800323486328, 1.2092299461364746, -6.422039985656738, -15.093799591064453, 0.5971490144729614,
+        0, -16.361900329589844, 0.5971490144729614, -4.177840232849121, -9.819259643554688, 0.16421599686145782,
+        0, -10.644200325012207, 0.16421599686145782, 0, 0, 0,
+        0, 0, 0, -13.56719970703125, -13.56719970703125, 1.9108799695968628,
+        -13.25979995727539, -13.25979995727539, 1.2092299461364746, -11.616900444030762, -11.616900444030762, 0.5971490144729614,
+        -7.557370185852051, -7.557370185852051, 0.16421599686145782, 0, 0, 0,
+        -17.62779998779297, -7.500199794769287, 1.9108799695968628, -17.228500366210938, -7.330269813537598, 1.2092299461364746,
+        -15.093799591064453, -6.422039985656738, 0.5971490144729614, -9.819259643554688, -4.177840232849121, 0.16421599686145782,
+        0, 0, 0, -19.108800888061523, 0, 1.9108799695968628,
+        -18.675800323486328, 0, 1.2092299461364746, -16.361900329589844, 0, 0.5971490144729614,
+        -10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+        -19.108800888061523, 0, 1.9108799695968628, -17.62779998779297, 7.500199794769287, 1.9108799695968628,
+        -17.228500366210938, 7.330269813537598, 1.2092299461364746, -18.675800323486328, 0, 1.2092299461364746,
+        -15.093799591064453, 6.422039985656738, 0.5971490144729614, -16.361900329589844, 0, 0.5971490144729614,
+        -9.819259643554688, 4.177840232849121, 0.16421599686145782, -10.644200325012207, 0, 0.16421599686145782,
+        0, 0, 0, 0, 0, 0,
+        -13.56719970703125, 13.56719970703125, 1.9108799695968628, -13.25979995727539, 13.25979995727539, 1.2092299461364746,
+        -11.616900444030762, 11.616900444030762, 0.5971490144729614, -7.557370185852051, 7.557370185852051, 0.16421599686145782,
+        0, 0, 0, -7.500199794769287, 17.62779998779297, 1.9108799695968628,
+        -7.330269813537598, 17.228500366210938, 1.2092299461364746, -6.422039985656738, 15.093799591064453, 0.5971490144729614,
+        -4.177840232849121, 9.819259643554688, 0.16421599686145782, 0, 0, 0,
+        0, 19.108800888061523, 1.9108799695968628, 0, 18.675800323486328, 1.2092299461364746,
+        0, 16.361900329589844, 0.5971490144729614, 0, 10.644200325012207, 0.16421599686145782,
+        0, 0, 0, 0, 19.108800888061523, 1.9108799695968628,
+        7.500199794769287, 17.62779998779297, 1.9108799695968628, 7.330269813537598, 17.228500366210938, 1.2092299461364746,
+        0, 18.675800323486328, 1.2092299461364746, 6.422039985656738, 15.093799591064453, 0.5971490144729614,
+        0, 16.361900329589844, 0.5971490144729614, 4.177840232849121, 9.819259643554688, 0.16421599686145782,
+        0, 10.644200325012207, 0.16421599686145782, 0, 0, 0,
+        0, 0, 0, 13.56719970703125, 13.56719970703125, 1.9108799695968628,
+        13.25979995727539, 13.25979995727539, 1.2092299461364746, 11.616900444030762, 11.616900444030762, 0.5971490144729614,
+        7.557370185852051, 7.557370185852051, 0.16421599686145782, 0, 0, 0,
+        17.62779998779297, 7.500199794769287, 1.9108799695968628, 17.228500366210938, 7.330269813537598, 1.2092299461364746,
+        15.093799591064453, 6.422039985656738, 0.5971490144729614, 9.819259643554688, 4.177840232849121, 0.16421599686145782,
+        0, 0, 0, 19.108800888061523, 0, 1.9108799695968628,
+        18.675800323486328, 0, 1.2092299461364746, 16.361900329589844, 0, 0.5971490144729614,
+        10.644200325012207, 0, 0.16421599686145782, 0, 0, 0,
+        -20.382699966430664, 0, 25.796899795532227, -20.1835994720459, -2.149739980697632, 26.244699478149414,
+        -26.511600494384766, -2.149739980697632, 26.192899703979492, -26.334299087524414, 0, 25.752099990844727,
+        -31.156299591064453, -2.149739980697632, 25.830400466918945, -30.733299255371094, 0, 25.438600540161133,
+        -34.016998291015625, -2.149739980697632, 24.846500396728516, -33.46030044555664, 0, 24.587600708007812,
+        -34.99290084838867, -2.149739980697632, 22.930500030517578, -34.39580154418945, 0, 22.930500030517578,
+        -19.74570083618164, -2.8663198947906494, 27.229999542236328, -26.901599884033203, -2.8663198947906494, 27.162799835205078,
+        -32.08679962158203, -2.8663198947906494, 26.69260025024414, -35.241798400878906, -2.8663198947906494, 25.416200637817383,
+        -36.30670166015625, -2.8663198947906494, 22.930500030517578, -19.30780029296875, -2.149739980697632, 28.215299606323242,
+        -27.29159927368164, -2.149739980697632, 28.132699966430664, -33.017398834228516, -2.149739980697632, 27.55470085144043,
+        -36.46649932861328, -2.149739980697632, 25.98579978942871, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+        -19.108800888061523, 0, 28.66320037841797, -27.468900680541992, 0, 28.57360076904297,
+        -33.440399169921875, 0, 27.94659996032715, -37.02330017089844, 0, 26.244699478149414,
+        -38.21760177612305, 0, 22.930500030517578, -19.108800888061523, 0, 28.66320037841797,
+        -19.30780029296875, 2.149739980697632, 28.215299606323242, -27.29159927368164, 2.149739980697632, 28.132699966430664,
+        -27.468900680541992, 0, 28.57360076904297, -33.017398834228516, 2.149739980697632, 27.55470085144043,
+        -33.440399169921875, 0, 27.94659996032715, -36.46649932861328, 2.149739980697632, 25.98579978942871,
+        -37.02330017089844, 0, 26.244699478149414, -37.620399475097656, 2.149739980697632, 22.930500030517578,
+        -38.21760177612305, 0, 22.930500030517578, -19.74570083618164, 2.8663198947906494, 27.229999542236328,
+        -26.901599884033203, 2.8663198947906494, 27.162799835205078, -32.08679962158203, 2.8663198947906494, 26.69260025024414,
+        -35.241798400878906, 2.8663198947906494, 25.416200637817383, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+        -20.1835994720459, 2.149739980697632, 26.244699478149414, -26.511600494384766, 2.149739980697632, 26.192899703979492,
+        -31.156299591064453, 2.149739980697632, 25.830400466918945, -34.016998291015625, 2.149739980697632, 24.846500396728516,
+        -34.99290084838867, 2.149739980697632, 22.930500030517578, -20.382699966430664, 0, 25.796899795532227,
+        -26.334299087524414, 0, 25.752099990844727, -30.733299255371094, 0, 25.438600540161133,
+        -33.46030044555664, 0, 24.587600708007812, -34.39580154418945, 0, 22.930500030517578,
+        -34.39580154418945, 0, 22.930500030517578, -34.99290084838867, -2.149739980697632, 22.930500030517578,
+        -34.44089889526367, -2.149739980697632, 20.082199096679688, -33.89820098876953, 0, 20.33289909362793,
+        -32.711299896240234, -2.149739980697632, 16.81529998779297, -32.32569885253906, 0, 17.197900772094727,
+        -29.69420051574707, -2.149739980697632, 13.590499877929688, -29.558900833129883, 0, 14.062899589538574,
+        -25.279300689697266, -2.149739980697632, 10.8681001663208, -25.4783992767334, 0, 11.465299606323242,
+        -36.30670166015625, -2.8663198947906494, 22.930500030517578, -35.6348991394043, -2.8663198947906494, 19.530500411987305,
+        -33.55979919433594, -2.8663198947906494, 15.973699569702148, -29.99180030822754, -2.8663198947906494, 12.551300048828125,
+        -24.841400146484375, -2.8663198947906494, 9.554389953613281, -37.620399475097656, -2.149739980697632, 22.930500030517578,
+        -36.82889938354492, -2.149739980697632, 18.97879981994629, -34.408199310302734, -2.149739980697632, 15.132100105285645,
+        -30.289499282836914, -2.149739980697632, 11.512200355529785, -24.403499603271484, -2.149739980697632, 8.240659713745117,
+        -38.21760177612305, 0, 22.930500030517578, -37.37160110473633, 0, 18.728099822998047,
+        -34.79389953613281, 0, 14.749600410461426, -30.424800872802734, 0, 11.039799690246582,
+        -24.204500198364258, 0, 7.643509864807129, -38.21760177612305, 0, 22.930500030517578,
+        -37.620399475097656, 2.149739980697632, 22.930500030517578, -36.82889938354492, 2.149739980697632, 18.97879981994629,
+        -37.37160110473633, 0, 18.728099822998047, -34.408199310302734, 2.149739980697632, 15.132100105285645,
+        -34.79389953613281, 0, 14.749600410461426, -30.289499282836914, 2.149739980697632, 11.512200355529785,
+        -30.424800872802734, 0, 11.039799690246582, -24.403499603271484, 2.149739980697632, 8.240659713745117,
+        -24.204500198364258, 0, 7.643509864807129, -36.30670166015625, 2.8663198947906494, 22.930500030517578,
+        -35.6348991394043, 2.8663198947906494, 19.530500411987305, -33.55979919433594, 2.8663198947906494, 15.973699569702148,
+        -29.99180030822754, 2.8663198947906494, 12.551300048828125, -24.841400146484375, 2.8663198947906494, 9.554389953613281,
+        -34.99290084838867, 2.149739980697632, 22.930500030517578, -34.44089889526367, 2.149739980697632, 20.082199096679688,
+        -32.711299896240234, 2.149739980697632, 16.81529998779297, -29.69420051574707, 2.149739980697632, 13.590499877929688,
+        -25.279300689697266, 2.149739980697632, 10.8681001663208, -34.39580154418945, 0, 22.930500030517578,
+        -33.89820098876953, 0, 20.33289909362793, -32.32569885253906, 0, 17.197900772094727,
+        -29.558900833129883, 0, 14.062899589538574, -25.4783992767334, 0, 11.465299606323242,
+        21.656600952148438, 0, 18.15329933166504, 21.656600952148438, -4.729420185089111, 16.511199951171875,
+        28.233999252319336, -4.270359992980957, 18.339000701904297, 27.76740074157715, 0, 19.55660057067871,
+        31.011899948120117, -3.2604401111602783, 22.221399307250977, 30.4148006439209, 0, 22.930500030517578,
+        32.59560012817383, -2.2505099773406982, 26.764400482177734, 31.867900848388672, 0, 27.020999908447266,
+        35.5900993347168, -1.791450023651123, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+        21.656600952148438, -6.3059000968933105, 12.89840030670166, 29.260299682617188, -5.693819999694824, 15.660200119018555,
+        32.32569885253906, -4.347249984741211, 20.661399841308594, 34.19670104980469, -3.0006699562072754, 26.199899673461914,
+        38.21760177612305, -2.3886001110076904, 30.573999404907227, 21.656600952148438, -4.729420185089111, 9.285670280456543,
+        30.286699295043945, -4.270359992980957, 12.981499671936035, 33.639400482177734, -3.2604401111602783, 19.101299285888672,
+        35.79790115356445, -2.2505099773406982, 25.635400772094727, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+        21.656600952148438, 0, 7.643509864807129, 30.75320053100586, 0, 11.763799667358398,
+        34.23659896850586, 0, 18.392200469970703, 36.52560043334961, 0, 25.378799438476562,
+        42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 0, 7.643509864807129,
+        21.656600952148438, 4.729420185089111, 9.285670280456543, 30.286699295043945, 4.270359992980957, 12.981499671936035,
+        30.75320053100586, 0, 11.763799667358398, 33.639400482177734, 3.2604401111602783, 19.101299285888672,
+        34.23659896850586, 0, 18.392200469970703, 35.79790115356445, 2.2505099773406982, 25.635400772094727,
+        36.52560043334961, 0, 25.378799438476562, 40.845001220703125, 1.791450023651123, 30.573999404907227,
+        42.03929901123047, 0, 30.573999404907227, 21.656600952148438, 6.3059000968933105, 12.89840030670166,
+        29.260299682617188, 5.693819999694824, 15.660200119018555, 32.32569885253906, 4.347249984741211, 20.661399841308594,
+        34.19670104980469, 3.0006699562072754, 26.199899673461914, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+        21.656600952148438, 4.729420185089111, 16.511199951171875, 28.233999252319336, 4.270359992980957, 18.339000701904297,
+        31.011899948120117, 3.2604401111602783, 22.221399307250977, 32.59560012817383, 2.2505099773406982, 26.764400482177734,
+        35.5900993347168, 1.791450023651123, 30.573999404907227, 21.656600952148438, 0, 18.15329933166504,
+        27.76740074157715, 0, 19.55660057067871, 30.4148006439209, 0, 22.930500030517578,
+        31.867900848388672, 0, 27.020999908447266, 34.39580154418945, 0, 30.573999404907227,
+        34.39580154418945, 0, 30.573999404907227, 35.5900993347168, -1.791450023651123, 30.573999404907227,
+        36.59049987792969, -1.679479956626892, 31.137699127197266, 35.3114013671875, 0, 31.111499786376953,
+        37.18870162963867, -1.4331599473953247, 31.332599639892578, 35.98820114135742, 0, 31.290599822998047,
+        37.206600189208984, -1.1868300437927246, 31.1481990814209, 36.187198638916016, 0, 31.111499786376953,
+        36.46590042114258, -1.074869990348816, 30.573999404907227, 35.669700622558594, 0, 30.573999404907227,
+        38.21760177612305, -2.3886001110076904, 30.573999404907227, 39.40439987182617, -2.2393100261688232, 31.195499420166016,
+        39.829898834228516, -1.9108799695968628, 31.424999237060547, 39.44919967651367, -1.582450032234192, 31.229000091552734,
+        38.21760177612305, -1.4331599473953247, 30.573999404907227, 40.845001220703125, -1.791450023651123, 30.573999404907227,
+        42.218299865722656, -1.679479956626892, 31.25320053100586, 42.47100067138672, -1.4331599473953247, 31.51740074157715,
+        41.69169998168945, -1.1868300437927246, 31.309900283813477, 39.969200134277344, -1.074869990348816, 30.573999404907227,
+        42.03929901123047, 0, 30.573999404907227, 43.49729919433594, 0, 31.279399871826172,
+        43.67150115966797, 0, 31.55929946899414, 42.71110153198242, 0, 31.346599578857422,
+        40.76539993286133, 0, 30.573999404907227, 42.03929901123047, 0, 30.573999404907227,
+        40.845001220703125, 1.791450023651123, 30.573999404907227, 42.218299865722656, 1.679479956626892, 31.25320053100586,
+        43.49729919433594, 0, 31.279399871826172, 42.47100067138672, 1.4331599473953247, 31.51740074157715,
+        43.67150115966797, 0, 31.55929946899414, 41.69169998168945, 1.1868300437927246, 31.309900283813477,
+        42.71110153198242, 0, 31.346599578857422, 39.969200134277344, 1.074869990348816, 30.573999404907227,
+        40.76539993286133, 0, 30.573999404907227, 38.21760177612305, 2.3886001110076904, 30.573999404907227,
+        39.40439987182617, 2.2393100261688232, 31.195499420166016, 39.829898834228516, 1.9108799695968628, 31.424999237060547,
+        39.44919967651367, 1.582450032234192, 31.229000091552734, 38.21760177612305, 1.4331599473953247, 30.573999404907227,
+        35.5900993347168, 1.791450023651123, 30.573999404907227, 36.59049987792969, 1.679479956626892, 31.137699127197266,
+        37.18870162963867, 1.4331599473953247, 31.332599639892578, 37.206600189208984, 1.1868300437927246, 31.1481990814209,
+        36.46590042114258, 1.074869990348816, 30.573999404907227, 34.39580154418945, 0, 30.573999404907227,
+        35.3114013671875, 0, 31.111499786376953, 35.98820114135742, 0, 31.290599822998047,
+        36.187198638916016, 0, 31.111499786376953, 35.669700622558594, 0, 30.573999404907227,
+        0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+        4.004499912261963, -1.7077000141143799, 39.501399993896484, 4.339280128479004, 0, 39.501399993896484,
+        3.8207099437713623, -1.6290700435638428, 37.97869873046875, 4.140230178833008, 0, 37.97869873046875,
+        2.314160108566284, -0.985912024974823, 36.09769821166992, 2.5080299377441406, 0, 36.09769821166992,
+        2.3503799438476562, -1.0000300407409668, 34.39580154418945, 2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, 3.0849199295043945, -3.0849199295043945, 39.501399993896484,
+        2.943150043487549, -2.943150043487549, 37.97869873046875, 1.782039999961853, -1.782039999961853, 36.09769821166992,
+        1.8089599609375, -1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+        1.7077000141143799, -4.004499912261963, 39.501399993896484, 1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+        0.985912024974823, -2.314160108566284, 36.09769821166992, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, -4.339280128479004, 39.501399993896484,
+        0, -4.140230178833008, 37.97869873046875, 0, -2.5080299377441406, 36.09769821166992,
+        0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        0, 0, 40.12839889526367, -1.7077000141143799, -4.004499912261963, 39.501399993896484,
+        0, -4.339280128479004, 39.501399993896484, -1.6290700435638428, -3.8207099437713623, 37.97869873046875,
+        0, -4.140230178833008, 37.97869873046875, -0.985912024974823, -2.314160108566284, 36.09769821166992,
+        0, -2.5080299377441406, 36.09769821166992, -1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        0, -2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        -3.0849199295043945, -3.0849199295043945, 39.501399993896484, -2.943150043487549, -2.943150043487549, 37.97869873046875,
+        -1.782039999961853, -1.782039999961853, 36.09769821166992, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+        0, 0, 40.12839889526367, -4.004499912261963, -1.7077000141143799, 39.501399993896484,
+        -3.8207099437713623, -1.6290700435638428, 37.97869873046875, -2.314160108566284, -0.985912024974823, 36.09769821166992,
+        -2.3503799438476562, -1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+        -4.339280128479004, 0, 39.501399993896484, -4.140230178833008, 0, 37.97869873046875,
+        -2.5080299377441406, 0, 36.09769821166992, -2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, 0, 40.12839889526367,
+        -4.004499912261963, 1.7077000141143799, 39.501399993896484, -4.339280128479004, 0, 39.501399993896484,
+        -3.8207099437713623, 1.6290700435638428, 37.97869873046875, -4.140230178833008, 0, 37.97869873046875,
+        -2.314160108566284, 0.985912024974823, 36.09769821166992, -2.5080299377441406, 0, 36.09769821166992,
+        -2.3503799438476562, 1.0000300407409668, 34.39580154418945, -2.547840118408203, 0, 34.39580154418945,
+        0, 0, 40.12839889526367, -3.0849199295043945, 3.0849199295043945, 39.501399993896484,
+        -2.943150043487549, 2.943150043487549, 37.97869873046875, -1.782039999961853, 1.782039999961853, 36.09769821166992,
+        -1.8089599609375, 1.8089599609375, 34.39580154418945, 0, 0, 40.12839889526367,
+        -1.7077000141143799, 4.004499912261963, 39.501399993896484, -1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+        -0.985912024974823, 2.314160108566284, 36.09769821166992, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        0, 0, 40.12839889526367, 0, 4.339280128479004, 39.501399993896484,
+        0, 4.140230178833008, 37.97869873046875, 0, 2.5080299377441406, 36.09769821166992,
+        0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        0, 0, 40.12839889526367, 1.7077000141143799, 4.004499912261963, 39.501399993896484,
+        0, 4.339280128479004, 39.501399993896484, 1.6290700435638428, 3.8207099437713623, 37.97869873046875,
+        0, 4.140230178833008, 37.97869873046875, 0.985912024974823, 2.314160108566284, 36.09769821166992,
+        0, 2.5080299377441406, 36.09769821166992, 1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        0, 2.547840118408203, 34.39580154418945, 0, 0, 40.12839889526367,
+        3.0849199295043945, 3.0849199295043945, 39.501399993896484, 2.943150043487549, 2.943150043487549, 37.97869873046875,
+        1.782039999961853, 1.782039999961853, 36.09769821166992, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+        0, 0, 40.12839889526367, 4.004499912261963, 1.7077000141143799, 39.501399993896484,
+        3.8207099437713623, 1.6290700435638428, 37.97869873046875, 2.314160108566284, 0.985912024974823, 36.09769821166992,
+        2.3503799438476562, 1.0000300407409668, 34.39580154418945, 0, 0, 40.12839889526367,
+        4.339280128479004, 0, 39.501399993896484, 4.140230178833008, 0, 37.97869873046875,
+        2.5080299377441406, 0, 36.09769821166992, 2.547840118408203, 0, 34.39580154418945,
+        2.547840118408203, 0, 34.39580154418945, 2.3503799438476562, -1.0000300407409668, 34.39580154418945,
+        5.361800193786621, -2.2813100814819336, 33.261199951171875, 5.812250137329102, 0, 33.261199951171875,
+        9.695320129394531, -4.125110149383545, 32.484901428222656, 10.50979995727539, 0, 32.484901428222656,
+        13.58810043334961, -5.781400203704834, 31.708599090576172, 14.729700088500977, 0, 31.708599090576172,
+        15.27750015258789, -6.5001702308654785, 30.573999404907227, 16.56089973449707, 0, 30.573999404907227,
+        1.8089599609375, -1.8089599609375, 34.39580154418945, 4.126699924468994, -4.126699924468994, 33.261199951171875,
+        7.461979866027832, -7.461979866027832, 32.484901428222656, 10.458100318908691, -10.458100318908691, 31.708599090576172,
+        11.758299827575684, -11.758299827575684, 30.573999404907227, 1.0000300407409668, -2.3503799438476562, 34.39580154418945,
+        2.2813100814819336, -5.361800193786621, 33.261199951171875, 4.125110149383545, -9.695320129394531, 32.484901428222656,
+        5.781400203704834, -13.58810043334961, 31.708599090576172, 6.5001702308654785, -15.27750015258789, 30.573999404907227,
+        0, -2.547840118408203, 34.39580154418945, 0, -5.812250137329102, 33.261199951171875,
+        0, -10.50979995727539, 32.484901428222656, 0, -14.729700088500977, 31.708599090576172,
+        0, -16.56089973449707, 30.573999404907227, 0, -2.547840118408203, 34.39580154418945,
+        -1.0000300407409668, -2.3503799438476562, 34.39580154418945, -2.2813100814819336, -5.361800193786621, 33.261199951171875,
+        0, -5.812250137329102, 33.261199951171875, -4.125110149383545, -9.695320129394531, 32.484901428222656,
+        0, -10.50979995727539, 32.484901428222656, -5.781400203704834, -13.58810043334961, 31.708599090576172,
+        0, -14.729700088500977, 31.708599090576172, -6.5001702308654785, -15.27750015258789, 30.573999404907227,
+        0, -16.56089973449707, 30.573999404907227, -1.8089599609375, -1.8089599609375, 34.39580154418945,
+        -4.126699924468994, -4.126699924468994, 33.261199951171875, -7.461979866027832, -7.461979866027832, 32.484901428222656,
+        -10.458100318908691, -10.458100318908691, 31.708599090576172, -11.758299827575684, -11.758299827575684, 30.573999404907227,
+        -2.3503799438476562, -1.0000300407409668, 34.39580154418945, -5.361800193786621, -2.2813100814819336, 33.261199951171875,
+        -9.695320129394531, -4.125110149383545, 32.484901428222656, -13.58810043334961, -5.781400203704834, 31.708599090576172,
+        -15.27750015258789, -6.5001702308654785, 30.573999404907227, -2.547840118408203, 0, 34.39580154418945,
+        -5.812250137329102, 0, 33.261199951171875, -10.50979995727539, 0, 32.484901428222656,
+        -14.729700088500977, 0, 31.708599090576172, -16.56089973449707, 0, 30.573999404907227,
+        -2.547840118408203, 0, 34.39580154418945, -2.3503799438476562, 1.0000300407409668, 34.39580154418945,
+        -5.361800193786621, 2.2813100814819336, 33.261199951171875, -5.812250137329102, 0, 33.261199951171875,
+        -9.695320129394531, 4.125110149383545, 32.484901428222656, -10.50979995727539, 0, 32.484901428222656,
+        -13.58810043334961, 5.781400203704834, 31.708599090576172, -14.729700088500977, 0, 31.708599090576172,
+        -15.27750015258789, 6.5001702308654785, 30.573999404907227, -16.56089973449707, 0, 30.573999404907227,
+        -1.8089599609375, 1.8089599609375, 34.39580154418945, -4.126699924468994, 4.126699924468994, 33.261199951171875,
+        -7.461979866027832, 7.461979866027832, 32.484901428222656, -10.458100318908691, 10.458100318908691, 31.708599090576172,
+        -11.758299827575684, 11.758299827575684, 30.573999404907227, -1.0000300407409668, 2.3503799438476562, 34.39580154418945,
+        -2.2813100814819336, 5.361800193786621, 33.261199951171875, -4.125110149383545, 9.695320129394531, 32.484901428222656,
+        -5.781400203704834, 13.58810043334961, 31.708599090576172, -6.5001702308654785, 15.27750015258789, 30.573999404907227,
+        0, 2.547840118408203, 34.39580154418945, 0, 5.812250137329102, 33.261199951171875,
+        0, 10.50979995727539, 32.484901428222656, 0, 14.729700088500977, 31.708599090576172,
+        0, 16.56089973449707, 30.573999404907227, 0, 2.547840118408203, 34.39580154418945,
+        1.0000300407409668, 2.3503799438476562, 34.39580154418945, 2.2813100814819336, 5.361800193786621, 33.261199951171875,
+        0, 5.812250137329102, 33.261199951171875, 4.125110149383545, 9.695320129394531, 32.484901428222656,
+        0, 10.50979995727539, 32.484901428222656, 5.781400203704834, 13.58810043334961, 31.708599090576172,
+        0, 14.729700088500977, 31.708599090576172, 6.5001702308654785, 15.27750015258789, 30.573999404907227,
+        0, 16.56089973449707, 30.573999404907227, 1.8089599609375, 1.8089599609375, 34.39580154418945,
+        4.126699924468994, 4.126699924468994, 33.261199951171875, 7.461979866027832, 7.461979866027832, 32.484901428222656,
+        10.458100318908691, 10.458100318908691, 31.708599090576172, 11.758299827575684, 11.758299827575684, 30.573999404907227,
+        2.3503799438476562, 1.0000300407409668, 34.39580154418945, 5.361800193786621, 2.2813100814819336, 33.261199951171875,
+        9.695320129394531, 4.125110149383545, 32.484901428222656, 13.58810043334961, 5.781400203704834, 31.708599090576172,
+        15.27750015258789, 6.5001702308654785, 30.573999404907227, 2.547840118408203, 0, 34.39580154418945,
+        5.812250137329102, 0, 33.261199951171875, 10.50979995727539, 0, 32.484901428222656,
+        14.729700088500977, 0, 31.708599090576172, 16.56089973449707, 0, 30.573999404907227 };
+
+float teapotNormals[] = { -0.9667419791221619, 0, -0.25575199723243713, -0.8930140137672424, 0.3698819875717163, -0.2563450038433075,
+        -0.8934370279312134, 0.36910200119018555, 0.2559970021247864, -0.9668239951133728, 0, 0.2554430067539215,
+        -0.0838799998164177, 0.03550700098276138, 0.9958429932594299, -0.09205400198698044, 0, 0.9957540035247803,
+        0.629721999168396, -0.2604379951953888, 0.7318620085716248, 0.6820489764213562, 0, 0.7313070297241211,
+        0.803725004196167, -0.3325839936733246, 0.4933690130710602, 0.8703010082244873, 0, 0.4925200045108795,
+        -0.6834070086479187, 0.6834070086479187, -0.2567310035228729, -0.6835309863090515, 0.6835309863090515, 0.25606799125671387,
+        -0.06492599844932556, 0.06492500007152557, 0.9957759976387024, 0.48139700293540955, -0.48139700293540955, 0.7324709892272949,
+        0.6148040294647217, -0.6148040294647217, 0.4939970076084137, -0.3698819875717163, 0.8930140137672424, -0.2563450038433075,
+        -0.36910200119018555, 0.8934370279312134, 0.2559959888458252, -0.03550700098276138, 0.0838790014386177, 0.9958429932594299,
+        0.26043900847435, -0.6297230124473572, 0.7318609952926636, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+        -0.002848000032827258, 0.9661769866943359, -0.25786298513412476, -0.001921999966725707, 0.9670090079307556, 0.2547360062599182,
+        -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, 0.00002300000051036477, -0.6820600032806396, 0.7312960028648376,
+        0, -0.8703010082244873, 0.4925200045108795, -0.002848000032827258, 0.9661769866943359, -0.25786298513412476,
+        0.37905800342559814, 0.852770984172821, -0.35929998755455017, 0.37711000442504883, 0.9140909910202026, 0.14908500015735626,
+        -0.001921999966725707, 0.9670090079307556, 0.2547360062599182, 0.0275030005723238, 0.12255500257015228, 0.9920809864997864,
+        -0.00026500000967644155, 0.09227199852466583, 0.9957339763641357, -0.26100900769233704, -0.6353650093078613, 0.7267630100250244,
+        0.00002300000051036477, -0.6820600032806396, 0.7312960028648376, -0.33248499035835266, -0.8042709827423096, 0.4925459921360016,
+        0, -0.8703010082244873, 0.4925200045108795, 0.6635469794273376, 0.6252639889717102, -0.4107919931411743,
+        0.712664008140564, 0.6976209878921509, 0.07372400164604187, 0.09972699731588364, 0.12198299914598465, 0.98750901222229,
+        -0.4873189926147461, -0.4885669946670532, 0.7237560153007507, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+        0.8800280094146729, 0.3387089967727661, -0.3329069912433624, 0.9172769784927368, 0.36149299144744873, 0.16711199283599854,
+        0.11358699947595596, 0.04806999862194061, 0.9923650026321411, -0.6341490149497986, -0.2618879973888397, 0.7275090217590332,
+        -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, 0.9666900038719177, -0.010453999973833561, -0.2557379901409149,
+        0.967441976070404, -0.00810300000011921, 0.25296199321746826, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+        -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        0.9666900038719177, -0.010453999973833561, -0.2557379901409149, 0.8930140137672424, -0.3698819875717163, -0.2563450038433075,
+        0.8934370279312134, -0.36910200119018555, 0.2559970021247864, 0.967441976070404, -0.00810300000011921, 0.25296199321746826,
+        0.0838799998164177, -0.03550700098276138, 0.9958429932594299, 0.0934389978647232, -0.0012799999676644802, 0.9956240057945251,
+        -0.629721999168396, 0.2604379951953888, 0.7318620085716248, -0.6821659803390503, 0.0003429999924264848, 0.7311969995498657,
+        -0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        0.6834070086479187, -0.6834070086479187, -0.2567310035228729, 0.6835309863090515, -0.6835309863090515, 0.25606799125671387,
+        0.06492599844932556, -0.06492500007152557, 0.9957759976387024, -0.48139700293540955, 0.48139700293540955, 0.7324709892272949,
+        -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, 0.3698819875717163, -0.8930140137672424, -0.2563450038433075,
+        0.36910200119018555, -0.8934370279312134, 0.2559959888458252, 0.03550700098276138, -0.0838790014386177, 0.9958429932594299,
+        -0.26043900847435, 0.6297230124473572, 0.7318609952926636, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        0, -0.9667419791221619, -0.25575199723243713, 0, -0.9668239951133728, 0.2554430067539215,
+        0, -0.09205400198698044, 0.9957540035247803, 0, 0.6820489764213562, 0.7313070297241211,
+        0, 0.8703010082244873, 0.4925200045108795, 0, -0.9667419791221619, -0.25575199723243713,
+        -0.3698819875717163, -0.8930140137672424, -0.2563450038433075, -0.36910200119018555, -0.8934370279312134, 0.2559970021247864,
+        0, -0.9668239951133728, 0.2554430067539215, -0.03550700098276138, -0.0838799998164177, 0.9958429932594299,
+        0, -0.09205400198698044, 0.9957540035247803, 0.2604379951953888, 0.629721999168396, 0.7318620085716248,
+        0, 0.6820489764213562, 0.7313070297241211, 0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        0, 0.8703010082244873, 0.4925200045108795, -0.6834070086479187, -0.6834070086479187, -0.2567310035228729,
+        -0.6835309863090515, -0.6835309863090515, 0.25606799125671387, -0.06492500007152557, -0.06492599844932556, 0.9957759976387024,
+        0.48139700293540955, 0.48139700293540955, 0.7324709892272949, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+        -0.8930140137672424, -0.3698819875717163, -0.2563450038433075, -0.8934370279312134, -0.36910200119018555, 0.2559959888458252,
+        -0.0838790014386177, -0.03550700098276138, 0.9958429932594299, 0.6297230124473572, 0.26043900847435, 0.7318609952926636,
+        0.803725004196167, 0.3325839936733246, 0.4933690130710602, -0.9667419791221619, 0, -0.25575199723243713,
+        -0.9668239951133728, 0, 0.2554430067539215, -0.09205400198698044, 0, 0.9957540035247803,
+        0.6820489764213562, 0, 0.7313070297241211, 0.8703010082244873, 0, 0.4925200045108795,
+        0.8703010082244873, 0, 0.4925200045108795, 0.803725004196167, -0.3325839936733246, 0.4933690130710602,
+        0.8454390168190002, -0.34983500838279724, 0.40354499220848083, 0.9153209924697876, 0, 0.4027250111103058,
+        0.8699960112571716, -0.36004599928855896, 0.33685898780822754, 0.9418079853057861, 0, 0.33615100383758545,
+        0.9041929841041565, -0.37428000569343567, 0.20579099655151367, 0.9786900281906128, 0, 0.20534199476242065,
+        0.9218789935112, -0.38175201416015625, -0.06636899709701538, 0.9978039860725403, 0, -0.06623899936676025,
+        0.6148040294647217, -0.6148040294647217, 0.4939970076084137, 0.6468020081520081, -0.6468020081520081, 0.40409600734710693,
+        0.6656550168991089, -0.6656550168991089, 0.3373520076274872, 0.6919230222702026, -0.6919230222702026, 0.20611999928951263,
+        0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.3325839936733246, -0.803725004196167, 0.4933690130710602,
+        0.34983500838279724, -0.8454390168190002, 0.40354499220848083, 0.36004701256752014, -0.8699960112571716, 0.33685800433158875,
+        0.37428000569343567, -0.9041929841041565, 0.20579099655151367, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0, -0.8703010082244873, 0.4925200045108795, 0, -0.9153209924697876, 0.4027250111103058,
+        0, -0.9418079853057861, 0.33615100383758545, 0, -0.9786900281906128, 0.20534199476242065,
+        0, -0.9978039860725403, -0.06623899936676025, 0, -0.8703010082244873, 0.4925200045108795,
+        -0.33248499035835266, -0.8042709827423096, 0.4925459921360016, -0.34983500838279724, -0.8454390168190002, 0.40354499220848083,
+        0, -0.9153209924697876, 0.4027250111103058, -0.36004599928855896, -0.8699960112571716, 0.33685898780822754,
+        0, -0.9418079853057861, 0.33615100383758545, -0.37428000569343567, -0.9041929841041565, 0.20579099655151367,
+        0, -0.9786900281906128, 0.20534199476242065, -0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0, -0.9978039860725403, -0.06623899936676025, -0.6152420043945312, -0.6154839992523193, 0.4926010072231293,
+        -0.6468020081520081, -0.6468020081520081, 0.40409600734710693, -0.6656550168991089, -0.6656550168991089, 0.3373520076274872,
+        -0.6919230222702026, -0.6919230222702026, 0.20611999928951263, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+        -0.8041260242462158, -0.33270499110221863, 0.49263399839401245, -0.8454390168190002, -0.34983500838279724, 0.40354499220848083,
+        -0.8699960112571716, -0.36004701256752014, 0.33685800433158875, -0.9041929841041565, -0.37428000569343567, 0.20579099655151367,
+        -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8703219890594482, 0.00005400000009103678, 0.492482990026474,
+        -0.9153209924697876, 0, 0.4027250111103058, -0.9418079853057861, 0, 0.33615100383758545,
+        -0.9786900281906128, 0, 0.20534199476242065, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.8703219890594482, 0.00005400000009103678, 0.492482990026474, -0.803725004196167, 0.3325839936733246, 0.4933690130710602,
+        -0.8454390168190002, 0.34983500838279724, 0.40354499220848083, -0.9153209924697876, 0, 0.4027250111103058,
+        -0.8699960112571716, 0.36004599928855896, 0.33685898780822754, -0.9418079853057861, 0, 0.33615100383758545,
+        -0.9041929841041565, 0.37428000569343567, 0.20579099655151367, -0.9786900281906128, 0, 0.20534199476242065,
+        -0.9218789935112, 0.38175201416015625, -0.06636899709701538, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.6148040294647217, 0.6148040294647217, 0.4939970076084137, -0.6468020081520081, 0.6468020081520081, 0.40409600734710693,
+        -0.6656550168991089, 0.6656550168991089, 0.3373520076274872, -0.6919230222702026, 0.6919230222702026, 0.20611999928951263,
+        -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.3325839936733246, 0.803725004196167, 0.4933690130710602,
+        -0.34983500838279724, 0.8454390168190002, 0.40354499220848083, -0.36004701256752014, 0.8699960112571716, 0.33685800433158875,
+        -0.37428000569343567, 0.9041929841041565, 0.20579099655151367, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        0, 0.8703010082244873, 0.4925200045108795, 0, 0.9153209924697876, 0.4027250111103058,
+        0, 0.9418079853057861, 0.33615100383758545, 0, 0.9786900281906128, 0.20534199476242065,
+        0, 0.9978039860725403, -0.06623899936676025, 0, 0.8703010082244873, 0.4925200045108795,
+        0.3325839936733246, 0.803725004196167, 0.4933690130710602, 0.34983500838279724, 0.8454390168190002, 0.40354499220848083,
+        0, 0.9153209924697876, 0.4027250111103058, 0.36004599928855896, 0.8699960112571716, 0.33685898780822754,
+        0, 0.9418079853057861, 0.33615100383758545, 0.37428000569343567, 0.9041929841041565, 0.20579099655151367,
+        0, 0.9786900281906128, 0.20534199476242065, 0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        0, 0.9978039860725403, -0.06623899936676025, 0.6148040294647217, 0.6148040294647217, 0.4939970076084137,
+        0.6468020081520081, 0.6468020081520081, 0.40409600734710693, 0.6656550168991089, 0.6656550168991089, 0.3373520076274872,
+        0.6919230222702026, 0.6919230222702026, 0.20611999928951263, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+        0.803725004196167, 0.3325839936733246, 0.4933690130710602, 0.8454390168190002, 0.34983500838279724, 0.40354499220848083,
+        0.8699960112571716, 0.36004701256752014, 0.33685800433158875, 0.9041929841041565, 0.37428000569343567, 0.20579099655151367,
+        0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8703010082244873, 0, 0.4925200045108795,
+        0.9153209924697876, 0, 0.4027250111103058, 0.9418079853057861, 0, 0.33615100383758545,
+        0.9786900281906128, 0, 0.20534199476242065, 0.9978039860725403, 0, -0.06623899936676025,
+        0.9978039860725403, 0, -0.06623899936676025, 0.9218789935112, -0.38175201416015625, -0.06636899709701538,
+        0.8314369916915894, -0.3441790044307709, -0.4361799955368042, 0.9001820087432861, 0, -0.4355129897594452,
+        0.6735119819641113, -0.2785939872264862, -0.6846650242805481, 0.7296109795570374, 0, -0.6838629841804504,
+        0.6403989791870117, -0.26487401127815247, -0.7209240198135376, 0.6939510107040405, 0, -0.7200220227241516,
+        0.7329490184783936, -0.303166002035141, -0.6089959740638733, 0.7939500212669373, 0, -0.6079840064048767,
+        0.7055429816246033, -0.7055429816246033, -0.06647899746894836, 0.6360920071601868, -0.6360920071601868, -0.4367780089378357,
+        0.5149649977684021, -0.5149649977684021, -0.6852890253067017, 0.48965099453926086, -0.48965099453926086, -0.7214459776878357,
+        0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.38175201416015625, -0.9218789935112, -0.06636899709701538,
+        0.3441790044307709, -0.8314369916915894, -0.4361799955368042, 0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+        0.26487401127815247, -0.6403989791870117, -0.7209240198135376, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0, -0.9978039860725403, -0.06623899936676025, 0, -0.9001820087432861, -0.4355129897594452,
+        0, -0.7296109795570374, -0.6838629841804504, 0, -0.6939510107040405, -0.7200220227241516,
+        0, -0.7939500212669373, -0.6079840064048767, 0, -0.9978039860725403, -0.06623899936676025,
+        -0.38175201416015625, -0.9218789935112, -0.06636899709701538, -0.3441790044307709, -0.8314369916915894, -0.4361799955368042,
+        0, -0.9001820087432861, -0.4355129897594452, -0.2785939872264862, -0.6735119819641113, -0.6846650242805481,
+        0, -0.7296109795570374, -0.6838629841804504, -0.26487401127815247, -0.6403989791870117, -0.7209240198135376,
+        0, -0.6939510107040405, -0.7200220227241516, -0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0, -0.7939500212669373, -0.6079840064048767, -0.7055429816246033, -0.7055429816246033, -0.06647899746894836,
+        -0.6360920071601868, -0.6360920071601868, -0.4367780089378357, -0.5149649977684021, -0.5149649977684021, -0.6852890253067017,
+        -0.48965099453926086, -0.48965099453926086, -0.7214459776878357, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+        -0.9218789935112, -0.38175201416015625, -0.06636899709701538, -0.8314369916915894, -0.3441790044307709, -0.4361799955368042,
+        -0.6735119819641113, -0.2785939872264862, -0.6846650242805481, -0.6403989791870117, -0.26487401127815247, -0.7209240198135376,
+        -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.9978039860725403, 0, -0.06623899936676025,
+        -0.9001820087432861, 0, -0.4355129897594452, -0.7296109795570374, 0, -0.6838629841804504,
+        -0.6939510107040405, 0, -0.7200220227241516, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.9978039860725403, 0, -0.06623899936676025, -0.9218789935112, 0.38175201416015625, -0.06636899709701538,
+        -0.8314369916915894, 0.3441790044307709, -0.4361799955368042, -0.9001820087432861, 0, -0.4355129897594452,
+        -0.6735119819641113, 0.2785939872264862, -0.6846650242805481, -0.7296109795570374, 0, -0.6838629841804504,
+        -0.6403989791870117, 0.26487401127815247, -0.7209240198135376, -0.6939510107040405, 0, -0.7200220227241516,
+        -0.7329490184783936, 0.303166002035141, -0.6089959740638733, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.7055429816246033, 0.7055429816246033, -0.06647899746894836, -0.6360920071601868, 0.6360920071601868, -0.4367780089378357,
+        -0.5149649977684021, 0.5149649977684021, -0.6852890253067017, -0.48965099453926086, 0.48965099453926086, -0.7214459776878357,
+        -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.38175201416015625, 0.9218789935112, -0.06636899709701538,
+        -0.3441790044307709, 0.8314369916915894, -0.4361799955368042, -0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+        -0.26487401127815247, 0.6403989791870117, -0.7209240198135376, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        0, 0.9978039860725403, -0.06623899936676025, 0, 0.9001820087432861, -0.4355129897594452,
+        0, 0.7296109795570374, -0.6838629841804504, 0, 0.6939510107040405, -0.7200220227241516,
+        0, 0.7939500212669373, -0.6079840064048767, 0, 0.9978039860725403, -0.06623899936676025,
+        0.38175201416015625, 0.9218789935112, -0.06636899709701538, 0.3441790044307709, 0.8314369916915894, -0.4361799955368042,
+        0, 0.9001820087432861, -0.4355129897594452, 0.2785939872264862, 0.6735119819641113, -0.6846650242805481,
+        0, 0.7296109795570374, -0.6838629841804504, 0.26487401127815247, 0.6403989791870117, -0.7209240198135376,
+        0, 0.6939510107040405, -0.7200220227241516, 0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        0, 0.7939500212669373, -0.6079840064048767, 0.7055429816246033, 0.7055429816246033, -0.06647899746894836,
+        0.6360920071601868, 0.6360920071601868, -0.4367780089378357, 0.5149649977684021, 0.5149649977684021, -0.6852890253067017,
+        0.48965099453926086, 0.48965099453926086, -0.7214459776878357, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+        0.9218789935112, 0.38175201416015625, -0.06636899709701538, 0.8314369916915894, 0.3441790044307709, -0.4361799955368042,
+        0.6735119819641113, 0.2785939872264862, -0.6846650242805481, 0.6403989791870117, 0.26487401127815247, -0.7209240198135376,
+        0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.9978039860725403, 0, -0.06623899936676025,
+        0.9001820087432861, 0, -0.4355129897594452, 0.7296109795570374, 0, -0.6838629841804504,
+        0.6939510107040405, 0, -0.7200220227241516, 0.7939500212669373, 0, -0.6079840064048767,
+        0.7939500212669373, 0, -0.6079840064048767, 0.7329490184783936, -0.303166002035141, -0.6089959740638733,
+        0.576229989528656, -0.23821599781513214, -0.7818009853363037, 0.6238600015640259, 0, -0.7815359830856323,
+        0.16362899541854858, -0.06752700358629227, -0.9842079877853394, 0.17729100584983826, 0, -0.984158992767334,
+        0.04542100057005882, -0.018735000863671303, -0.9987919926643372, 0.04920699819922447, 0, -0.9987890124320984,
+        0, 0, -1, 0, 0, -1,
+        0.5605549812316895, -0.5605549812316895, -0.6095539927482605, 0.44041600823402405, -0.44041600823402405, -0.7823479771614075,
+        0.12490200251340866, -0.12490200251340866, -0.9842759966850281, 0.034662000834941864, -0.034662000834941864, -0.9987980127334595,
+        0, 0, -1, 0.303166002035141, -0.7329490184783936, -0.6089959740638733,
+        0.23821599781513214, -0.576229989528656, -0.7818009853363037, 0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+        0.018735000863671303, -0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+        0, -0.7939500212669373, -0.6079840064048767, 0, -0.6238600015640259, -0.7815359830856323,
+        0, -0.17729100584983826, -0.984158992767334, 0, -0.04920699819922447, -0.9987890124320984,
+        0, 0, -1, 0, -0.7939500212669373, -0.6079840064048767,
+        -0.303166002035141, -0.7329490184783936, -0.6089959740638733, -0.23821599781513214, -0.576229989528656, -0.7818009853363037,
+        0, -0.6238600015640259, -0.7815359830856323, -0.06752700358629227, -0.16362899541854858, -0.9842079877853394,
+        0, -0.17729100584983826, -0.984158992767334, -0.018735000863671303, -0.04542100057005882, -0.9987919926643372,
+        0, -0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+        0, 0, -1, -0.5605549812316895, -0.5605549812316895, -0.6095539927482605,
+        -0.44041600823402405, -0.44041600823402405, -0.7823479771614075, -0.12490200251340866, -0.12490200251340866, -0.9842759966850281,
+        -0.034662000834941864, -0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+        -0.7329490184783936, -0.303166002035141, -0.6089959740638733, -0.576229989528656, -0.23821599781513214, -0.7818009853363037,
+        -0.16362899541854858, -0.06752700358629227, -0.9842079877853394, -0.04542100057005882, -0.018735000863671303, -0.9987919926643372,
+        0, 0, -1, -0.7939500212669373, 0, -0.6079840064048767,
+        -0.6238600015640259, 0, -0.7815359830856323, -0.17729100584983826, 0, -0.984158992767334,
+        -0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+        -0.7939500212669373, 0, -0.6079840064048767, -0.7329490184783936, 0.303166002035141, -0.6089959740638733,
+        -0.576229989528656, 0.23821599781513214, -0.7818009853363037, -0.6238600015640259, 0, -0.7815359830856323,
+        -0.16362899541854858, 0.06752700358629227, -0.9842079877853394, -0.17729100584983826, 0, -0.984158992767334,
+        -0.04542100057005882, 0.018735000863671303, -0.9987919926643372, -0.04920699819922447, 0, -0.9987890124320984,
+        0, 0, -1, 0, 0, -1,
+        -0.5605549812316895, 0.5605549812316895, -0.6095539927482605, -0.44041600823402405, 0.44041600823402405, -0.7823479771614075,
+        -0.12490200251340866, 0.12490200251340866, -0.9842759966850281, -0.034662000834941864, 0.034662000834941864, -0.9987980127334595,
+        0, 0, -1, -0.303166002035141, 0.7329490184783936, -0.6089959740638733,
+        -0.23821599781513214, 0.576229989528656, -0.7818009853363037, -0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+        -0.018735000863671303, 0.04542100057005882, -0.9987919926643372, 0, 0, -1,
+        0, 0.7939500212669373, -0.6079840064048767, 0, 0.6238600015640259, -0.7815359830856323,
+        0, 0.17729100584983826, -0.984158992767334, 0, 0.04920699819922447, -0.9987890124320984,
+        0, 0, -1, 0, 0.7939500212669373, -0.6079840064048767,
+        0.303166002035141, 0.7329490184783936, -0.6089959740638733, 0.23821599781513214, 0.576229989528656, -0.7818009853363037,
+        0, 0.6238600015640259, -0.7815359830856323, 0.06752700358629227, 0.16362899541854858, -0.9842079877853394,
+        0, 0.17729100584983826, -0.984158992767334, 0.018735000863671303, 0.04542100057005882, -0.9987919926643372,
+        0, 0.04920699819922447, -0.9987890124320984, 0, 0, -1,
+        0, 0, -1, 0.5605549812316895, 0.5605549812316895, -0.6095539927482605,
+        0.44041600823402405, 0.44041600823402405, -0.7823479771614075, 0.12490200251340866, 0.12490200251340866, -0.9842759966850281,
+        0.034662000834941864, 0.034662000834941864, -0.9987980127334595, 0, 0, -1,
+        0.7329490184783936, 0.303166002035141, -0.6089959740638733, 0.576229989528656, 0.23821599781513214, -0.7818009853363037,
+        0.16362899541854858, 0.06752700358629227, -0.9842079877853394, 0.04542100057005882, 0.018735000863671303, -0.9987919926643372,
+        0, 0, -1, 0.7939500212669373, 0, -0.6079840064048767,
+        0.6238600015640259, 0, -0.7815359830856323, 0.17729100584983826, 0, -0.984158992767334,
+        0.04920699819922447, 0, -0.9987890124320984, 0, 0, -1,
+        0.007784999907016754, 0.00021499999274965376, -0.999970018863678, 0.007038000039756298, -0.5829259753227234, -0.8124949932098389,
+        0.0361270010471344, -0.5456140041351318, -0.837257981300354, 0.03913800045847893, 0.0009879999561235309, -0.9992330074310303,
+        0.16184599697589874, -0.5630490183830261, -0.8104209899902344, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+        0.4823650121688843, -0.6427459716796875, -0.5951480269432068, 0.6122999787330627, 0.010459000244736671, -0.790556013584137,
+        0.7387199997901917, -0.6641989946365356, -0.11459299921989441, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        -0.0019079999765381217, -0.9867690205574036, 0.1621209979057312, 0.002761000068858266, -0.9998499751091003, 0.017105000093579292,
+        0.010532000102102757, -0.9972469806671143, 0.07339800149202347, -0.06604000180959702, -0.9893029928207397, 0.13006900250911713,
+        -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.009201999753713608, -0.4902929961681366, 0.8715090155601501,
+        -0.04860600084066391, -0.5394579768180847, 0.8406090140342712, -0.22329799830913544, -0.5527390241622925, 0.8028810024261475,
+        -0.5963649749755859, -0.5751349925994873, 0.5599709749221802, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+        -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111, -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943,
+        -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.7497230172157288, -0.004267000127583742, 0.6617379784584045,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.01056000031530857, -0.00010299999848939478, 0.9999439716339111,
+        -0.008791999891400337, 0.49032899737358093, 0.8714929819107056, -0.04649300128221512, 0.5387560129165649, 0.8411779999732971,
+        -0.05879800021648407, -0.0007089999853633344, 0.9982699751853943, -0.21790899336338043, 0.5491610169410706, 0.8068069815635681,
+        -0.28071001172065735, -0.0032679999712854624, 0.9597870111465454, -0.5972909927368164, 0.5741199851036072, 0.560027003288269,
+        -0.7497230172157288, -0.004267000127583742, 0.6617379784584045, -0.8040000200271606, 0.5912910103797913, 0.0629120022058487,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.0018050000071525574, 0.986840009689331, 0.16169099509716034,
+        0.0020310000982135534, 0.999891996383667, 0.014553000219166279, 0.009215000085532665, 0.9981520175933838, 0.060068998485803604,
+        -0.059335000813007355, 0.9917230010032654, 0.11386600136756897, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+        0.006417000200599432, 0.5830950140953064, -0.812379002571106, 0.03378299996256828, 0.5453730225563049, -0.8375130295753479,
+        0.1571130007505417, 0.562188982963562, -0.8119469881057739, 0.4844059944152832, 0.6465290188789368, -0.5893650054931641,
+        0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.007784999907016754, 0.00021499999274965376, -0.999970018863678,
+        0.03913800045847893, 0.0009879999561235309, -0.9992330074310303, 0.17951199412345886, 0.0043680001981556416, -0.9837459921836853,
+        0.6122999787330627, 0.010459000244736671, -0.790556013584137, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        0.9861519932746887, 0.006668999791145325, -0.16570700705051422, 0.7387199997901917, -0.6641989946365356, -0.11459299921989441,
+        0.7256090044975281, -0.6373609900474548, 0.25935098528862, 0.94651198387146, 0.0033569999504834414, 0.3226499855518341,
+        0.6459450125694275, -0.6077200174331665, 0.46198800206184387, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+        0.5316150188446045, -0.5586140155792236, 0.6366599798202515, 0.6500110030174255, 0.006936000194400549, 0.759893000125885,
+        0.4249640107154846, -0.5955389738082886, 0.6817179918289185, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+        -0.09442699700593948, -0.9953929781913757, 0.016594000160694122, -0.04956100136041641, -0.9985759854316711, -0.01975500024855137,
+        -0.03781700134277344, -0.998649001121521, -0.035624999552965164, -0.0379129983484745, -0.9986140131950378, -0.03651199862360954,
+        -0.1688539981842041, -0.9395300149917603, -0.2979460060596466, -0.8033369779586792, -0.5916029810905457, 0.06823500245809555,
+        -0.7423409819602966, -0.5995240211486816, -0.2991659939289093, -0.6196020245552063, -0.5795029997825623, -0.5294060111045837,
+        -0.483707994222641, -0.5438370108604431, -0.6857600212097168, -0.44529199600219727, -0.4131770133972168, -0.7943549752235413,
+        -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288, -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682,
+        -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.5662239789962769, -0.003461000043898821, -0.8242440223693848,
+        -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.9973509907722473, -0.0020580000709742308, 0.07271400094032288,
+        -0.8040000200271606, 0.5912910103797913, 0.0629120022058487, -0.7446749806404114, 0.5989770293235779, -0.29442399740219116,
+        -0.9265130162239075, -0.0019950000569224358, -0.3762570023536682, -0.6219490170478821, 0.5781649947166443, -0.5281140208244324,
+        -0.7539200186729431, -0.004317000042647123, -0.6569520235061646, -0.48117101192474365, 0.5428280234336853, -0.6883400082588196,
+        -0.5662239789962769, -0.003461000043898821, -0.8242440223693848, -0.43805500864982605, 0.41574400663375854, -0.7970349788665771,
+        -0.4818040132522583, -0.0018500000005587935, -0.8762770295143127, -0.08690100163221359, 0.9961410164833069, 0.01228999998420477,
+        -0.04433799907565117, 0.9988710284233093, -0.017055999487638474, -0.026177000254392624, 0.9992600083351135, -0.02816700004041195,
+        -0.025293000042438507, 0.9992780089378357, -0.028332000598311424, -0.15748199820518494, 0.9441670179367065, -0.28939300775527954,
+        0.7388700246810913, 0.6661880016326904, -0.10131999850273132, 0.7282440066337585, 0.63714200258255, 0.25240999460220337,
+        0.6470540165901184, 0.6082550287246704, 0.4597249925136566, 0.5229939818382263, 0.5621700286865234, 0.6406570076942444,
+        0.4099780023097992, 0.6046689748764038, 0.6828569769859314, 0.9861519932746887, 0.006668999791145325, -0.16570700705051422,
+        0.94651198387146, 0.0033569999504834414, 0.3226499855518341, 0.8258299827575684, 0.007451999932527542, 0.5638700127601624,
+        0.6500110030174255, 0.006936000194400549, 0.759893000125885, 0.5324289798736572, 0.005243999883532524, 0.8464580178260803,
+        -0.230786994099617, 0.006523000076413155, 0.9729819893836975, -0.15287800133228302, -0.7101899981498718, 0.6872109770774841,
+        -0.31672099232673645, -0.7021129727363586, 0.6377500295639038, -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308,
+        -0.6010670065879822, -0.645330011844635, 0.471451997756958, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+        -0.635890007019043, -0.629800021648407, 0.4460900127887726, -0.8775539994239807, -0.01909100078046322, 0.47909700870513916,
+        -0.4357450008392334, -0.670009970664978, 0.6010090112686157, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        0.11111299693584442, -0.9901599884033203, -0.08506900072097778, 0.22330999374389648, -0.9747260212898254, 0.006539999973028898,
+        0.19009700417518616, -0.9694579839706421, 0.15496399998664856, 0.005270000081509352, -0.9818699955940247, 0.18948200345039368,
+        -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.3439059853553772, -0.5994120240211487, -0.7227950096130371,
+        0.5724899768829346, -0.5916270017623901, -0.5676559805870056, 0.7874360084533691, -0.5605109930038452, -0.2564600110054016,
+        0.6470969915390015, -0.6981409788131714, -0.3063740134239197, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+        0.4109260141849518, -0.0012839999981224537, -0.9116680026054382, 0.6715199947357178, 0.0008989999769255519, -0.7409859895706177,
+        0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.8469099998474121, 0.01385399978607893, -0.5315560102462769,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.4109260141849518, -0.0012839999981224537, -0.9116680026054382,
+        0.3411880135536194, 0.6009309887886047, -0.7228230237960815, 0.5786640048027039, 0.591838002204895, -0.5611389875411987,
+        0.6715199947357178, 0.0008989999769255519, -0.7409859895706177, 0.7848690152168274, 0.5665420293807983, -0.25102001428604126,
+        0.9220259785652161, 0.00725199980661273, -0.3870599865913391, 0.6426810026168823, 0.7039899826049805, -0.3022570013999939,
+        0.8469099998474121, 0.01385399978607893, -0.5315560102462769, 0.4185889959335327, 0.7581170201301575, -0.5000420212745667,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.11580599844455719, 0.9901139736175537, -0.07913900166749954,
+        0.23281100392341614, 0.9724410176277161, 0.012564999982714653, 0.20666299760341644, 0.9662799835205078, 0.15360000729560852,
+        0.02449899911880493, 0.9865779876708984, 0.16144299507141113, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+        -0.13491199910640717, 0.7135509848594666, 0.6874909996986389, -0.31953999400138855, 0.7050619721412659, 0.6330729722976685,
+        -0.6039019823074341, 0.6499029994010925, 0.4614419937133789, -0.6318150162696838, 0.6400719881057739, 0.43716898560523987,
+        -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.230786994099617, 0.006523000076413155, 0.9729819893836975,
+        -0.5489360094070435, 0.0015109999803826213, 0.8358629941940308, -0.8756710290908813, -0.009891999885439873, 0.4828070104122162,
+        -0.8775539994239807, -0.01909100078046322, 0.47909700870513916, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        -0.6961889863014221, -0.02449600026011467, 0.7174400091171265, -0.4357450008392334, -0.670009970664978, 0.6010090112686157,
+        -0.25985801219940186, -0.5525479912757874, 0.7919380068778992, -0.42579901218414307, -0.010804999619722366, 0.9047530293464661,
+        0.009537000209093094, 0.021669000387191772, 0.9997199773788452, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+        0.4101540148258209, 0.8490809798240662, 0.3329179883003235, 0.9995980262756348, -0.01155600044876337, 0.02587899938225746,
+        0.5415220260620117, 0.6370009779930115, -0.5486199855804443, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+        -0.011750999838113785, -0.9690240025520325, 0.24668699502944946, 0.046310000121593475, -0.8891720175743103, 0.45522499084472656,
+        -0.010688000358641148, -0.14889900386333466, 0.9887949824333191, -0.04437499865889549, 0.7291200160980225, 0.6829460263252258,
+        0.12282499670982361, 0.9923850297927856, 0.009232000447809696, 0.4275279939174652, -0.7535750269889832, -0.49934399127960205,
+        0.48183900117874146, -0.857479989528656, -0.18044300377368927, 0.45527198910713196, -0.49992498755455017, 0.7367510199546814,
+        -0.22054199874401093, 0.3582780063152313, 0.9071930050849915, -0.23591899871826172, 0.7157959938049316, 0.6572499871253967,
+        0.5359240174293518, 0.010503999888896942, -0.8442010283470154, 0.7280910015106201, 0.015584999695420265, -0.6853029727935791,
+        0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.26009801030158997, -0.0007999999797903001, 0.965582013130188,
+        -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.5359240174293518, 0.010503999888896942, -0.8442010283470154,
+        0.4185889959335327, 0.7581170201301575, -0.5000420212745667, 0.4801650047302246, 0.8588529825210571, -0.17836299538612366,
+        0.7280910015106201, 0.015584999695420265, -0.6853029727935791, 0.4881030023097992, 0.49794700741767883, 0.7168020009994507,
+        0.8887389898300171, 0.016679000109434128, 0.4581089913845062, -0.2220049947500229, -0.36189401149749756, 0.9053990244865417,
+        -0.26009801030158997, -0.0007999999797903001, 0.965582013130188, -0.23540399968624115, -0.7104769945144653, 0.6631799936294556,
+        -0.37161099910736084, 0.004416999872773886, 0.9283779859542847, 0.0033809999004006386, 0.9774550199508667, 0.2111150026321411,
+        0.058719001710414886, 0.8971999883651733, 0.437703013420105, 0.0013249999610707164, 0.164000004529953, 0.9864590167999268,
+        -0.04418899863958359, -0.7303190231323242, 0.6816750168800354, 0.13880200684070587, -0.9897300004959106, -0.034189000725746155,
+        -0.4243049919605255, 0.6667500138282776, 0.6127070188522339, -0.25888898968696594, 0.5453789830207825, 0.7972059845924377,
+        0.012268000282347202, -0.01928500086069107, 0.9997389912605286, 0.3986299932003021, -0.8456630110740662, 0.3548929989337921,
+        0.5375639796257019, -0.6107370257377625, -0.5813990235328674, -0.6961889863014221, -0.02449600026011467, 0.7174400091171265,
+        -0.42579901218414307, -0.010804999619722366, 0.9047530293464661, 0.022041000425815582, -0.001623000018298626, 0.9997559785842896,
+        0.9995980262756348, -0.01155600044876337, 0.02587899938225746, 0.7095860242843628, -0.009670999832451344, -0.7045519948005676,
+        0, 0, 1, 0, 0, 1,
+        0.7626410126686096, -0.31482499837875366, 0.5650339722633362, 0.8245400190353394, -0.00001700000029813964, 0.5658029913902283,
+        0.8479819893836975, -0.3500339984893799, -0.39799800515174866, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+        0.8641409873962402, -0.35644200444221497, -0.3552600145339966, 0.9352689981460571, -0.00011200000153621659, -0.3539389967918396,
+        0.7209920287132263, -0.29793301224708557, 0.6256250143051147, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0, 0, 1, 0.5833569765090942, -0.5833380222320557, 0.5651649832725525,
+        0.648485004901886, -0.6484479904174805, -0.3987259864807129, 0.6608719825744629, -0.6607480049133301, -0.35589399933815,
+        0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+        0.31482499837875366, -0.762628972530365, 0.5650510191917419, 0.35004499554634094, -0.8479880094528198, -0.39797601103782654,
+        0.35647401213645935, -0.8641520142555237, -0.35519900918006897, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+        0, 0, 1, -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283,
+        -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0, 0, 1, -0.31482499837875366, -0.7626410126686096, 0.5650339722633362,
+        -0.00001700000029813964, -0.8245400190353394, 0.5658029913902283, -0.3500339984893799, -0.8479819893836975, -0.39799800515174866,
+        -0.00003300000025774352, -0.917701005935669, -0.397271990776062, -0.35644200444221497, -0.8641409873962402, -0.3552600145339966,
+        -0.00011200000153621659, -0.9352689981460571, -0.3539389967918396, -0.29793301224708557, -0.7209920287132263, 0.6256250143051147,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        -0.5833380222320557, -0.5833569765090942, 0.5651649832725525, -0.6484479904174805, -0.648485004901886, -0.3987259864807129,
+        -0.6607480049133301, -0.6608719825744629, -0.35589399933815, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+        0, 0, 1, -0.762628972530365, -0.31482499837875366, 0.5650510191917419,
+        -0.8479880094528198, -0.35004499554634094, -0.39797601103782654, -0.8641520142555237, -0.35647401213645935, -0.35519900918006897,
+        -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+        -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+        -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        0, 0, 1, 0, 0, 1,
+        -0.7626410126686096, 0.31482499837875366, 0.5650339722633362, -0.8245400190353394, 0.00001700000029813964, 0.5658029913902283,
+        -0.8479819893836975, 0.3500339984893799, -0.39799800515174866, -0.917701005935669, 0.00003300000025774352, -0.397271990776062,
+        -0.8641409873962402, 0.35644200444221497, -0.3552600145339966, -0.9352689981460571, 0.00011200000153621659, -0.3539389967918396,
+        -0.7209920287132263, 0.29793301224708557, 0.6256250143051147, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        0, 0, 1, -0.5833569765090942, 0.5833380222320557, 0.5651649832725525,
+        -0.648485004901886, 0.6484479904174805, -0.3987259864807129, -0.6608719825744629, 0.6607480049133301, -0.35589399933815,
+        -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, 0, 0, 1,
+        -0.31482499837875366, 0.762628972530365, 0.5650510191917419, -0.35004499554634094, 0.8479880094528198, -0.39797601103782654,
+        -0.35647401213645935, 0.8641520142555237, -0.35519900918006897, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+        0, 0, 1, 0.00001700000029813964, 0.8245400190353394, 0.5658029913902283,
+        0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.00011200000153621659, 0.9352689981460571, -0.3539389967918396,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0, 0, 1, 0.31482499837875366, 0.7626410126686096, 0.5650339722633362,
+        0.00001700000029813964, 0.8245400190353394, 0.5658029913902283, 0.3500339984893799, 0.8479819893836975, -0.39799800515174866,
+        0.00003300000025774352, 0.917701005935669, -0.397271990776062, 0.35644200444221497, 0.8641409873962402, -0.3552600145339966,
+        0.00011200000153621659, 0.9352689981460571, -0.3539389967918396, 0.29793301224708557, 0.7209920287132263, 0.6256250143051147,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0, 1,
+        0.5833380222320557, 0.5833569765090942, 0.5651649832725525, 0.6484479904174805, 0.648485004901886, -0.3987259864807129,
+        0.6607480049133301, 0.6608719825744629, -0.35589399933815, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+        0, 0, 1, 0.762628972530365, 0.31482499837875366, 0.5650510191917419,
+        0.8479880094528198, 0.35004499554634094, -0.39797601103782654, 0.8641520142555237, 0.35647401213645935, -0.35519900918006897,
+        0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0, 0, 1,
+        0.8245400190353394, -0.00001700000029813964, 0.5658029913902283, 0.917701005935669, -0.00003300000025774352, -0.397271990776062,
+        0.9352689981460571, -0.00011200000153621659, -0.3539389967918396, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0.7807120084762573, -0.00007500000356230885, 0.6248909831047058, 0.7209920287132263, -0.29793301224708557, 0.6256250143051147,
+        0.21797800064086914, -0.0902160033583641, 0.9717749953269958, 0.23658299446105957, 0, 0.9716110229492188,
+        0.1595889925956726, -0.06596100330352783, 0.9849770069122314, 0.17308400571346283, 0, 0.9849069714546204,
+        0.3504979908466339, -0.1447400003671646, 0.9253119826316833, 0.37970298528671265, 0, 0.925108015537262,
+        0.48558899760246277, -0.20147399604320526, 0.8506529927253723, 0.5266720056533813, 0, 0.8500679731369019,
+        0.5518630146980286, -0.5517799854278564, 0.6252880096435547, 0.16663099825382233, -0.16663099825382233, 0.9718379974365234,
+        0.12190800160169601, -0.12190800160169601, 0.9850260019302368, 0.2676680088043213, -0.2676680088043213, 0.9255849719047546,
+        0.37131500244140625, -0.37131500244140625, 0.8510289788246155, 0.29798200726509094, -0.7210670113563538, 0.6255149841308594,
+        0.0902160033583641, -0.21797800064086914, 0.9717749953269958, 0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+        0.1447400003671646, -0.3504979908466339, 0.9253119826316833, 0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+        -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894, 0, -0.23658299446105957, 0.9716110229492188,
+        0, -0.17308400571346283, 0.9849069714546204, 0, -0.37970298528671265, 0.925108015537262,
+        0, -0.5266720056533813, 0.8500679731369019, -0.00007500000356230885, -0.7807120084762573, 0.6248900294303894,
+        -0.29793301224708557, -0.7209920287132263, 0.6256250143051147, -0.0902160033583641, -0.21797800064086914, 0.9717749953269958,
+        0, -0.23658299446105957, 0.9716110229492188, -0.06596100330352783, -0.1595889925956726, 0.9849770069122314,
+        0, -0.17308400571346283, 0.9849069714546204, -0.1447400003671646, -0.3504979908466339, 0.9253119826316833,
+        0, -0.37970298528671265, 0.925108015537262, -0.20147399604320526, -0.48558899760246277, 0.8506529927253723,
+        0, -0.5266720056533813, 0.8500679731369019, -0.5517799854278564, -0.5518630146980286, 0.6252880096435547,
+        -0.16663099825382233, -0.16663099825382233, 0.9718379974365234, -0.12190800160169601, -0.12190800160169601, 0.9850260019302368,
+        -0.2676680088043213, -0.2676680088043213, 0.9255849719047546, -0.37131500244140625, -0.37131500244140625, 0.8510289788246155,
+        -0.7210670113563538, -0.29798200726509094, 0.6255149841308594, -0.21797800064086914, -0.0902160033583641, 0.9717749953269958,
+        -0.1595889925956726, -0.06596100330352783, 0.9849770069122314, -0.3504979908466339, -0.1447400003671646, 0.9253119826316833,
+        -0.48558899760246277, -0.20147399604320526, 0.8506529927253723, -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894,
+        -0.23658299446105957, 0, 0.9716110229492188, -0.17308400571346283, 0, 0.9849069714546204,
+        -0.37970298528671265, 0, 0.925108015537262, -0.5266720056533813, 0, 0.8500679731369019,
+        -0.7807120084762573, 0.00007500000356230885, 0.6248900294303894, -0.7209920287132263, 0.29793301224708557, 0.6256250143051147,
+        -0.21797800064086914, 0.0902160033583641, 0.9717749953269958, -0.23658299446105957, 0, 0.9716110229492188,
+        -0.1595889925956726, 0.06596100330352783, 0.9849770069122314, -0.17308400571346283, 0, 0.9849069714546204,
+        -0.3504979908466339, 0.1447400003671646, 0.9253119826316833, -0.37970298528671265, 0, 0.925108015537262,
+        -0.48558899760246277, 0.20147399604320526, 0.8506529927253723, -0.5266720056533813, 0, 0.8500679731369019,
+        -0.5518630146980286, 0.5517799854278564, 0.6252880096435547, -0.16663099825382233, 0.16663099825382233, 0.9718379974365234,
+        -0.12190800160169601, 0.12190800160169601, 0.9850260019302368, -0.2676680088043213, 0.2676680088043213, 0.9255849719047546,
+        -0.37131500244140625, 0.37131500244140625, 0.8510289788246155, -0.29798200726509094, 0.7210670113563538, 0.6255149841308594,
+        -0.0902160033583641, 0.21797800064086914, 0.9717749953269958, -0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+        -0.1447400003671646, 0.3504979908466339, 0.9253119826316833, -0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+        0.00007500000356230885, 0.7807120084762573, 0.6248900294303894, 0, 0.23658299446105957, 0.9716110229492188,
+        0, 0.17308400571346283, 0.9849069714546204, 0, 0.37970298528671265, 0.925108015537262,
+        0, 0.5266720056533813, 0.8500679731369019, 0.00007500000356230885, 0.7807120084762573, 0.6248900294303894,
+        0.29793301224708557, 0.7209920287132263, 0.6256250143051147, 0.0902160033583641, 0.21797800064086914, 0.9717749953269958,
+        0, 0.23658299446105957, 0.9716110229492188, 0.06596100330352783, 0.1595889925956726, 0.9849770069122314,
+        0, 0.17308400571346283, 0.9849069714546204, 0.1447400003671646, 0.3504979908466339, 0.9253119826316833,
+        0, 0.37970298528671265, 0.925108015537262, 0.20147399604320526, 0.48558899760246277, 0.8506529927253723,
+        0, 0.5266720056533813, 0.8500679731369019, 0.5517799854278564, 0.5518630146980286, 0.6252880096435547,
+        0.16663099825382233, 0.16663099825382233, 0.9718379974365234, 0.12190800160169601, 0.12190800160169601, 0.9850260019302368,
+        0.2676680088043213, 0.2676680088043213, 0.9255849719047546, 0.37131500244140625, 0.37131500244140625, 0.8510289788246155,
+        0.7210670113563538, 0.29798200726509094, 0.6255149841308594, 0.21797800064086914, 0.0902160033583641, 0.9717749953269958,
+        0.1595889925956726, 0.06596100330352783, 0.9849770069122314, 0.3504979908466339, 0.1447400003671646, 0.9253119826316833,
+        0.48558899760246277, 0.20147399604320526, 0.8506529927253723, 0.7807120084762573, -0.00007500000356230885, 0.6248909831047058,
+        0.23658299446105957, 0, 0.9716110229492188, 0.17308400571346283, 0, 0.9849069714546204,
+        0.37970298528671265, 0, 0.925108015537262, 0.5266720056533813, 0, 0.8500679731369019 };
+
+float teapotTangents[] = { 0.012897999957203865, 0.998727023601532, -0.048757001757621765, 0.3861910104751587, 0.9210079908370972, -0.016421999782323837,
+        0.38136398792266846, 0.9230089783668518, 0.000155999994603917, 0.012866999953985214, 0.9987300038337708, 0.04870200157165527,
+        0.3750790059566498, 0.9061710238456726, -0.0007169999880716205, 0.19210100173950195, 0.9812139868736267, 0.01775900088250637,
+        0.3782620131969452, 0.9142940044403076, -0.00011300000187475234, 0.10451500117778778, 0.9897350072860718, -0.09747499972581863,
+        0.3655939996242523, 0.9257190227508545, 0.028463000431656837, 0.04767199978232384, 0.9953050017356873, -0.08423800021409988,
+        0.7092679738998413, 0.7031199932098389, -0.016364000737667084, 0.7061989903450012, 0.7061989903450012, 0,
+        0.6937360167503357, 0.6937360167503357, 0, 0.6997770071029663, 0.6997770071029663, 0,
+        0.6924030184745789, 0.7150859832763672, 0.02822900004684925, 0.9243540167808533, 0.37810400128364563, -0.01657800003886223,
+        0.9230089783668518, 0.38136398792266846, -0.000155999994603917, 0.9061710238456726, 0.3750790059566498, 0.0007169999880716205,
+        0.9142940044403076, 0.3782620131969452, 0.00011300000187475234, 0.9133660197257996, 0.39544400572776794, 0.028490999713540077,
+        0.9987040162086487, 0.015853000804781914, 0.04836999997496605, 0.9987369775772095, 0.014649000018835068, -0.04806999862194061,
+        0.9812150001525879, 0.19211700558662415, -0.01754000037908554, 0.9897350072860718, 0.10452800244092941, 0.09745799750089645,
+        0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9988179802894592, -0.009758999571204185, -0.047600001096725464,
+        0.9094679951667786, -0.4095839858055115, -0.012636999599635601, 0.9240090250968933, -0.3811509907245636, -0.0003150000120513141,
+        0.9987890124320984, -0.01066299993544817, 0.04801800101995468, 0.9072269797325134, -0.37142300605773926, 0.0207310002297163,
+        0.9814350008964539, -0.19095200300216675, 0.01795700006186962, 0.914870023727417, -0.3771440088748932, -0.0011480000102892518,
+        0.989749014377594, -0.10442499816417694, -0.09742700308561325, 0.925815999507904, -0.3653950095176697, 0.028308000415563583,
+        0.9953050017356873, -0.04767199978232384, -0.08423800021409988, 0.6768929958343506, -0.7314029932022095, -0.01988700032234192,
+        0.6994619965553284, -0.7145140171051025, -0.00029799999902024865, 0.6940590143203735, -0.6933979988098145, 0.015560000203549862,
+        0.7002580165863037, -0.6996300220489502, -0.000783999974373728, 0.715142011642456, -0.6923869848251343, 0.028078999370336533,
+        0.351936012506485, -0.933899998664856, -0.019843999296426773, 0.36654001474380493, -0.9298419952392578, -0.0005210000090301037,
+        0.37116900086402893, -0.9084830284118652, 0.00152299995534122, 0.3776479959487915, -0.9147650003433228, -0.00011000000085914508,
+        0.39533698558807373, -0.9134349822998047, 0.028410999104380608, 0.0013210000470280647, -0.9989479780197144, 0.045830998569726944,
+        0.003897000104188919, -0.9988909959793091, -0.04690299928188324, 0.18705999851226807, -0.9821630120277405, -0.018818000331521034,
+        0.10363999754190445, -0.9898579716682434, 0.09715499728918076, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+        -0.02296699956059456, -0.9986780285835266, -0.04599199816584587, -0.3861910104751587, -0.9210079908370972, -0.016421999782323837,
+        -0.38136398792266846, -0.9230089783668518, 0.000155999994603917, -0.020431000739336014, -0.9987260103225708, 0.04614400118589401,
+        -0.3750790059566498, -0.9061710238456726, -0.0007169999880716205, -0.19216600060462952, -0.9812189936637878, 0.01677200011909008,
+        -0.3782620131969452, -0.9142940044403076, -0.00011300000187475234, -0.10471200197935104, -0.9897390007972717, -0.09722500294446945,
+        -0.3655939996242523, -0.9257190227508545, 0.028463000431656837, -0.047710999846458435, -0.9953050017356873, -0.08420699834823608,
+        -0.7092679738998413, -0.7031199932098389, -0.016364000737667084, -0.7061989903450012, -0.7061989903450012, 0,
+        -0.6937360167503357, -0.6937360167503357, 0, -0.6997770071029663, -0.6997770071029663, 0,
+        -0.6924030184745789, -0.7150859832763672, 0.02822900004684925, -0.9243540167808533, -0.37810400128364563, -0.01657800003886223,
+        -0.9230089783668518, -0.38136398792266846, -0.000155999994603917, -0.9061710238456726, -0.3750790059566498, 0.0007169999880716205,
+        -0.9142940044403076, -0.3782620131969452, 0.00011300000187475234, -0.9133660197257996, -0.39544400572776794, 0.028490999713540077,
+        -0.998727023601532, -0.012897999957203865, 0.048757001757621765, -0.9987300038337708, -0.012866999953985214, -0.04870200157165527,
+        -0.9812139868736267, -0.19210100173950195, -0.01775900088250637, -0.9897350072860718, -0.10451500117778778, 0.09747499972581863,
+        -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.998727023601532, 0.012897999957203865, -0.048757001757621765,
+        -0.9210079908370972, 0.3861910104751587, -0.016421999782323837, -0.9230089783668518, 0.38136398792266846, 0.000155999994603917,
+        -0.9987300038337708, 0.012866999953985214, 0.04870200157165527, -0.9061710238456726, 0.3750790059566498, -0.0007169999880716205,
+        -0.9812139868736267, 0.19210100173950195, 0.01775900088250637, -0.9142940044403076, 0.3782620131969452, -0.00011300000187475234,
+        -0.9897350072860718, 0.10451500117778778, -0.09747499972581863, -0.9257190227508545, 0.3655939996242523, 0.028463000431656837,
+        -0.9953050017356873, 0.04767199978232384, -0.08423800021409988, -0.7031199932098389, 0.7092679738998413, -0.016364000737667084,
+        -0.7061989903450012, 0.7061989903450012, 0, -0.6937360167503357, 0.6937360167503357, 0,
+        -0.6997770071029663, 0.6997770071029663, 0, -0.7150859832763672, 0.6924030184745789, 0.02822900004684925,
+        -0.37810400128364563, 0.9243540167808533, -0.01657800003886223, -0.38136398792266846, 0.9230089783668518, -0.000155999994603917,
+        -0.3750790059566498, 0.9061710238456726, 0.0007169999880716205, -0.3782620131969452, 0.9142940044403076, 0.00011300000187475234,
+        -0.39544400572776794, 0.9133660197257996, 0.028490999713540077, -0.012897999957203865, 0.998727023601532, 0.048757001757621765,
+        -0.012866999953985214, 0.9987300038337708, -0.04870200157165527, -0.19210100173950195, 0.9812139868736267, -0.01775900088250637,
+        -0.10451500117778778, 0.9897350072860718, 0.09747499972581863, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+        0.04767199978232384, 0.9953050017356873, -0.08423800021409988, 0.39544400572776794, 0.9133660197257996, -0.028490999713540077,
+        0.38111698627471924, 0.9210190176963806, -0.000015999999959603883, 0.031922999769449234, 0.9968529939651489, -0.07255599647760391,
+        0.3815299868583679, 0.9219080209732056, 0.0000019999999949504854, 0.022261999547481537, 0.9978039860725403, -0.06237399950623512,
+        0.3821389973163605, 0.9231889843940735, 0.00001700000029813964, 0.008317999541759491, 0.9991790056228638, -0.03964800015091896,
+        0.38228899240493774, 0.9239469766616821, -0.004430000204592943, 0.0008660000166855752, 0.9999139904975891, 0.013048999942839146,
+        0.7150859832763672, 0.6924030184745789, -0.02822900004684925, 0.7048519849777222, 0.7048519849777222, 0,
+        0.7055330276489258, 0.7055330276489258, 0, 0.7065179944038391, 0.7065179944038391, 0,
+        0.7068390250205994, 0.707252025604248, -0.004379999823868275, 0.9257190227508545, 0.3655939996242523, -0.028463000431656837,
+        0.9210180044174194, 0.38111698627471924, 0.000015999999959603883, 0.9219080209732056, 0.3815299868583679, -0.0000019999999949504854,
+        0.9231889843940735, 0.3821389973163605, -0.00001700000029813964, 0.9237229824066162, 0.38283199071884155, -0.004399999976158142,
+        0.9953050017356873, 0.04767199978232384, 0.08423800021409988, 0.9968529939651489, 0.031922999769449234, 0.07255599647760391,
+        0.9978039860725403, 0.022261999547481537, 0.06237399950623512, 0.9991790056228638, 0.008317999541759491, 0.03964800015091896,
+        0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9953050017356873, -0.04767199978232384, -0.08423800021409988,
+        0.9135000109672546, -0.3951619863510132, -0.02861100062727928, 0.9210190176963806, -0.38111698627471924, -0.000015999999959603883,
+        0.9968529939651489, -0.031922999769449234, -0.07255599647760391, 0.9219080209732056, -0.3815299868583679, 0.0000019999999949504854,
+        0.9978039860725403, -0.022261999547481537, -0.06237399950623512, 0.9231889843940735, -0.3821389973163605, 0.00001700000029813964,
+        0.9991790056228638, -0.008317999541759491, -0.03964800015091896, 0.9239469766616821, -0.38228899240493774, -0.004430000204592943,
+        0.9999139904975891, -0.0008660000166855752, 0.013048999942839146, 0.6925899982452393, -0.7149369716644287, -0.028262000530958176,
+        0.7048519849777222, -0.7048519849777222, 0, 0.7055330276489258, -0.7055330276489258, 0,
+        0.7065179944038391, -0.7065179944038391, 0, 0.707252025604248, -0.7068390250205994, -0.004379999823868275,
+        0.3656100034713745, -0.9257280230522156, -0.02841299958527088, 0.38111698627471924, -0.9210180044174194, 0.000015999999959603883,
+        0.3815299868583679, -0.9219080209732056, -0.0000019999999949504854, 0.3821389973163605, -0.9231889843940735, -0.00001700000029813964,
+        0.38283199071884155, -0.9237229824066162, -0.004399999976158142, 0.04757700115442276, -0.9953129887580872, 0.08418799936771393,
+        0.031922999769449234, -0.9968529939651489, 0.07255599647760391, 0.022261999547481537, -0.9978039860725403, 0.06237399950623512,
+        0.008317999541759491, -0.9991790056228638, 0.03964800015091896, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+        -0.047710999846458435, -0.9953050017356873, -0.08420699834823608, -0.39544400572776794, -0.9133660197257996, -0.028490999713540077,
+        -0.38111698627471924, -0.9210190176963806, -0.000015999999959603883, -0.031922999769449234, -0.9968529939651489, -0.07255599647760391,
+        -0.3815299868583679, -0.9219080209732056, 0.0000019999999949504854, -0.022261999547481537, -0.9978039860725403, -0.06237399950623512,
+        -0.3821389973163605, -0.9231889843940735, 0.00001700000029813964, -0.008317999541759491, -0.9991790056228638, -0.03964800015091896,
+        -0.38228899240493774, -0.9239469766616821, -0.004430000204592943, -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146,
+        -0.7150859832763672, -0.6924030184745789, -0.02822900004684925, -0.7048519849777222, -0.7048519849777222, 0,
+        -0.7055330276489258, -0.7055330276489258, 0, -0.7065179944038391, -0.7065179944038391, 0,
+        -0.7068390250205994, -0.707252025604248, -0.004379999823868275, -0.9257190227508545, -0.3655939996242523, -0.028463000431656837,
+        -0.9210180044174194, -0.38111698627471924, 0.000015999999959603883, -0.9219080209732056, -0.3815299868583679, -0.0000019999999949504854,
+        -0.9231889843940735, -0.3821389973163605, -0.00001700000029813964, -0.9237229824066162, -0.38283199071884155, -0.004399999976158142,
+        -0.9953050017356873, -0.04767199978232384, 0.08423800021409988, -0.9968529939651489, -0.031922999769449234, 0.07255599647760391,
+        -0.9978039860725403, -0.022261999547481537, 0.06237399950623512, -0.9991790056228638, -0.008317999541759491, 0.03964800015091896,
+        -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9953050017356873, 0.04767199978232384, -0.08423800021409988,
+        -0.9133660197257996, 0.39544400572776794, -0.028490999713540077, -0.9210190176963806, 0.38111698627471924, -0.000015999999959603883,
+        -0.9968529939651489, 0.031922999769449234, -0.07255599647760391, -0.9219080209732056, 0.3815299868583679, 0.0000019999999949504854,
+        -0.9978039860725403, 0.022261999547481537, -0.06237399950623512, -0.9231889843940735, 0.3821389973163605, 0.00001700000029813964,
+        -0.9991790056228638, 0.008317999541759491, -0.03964800015091896, -0.9239469766616821, 0.38228899240493774, -0.004430000204592943,
+        -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146, -0.6924030184745789, 0.7150859832763672, -0.02822900004684925,
+        -0.7048519849777222, 0.7048519849777222, 0, -0.7055330276489258, 0.7055330276489258, 0,
+        -0.7065179944038391, 0.7065179944038391, 0, -0.707252025604248, 0.7068390250205994, -0.004379999823868275,
+        -0.3655939996242523, 0.9257190227508545, -0.028463000431656837, -0.38111698627471924, 0.9210180044174194, 0.000015999999959603883,
+        -0.3815299868583679, 0.9219080209732056, -0.0000019999999949504854, -0.3821389973163605, 0.9231889843940735, -0.00001700000029813964,
+        -0.38283199071884155, 0.9237229824066162, -0.004399999976158142, -0.04767199978232384, 0.9953050017356873, 0.08423800021409988,
+        -0.031922999769449234, 0.9968529939651489, 0.07255599647760391, -0.022261999547481537, 0.9978039860725403, 0.06237399950623512,
+        -0.008317999541759491, 0.9991790056228638, 0.03964800015091896, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+        0.0008660000166855752, 0.9999139904975891, 0.013048999942839146, 0.38283199071884155, 0.9237229824066162, 0.004399999976158142,
+        0.38101500272750854, 0.9204739928245544, -0.00003899999865097925, 0.03731299936771393, 0.9963229894638062, 0.07712399959564209,
+        0.37877199053764343, 0.9154880046844482, 0.00008399999933317304, 0.09151100367307663, 0.9910060167312622, 0.097632996737957,
+        0.378387987613678, 0.9145749807357788, 0.00009999999747378752, 0.10134600102901459, 0.9900450110435486, 0.09767600148916245,
+        0.356795996427536, 0.9266510009765625, -0.03188199922442436, 0.07246600091457367, 0.9928709864616394, 0.09463199973106384,
+        0.707252025604248, 0.7068390250205994, 0.004379999823868275, 0.7044739723205566, 0.7044739723205566, 0,
+        0.7006790041923523, 0.7006790041923523, 0, 0.6999930143356323, 0.6999930143356323, 0,
+        0.6847820281982422, 0.7192310094833374, -0.03167999908328056, 0.9239469766616821, 0.38228899240493774, 0.004430000204592943,
+        0.9204739928245544, 0.38101500272750854, 0.00003899999865097925, 0.9154880046844482, 0.37877199053764343, -0.00008399999933317304,
+        0.9145749807357788, 0.378387987613678, -0.00009999999747378752, 0.9078760147094727, 0.40216198563575745, -0.03206299990415573,
+        0.9999139904975891, 0.0008660000166855752, -0.013048999942839146, 0.9963229894638062, 0.03731299936771393, -0.07712399959564209,
+        0.9910060167312622, 0.09151100367307663, -0.097632996737957, 0.9900450110435486, 0.10134600102901459, -0.09767600148916245,
+        0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9999139904975891, -0.0008660000166855752, 0.013048999942839146,
+        0.9237229824066162, -0.38283199071884155, 0.004399999976158142, 0.9204739928245544, -0.38101500272750854, -0.00003899999865097925,
+        0.9963229894638062, -0.03731299936771393, 0.07712399959564209, 0.9154880046844482, -0.37877199053764343, 0.00008399999933317304,
+        0.9910060167312622, -0.09151100367307663, 0.097632996737957, 0.9145749807357788, -0.378387987613678, 0.00009999999747378752,
+        0.9900450110435486, -0.10134600102901459, 0.09767600148916245, 0.9266510009765625, -0.356795996427536, -0.03188199922442436,
+        0.9928709864616394, -0.07246600091457367, 0.09463199973106384, 0.7068390250205994, -0.707252025604248, 0.004379999823868275,
+        0.7044739723205566, -0.7044739723205566, 0, 0.7006790041923523, -0.7006790041923523, 0,
+        0.6999930143356323, -0.6999930143356323, 0, 0.7192310094833374, -0.6847820281982422, -0.03167999908328056,
+        0.38228899240493774, -0.9239469766616821, 0.004430000204592943, 0.38101500272750854, -0.9204739928245544, 0.00003899999865097925,
+        0.37877199053764343, -0.9154880046844482, -0.00008399999933317304, 0.378387987613678, -0.9145749807357788, -0.00009999999747378752,
+        0.40216198563575745, -0.9078760147094727, -0.03206299990415573, 0.0008660000166855752, -0.9999139904975891, -0.013048999942839146,
+        0.03731299936771393, -0.9963229894638062, -0.07712399959564209, 0.09151100367307663, -0.9910060167312622, -0.097632996737957,
+        0.10134600102901459, -0.9900450110435486, -0.09767600148916245, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+        -0.0008660000166855752, -0.9999139904975891, 0.013048999942839146, -0.38283199071884155, -0.9237229824066162, 0.004399999976158142,
+        -0.38101500272750854, -0.9204739928245544, -0.00003899999865097925, -0.03731299936771393, -0.9963229894638062, 0.07712399959564209,
+        -0.37877199053764343, -0.9154880046844482, 0.00008399999933317304, -0.09151100367307663, -0.9910060167312622, 0.097632996737957,
+        -0.378387987613678, -0.9145749807357788, 0.00009999999747378752, -0.10134600102901459, -0.9900450110435486, 0.09767600148916245,
+        -0.356795996427536, -0.9266510009765625, -0.03188199922442436, -0.07246600091457367, -0.9928709864616394, 0.09463199973106384,
+        -0.707252025604248, -0.7068390250205994, 0.004379999823868275, -0.7044739723205566, -0.7044739723205566, 0,
+        -0.7006790041923523, -0.7006790041923523, 0, -0.6999930143356323, -0.6999930143356323, 0,
+        -0.6847820281982422, -0.7192310094833374, -0.03167999908328056, -0.9239469766616821, -0.38228899240493774, 0.004430000204592943,
+        -0.9204739928245544, -0.38101500272750854, 0.00003899999865097925, -0.9154880046844482, -0.37877199053764343, -0.00008399999933317304,
+        -0.9145749807357788, -0.378387987613678, -0.00009999999747378752, -0.9078760147094727, -0.40216198563575745, -0.03206299990415573,
+        -0.9999139904975891, -0.0008660000166855752, -0.013048999942839146, -0.9963229894638062, -0.03731299936771393, -0.07712399959564209,
+        -0.9910060167312622, -0.09151100367307663, -0.097632996737957, -0.9900450110435486, -0.10134600102901459, -0.09767600148916245,
+        -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9999139904975891, 0.0008660000166855752, 0.013048999942839146,
+        -0.9237229824066162, 0.38283199071884155, 0.004399999976158142, -0.9204739928245544, 0.38101500272750854, -0.00003899999865097925,
+        -0.9963229894638062, 0.03731299936771393, 0.07712399959564209, -0.9154880046844482, 0.37877199053764343, 0.00008399999933317304,
+        -0.9910060167312622, 0.09151100367307663, 0.097632996737957, -0.9145749807357788, 0.378387987613678, 0.00009999999747378752,
+        -0.9900450110435486, 0.10134600102901459, 0.09767600148916245, -0.9266510009765625, 0.356795996427536, -0.03188199922442436,
+        -0.9928709864616394, 0.07246600091457367, 0.09463199973106384, -0.7068390250205994, 0.707252025604248, 0.004379999823868275,
+        -0.7044739723205566, 0.7044739723205566, 0, -0.7006790041923523, 0.7006790041923523, 0,
+        -0.6999930143356323, 0.6999930143356323, 0, -0.7192310094833374, 0.6847820281982422, -0.03167999908328056,
+        -0.38228899240493774, 0.9239469766616821, 0.004430000204592943, -0.38101500272750854, 0.9204739928245544, 0.00003899999865097925,
+        -0.37877199053764343, 0.9154880046844482, -0.00008399999933317304, -0.378387987613678, 0.9145749807357788, -0.00009999999747378752,
+        -0.40216198563575745, 0.9078760147094727, -0.03206299990415573, -0.0008660000166855752, 0.9999139904975891, -0.013048999942839146,
+        -0.03731299936771393, 0.9963229894638062, -0.07712399959564209, -0.09151100367307663, 0.9910060167312622, -0.097632996737957,
+        -0.10134600102901459, 0.9900450110435486, -0.09767600148916245, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+        0.07246600091457367, 0.9928709864616394, 0.09463199973106384, 0.40216198563575745, 0.9078760147094727, 0.03206299990415573,
+        0.37766799330711365, 0.912958025932312, 0.00018099999579135329, 0.11919300258159637, 0.9883019924163818, 0.09514500200748444,
+        0.37516000866889954, 0.906607985496521, 0.00016799999866634607, 0.187733992934227, 0.9816380143165588, 0.03381900116801262,
+        0.2823430001735687, 0.767549991607666, -0.1682250052690506, 0.12883399426937103, 0.6540690064430237, -0.32698601484298706,
+        0.06457000225782394, 0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+        0.7192320227622986, 0.6847820281982422, 0.03167999908328056, 0.6987630128860474, 0.6987630128860474, 0,
+        0.694034993648529, 0.694034993648529, 0, 0.5551990270614624, 0.6008960008621216, -0.16825300455093384,
+        0.1854030042886734, 0.27701398730278015, -0.6666669845581055, 0.9266499876976013, 0.3567950129508972, 0.03188199922442436,
+        0.912958025932312, 0.37766799330711365, -0.00018099999579135329, 0.906607985496521, 0.37516000866889954, -0.00016799999866634607,
+        0.742605984210968, 0.3426159918308258, -0.1683180034160614, 0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+        0.9928709864616394, 0.07246600091457367, -0.09463199973106384, 0.9883019924163818, 0.11919300258159637, -0.09514500200748444,
+        0.9816370010375977, 0.187733992934227, -0.03381900116801262, 0.9811030030250549, 0.19325199723243713, -0.009519999846816063,
+        0.49052900075912476, 0.0968559980392456, -0.5, 0.9928709864616394, -0.07246600091457367, 0.09463199973106384,
+        0.9078760147094727, -0.40216198563575745, 0.03206299990415573, 0.912958025932312, -0.37766799330711365, 0.00018099999579135329,
+        0.9883019924163818, -0.11919300258159637, 0.09514500200748444, 0.906607985496521, -0.37516000866889954, 0.00016799999866634607,
+        0.9816380143165588, -0.187733992934227, 0.03381900116801262, 0.767549991607666, -0.2823430001735687, -0.1682250052690506,
+        0.6540690064430237, -0.12883399426937103, -0.32698601484298706, 0.32701900601387024, -0.06457000225782394, -0.6666669845581055,
+        0, 0, -1, 0.6847820281982422, -0.7192320227622986, 0.03167999908328056,
+        0.6987630128860474, -0.6987630128860474, 0, 0.694034993648529, -0.694034993648529, 0,
+        0.6008960008621216, -0.5551990270614624, -0.16825300455093384, 0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+        0.3567950129508972, -0.9266499876976013, 0.03188199922442436, 0.37766799330711365, -0.912958025932312, -0.00018099999579135329,
+        0.37516000866889954, -0.906607985496521, -0.00016799999866634607, 0.3426159918308258, -0.742605984210968, -0.1683180034160614,
+        0.1854030042886734, -0.27701398730278015, -0.6666669845581055, 0.07246600091457367, -0.9928709864616394, -0.09463199973106384,
+        0.11919300258159637, -0.9883019924163818, -0.09514500200748444, 0.187733992934227, -0.9816370010375977, -0.03381900116801262,
+        0.19325199723243713, -0.9811030030250549, -0.009519999846816063, 0.0968559980392456, -0.49052900075912476, -0.5,
+        -0.07246600091457367, -0.9928709864616394, 0.09463199973106384, -0.40216198563575745, -0.9078760147094727, 0.03206299990415573,
+        -0.37766799330711365, -0.912958025932312, 0.00018099999579135329, -0.11919300258159637, -0.9883019924163818, 0.09514500200748444,
+        -0.37516000866889954, -0.906607985496521, 0.00016799999866634607, -0.187733992934227, -0.9816380143165588, 0.03381900116801262,
+        -0.2823430001735687, -0.767549991607666, -0.1682250052690506, -0.12883399426937103, -0.6540690064430237, -0.32698601484298706,
+        -0.06457000225782394, -0.32701900601387024, -0.6666669845581055, 0, 0, -1,
+        -0.7192320227622986, -0.6847820281982422, 0.03167999908328056, -0.6987630128860474, -0.6987630128860474, 0,
+        -0.694034993648529, -0.694034993648529, 0, -0.5551990270614624, -0.6008960008621216, -0.16825300455093384,
+        -0.1854030042886734, -0.27701398730278015, -0.6666669845581055, -0.9266499876976013, -0.3567950129508972, 0.03188199922442436,
+        -0.912958025932312, -0.37766799330711365, -0.00018099999579135329, -0.906607985496521, -0.37516000866889954, -0.00016799999866634607,
+        -0.742605984210968, -0.3426159918308258, -0.1683180034160614, -0.27701398730278015, -0.1854030042886734, -0.6666669845581055,
+        -0.9928709864616394, -0.07246600091457367, -0.09463199973106384, -0.9883019924163818, -0.11919300258159637, -0.09514500200748444,
+        -0.9816370010375977, -0.187733992934227, -0.03381900116801262, -0.9811030030250549, -0.19325199723243713, -0.009519999846816063,
+        -0.49052900075912476, -0.0968559980392456, -0.5, -0.9928709864616394, 0.07246600091457367, 0.09463199973106384,
+        -0.9078760147094727, 0.40216198563575745, 0.03206299990415573, -0.912958025932312, 0.37766799330711365, 0.00018099999579135329,
+        -0.9883019924163818, 0.11919300258159637, 0.09514500200748444, -0.906607985496521, 0.37516000866889954, 0.00016799999866634607,
+        -0.9816380143165588, 0.187733992934227, 0.03381900116801262, -0.767549991607666, 0.2823430001735687, -0.1682250052690506,
+        -0.6540690064430237, 0.12883399426937103, -0.32698601484298706, -0.32701900601387024, 0.06457000225782394, -0.6666669845581055,
+        0, 0, -1, -0.6847820281982422, 0.7192320227622986, 0.03167999908328056,
+        -0.6987630128860474, 0.6987630128860474, 0, -0.694034993648529, 0.694034993648529, 0,
+        -0.6008960008621216, 0.5551990270614624, -0.16825300455093384, -0.27701398730278015, 0.1854030042886734, -0.6666669845581055,
+        -0.3567950129508972, 0.9266499876976013, 0.03188199922442436, -0.37766799330711365, 0.912958025932312, -0.00018099999579135329,
+        -0.37516000866889954, 0.906607985496521, -0.00016799999866634607, -0.3426159918308258, 0.742605984210968, -0.1683180034160614,
+        -0.1854030042886734, 0.27701398730278015, -0.6666669845581055, -0.07246600091457367, 0.9928709864616394, -0.09463199973106384,
+        -0.11919300258159637, 0.9883019924163818, -0.09514500200748444, -0.187733992934227, 0.9816370010375977, -0.03381900116801262,
+        -0.19325199723243713, 0.9811030030250549, -0.009519999846816063, -0.0968559980392456, 0.49052900075912476, -0.5,
+        -0.006597999949008226, 0.9961680173873901, 0.0001630000042496249, -0.043907999992370605, 0.779125988483429, -0.55936598777771,
+        0.23287899792194366, 0.79271000623703, -0.506534993648529, 0.11139900237321854, 0.9923329949378967, 0.0053449999541044235,
+        0.4521920084953308, 0.7370989918708801, -0.42180201411247253, 0.17797799408435822, 0.9827970266342163, 0.036841001361608505,
+        0.6075379848480225, 0.7066869735717773, -0.270797997713089, 0.11894699931144714, 0.9864829778671265, 0.10517799854278564,
+        0.6583719849586487, 0.7438470125198364, -0.06727500259876251, 0.0010629999451339245, 0.99891597032547, 0.04653400182723999,
+        -0.1622990071773529, -0.14869500696659088, -0.9069569706916809, 0.3020159900188446, -0.014301000162959099, -0.8847119808197021,
+        0.7048640251159668, -0.042514998465776443, -0.6788020133972168, 0.8948519825935364, -0.11078000068664551, -0.38824599981307983,
+        0.9622920155525208, -0.09367900341749191, -0.14349600672721863, -0.12511900067329407, -0.8479049801826477, -0.4783349931240082,
+        0.11315400153398514, -0.8153669834136963, -0.5167160034179688, 0.3956319987773895, -0.7910019755363464, -0.4345270097255707,
+        0.5244609713554382, -0.8012329936027527, -0.2643829882144928, 0.571465015411377, -0.7902160286903381, -0.12332800030708313,
+        -0.0943560004234314, -0.9955379962921143, -0.0010989999864250422, 0.012040999718010426, -0.9965500235557556, 0,
+        0.09501499682664871, -0.9936969876289368, 0.02440500073134899, 0.03737499937415123, -0.9978089928627014, 0.035909999161958694,
+        -0.0008800000068731606, -0.9973530173301697, -0.04031199961900711, 0.007164000067859888, -0.9961649775505066, -0.00002700000004551839,
+        0.043988000601530075, -0.8330309987068176, 0.4691329896450043, -0.2334270030260086, -0.7983189821243286, 0.49840399622917175,
+        -0.10737399756908417, -0.9927549958229065, -0.007029999978840351, -0.45147499442100525, -0.7576299905776978, 0.39375001192092896,
+        -0.15364399552345276, -0.9863160252571106, -0.048294998705387115, -0.5575600266456604, -0.7753210067749023, 0.2001740038394928,
+        -0.07242999970912933, -0.9923030138015747, -0.08845999836921692, -0.5877019762992859, -0.8041930198669434, 0.04768599942326546,
+        0.0005830000154674053, -0.9997940063476562, -0.020301999524235725, 0.13663700222969055, -0.14665700495243073, 0.8966140151023865,
+        -0.3045389950275421, -0.012237999588251114, 0.8833180069923401, -0.7020289897918701, -0.033987998962402344, 0.6724730134010315,
+        -0.8890330195426941, -0.09636799991130829, 0.37605398893356323, -0.9668099880218506, -0.08601800352334976, 0.1358419954776764,
+        0.12022499740123749, 0.7918559908866882, 0.5693140029907227, -0.11313500255346298, 0.8111780285835266, 0.5236610174179077,
+        -0.39790698885917664, 0.7734419703483582, 0.45853298902511597, -0.5793390274047852, 0.7346490025520325, 0.32973799109458923,
+        -0.6447499990463257, 0.7340419888496399, 0.12459299713373184, 0.09378799796104431, 0.9955919981002808, 0.000944000028539449,
+        -0.01607999950647354, 0.9964879751205444, 0.00035600000410340726, -0.11933200061321259, 0.9912199974060059, -0.01737299934029579,
+        -0.08618299663066864, 0.9940080046653748, -0.053598999977111816, -0.004110999871045351, 0.9980229735374451, 0.015703000128269196,
+        0.010142000392079353, 0.9933879971504211, 0.10034400224685669, 0.6597890257835388, 0.7114480137825012, 0.12964099645614624,
+        0.5634239912033081, 0.7594000101089478, 0.289902001619339, -0.021227000281214714, 0.9976930022239685, 0.05189099907875061,
+        0.3972559869289398, 0.7709670066833496, 0.45872700214385986, -0.05054600164294243, 0.9957669973373413, 0.060869000852108,
+        0.11805199831724167, 0.7611619830131531, 0.5692800283432007, -0.11414600163698196, 0.9869359731674194, 0.08862999826669693,
+        -0.0012870000209659338, 0.7195389866828918, 0.6293820142745972, -0.18971200287342072, 0.9752820134162903, 0.11328700184822083,
+        0.9685969948768616, -0.08966200053691864, 0.13331100344657898, 0.8902140259742737, -0.051961999386548996, 0.39323100447654724,
+        0.6728280186653137, -0.050324998795986176, 0.6965069770812988, 0.25133201479911804, -0.04306900128722191, 0.9169719815254211,
+        -0.19813700020313263, -0.2512879967689514, 0.9046909809112549, 0.5937719941139221, -0.8024669885635376, 0.03307799994945526,
+        0.5571249723434448, -0.7907459735870361, 0.2022089958190918, 0.4313510060310364, -0.8083119988441467, 0.37996000051498413,
+        0.19395600259304047, -0.8197799921035767, 0.5133119821548462, -0.1517219990491867, -0.8084930181503296, 0.5055829882621765,
+        0.0035200000274926424, -0.9997940063476562, 0.019979000091552734, 0.01159599982202053, -0.9981369972229004, -0.02326199971139431,
+        0.01310999970883131, -0.9988970160484314, -0.008480999618768692, -0.02485400065779686, -0.9978809952735901, 0.021263999864459038,
+        -0.11335399746894836, -0.9881970286369324, 0.06441199779510498, -0.0035459999926388264, -0.9954169988632202, -0.07682599872350693,
+        -0.5816869735717773, -0.7760900259017944, -0.13957500457763672, -0.5260769724845886, -0.790789008140564, -0.2781960070133209,
+        0.017288999632000923, -0.9983699917793274, -0.03728000074625015, -0.36800798773765564, -0.7982890009880066, -0.4405499994754791,
+        0.03743100166320801, -0.9973520040512085, -0.03640099987387657, -0.09636899828910828, -0.7829139828681946, -0.5500450134277344,
+        0.10426300019025803, -0.9894949793815613, -0.06746900081634521, 0.10083399713039398, -0.8161320090293884, -0.48112401366233826,
+        0.18510299921035767, -0.9776470065116882, -0.09971100091934204, -0.9615049958229065, -0.08203399926424026, -0.14958199858665466,
+        -0.8876789808273315, -0.04622500017285347, -0.39955899119377136, -0.6675580143928528, -0.03723999857902527, -0.7007560133934021,
+        -0.245511993765831, -0.03216199949383736, -0.9151920080184937, 0.15477199852466583, -0.24929499626159668, -0.8975690007209778,
+        -0.6700729727745056, 0.7402250170707703, -0.01942499913275242, -0.5923460125923157, 0.7624830007553101, -0.21566900610923767,
+        -0.45611900091171265, 0.7868310213088989, -0.39906400442123413, -0.21001900732517242, 0.8031420111656189, -0.5333020091056824,
+        0.05119999870657921, 0.7096909880638123, -0.6591699719429016, -0.014175999909639359, 0.9989240169525146, -0.04416000097990036,
+        -0.0065449997782707214, 0.9983869791030884, 0.008813999593257904, 0.0023960000835359097, 0.9989259839057922, -0.016711000353097916,
+        0.03813000023365021, 0.9969249963760376, -0.04171599820256233, 0.11744900047779083, 0.986670970916748, -0.0799890011548996,
+        -0.02072799950838089, -0.997963011264801, 0.0017740000039339066, 0.10236400365829468, -0.695684015750885, -0.6961740255355835,
+        0.28174999356269836, -0.7065439820289612, -0.6379269957542419, -0.027713999152183533, -0.9983959794044495, -0.016395000740885735,
+        0.4621469974517822, -0.7501789927482605, -0.43765199184417725, -0.014942999929189682, -0.9960020184516907, -0.04751100018620491,
+        0.6121799945831299, -0.7355859875679016, -0.1658719927072525, 0.08200599998235703, -0.9833409786224365, 0.11102399975061417,
+        0.7232419848442078, -0.6012910008430481, -0.14595800638198853, 0.32238098978996277, -0.9036369919776917, 0.28197699785232544,
+        0.1188960000872612, 0.09661199897527695, -0.9692260026931763, 0.3230240046977997, 0.06791900098323822, -0.9069269895553589,
+        0.6287810206413269, 0.00962899997830391, -0.711097002029419, 0.8952469825744629, -0.060169998556375504, -0.3366979956626892,
+        0.9689210057258606, -0.04508800059556961, -0.13095800578594208, 0.06500200182199478, 0.7708680033683777, -0.6083509922027588,
+        0.1816529929637909, 0.7457069754600525, -0.593995988368988, 0.37600401043891907, 0.7467949986457825, -0.4776870012283325,
+        0.6288849711418152, 0.7020969986915588, -0.27160701155662537, 0.8230010271072388, 0.5295370221138, -0.09450399875640869,
+        -0.12820099294185638, 0.9899809956550598, -0.05917999893426895, -0.11097600311040878, 0.9872509837150574, -0.09937400370836258,
+        -0.06767299771308899, 0.9865689873695374, -0.1427209973335266, -0.0003349999897181988, 0.9967420101165771, 0.025443999096751213,
+        0.29019099473953247, 0.9243509769439697, 0.1957239955663681, 0.07294999808073044, 0.9949049949645996, 0.03147900104522705,
+        -0.04948300123214722, 0.7695090174674988, 0.6163870096206665, -0.24193400144577026, 0.7750219702720642, 0.5679330229759216,
+        0.05620399862527847, 0.9959489703178406, 0.052143000066280365, -0.4294399917125702, 0.779321014881134, 0.41615501046180725,
+        0.023887999355793, 0.9943940043449402, 0.07553800195455551, -0.6655910015106201, 0.6939520239830017, 0.20106400549411774,
+        -0.09678799659013748, 0.9791589975357056, -0.12869000434875488, -0.7716730237007141, 0.5443729758262634, 0.1793539971113205,
+        -0.417836993932724, 0.8721759915351868, -0.2544029951095581, -0.09499499946832657, 0.08934500068426132, 0.9787889719009399,
+        -0.3299880027770996, 0.06701900064945221, 0.9273520112037659, -0.6511250138282776, 0.023523999378085136, 0.7280719876289368,
+        -0.9116759896278381, -0.033263999968767166, 0.34162598848342896, -0.9896330237388611, -0.013496000319719315, 0.07834099978208542,
+        -0.07044100016355515, -0.6954740285873413, 0.7080140113830566, -0.21969600021839142, -0.6959800124168396, 0.6642320156097412,
+        -0.4075010120868683, -0.7370589971542358, 0.5047789812088013, -0.5866039991378784, -0.7473030090332031, 0.24636299908161163,
+        -0.799036979675293, -0.5617390275001526, 0.05794600024819374, 0.07605399936437607, -0.9967970252037048, 0.02472200058400631,
+        0.08756300061941147, -0.9926980137825012, 0.05929899960756302, 0.07250799983739853, -0.9901790022850037, 0.11122000217437744,
+        0.015556000173091888, -0.9970260262489319, -0.011235999874770641, -0.194814994931221, -0.9439409971237183, -0.22127500176429749,
+        0.3417310118675232, -0.8896859884262085, 0.3012309968471527, 0.8375009894371033, -0.4931910037994385, 0.05739299952983856,
+        0.8273029923439026, -0.4684619903564453, -0.05539099872112274, 0.5311300158500671, -0.8121910095214844, 0.24026300013065338,
+        0.8069959878921509, -0.47689300775527954, 0.002638000063598156, 0.644743025302887, -0.7642210125923157, -0.015455000102519989,
+        0.8856800198554993, -0.4464530050754547, 0.047488000243902206, -0.011536000296473503, -0.999845027923584, -0.0008730000117793679,
+        0.7597830295562744, -0.6229599714279175, 0.026636000722646713, 0.321245014667511, -0.8855000138282776, 0.3356960117816925,
+        0.998091995716095, -0.005673000123351812, 0.025262000039219856, 0.9941530227661133, 0.046904999762773514, -0.00951599981635809,
+        0.9838590025901794, -0.00041700000292621553, 0.010572000406682491, 0.990556001663208, 0.01886500045657158, 0.04422200098633766,
+        0.9921990036964417, -0.12290599942207336, 0.011202000081539154, 0.828000009059906, 0.5258169770240784, -0.0846100002527237,
+        0.8704839944839478, 0.4878079891204834, 0.00635599996894598, 0.7773939967155457, 0.5659670233726501, -0.09634699672460556,
+        0.8190580010414124, 0.4740380048751831, 0.01190400030463934, 0.9017590284347534, 0.3486430048942566, -0.05601400136947632,
+        0.41038599610328674, 0.870602011680603, 0.27135801315307617, 0.3019320070743561, 0.8897680044174194, 0.34101900458335876,
+        0.13912299275398254, 0.9423390030860901, -0.3042120039463043, 0.6167309880256653, 0.7692840099334717, 0.1667650043964386,
+        0.5558350086212158, 0.8010749816894531, 0.21867799758911133, -0.4410029947757721, 0.8555399775505066, -0.2693159878253937,
+        -0.8639690279960632, 0.464356005191803, -0.019222000613808632, -0.8705710172653198, 0.4855479896068573, -0.005623999983072281,
+        -0.33969300985336304, 0.8762779831886292, -0.34097298979759216, -0.7608209848403931, 0.5840269923210144, 0.11236599832773209,
+        -0.16763299703598022, 0.9419429898262024, 0.29091599583625793, -0.8260639905929565, 0.47304999828338623, -0.0134699996560812,
+        -0.6006280183792114, 0.7822970151901245, -0.1611420065164566, -0.8495870232582092, 0.4440779983997345, 0.17417700588703156,
+        -0.5251449942588806, 0.8236340284347534, -0.21412399411201477, -0.9991480112075806, 0.0017519999528303742, 0.007890000008046627,
+        -0.9946579933166504, 0.06129400059580803, 0.007796999998390675, -0.9840919971466064, 0.008732999674975872, -0.0001289999927394092,
+        -0.9916059970855713, 0.015207000076770782, -0.04798699915409088, -0.9899899959564209, -0.13816699385643005, -0.019433999434113503,
+        -0.7927820086479187, -0.5669599771499634, 0.06795799732208252, -0.8363490104675293, -0.4685719907283783, 0.048955000936985016,
+        -0.8138830065727234, -0.4743089973926544, 0.0008379999781027436, -0.8869869709014893, -0.4417180120944977, -0.05625399947166443,
+        -0.7898640036582947, -0.5522750020027161, -0.15016800165176392, -0.297340989112854, -0.8998129963874817, -0.3192580044269562,
+        -0.49759799242019653, -0.8317790031433105, -0.24411599338054657, -0.6295620203018188, -0.7765420079231262, 0.01261799968779087,
+        -0.011338000185787678, -0.9998990297317505, -0.008561000227928162, -0.3547320067882538, -0.8679590225219727, -0.3453510105609894,
+        0.09618999809026718, 0.49066001176834106, -0.5, 0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+        0.32566601037979126, 0.76139897108078, -0.18199099600315094, 0.062401000410318375, 0.9939020276069641, -0.09090700000524521,
+        0.3803209960460663, 0.9214360117912292, -0.00007100000220816582, 0.030918000265955925, 0.9969729781150818, 0.07133600115776062,
+        0.3804109990596771, 0.9220889806747437, 0.0001630000042496249, 0.02471200004220009, 0.9975799918174744, 0.06498300284147263,
+        0.35510900616645813, 0.926891028881073, 0.03216100111603737, 0.07657899707555771, 0.9924740195274353, -0.09555599838495255,
+        0.27721700072288513, 0.1851000040769577, -0.6666669845581055, 0.5929989814758301, 0.5781109929084778, -0.18205299973487854,
+        0.7048519849777222, 0.7048519849777222, 0, 0.7052720189094543, 0.7054179906845093, -0.00002499999936844688,
+        0.6835219860076904, 0.7199410200119019, 0.03204600140452385, 0.3271070122718811, 0.06412599980831146, -0.6666669845581055,
+        0.7694699764251709, 0.3061000108718872, -0.18225300312042236, 0.9214379787445068, 0.38033199310302734, 0.0000670000008540228,
+        0.9220880270004272, 0.3804430067539215, -0.00016799999866634607, 0.9071130156517029, 0.403003990650177, 0.032437000423669815,
+        0, 0, -1, 0.6626030206680298, 0.04157499969005585, -0.272724986076355,
+        0.9969789981842041, 0.03082600049674511, -0.07129299640655518, 0.9975910186767578, 0.024447999894618988, -0.06492199748754501,
+        0.9925040006637573, 0.07630900293588638, 0.09545700252056122, 0.49066001176834106, -0.09618999809026718, -0.5,
+        0.27721700072288513, -0.1851000040769577, -0.6666669845581055, 0.76139897108078, -0.32566601037979126, -0.18199099600315094,
+        0.9939020276069641, -0.062401000410318375, -0.09090700000524521, 0.9214360117912292, -0.3803209960460663, -0.00007100000220816582,
+        0.9969729781150818, -0.030918000265955925, 0.07133600115776062, 0.9220889806747437, -0.3804109990596771, 0.0001630000042496249,
+        0.9975799918174744, -0.02471200004220009, 0.06498300284147263, 0.926891028881073, -0.35510900616645813, 0.03216100111603737,
+        0.9924740195274353, -0.07657899707555771, -0.09555599838495255, 0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+        0.5781109929084778, -0.5929989814758301, -0.18205299973487854, 0.7048519849777222, -0.7048519849777222, 0,
+        0.7054179906845093, -0.7052720189094543, -0.00002499999936844688, 0.7199410200119019, -0.6835219860076904, 0.03204600140452385,
+        0.06412599980831146, -0.3271070122718811, -0.6666669845581055, 0.3061000108718872, -0.7694699764251709, -0.18225300312042236,
+        0.38033199310302734, -0.9214379787445068, 0.0000670000008540228, 0.3804430067539215, -0.9220880270004272, -0.00016799999866634607,
+        0.403003990650177, -0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+        0.04157499969005585, -0.6626030206680298, -0.272724986076355, 0.03082600049674511, -0.9969789981842041, -0.07129299640655518,
+        0.024447999894618988, -0.9975910186767578, -0.06492199748754501, 0.07630900293588638, -0.9925040006637573, 0.09545700252056122,
+        -0.09618999809026718, -0.49066001176834106, -0.5, -0.1851000040769577, -0.27721700072288513, -0.6666669845581055,
+        -0.32566601037979126, -0.76139897108078, -0.18199099600315094, -0.062401000410318375, -0.9939020276069641, -0.09090700000524521,
+        -0.3803209960460663, -0.9214360117912292, -0.00007100000220816582, -0.030918000265955925, -0.9969729781150818, 0.07133600115776062,
+        -0.3804109990596771, -0.9220889806747437, 0.0001630000042496249, -0.02471200004220009, -0.9975799918174744, 0.06498300284147263,
+        -0.35510900616645813, -0.926891028881073, 0.03216100111603737, -0.07657899707555771, -0.9924740195274353, -0.09555599838495255,
+        -0.27721700072288513, -0.1851000040769577, -0.6666669845581055, -0.5929989814758301, -0.5781109929084778, -0.18205299973487854,
+        -0.7048519849777222, -0.7048519849777222, 0, -0.7052720189094543, -0.7054179906845093, -0.00002499999936844688,
+        -0.6835219860076904, -0.7199410200119019, 0.03204600140452385, -0.3271070122718811, -0.06412599980831146, -0.6666669845581055,
+        -0.7694699764251709, -0.3061000108718872, -0.18225300312042236, -0.9214379787445068, -0.38033199310302734, 0.0000670000008540228,
+        -0.9220880270004272, -0.3804430067539215, -0.00016799999866634607, -0.9071130156517029, -0.403003990650177, 0.032437000423669815,
+        0, 0, -1, -0.6626030206680298, -0.04157499969005585, -0.272724986076355,
+        -0.9969789981842041, -0.03082600049674511, -0.07129299640655518, -0.9975910186767578, -0.024447999894618988, -0.06492199748754501,
+        -0.9925040006637573, -0.07630900293588638, 0.09545700252056122, -0.49066001176834106, 0.09618999809026718, -0.5,
+        -0.27721700072288513, 0.1851000040769577, -0.6666669845581055, -0.76139897108078, 0.32566601037979126, -0.18199099600315094,
+        -0.9939020276069641, 0.062401000410318375, -0.09090700000524521, -0.9214360117912292, 0.3803209960460663, -0.00007100000220816582,
+        -0.9969729781150818, 0.030918000265955925, 0.07133600115776062, -0.9220889806747437, 0.3804109990596771, 0.0001630000042496249,
+        -0.9975799918174744, 0.02471200004220009, 0.06498300284147263, -0.926891028881073, 0.35510900616645813, 0.03216100111603737,
+        -0.9924740195274353, 0.07657899707555771, -0.09555599838495255, -0.1851000040769577, 0.27721700072288513, -0.6666669845581055,
+        -0.5781109929084778, 0.5929989814758301, -0.18205299973487854, -0.7048519849777222, 0.7048519849777222, 0,
+        -0.7054179906845093, 0.7052720189094543, -0.00002499999936844688, -0.7199410200119019, 0.6835219860076904, 0.03204600140452385,
+        -0.06412599980831146, 0.3271070122718811, -0.6666669845581055, -0.3061000108718872, 0.7694699764251709, -0.18225300312042236,
+        -0.38033199310302734, 0.9214379787445068, 0.0000670000008540228, -0.3804430067539215, 0.9220880270004272, -0.00016799999866634607,
+        -0.403003990650177, 0.9071130156517029, 0.032437000423669815, 0, 0, -1,
+        -0.04157499969005585, 0.6626030206680298, -0.272724986076355, -0.03082600049674511, 0.9969789981842041, -0.07129299640655518,
+        -0.024447999894618988, 0.9975910186767578, -0.06492199748754501, -0.07630900293588638, 0.9925040006637573, 0.09545700252056122,
+        0.07657899707555771, 0.9924740195274353, -0.09555599838495255, 0.40307098627090454, 0.9070649743080139, -0.03255299851298332,
+        0.3753640055656433, 0.9070209860801697, 0.000007000000096013537, 0.18306200206279755, 0.9820899963378906, -0.04457399994134903,
+        0.3751649856567383, 0.9065750241279602, -0.00007400000322377309, 0.18801499903202057, 0.9816100001335144, -0.03304100036621094,
+        0.3759070038795471, 0.908607006072998, -0.00026199998683296144, 0.16623400151729584, 0.983722984790802, -0.06822899729013443,
+        0.33324098587036133, 0.9290030002593994, 0.029803000390529633, 0.14071400463581085, 0.9862040281295776, -0.08718100190162659,
+        0.7198299765586853, 0.6836559772491455, -0.032017000019550323, 0.6943539977073669, 0.6943539977073669, 0,
+        0.694034993648529, 0.694034993648529, 0, 0.6955100297927856, 0.6955100297927856, 0,
+        0.6639170050621033, 0.7306150197982788, 0.029100999236106873, 0.9268649816513062, 0.35523301362991333, -0.03203999996185303,
+        0.9070209860801697, 0.3753649890422821, -0.000007000000096013537, 0.9065750241279602, 0.3751649856567383, 0.00007300000288523734,
+        0.908607006072998, 0.3759070038795471, 0.00026199998683296144, 0.8926259875297546, 0.4211460053920746, 0.028991999104619026,
+        0.9924740195274353, 0.07646500319242477, 0.09565100073814392, 0.9820899963378906, 0.18306200206279755, 0.04457399994134903,
+        0.9816100001335144, 0.18801499903202057, 0.03304100036621094, 0.983722984790802, 0.16623400151729584, 0.06822899729013443,
+        0.9862040281295776, 0.14071400463581085, 0.08718100190162659, 0.9924740195274353, -0.07657899707555771, -0.09555599838495255,
+        0.9070649743080139, -0.40307098627090454, -0.03255299851298332, 0.9070209860801697, -0.3753640055656433, 0.000007000000096013537,
+        0.9820899963378906, -0.18306200206279755, -0.04457399994134903, 0.9065750241279602, -0.3751649856567383, -0.00007400000322377309,
+        0.9816100001335144, -0.18801499903202057, -0.03304100036621094, 0.908607006072998, -0.3759070038795471, -0.00026199998683296144,
+        0.983722984790802, -0.16623400151729584, -0.06822899729013443, 0.9290030002593994, -0.33324098587036133, 0.029803000390529633,
+        0.9862040281295776, -0.14071400463581085, -0.08718100190162659, 0.6836559772491455, -0.7198299765586853, -0.032017000019550323,
+        0.6943539977073669, -0.6943539977073669, 0, 0.694034993648529, -0.694034993648529, 0,
+        0.6955100297927856, -0.6955100297927856, 0, 0.7306150197982788, -0.6639170050621033, 0.029100999236106873,
+        0.35523301362991333, -0.9268649816513062, -0.03203999996185303, 0.3753649890422821, -0.9070209860801697, -0.000007000000096013537,
+        0.3751649856567383, -0.9065750241279602, 0.00007300000288523734, 0.3759070038795471, -0.908607006072998, 0.00026199998683296144,
+        0.4211460053920746, -0.8926259875297546, 0.028991999104619026, 0.07646500319242477, -0.9924740195274353, 0.09565100073814392,
+        0.18306200206279755, -0.9820899963378906, 0.04457399994134903, 0.18801499903202057, -0.9816100001335144, 0.03304100036621094,
+        0.16623400151729584, -0.983722984790802, 0.06822899729013443, 0.14071400463581085, -0.9862040281295776, 0.08718100190162659,
+        -0.07657899707555771, -0.9924740195274353, -0.09555599838495255, -0.40307098627090454, -0.9070649743080139, -0.03255299851298332,
+        -0.3753640055656433, -0.9070209860801697, 0.000007000000096013537, -0.18306200206279755, -0.9820899963378906, -0.04457399994134903,
+        -0.3751649856567383, -0.9065750241279602, -0.00007400000322377309, -0.18801499903202057, -0.9816100001335144, -0.03304100036621094,
+        -0.3759070038795471, -0.908607006072998, -0.00026199998683296144, -0.16623400151729584, -0.983722984790802, -0.06822899729013443,
+        -0.33324098587036133, -0.9290030002593994, 0.029803000390529633, -0.14071400463581085, -0.9862040281295776, -0.08718100190162659,
+        -0.7198299765586853, -0.6836559772491455, -0.032017000019550323, -0.6943539977073669, -0.6943539977073669, 0,
+        -0.694034993648529, -0.694034993648529, 0, -0.6955100297927856, -0.6955100297927856, 0,
+        -0.6639170050621033, -0.7306150197982788, 0.029100999236106873, -0.9268649816513062, -0.35523301362991333, -0.03203999996185303,
+        -0.9070209860801697, -0.3753649890422821, -0.000007000000096013537, -0.9065750241279602, -0.3751649856567383, 0.00007300000288523734,
+        -0.908607006072998, -0.3759070038795471, 0.00026199998683296144, -0.8926259875297546, -0.4211460053920746, 0.028991999104619026,
+        -0.9924740195274353, -0.07646500319242477, 0.09565100073814392, -0.9820899963378906, -0.18306200206279755, 0.04457399994134903,
+        -0.9816100001335144, -0.18801499903202057, 0.03304100036621094, -0.983722984790802, -0.16623400151729584, 0.06822899729013443,
+        -0.9862040281295776, -0.14071400463581085, 0.08718100190162659, -0.9924740195274353, 0.07657899707555771, -0.09555599838495255,
+        -0.9070649743080139, 0.40307098627090454, -0.03255299851298332, -0.9070209860801697, 0.3753640055656433, 0.000007000000096013537,
+        -0.9820899963378906, 0.18306200206279755, -0.04457399994134903, -0.9065750241279602, 0.3751649856567383, -0.00007400000322377309,
+        -0.9816100001335144, 0.18801499903202057, -0.03304100036621094, -0.908607006072998, 0.3759070038795471, -0.00026199998683296144,
+        -0.983722984790802, 0.16623400151729584, -0.06822899729013443, -0.9290030002593994, 0.33324098587036133, 0.029803000390529633,
+        -0.9862040281295776, 0.14071400463581085, -0.08718100190162659, -0.6836559772491455, 0.7198299765586853, -0.032017000019550323,
+        -0.6943539977073669, 0.6943539977073669, 0, -0.694034993648529, 0.694034993648529, 0,
+        -0.6955100297927856, 0.6955100297927856, 0, -0.7306150197982788, 0.6639170050621033, 0.029100999236106873,
+        -0.35523301362991333, 0.9268649816513062, -0.03203999996185303, -0.3753649890422821, 0.9070209860801697, -0.000007000000096013537,
+        -0.3751649856567383, 0.9065750241279602, 0.00007300000288523734, -0.3759070038795471, 0.908607006072998, 0.00026199998683296144,
+        -0.4211460053920746, 0.8926259875297546, 0.028991999104619026, -0.07646500319242477, 0.9924740195274353, 0.09565100073814392,
+        -0.18306200206279755, 0.9820899963378906, 0.04457399994134903, -0.18801499903202057, 0.9816100001335144, 0.03304100036621094,
+        -0.16623400151729584, 0.983722984790802, 0.06822899729013443, -0.14071400463581085, 0.9862040281295776, 0.08718100190162659 };
+
+
+float  teapotBinormals[] = { 0.2554270029067993, -0.05043400079011917, -0.9655119776725769, 0.2302899956703186, -0.11379700154066086, -0.9664459824562073,
+        -0.23653900623321533, 0.09789499640464783, -0.9666780233383179, -0.2551180124282837, 0.05037299916148186, -0.9655969738960266,
+        -0.9201610088348389, 0.38079801201820374, -0.09108299762010574, -0.9770479798316956, 0.1929199993610382, -0.09032399952411652,
+        -0.6762400269508362, 0.2798590064048767, 0.6814529895782471, -0.723800003528595, 0.1429159939289093, 0.6750479936599731,
+        -0.4681990146636963, 0.1581760048866272, 0.869350016117096, -0.4902079999446869, 0.09679199755191803, 0.8662149906158447,
+        0.16952399909496307, -0.1934960037469864, -0.9663439989089966, -0.18106800317764282, 0.18106800317764282, -0.9666590094566345,
+        -0.7041199803352356, 0.7041199803352356, -0.09181900322437286, -0.5179349780082703, 0.5179349780082703, 0.6807990074157715,
+        -0.37217798829078674, 0.3260670006275177, 0.8690019845962524, 0.08221600204706192, -0.243368998169899, -0.9664430022239685,
+        -0.09789499640464783, 0.23653900623321533, -0.9666780233383179, -0.38079801201820374, 0.9201610088348389, -0.09108199924230576,
+        -0.2798590064048767, 0.6762400269508362, 0.6814540028572083, -0.21894000470638275, 0.44305500388145447, 0.8693490028381348,
+        0.050822000950574875, -0.2573910057544708, -0.9649699926376343, -0.05021600052714348, 0.25432100892066956, -0.965815007686615,
+        -0.19291600584983826, 0.9770249724388123, -0.09059000015258789, -0.14291299879550934, 0.7237870097160339, 0.6750609874725342,
+        -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.048507001250982285, -0.2576940059661865, -0.965008020401001,
+        -0.15833300352096558, -0.3227809965610504, -0.933135986328125, 0.05656199902296066, 0.13793900609016418, -0.9888240098953247,
+        0.049150001257658005, 0.2545199990272522, -0.9658179879188538, 0.378387987613678, 0.9173290133476257, -0.12381099909543991,
+        0.1917950063943863, 0.9772530198097229, -0.09050799906253815, 0.2777239978313446, 0.6716070175170898, 0.6868870258331299,
+        0.14281700551509857, 0.7238019704818726, 0.6750659942626953, 0.15788200497627258, 0.4674209952354431, 0.8698220252990723,
+        0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.3139069974422455, -0.2657270133495331, -0.9115110039710999,
+        0.05247500166296959, 0.05178600177168846, -0.9972789883613586, 0.699787974357605, 0.6969379782676697, -0.15676100552082062,
+        0.511929988861084, 0.5116159915924072, 0.6900550127029419, 0.32515400648117065, 0.37111398577690125, 0.8697980046272278,
+        -0.3181929886341095, -0.09987600147724152, -0.9427499771118164, 0.1552799940109253, 0.06176299974322319, -0.9859380125999451,
+        0.9187250137329102, 0.3751460015773773, -0.1233299970626831, 0.6724870204925537, 0.2775439918041229, 0.6860979795455933,
+        0.4424299895763397, 0.21853800117969513, 0.8697689771652222, -0.255948007106781, -0.04464200139045715, -0.9656590223312378,
+        0.25306200981140137, 0.046362001448869705, -0.9663389921188354, 0.9778940081596375, 0.18800100684165955, -0.09153299778699875,
+        0.7238150238990784, 0.14205799996852875, 0.675212025642395, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+        -0.25491899251937866, 0.05033399909734726, -0.9656509757041931, -0.2302899956703186, 0.11379700154066086, -0.9664459824562073,
+        0.23653900623321533, -0.09789499640464783, -0.9666780233383179, 0.252265989780426, -0.04980999976396561, -0.9663749933242798,
+        0.9201610088348389, -0.38079801201820374, -0.09108299762010574, 0.9769039750099182, -0.19289200007915497, -0.09193000197410583,
+        0.6762400269508362, -0.2798590064048767, 0.6814529895782471, 0.7236610054969788, -0.14288799464702606, 0.6752020120620728,
+        0.4681990146636963, -0.1581760048866272, 0.869350016117096, 0.4901660084724426, -0.09678400307893753, 0.8662390112876892,
+        -0.16952399909496307, 0.1934960037469864, -0.9663439989089966, 0.18106800317764282, -0.18106800317764282, -0.9666590094566345,
+        0.7041199803352356, -0.7041199803352356, -0.09181900322437286, 0.5179349780082703, -0.5179349780082703, 0.6807990074157715,
+        0.37217798829078674, -0.3260670006275177, 0.8690019845962524, -0.08221600204706192, 0.243368998169899, -0.9664430022239685,
+        0.09789499640464783, -0.23653900623321533, -0.9666780233383179, 0.38079801201820374, -0.9201610088348389, -0.09108199924230576,
+        0.2798590064048767, -0.6762400269508362, 0.6814540028572083, 0.21894000470638275, -0.44305500388145447, 0.8693490028381348,
+        -0.05043400079011917, 0.2554270029067993, -0.9655119776725769, 0.05037299916148186, -0.2551180124282837, -0.9655969738960266,
+        0.1929199993610382, -0.9770479798316956, -0.09032399952411652, 0.1429159939289093, -0.723800003528595, 0.6750479936599731,
+        0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.05043400079011917, 0.2554270029067993, -0.9655119776725769,
+        0.11379700154066086, 0.2302899956703186, -0.9664459824562073, -0.09789499640464783, -0.23653900623321533, -0.9666780233383179,
+        -0.05037299916148186, -0.2551180124282837, -0.9655969738960266, -0.38079801201820374, -0.9201610088348389, -0.09108299762010574,
+        -0.1929199993610382, -0.9770479798316956, -0.09032399952411652, -0.2798590064048767, -0.6762400269508362, 0.6814529895782471,
+        -0.1429159939289093, -0.723800003528595, 0.6750479936599731, -0.1581760048866272, -0.4681990146636963, 0.869350016117096,
+        -0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.1934960037469864, 0.16952399909496307, -0.9663439989089966,
+        -0.18106800317764282, -0.18106800317764282, -0.9666590094566345, -0.7041199803352356, -0.7041199803352356, -0.09181900322437286,
+        -0.5179349780082703, -0.5179349780082703, 0.6807990074157715, -0.3260670006275177, -0.37217798829078674, 0.8690019845962524,
+        0.243368998169899, 0.08221600204706192, -0.9664430022239685, -0.23653900623321533, -0.09789499640464783, -0.9666780233383179,
+        -0.9201610088348389, -0.38079801201820374, -0.09108199924230576, -0.6762400269508362, -0.2798590064048767, 0.6814540028572083,
+        -0.44305500388145447, -0.21894000470638275, 0.8693490028381348, 0.2554270029067993, 0.05043400079011917, -0.9655119776725769,
+        -0.2551180124282837, -0.05037299916148186, -0.9655969738960266, -0.9770479798316956, -0.1929199993610382, -0.09032399952411652,
+        -0.723800003528595, -0.1429159939289093, 0.6750479936599731, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+        -0.4902079999446869, 0.09679199755191803, 0.8662149906158447, -0.44305500388145447, 0.21893900632858276, 0.8693490028381348,
+        -0.37287598848342896, 0.15431199967861176, 0.9149600267410278, -0.4014579951763153, 0.07926800101995468, 0.9124410152435303,
+        -0.3112579882144928, 0.12881100177764893, 0.9415550231933594, -0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+        -0.19015200436115265, 0.07869099825620651, 0.9785959720611572, -0.20517399907112122, 0.040511999279260635, 0.977886974811554,
+        0.06301800161600113, -0.021289000287652016, 0.9977849721908569, 0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        -0.3260670006275177, 0.37217798829078674, 0.8690019845962524, -0.285739004611969, 0.285739004611969, 0.9147170186042786,
+        -0.23854400217533112, 0.23854400217533112, 0.9413790106773376, -0.14574900269508362, 0.14574900269508362, 0.9785270094871521,
+        0.05011200159788132, -0.04390300065279007, 0.9977779984474182, -0.1581760048866272, 0.4681999981403351, 0.869350016117096,
+        -0.15431199967861176, 0.37287598848342896, 0.9149600267410278, -0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+        -0.07869099825620651, 0.19015100598335266, 0.9785959720611572, 0.02946699969470501, -0.05963199958205223, 0.9977849721908569,
+        -0.09679199755191803, 0.4902079999446869, 0.8662149906158447, -0.07926800101995468, 0.4014579951763153, 0.9124410152435303,
+        -0.0662280023097992, 0.33541300892829895, 0.939740002155304, -0.040511999279260635, 0.20517399907112122, 0.977886974811554,
+        0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.09679199755191803, 0.4902079999446869, 0.8662149906158447,
+        0.21858200430870056, 0.4423219859600067, 0.86981201171875, 0.15431199967861176, 0.37287598848342896, 0.9149600267410278,
+        0.07926800101995468, 0.4014579951763153, 0.9124410152435303, 0.12881100177764893, 0.3112579882144928, 0.9415550231933594,
+        0.0662280023097992, 0.33541300892829895, 0.939740002155304, 0.07869099825620651, 0.19015200436115265, 0.9785959720611572,
+        0.040511999279260635, 0.20517399907112122, 0.977886974811554, -0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+        -0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.3711329996585846, 0.3251489996910095, 0.8697919845581055,
+        0.285739004611969, 0.285739004611969, 0.9147170186042786, 0.23854400217533112, 0.23854400217533112, 0.9413790106773376,
+        0.14574900269508362, 0.14574900269508362, 0.9785270094871521, -0.04390300065279007, -0.05011200159788132, 0.9977779984474182,
+        0.46750199794769287, 0.15794099867343903, 0.8697680234909058, 0.37287598848342896, 0.15431199967861176, 0.9149600267410278,
+        0.3112579882144928, 0.12881100177764893, 0.9415550231933594, 0.19015100598335266, 0.07869099825620651, 0.9785959720611572,
+        -0.05963199958205223, -0.02946699969470501, 0.9977849721908569, 0.49017900228500366, 0.0967010036110878, 0.8662409782409668,
+        0.4014579951763153, 0.07926800101995468, 0.9124410152435303, 0.33541300892829895, 0.0662280023097992, 0.939740002155304,
+        0.20517399907112122, 0.040511999279260635, 0.977886974811554, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        0.4901660084724426, -0.09678400307893753, 0.8662390112876892, 0.44305500388145447, -0.21893900632858276, 0.8693490028381348,
+        0.37287598848342896, -0.15431199967861176, 0.9149600267410278, 0.4014579951763153, -0.07926800101995468, 0.9124410152435303,
+        0.3112579882144928, -0.12881100177764893, 0.9415550231933594, 0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+        0.19015200436115265, -0.07869099825620651, 0.9785959720611572, 0.20517399907112122, -0.040511999279260635, 0.977886974811554,
+        -0.06301800161600113, 0.021289000287652016, 0.9977849721908569, -0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.3260670006275177, -0.37217798829078674, 0.8690019845962524, 0.285739004611969, -0.285739004611969, 0.9147170186042786,
+        0.23854400217533112, -0.23854400217533112, 0.9413790106773376, 0.14574900269508362, -0.14574900269508362, 0.9785270094871521,
+        -0.05011200159788132, 0.04390300065279007, 0.9977779984474182, 0.1581760048866272, -0.4681999981403351, 0.869350016117096,
+        0.15431199967861176, -0.37287598848342896, 0.9149600267410278, 0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+        0.07869099825620651, -0.19015100598335266, 0.9785959720611572, -0.02946699969470501, 0.05963199958205223, 0.9977849721908569,
+        0.09679199755191803, -0.4902079999446869, 0.8662149906158447, 0.07926800101995468, -0.4014579951763153, 0.9124410152435303,
+        0.0662280023097992, -0.33541300892829895, 0.939740002155304, 0.040511999279260635, -0.20517399907112122, 0.977886974811554,
+        -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.09679199755191803, -0.4902079999446869, 0.8662149906158447,
+        -0.21893900632858276, -0.44305500388145447, 0.8693490028381348, -0.15431199967861176, -0.37287598848342896, 0.9149600267410278,
+        -0.07926800101995468, -0.4014579951763153, 0.9124410152435303, -0.12881100177764893, -0.3112579882144928, 0.9415550231933594,
+        -0.0662280023097992, -0.33541300892829895, 0.939740002155304, -0.07869099825620651, -0.19015200436115265, 0.9785959720611572,
+        -0.040511999279260635, -0.20517399907112122, 0.977886974811554, 0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+        0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.37217798829078674, -0.3260670006275177, 0.8690019845962524,
+        -0.285739004611969, -0.285739004611969, 0.9147170186042786, -0.23854400217533112, -0.23854400217533112, 0.9413790106773376,
+        -0.14574900269508362, -0.14574900269508362, 0.9785270094871521, 0.04390300065279007, 0.05011200159788132, 0.9977779984474182,
+        -0.4681999981403351, -0.1581760048866272, 0.869350016117096, -0.37287598848342896, -0.15431199967861176, 0.9149600267410278,
+        -0.3112579882144928, -0.12881100177764893, 0.9415550231933594, -0.19015100598335266, -0.07869099825620651, 0.9785959720611572,
+        0.05963199958205223, 0.02946699969470501, 0.9977849721908569, -0.4902079999446869, -0.09679199755191803, 0.8662149906158447,
+        -0.4014579951763153, -0.07926800101995468, 0.9124410152435303, -0.33541300892829895, -0.0662280023097992, 0.939740002155304,
+        -0.20517399907112122, -0.040511999279260635, 0.977886974811554, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.06623400002717972, -0.013078000396490097, 0.9977179765701294, 0.05963199958205223, -0.02946699969470501, 0.9977849721908569,
+        0.40303200483322144, -0.1667889952659607, 0.8998590111732483, 0.4339120090007782, -0.08567699790000916, 0.8968719840049744,
+        0.6326310038566589, -0.2618109881877899, 0.7288579940795898, 0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+        0.6661339998245239, -0.27567601203918457, 0.6930140256881714, 0.7128540277481079, -0.14075499773025513, 0.6870430111885071,
+        0.5777599811553955, -0.19519099593162537, 0.792523980140686, 0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        0.04390300065279007, -0.05011200159788132, 0.9977779984474182, 0.30884799361228943, -0.30884799361228943, 0.8995699882507324,
+        0.48457300662994385, -0.48457300662994385, 0.7282710075378418, 0.510138988494873, -0.510138988494873, 0.6924710273742676,
+        0.4591110050678253, -0.40222999453544617, 0.7921029925346375, 0.021289000287652016, -0.06301800161600113, 0.9977849721908569,
+        0.16678999364376068, -0.40303200483322144, 0.8998590111732483, 0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+        0.27567601203918457, -0.6661339998245239, 0.6930140256881714, 0.2701770067214966, -0.546737015247345, 0.7925170063972473,
+        0.013078000396490097, -0.06623400002717972, 0.9977179765701294, 0.08567599952220917, -0.4339120090007782, 0.8968719840049744,
+        0.13381600379943848, -0.6777120232582092, 0.723048985004425, 0.14075499773025513, -0.7128540277481079, 0.6870430111885071,
+        0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.013078000396490097, -0.06623400002717972, 0.9977179765701294,
+        -0.02946699969470501, -0.05963199958205223, 0.9977849721908569, -0.1667889952659607, -0.40303200483322144, 0.8998590111732483,
+        -0.08567699790000916, -0.4339120090007782, 0.8968719840049744, -0.2618109881877899, -0.6326310038566589, 0.7288579940795898,
+        -0.13381600379943848, -0.6777120232582092, 0.723048985004425, -0.27567601203918457, -0.6661339998245239, 0.6930140256881714,
+        -0.14075499773025513, -0.7128540277481079, 0.6870430111885071, -0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+        -0.11919199675321579, -0.6036490201950073, 0.7882900238037109, -0.05011200159788132, -0.04390300065279007, 0.9977779984474182,
+        -0.30884799361228943, -0.30884799361228943, 0.8995699882507324, -0.48457300662994385, -0.48457300662994385, 0.7282710075378418,
+        -0.510138988494873, -0.510138988494873, 0.6924710273742676, -0.40222999453544617, -0.4591110050678253, 0.7921029925346375,
+        -0.06301800161600113, -0.021289000287652016, 0.9977849721908569, -0.40303200483322144, -0.16678999364376068, 0.8998590111732483,
+        -0.6326310038566589, -0.2618109881877899, 0.7288579940795898, -0.6661339998245239, -0.27567601203918457, 0.6930140256881714,
+        -0.546737015247345, -0.2701770067214966, 0.7925170063972473, -0.06623400002717972, -0.013078000396490097, 0.9977179765701294,
+        -0.4339120090007782, -0.08567599952220917, 0.8968719840049744, -0.6777120232582092, -0.13381600379943848, 0.723048985004425,
+        -0.7128540277481079, -0.14075499773025513, 0.6870430111885071, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        -0.06623400002717972, 0.013078000396490097, 0.9977179765701294, -0.05963199958205223, 0.02946699969470501, 0.9977849721908569,
+        -0.40303200483322144, 0.1667889952659607, 0.8998590111732483, -0.4339120090007782, 0.08567699790000916, 0.8968719840049744,
+        -0.6326310038566589, 0.2618109881877899, 0.7288579940795898, -0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+        -0.6661339998245239, 0.27567601203918457, 0.6930140256881714, -0.7128540277481079, 0.14075499773025513, 0.6870430111885071,
+        -0.5777599811553955, 0.19519099593162537, 0.792523980140686, -0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        -0.04390300065279007, 0.05011200159788132, 0.9977779984474182, -0.30884799361228943, 0.30884799361228943, 0.8995699882507324,
+        -0.48457300662994385, 0.48457300662994385, 0.7282710075378418, -0.510138988494873, 0.510138988494873, 0.6924710273742676,
+        -0.4591110050678253, 0.40222999453544617, 0.7921029925346375, -0.021289000287652016, 0.06301800161600113, 0.9977849721908569,
+        -0.16678999364376068, 0.40303200483322144, 0.8998590111732483, -0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+        -0.27567601203918457, 0.6661339998245239, 0.6930140256881714, -0.2701770067214966, 0.546737015247345, 0.7925170063972473,
+        -0.013078000396490097, 0.06623400002717972, 0.9977179765701294, -0.08567599952220917, 0.4339120090007782, 0.8968719840049744,
+        -0.13381600379943848, 0.6777120232582092, 0.723048985004425, -0.14075499773025513, 0.7128540277481079, 0.6870430111885071,
+        -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.013078000396490097, 0.06623400002717972, 0.9977179765701294,
+        0.02946699969470501, 0.05963199958205223, 0.9977849721908569, 0.1667889952659607, 0.40303200483322144, 0.8998590111732483,
+        0.08567699790000916, 0.4339120090007782, 0.8968719840049744, 0.2618109881877899, 0.6326310038566589, 0.7288579940795898,
+        0.13381600379943848, 0.6777120232582092, 0.723048985004425, 0.27567601203918457, 0.6661339998245239, 0.6930140256881714,
+        0.14075499773025513, 0.7128540277481079, 0.6870430111885071, 0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+        0.11919199675321579, 0.6036490201950073, 0.7882900238037109, 0.05011200159788132, 0.04390300065279007, 0.9977779984474182,
+        0.30884799361228943, 0.30884799361228943, 0.8995699882507324, 0.48457300662994385, 0.48457300662994385, 0.7282710075378418,
+        0.510138988494873, 0.510138988494873, 0.6924710273742676, 0.40222999453544617, 0.4591110050678253, 0.7921029925346375,
+        0.06301800161600113, 0.021289000287652016, 0.9977849721908569, 0.40303200483322144, 0.16678999364376068, 0.8998590111732483,
+        0.6326310038566589, 0.2618109881877899, 0.7288579940795898, 0.6661339998245239, 0.27567601203918457, 0.6930140256881714,
+        0.546737015247345, 0.2701770067214966, 0.7925170063972473, 0.06623400002717972, 0.013078000396490097, 0.9977179765701294,
+        0.4339120090007782, 0.08567599952220917, 0.8968719840049744, 0.6777120232582092, 0.13381600379943848, 0.723048985004425,
+        0.7128540277481079, 0.14075499773025513, 0.6870430111885071, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        0.6036490201950073, -0.11919199675321579, 0.7882900238037109, 0.546737015247345, -0.2701770067214966, 0.7925170063972473,
+        0.7223830223083496, -0.2989569902420044, 0.623528003692627, 0.7723940014839172, -0.15251100063323975, 0.616562008857727,
+        0.9094089865684509, -0.3763520121574402, 0.1770150065422058, 0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+        0.9408230185508728, -0.3353259861469269, 0.04907499998807907, 0.9843119978904724, -0.16964000463485718, 0.048493001610040665,
+        0.9810580015182495, -0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+        0.40222999453544617, -0.4591110050678253, 0.7921029925346375, 0.5532029867172241, -0.5532029867172241, 0.622842013835907,
+        0.6959879994392395, -0.6959879994392395, 0.17663900554180145, 0.7403979897499084, -0.6703829765319824, 0.048958998173475266,
+        0.8310419917106628, -0.5562090277671814, 0, 0.19519099593162537, -0.5777599811553955, 0.792523980140686,
+        0.2989560067653656, -0.7223830223083496, 0.623528003692627, 0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+        0.4275760054588318, -0.902646005153656, 0.04906899854540825, 0.5562090277671814, -0.8310419917106628, 0,
+        0.11919199675321579, -0.6036490201950073, 0.7882900238037109, 0.15251100063323975, -0.7723940014839172, 0.616562008857727,
+        0.19075599312782288, -0.9660869836807251, 0.1740349978208542, 0.19348600506782532, -0.9799140095710754, 0.048277001827955246,
+        0.1937119960784912, -0.9810580015182495, 0, -0.11919199675321579, -0.6036490201950073, 0.7882900238037109,
+        -0.2701770067214966, -0.546737015247345, 0.7925170063972473, -0.2989569902420044, -0.7223830223083496, 0.623528003692627,
+        -0.15251100063323975, -0.7723940014839172, 0.616562008857727, -0.3763520121574402, -0.9094089865684509, 0.1770150065422058,
+        -0.19075599312782288, -0.9660869836807251, 0.1740349978208542, -0.3353259861469269, -0.9408230185508728, 0.04907499998807907,
+        -0.16964000463485718, -0.9843119978904724, 0.04849399998784065, -0.1937119960784912, -0.9810580015182495, 0,
+        0.7071070075035095, -0.7071070075035095, 0, -0.4591110050678253, -0.40222999453544617, 0.7921029925346375,
+        -0.5532029867172241, -0.5532029867172241, 0.622842013835907, -0.6959879994392395, -0.6959879994392395, 0.17663900554180145,
+        -0.6703829765319824, -0.7403979897499084, 0.048958998173475266, -0.5562090277671814, -0.8310419917106628, 0,
+        -0.5777599811553955, -0.19519099593162537, 0.792523980140686, -0.7223830223083496, -0.2989560067653656, 0.623528003692627,
+        -0.9094089865684509, -0.3763520121574402, 0.1770150065422058, -0.902646005153656, -0.4275760054588318, 0.04906899854540825,
+        -0.8310419917106628, -0.5562090277671814, 0, -0.6036490201950073, -0.11919199675321579, 0.7882900238037109,
+        -0.7723940014839172, -0.15251100063323975, 0.616562008857727, -0.9660869836807251, -0.19075599312782288, 0.1740349978208542,
+        -0.9799140095710754, -0.19348600506782532, 0.048277001827955246, -0.9810580015182495, -0.1937119960784912, 0,
+        -0.6036490201950073, 0.11919199675321579, 0.7882900238037109, -0.546737015247345, 0.2701770067214966, 0.7925170063972473,
+        -0.7223830223083496, 0.2989569902420044, 0.623528003692627, -0.7723940014839172, 0.15251100063323975, 0.616562008857727,
+        -0.9094089865684509, 0.3763520121574402, 0.1770150065422058, -0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+        -0.9408230185508728, 0.3353259861469269, 0.04907499998807907, -0.9843119978904724, 0.16964000463485718, 0.04849399998784065,
+        -0.9810580015182495, 0.1937119960784912, 0, 0.7071070075035095, -0.7071070075035095, 0,
+        -0.40222999453544617, 0.4591110050678253, 0.7921029925346375, -0.5532029867172241, 0.5532029867172241, 0.622842013835907,
+        -0.6959879994392395, 0.6959879994392395, 0.17663900554180145, -0.7403979897499084, 0.6703829765319824, 0.048958998173475266,
+        -0.8310419917106628, 0.5562090277671814, 0, -0.19519099593162537, 0.5777599811553955, 0.792523980140686,
+        -0.2989560067653656, 0.7223830223083496, 0.623528003692627, -0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+        -0.4275760054588318, 0.902646005153656, 0.04906899854540825, -0.5562090277671814, 0.8310419917106628, 0,
+        -0.11919199675321579, 0.6036490201950073, 0.7882900238037109, -0.15251100063323975, 0.7723940014839172, 0.616562008857727,
+        -0.19075599312782288, 0.9660869836807251, 0.1740349978208542, -0.19348600506782532, 0.9799140095710754, 0.048277001827955246,
+        -0.1937119960784912, 0.9810580015182495, 0, 0.11919199675321579, 0.6036490201950073, 0.7882900238037109,
+        0.2701770067214966, 0.546737015247345, 0.7925170063972473, 0.2989569902420044, 0.7223830223083496, 0.623528003692627,
+        0.15251100063323975, 0.7723940014839172, 0.616562008857727, 0.3763520121574402, 0.9094089865684509, 0.1770150065422058,
+        0.19075599312782288, 0.9660869836807251, 0.1740349978208542, 0.3353259861469269, 0.9408230185508728, 0.04907499998807907,
+        0.16964000463485718, 0.9843119978904724, 0.04849399998784065, 0.1937119960784912, 0.9810580015182495, 0,
+        0.7071070075035095, -0.7071070075035095, 0, 0.4591110050678253, 0.40222999453544617, 0.7921029925346375,
+        0.5532029867172241, 0.5532029867172241, 0.622842013835907, 0.6959879994392395, 0.6959879994392395, 0.17663900554180145,
+        0.6703829765319824, 0.7403979897499084, 0.048958998173475266, 0.5562090277671814, 0.8310419917106628, 0,
+        0.5777599811553955, 0.19519099593162537, 0.792523980140686, 0.7223830223083496, 0.2989560067653656, 0.623528003692627,
+        0.9094089865684509, 0.3763520121574402, 0.1770150065422058, 0.902646005153656, 0.4275760054588318, 0.04906899854540825,
+        0.8310419917106628, 0.5562090277671814, 0, 0.6036490201950073, 0.11919199675321579, 0.7882900238037109,
+        0.7723940014839172, 0.15251100063323975, 0.616562008857727, 0.9660869836807251, 0.19075599312782288, 0.1740349978208542,
+        0.9799150228500366, 0.19348600506782532, 0.048277001827955246, 0.9810580015182495, 0.1937119960784912, 0,
+        0.9999480247497559, 0.006622000131756067, 0.007786999922245741, 0.9989290237426758, 0.04125700145959854, -0.020945999771356583,
+        0.9700260162353516, -0.18230900168418884, 0.1606609970331192, 0.9929869771003723, -0.1116809993982315, 0.038782998919487,
+        0.8677089810371399, -0.30993399024009705, 0.38861599564552307, 0.9675049781799316, -0.18179599940776825, 0.17574100196361542,
+        0.6127229928970337, -0.23797500133514404, 0.753616988658905, 0.781611979007721, -0.1585649996995926, 0.6032750010490417,
+        0.13049399852752686, -0.02585900016129017, 0.9911119937896729, 0.16583800315856934, -0.04606600105762482, 0.9850770235061646,
+        0.9847609996795654, -0.03004699945449829, -0.17129500210285187, 0.9463850259780884, 0.008138000033795834, 0.3229379951953888,
+        0.6942890286445618, 0.06011800095438957, 0.7171810269355774, 0.405923992395401, 0.09244199842214584, 0.9092199802398682,
+        0.1477230042219162, 0.0024739999789744616, 0.9890260100364685, 0.991798996925354, -0.11557900160551071, -0.05454900115728378,
+        0.9920099973678589, 0.07202500104904175, 0.10358300060033798, 0.8882240056991577, 0.2238840013742447, 0.40116599202156067,
+        0.6046879887580872, 0.13691100478172302, 0.7846069931983948, 0.12908099591732025, -0.06111999973654747, 0.989749014377594,
+        0.9954820275306702, -0.09436299651861191, 0.010502999648451805, 0.9981970191001892, 0.012060999870300293, 0.05880200117826462,
+        0.9550639986991882, 0.09819000214338303, 0.27966299653053284, 0.6606940031051636, 0.05169999971985817, 0.7488729953765869,
+        0.07273799926042557, -0.04034300148487091, 0.9965350031852722, 0.9999179840087891, 0.007191000040620565, 0.010560999624431133,
+        0.9989050030708313, 0.04436499997973442, -0.014883999712765217, 0.9694769978523254, -0.17860299348831177, 0.1679760068655014,
+        0.9924619793891907, -0.10775599628686905, 0.058378998190164566, 0.8567489981651306, -0.28829601407051086, 0.4276289939880371,
+        0.9473999738693237, -0.16112199425697327, 0.27653801441192627, 0.5627779960632324, -0.19747799634933472, 0.8026729822158813,
+        0.6577669978141785, -0.11438000202178955, 0.7444859743118286, 0.07901199907064438, 0.0013689999468624592, 0.9968730211257935,
+        0.07274100184440613, -0.02020600065588951, 0.9971460103988647, 0.9888780117034912, 0.025808999314904213, -0.14647500216960907,
+        0.9453979730606079, -0.006663000211119652, 0.3258500099182129, 0.6921399831771851, -0.04972299933433533, 0.7200480103492737,
+        0.3957499861717224, -0.08134900033473969, 0.9147480130195618, 0.13914500176906586, -0.00007899999764049426, 0.9902719855308533,
+        0.9924669861793518, -0.10311000049114227, -0.06616800278425217, 0.9926300048828125, 0.07926999777555466, 0.09165900200605392,
+        0.900858998298645, 0.2553130090236664, 0.3510949909687042, 0.6513699889183044, 0.18318000435829163, 0.7363160252571106,
+        0.15978699922561646, -0.02714099921286106, 0.9867780208587646, 0.9955620169639587, -0.09379199892282486, 0.0077309999614953995,
+        0.9991030097007751, 0.01610800065100193, 0.039149001240730286, 0.9764699935913086, 0.12068899720907211, 0.17871999740600586,
+        0.7859060168266296, 0.10103499889373779, 0.6100350022315979, 0.16579000651836395, -0.014832000248134136, 0.986050009727478,
+        0.1655299961566925, -0.10078699886798859, 0.9810410141944885, -0.0046790000051259995, -0.1750659942626953, 0.9845460057258606,
+        -0.3859579861164093, -0.06494200229644775, 0.9202280044555664, -0.3219670057296753, -0.05600599944591522, 0.9450929760932922,
+        -0.6471610069274902, -0.11495299637317657, 0.7536370158195496, -0.5616440176963806, -0.078855000436306, 0.8236119747161865,
+        -0.8379700183868408, -0.23749999701976776, 0.4913240075111389, -0.7512590289115906, -0.1447169929742813, 0.6439470052719116,
+        -0.9052090048789978, -0.2807050049304962, 0.3190630078315735, -0.8249419927597046, -0.2209009975194931, 0.5202630162239075,
+        -0.13363699615001678, 0.0291920006275177, 0.9905999898910522, -0.4039649963378906, 0.0019519999623298645, 0.9147719740867615,
+        -0.7191359996795654, 0.002443999983370304, 0.6948649883270264, -0.9637579917907715, 0.026884999126195908, 0.26541900634765625,
+        -0.9637719988822937, 0.2207069993019104, -0.14977200329303741, 0.03522900119423866, 0.06716900318861008, 0.9971190094947815,
+        -0.3620629906654358, -0.01676199957728386, 0.9320030212402344, -0.6534259915351868, 0.007120999973267317, 0.7569569945335388,
+        -0.8528590202331543, 0.11686599999666214, 0.5088940262794495, -0.8814889788627625, 0.3579840064048767, 0.3079349994659424,
+        0.0726580023765564, 0.02018200047314167, 0.9971529841423035, -0.37608298659324646, -0.025955000892281532, 0.926222026348114,
+        -0.6568350195884705, -0.015021000057458878, 0.7538840174674988, -0.8238760232925415, 0.03257700055837631, 0.5658339858055115,
+        -0.8688690066337585, 0.13078700006008148, 0.4774540066719055, 0.07265599817037582, -0.07700400054454803, 0.994379997253418,
+        -0.0343950018286705, -0.151870995759964, 0.9878020286560059, -0.40362000465393066, -0.05282000079751015, 0.9134010076522827,
+        -0.37586501240730286, -0.041078001260757446, 0.9257640242576599, -0.6878190040588379, -0.0810059979557991, 0.721347987651825,
+        -0.6558970212936401, -0.052101001143455505, 0.7530509829521179, -0.8708800077438354, -0.2062380015850067, 0.44613200426101685,
+        -0.8175939917564392, -0.12448199838399887, 0.5621780157089233, -0.8926960229873657, -0.3055669963359833, 0.33124300837516785,
+        -0.8565059900283813, -0.21024300158023834, 0.4713769853115082, -0.15155400335788727, -0.025412000715732574, 0.9881219863891602,
+        -0.41033700108528137, -0.0026420000940561295, 0.9119300246238708, -0.7240620255470276, 0.00047400000039488077, 0.6897349953651428,
+        -0.9655590057373047, -0.017078999429941177, 0.2596229910850525, -0.973825991153717, -0.19711799919605255, -0.1131730005145073,
+        0.06214199960231781, 0.08235500007867813, 0.9946640133857727, -0.3334290087223053, 0.007625999860465527, 0.9427440166473389,
+        -0.608610987663269, 0.04885999858379364, 0.7919629812240601, -0.8253309726715088, 0.14631199836730957, 0.5453640222549438,
+        -0.9105669856071472, 0.3146660029888153, 0.2680560052394867, 0.16523399949073792, 0.04589800164103508, 0.985185980796814,
+        -0.32260099053382874, -0.010471000336110592, 0.9464769959449768, -0.5639140009880066, 0.015166000463068485, 0.8256940245628357,
+        -0.758965015411377, 0.05617399886250496, 0.6487039923667908, -0.8382350206375122, 0.14245299994945526, 0.5263739824295044,
+        0.9727830290794373, -0.019794000312685966, 0.2308720052242279, 0.9828159809112549, -0.036465998739004135, 0.18095199763774872,
+        0.9050639867782593, -0.02252200059592724, 0.4246790111064911, 0.8354039788246155, -0.03220000118017197, 0.5486930012702942,
+        0.6465700268745422, -0.045921001583337784, 0.7614709734916687, 0.4826749861240387, -0.04895399883389473, 0.8744300007820129,
+        0.4453999996185303, 0.17256900668144226, 0.8785430192947388, 0.47231200337409973, 0.13768500089645386, 0.8706120252609253,
+        0.4824250042438507, 0.3898639976978302, 0.7843930125236511, 0.641398012638092, 0.4275979995727539, 0.6370000243186951,
+        0.9863939881324768, 0.0994419977068901, 0.13091400265693665, 0.9154840111732483, 0.2120320051908493, 0.34195101261138916,
+        0.7246469855308533, 0.245046004652977, 0.6440799832344055, 0.35685500502586365, 0.17885500192642212, 0.9168779850006104,
+        0.14101800322532654, 0.24263200163841248, 0.9598140120506287, 0.9366779923439026, 0.16484400629997253, 0.3089669942855835,
+        0.7982620000839233, 0.2441370040178299, 0.5506129860877991, 0.4769439995288849, 0.2904820144176483, 0.8295450210571289,
+        0.4125959873199463, -0.017246000468730927, 0.9107509851455688, 0.341374009847641, -0.37689098715782166, 0.8610560297966003,
+        0.9026100039482117, 0.14119599759578705, 0.40664398670196533, 0.7326020002365112, 0.1491979956626892, 0.6641039848327637,
+        0.38115599751472473, 0.15792299807071686, 0.9109230041503906, 0.5317370295524597, -0.02143399976193905, 0.846638023853302,
+        0.7915729880332947, -0.3539769947528839, 0.49810999631881714, 0.9087340235710144, -0.07959599792957306, 0.40971601009368896,
+        0.9386569857597351, -0.17680299282073975, 0.29607900977134705, 0.7781569957733154, -0.19467000663280487, 0.5971400141716003,
+        0.738847017288208, -0.07674700021743774, 0.6694890260696411, 0.43915998935699463, -0.22276799380779266, 0.870352029800415,
+        0.3863860070705414, -0.0790880024433136, 0.918940007686615, 0.3576120138168335, 0.07325199991464615, 0.9309930205345154,
+        0.5227140188217163, 0.16167999804019928, 0.8370360136032104, 0.4246380031108856, 0.3233239948749542, 0.845661997795105,
+        0.733618974685669, 0.48907899856567383, 0.4718089997768402, 0.9886019825935364, -0.10717800259590149, 0.10573200136423111,
+        0.9131960272789001, -0.22303399443626404, 0.3410690128803253, 0.7163559794425964, -0.25636500120162964, 0.6489310264587402,
+        0.35149699449539185, -0.15968100726604462, 0.922469973564148, 0.07999800145626068, -0.2107039988040924, 0.9742709994316101,
+        0.9883249998092651, 0.04732999950647354, 0.14482200145721436, 0.9210500121116638, 0.07413999736309052, 0.3823229968547821,
+        0.6804890036582947, 0.11895299702882767, 0.7230389714241028, 0.4935390055179596, -0.10269299894571304, 0.8636389970779419,
+        0.3912479877471924, -0.4752289950847626, 0.7880880236625671, 0.9700270295143127, 0.07970499992370605, 0.2295520007610321,
+        0.831250011920929, 0.10592100024223328, 0.5457149744033813, 0.4774230122566223, 0.13252699375152588, 0.8686220049858093,
+        0.47922399640083313, -0.0024129999801516533, 0.877689003944397, 0.6902980208396912, -0.29711300134658813, 0.6597059965133667,
+        0.6312130093574524, 0.4550989866256714, 0.628055989742279, 0.26494699716567993, 0.5426689982414246, 0.797065019607544,
+        0.4216960072517395, 0.6728450059890747, 0.6078259944915771, 0.7324270009994507, 0.5829970240592957, 0.35166099667549133,
+        0.5086709856987, 0.8606399893760681, -0.023507000878453255, 0.7640720009803772, 0.6449369788169861, -0.015798000618815422,
+        0.19029100239276886, 0.2773289978504181, -0.9417420029640198, 0.02588699944317341, 0.0005750000127591193, -0.9996650218963623,
+        -0.33045700192451477, -0.4387669861316681, -0.8356329798698425, -0.6271269917488098, -0.4645389914512634, -0.6252319812774658,
+        -0.02311599999666214, 0.2469020038843155, 0.9687650203704834, -0.012950999662280083, 0.45514100790023804, 0.8903250098228455,
+        -0.001180000021122396, 0.9888520240783691, 0.14889399707317352, 0.019520999863743782, 0.6841210126876831, -0.7291070222854614,
+        0.012253000400960445, 0.007784999907016754, -0.9998949766159058, 0.3314639925956726, -0.3832260072231293, 0.8621309995651245,
+        0.08274699747562408, -0.16047699749469757, 0.9835649728775024, -0.381630003452301, 0.638043999671936, 0.6687729954719543,
+        -0.44988399744033813, 0.787883996963501, -0.42052799463272095, -0.2780170142650604, 0.5983560085296631, -0.7514500021934509,
+        0.7378140091896057, -0.4918749928474426, 0.4622659981250763, 0.6153389811515808, -0.45540300011634827, 0.6434019804000854,
+        -0.43678900599479675, 0.33411499857902527, 0.8352140188217163, -0.7429530024528503, 0.6388909816741943, -0.1995989978313446,
+        -0.7432950139045715, 0.5977380275726318, -0.3003700077533722, 0.7197920083999634, 0.5168960094451904, 0.4633769989013672,
+        0.22183099389076233, 0.4485720098018646, 0.8657789826393127, 0.08203200250864029, 0.15848000347614288, 0.9839479923248291,
+        0.5953459739685059, 0.4811680018901825, 0.6434599757194519, -0.37556400895118713, -0.6215270161628723, 0.6875,
+        -0.42666301131248474, -0.33534398674964905, 0.8399419784545898, -0.44476398825645447, -0.7887529730796814, -0.42432600259780884,
+        -0.7557309865951538, -0.6222699880599976, -0.20408600568771362, -0.4292669892311096, -0.5361850261688232, -0.7267979979515076,
+        -0.7655900120735168, -0.5671039819717407, -0.30375200510025024, 0.007348000071942806, -0.21113499999046326, 0.9774289727210999,
+        -0.01990099996328354, -0.4373210072517395, 0.8990849852561951, -0.008775000460445881, -0.9864199757575989, 0.16400499641895294,
+        0.024855999276041985, -0.6829339861869812, -0.7300570011138916, 0.014514000155031681, 0.03655200079083443, -0.9992259740829468,
+        0.40192899107933044, -0.4676550030708313, 0.7872430086135864, 0.41696101427078247, -0.6813820004463196, 0.6015490293502808,
+        0.5033609867095947, -0.8637740015983582, -0.022839000448584557, 0.2058819979429245, -0.2945750057697296, -0.9331870079040527,
+        -0.2351589947938919, 0.5535579919815063, -0.7989199757575989, 0.6533820033073425, -0.435588002204895, 0.619156002998352,
+        0.7555500268936157, -0.554410994052887, 0.3489600121974945, 0.7765160202980042, -0.6298360228538513, -0.01814199984073639,
+        0.025975000113248825, 0.008264999836683273, -0.9996280074119568, -0.6086519956588745, 0.49536699056625366, -0.6198019981384277,
+        -0.9813200235366821, 0.19238099455833435, 0, -0.831650972366333, 0.5552989840507507, 0,
+        -0.4425640106201172, 0.38308998942375183, 0.8107889890670776, -0.5623509883880615, 0.11026400327682495, 0.8195139765739441,
+        0.367917001247406, -0.15178599953651428, 0.917385995388031, 0.3960669934749603, -0.07774800062179565, 0.9149240255355835,
+        0.3283520042896271, -0.13562799990177155, 0.9347670078277588, 0.3530749976634979, -0.06952299922704697, 0.9330080151557922,
+        -0.5935590267181396, 0.20035800337791443, 0.7794510126113892, -0.6201800107955933, 0.12245599925518036, 0.7748429775238037,
+        -0.5552989840507507, 0.831650972366333, 0, -0.2616960108280182, 0.523730993270874, 0.8106920123100281,
+        0.2819640040397644, -0.2819199860095978, 0.9170699715614319, 0.25169798731803894, -0.25161200761795044, 0.9345269799232483,
+        -0.4710330069065094, 0.41249701380729675, 0.7797269821166992, -0.19238099455833435, 0.9813200235366821, 0,
+        -0.04031100124120712, 0.5840420126914978, 0.8107219934463501, 0.1517850011587143, -0.3678950071334839, 0.9173960089683533,
+        0.13561999797821045, -0.3282899856567383, 0.9347900152206421, -0.27737799286842346, 0.561601996421814, 0.779528021812439,
+        -1, 0, 0, 0.29074999690055847, 0.5413560271263123, 0.7889220118522644,
+        0.07767199724912643, -0.39607399702072144, 0.9149270057678223, 0.0693729966878891, -0.3530940115451813, 0.9330130219459534,
+        -0.12221000343561172, 0.6202139854431152, 0.7748550176620483, 0.19238099455833435, 0.9813200235366821, 0,
+        0.5552989840507507, 0.831650972366333, 0, 0.38308998942375183, 0.4425640106201172, 0.8107889890670776,
+        0.11026400327682495, 0.5623509883880615, 0.8195139765739441, -0.15178599953651428, -0.367917001247406, 0.917385995388031,
+        -0.07774800062179565, -0.3960669934749603, 0.9149240255355835, -0.13562799990177155, -0.3283520042896271, 0.9347670078277588,
+        -0.06952299922704697, -0.3530749976634979, 0.9330080151557922, 0.20035800337791443, 0.5935590267181396, 0.7794510126113892,
+        0.12245599925518036, 0.6201800107955933, 0.7748429775238037, 0.831650972366333, 0.5552989840507507, 0,
+        0.523730993270874, 0.2616960108280182, 0.8106920123100281, -0.2819199860095978, -0.2819640040397644, 0.9170699715614319,
+        -0.25161200761795044, -0.25169798731803894, 0.9345269799232483, 0.41249701380729675, 0.4710330069065094, 0.7797269821166992,
+        0.9813200235366821, 0.19238099455833435, 0, 0.5840420126914978, 0.04031100124120712, 0.8107219934463501,
+        -0.3678950071334839, -0.1517850011587143, 0.9173960089683533, -0.3282899856567383, -0.13561999797821045, 0.9347900152206421,
+        0.561601996421814, 0.27737799286842346, 0.779528021812439, -1, 0, 0,
+        0.5413560271263123, -0.29074999690055847, 0.7889220118522644, -0.39607399702072144, -0.07767199724912643, 0.9149270057678223,
+        -0.3530940115451813, -0.0693729966878891, 0.9330130219459534, 0.6202139854431152, 0.12221000343561172, 0.7748550176620483,
+        0.9813200235366821, -0.19238099455833435, 0, 0.831650972366333, -0.5552989840507507, 0,
+        0.4425640106201172, -0.38308998942375183, 0.8107889890670776, 0.5623509883880615, -0.11026400327682495, 0.8195139765739441,
+        -0.367917001247406, 0.15178599953651428, 0.917385995388031, -0.3960669934749603, 0.07774800062179565, 0.9149240255355835,
+        -0.3283520042896271, 0.13562799990177155, 0.9347670078277588, -0.3530749976634979, 0.06952299922704697, 0.9330080151557922,
+        0.5935590267181396, -0.20035800337791443, 0.7794510126113892, 0.6201800107955933, -0.12245599925518036, 0.7748429775238037,
+        0.5552989840507507, -0.831650972366333, 0, 0.2616960108280182, -0.523730993270874, 0.8106920123100281,
+        -0.2819640040397644, 0.2819199860095978, 0.9170699715614319, -0.25169798731803894, 0.25161200761795044, 0.9345269799232483,
+        0.4710330069065094, -0.41249701380729675, 0.7797269821166992, 0.19238099455833435, -0.9813200235366821, 0,
+        0.04031100124120712, -0.5840420126914978, 0.8107219934463501, -0.1517850011587143, 0.3678950071334839, 0.9173960089683533,
+        -0.13561999797821045, 0.3282899856567383, 0.9347900152206421, 0.27737799286842346, -0.561601996421814, 0.779528021812439,
+        -1, 0, 0, -0.29074999690055847, -0.5413560271263123, 0.7889220118522644,
+        -0.07767199724912643, 0.39607399702072144, 0.9149270057678223, -0.0693729966878891, 0.3530940115451813, 0.9330130219459534,
+        0.12221000343561172, -0.6202139854431152, 0.7748550176620483, -0.19238099455833435, -0.9813200235366821, 0,
+        -0.5552989840507507, -0.831650972366333, 0, -0.38308998942375183, -0.4425640106201172, 0.8107889890670776,
+        -0.11026400327682495, -0.5623509883880615, 0.8195139765739441, 0.15178599953651428, 0.367917001247406, 0.917385995388031,
+        0.07774800062179565, 0.3960669934749603, 0.9149240255355835, 0.13562799990177155, 0.3283520042896271, 0.9347670078277588,
+        0.06952299922704697, 0.3530749976634979, 0.9330080151557922, -0.20035800337791443, -0.5935590267181396, 0.7794510126113892,
+        -0.12245599925518036, -0.6201800107955933, 0.7748429775238037, -0.831650972366333, -0.5552989840507507, 0,
+        -0.523730993270874, -0.2616960108280182, 0.8106920123100281, 0.2819199860095978, 0.2819640040397644, 0.9170699715614319,
+        0.25161200761795044, 0.25169798731803894, 0.9345269799232483, -0.41249701380729675, -0.4710330069065094, 0.7797269821166992,
+        -0.9813200235366821, -0.19238099455833435, 0, -0.5840420126914978, -0.04031100124120712, 0.8107219934463501,
+        0.3678950071334839, 0.1517850011587143, 0.9173960089683533, 0.3282899856567383, 0.13561999797821045, 0.9347900152206421,
+        -0.561601996421814, -0.27737799286842346, 0.779528021812439, -1, 0, 0,
+        -0.5413560271263123, 0.29074999690055847, 0.7889220118522644, 0.39607399702072144, 0.07767199724912643, 0.9149270057678223,
+        0.3530940115451813, 0.0693729966878891, 0.9330130219459534, -0.6202139854431152, -0.12221000343561172, 0.7748550176620483,
+        -0.6201800107955933, 0.12245599925518036, 0.7748429775238037, -0.5616469979286194, 0.27755099534988403, 0.7794349789619446,
+        -0.8979210257530212, 0.37159600853919983, 0.23590999841690063, -0.9542099833488464, 0.18841099739074707, 0.23234599828720093,
+        -0.9101200103759766, 0.3766449987888336, 0.17268399894237518, -0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+        -0.8549879789352417, 0.35383298993110657, 0.3792079985141754, -0.9100499749183655, 0.17969100177288055, 0.3735229969024658,
+        -0.8064150214195251, 0.2724289894104004, 0.5248600244522095, -0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+        -0.4125959873199463, 0.47094500064849854, 0.7797279953956604, -0.687192976474762, 0.687192976474762, 0.23565199971199036,
+        -0.6965190172195435, 0.6965190172195435, 0.17240400612354279, -0.6544880270957947, 0.6544870138168335, 0.37853899598121643,
+        -0.6404970288276672, 0.5611429810523987, 0.5242909789085388, -0.20047900080680847, 0.5933949947357178, 0.7795450091362,
+        -0.3715969920158386, 0.8979210257530212, 0.23590999841690063, -0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+        -0.35383298993110657, 0.8549879789352417, 0.3792079985141754, -0.3770729899406433, 0.7630789875984192, 0.5249059796333313,
+        -0.12245900183916092, 0.6201940178871155, 0.7748309969902039, -0.18841099739074707, 0.9542099833488464, 0.23234599828720093,
+        -0.19089600443840027, 0.966795027256012, 0.16990099847316742, -0.17969200015068054, 0.9100499749183655, 0.3735229969024658,
+        -0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.12245599925518036, 0.6201800107955933, 0.7748429775238037,
+        0.27755099534988403, 0.5616469979286194, 0.7794349789619446, 0.37159600853919983, 0.8979210257530212, 0.23590999841690063,
+        0.18841099739074707, 0.9542099833488464, 0.23234599828720093, 0.3766449987888336, 0.9101200103759766, 0.17268399894237518,
+        0.19089600443840027, 0.966795027256012, 0.16990099847316742, 0.35383298993110657, 0.8549879789352417, 0.3792079985141754,
+        0.17969100177288055, 0.9100499749183655, 0.3735229969024658, 0.2724289894104004, 0.8064150214195251, 0.5248600244522095,
+        0.16553199291229248, 0.8383409976959229, 0.5194069743156433, 0.47094500064849854, 0.4125959873199463, 0.7797279953956604,
+        0.687192976474762, 0.687192976474762, 0.23565199971199036, 0.6965190172195435, 0.6965190172195435, 0.17240400612354279,
+        0.6544870138168335, 0.6544880270957947, 0.37853899598121643, 0.5611429810523987, 0.6404970288276672, 0.5242909789085388,
+        0.5933949947357178, 0.20047900080680847, 0.7795450091362, 0.8979210257530212, 0.3715969920158386, 0.23590999841690063,
+        0.9101200103759766, 0.3766449987888336, 0.17268399894237518, 0.8549879789352417, 0.35383298993110657, 0.3792079985141754,
+        0.7630789875984192, 0.3770729899406433, 0.5249059796333313, 0.6201940178871155, 0.12245900183916092, 0.7748309969902039,
+        0.9542099833488464, 0.18841099739074707, 0.23234599828720093, 0.966795027256012, 0.19089600443840027, 0.16990099847316742,
+        0.9100499749183655, 0.17969200015068054, 0.3735229969024658, 0.8383409976959229, 0.16553199291229248, 0.5194069743156433,
+        0.6201800107955933, -0.12245599925518036, 0.7748429775238037, 0.5616469979286194, -0.27755099534988403, 0.7794349789619446,
+        0.8979210257530212, -0.37159600853919983, 0.23590999841690063, 0.9542099833488464, -0.18841099739074707, 0.23234599828720093,
+        0.9101200103759766, -0.3766449987888336, 0.17268399894237518, 0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+        0.8549879789352417, -0.35383298993110657, 0.3792079985141754, 0.9100499749183655, -0.17969100177288055, 0.3735229969024658,
+        0.8064150214195251, -0.2724289894104004, 0.5248600244522095, 0.8383409976959229, -0.16553199291229248, 0.5194069743156433,
+        0.4125959873199463, -0.47094500064849854, 0.7797279953956604, 0.687192976474762, -0.687192976474762, 0.23565199971199036,
+        0.6965190172195435, -0.6965190172195435, 0.17240400612354279, 0.6544880270957947, -0.6544870138168335, 0.37853899598121643,
+        0.6404970288276672, -0.5611429810523987, 0.5242909789085388, 0.20047900080680847, -0.5933949947357178, 0.7795450091362,
+        0.3715969920158386, -0.8979210257530212, 0.23590999841690063, 0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+        0.35383298993110657, -0.8549879789352417, 0.3792079985141754, 0.3770729899406433, -0.7630789875984192, 0.5249059796333313,
+        0.12245900183916092, -0.6201940178871155, 0.7748309969902039, 0.18841099739074707, -0.9542099833488464, 0.23234599828720093,
+        0.19089600443840027, -0.966795027256012, 0.16990099847316742, 0.17969200015068054, -0.9100499749183655, 0.3735229969024658,
+        0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.12245599925518036, -0.6201800107955933, 0.7748429775238037,
+        -0.27755099534988403, -0.5616469979286194, 0.7794349789619446, -0.37159600853919983, -0.8979210257530212, 0.23590999841690063,
+        -0.18841099739074707, -0.9542099833488464, 0.23234599828720093, -0.3766449987888336, -0.9101200103759766, 0.17268399894237518,
+        -0.19089600443840027, -0.966795027256012, 0.16990099847316742, -0.35383298993110657, -0.8549879789352417, 0.3792079985141754,
+        -0.17969100177288055, -0.9100499749183655, 0.3735229969024658, -0.2724289894104004, -0.8064150214195251, 0.5248600244522095,
+        -0.16553199291229248, -0.8383409976959229, 0.5194069743156433, -0.47094500064849854, -0.4125959873199463, 0.7797279953956604,
+        -0.687192976474762, -0.687192976474762, 0.23565199971199036, -0.6965190172195435, -0.6965190172195435, 0.17240400612354279,
+        -0.6544870138168335, -0.6544880270957947, 0.37853899598121643, -0.5611429810523987, -0.6404970288276672, 0.5242909789085388,
+        -0.5933949947357178, -0.20047900080680847, 0.7795450091362, -0.8979210257530212, -0.3715969920158386, 0.23590999841690063,
+        -0.9101200103759766, -0.3766449987888336, 0.17268399894237518, -0.8549879789352417, -0.35383298993110657, 0.3792079985141754,
+        -0.7630789875984192, -0.3770729899406433, 0.5249059796333313, -0.6201940178871155, -0.12245900183916092, 0.7748309969902039,
+        -0.9542099833488464, -0.18841099739074707, 0.23234599828720093, -0.966795027256012, -0.19089600443840027, 0.16990099847316742,
+        -0.9100499749183655, -0.17969200015068054, 0.3735229969024658, -0.8383409976959229, -0.16553199291229248, 0.5194069743156433 };
+
+
+float  teapotTexCoords[] = { 2, 2, 0, 1.75, 2, 0, 1.75, 1.975000023841858,
+        0, 2, 1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2,
+        1.9500000476837158, 0, 1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0,
+        1.75, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.5, 2,
+        0, 1.5, 1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5,
+        1.9249999523162842, 0, 1.5, 1.899999976158142, 0, 1.25, 2, 0,
+        1.25, 1.975000023841858, 0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842,
+        0, 1.25, 1.899999976158142, 0, 1, 2, 0, 1,
+        1.975000023841858, 0, 1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0,
+        1, 1.899999976158142, 0, 1, 2, 0, 0.75, 2,
+        0, 0.75, 1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75,
+        1.9500000476837158, 0, 1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0,
+        1, 1.9249999523162842, 0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142,
+        0, 0.5, 2, 0, 0.5, 1.975000023841858, 0, 0.5,
+        1.9500000476837158, 0, 0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0,
+        0.25, 2, 0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158,
+        0, 0.25, 1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0,
+        2, 0, 0, 1.975000023841858, 0, 0, 1.9500000476837158, 0,
+        0, 1.9249999523162842, 0, 0, 1.899999976158142, 0, 2, 2,
+        0, 1.75, 2, 0, 1.75, 1.975000023841858, 0, 2,
+        1.975000023841858, 0, 1.75, 1.9500000476837158, 0, 2, 1.9500000476837158, 0,
+        1.75, 1.9249999523162842, 0, 2, 1.9249999523162842, 0, 1.75, 1.899999976158142,
+        0, 2, 1.899999976158142, 0, 1.5, 2, 0, 1.5,
+        1.975000023841858, 0, 1.5, 1.9500000476837158, 0, 1.5, 1.9249999523162842, 0,
+        1.5, 1.899999976158142, 0, 1.25, 2, 0, 1.25, 1.975000023841858,
+        0, 1.25, 1.9500000476837158, 0, 1.25, 1.9249999523162842, 0, 1.25,
+        1.899999976158142, 0, 1, 2, 0, 1, 1.975000023841858, 0,
+        1, 1.9500000476837158, 0, 1, 1.9249999523162842, 0, 1, 1.899999976158142,
+        0, 1, 2, 0, 0.75, 2, 0, 0.75,
+        1.975000023841858, 0, 1, 1.975000023841858, 0, 0.75, 1.9500000476837158, 0,
+        1, 1.9500000476837158, 0, 0.75, 1.9249999523162842, 0, 1, 1.9249999523162842,
+        0, 0.75, 1.899999976158142, 0, 1, 1.899999976158142, 0, 0.5,
+        2, 0, 0.5, 1.975000023841858, 0, 0.5, 1.9500000476837158, 0,
+        0.5, 1.9249999523162842, 0, 0.5, 1.899999976158142, 0, 0.25, 2,
+        0, 0.25, 1.975000023841858, 0, 0.25, 1.9500000476837158, 0, 0.25,
+        1.9249999523162842, 0, 0.25, 1.899999976158142, 0, 0, 2, 0,
+        0, 1.975000023841858, 0, 0, 1.9500000476837158, 0, 0, 1.9249999523162842,
+        0, 0, 1.899999976158142, 0, 2, 1.899999976158142, 0, 1.75,
+        1.899999976158142, 0, 1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0,
+        1.75, 1.4500000476837158, 0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858,
+        0, 2, 1.225000023841858, 0, 1.75, 1, 0, 2,
+        1, 0, 1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0,
+        1.5, 1.4500000476837158, 0, 1.5, 1.225000023841858, 0, 1.5, 1,
+        0, 1.25, 1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25,
+        1.4500000476837158, 0, 1.25, 1.225000023841858, 0, 1.25, 1, 0,
+        1, 1.899999976158142, 0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158,
+        0, 1, 1.225000023841858, 0, 1, 1, 0, 1,
+        1.899999976158142, 0, 0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0,
+        1, 1.6749999523162842, 0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158,
+        0, 0.75, 1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75,
+        1, 0, 1, 1, 0, 0.5, 1.899999976158142, 0,
+        0.5, 1.6749999523162842, 0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858,
+        0, 0.5, 1, 0, 0.25, 1.899999976158142, 0, 0.25,
+        1.6749999523162842, 0, 0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0,
+        0.25, 1, 0, 0, 1.899999976158142, 0, 0, 1.6749999523162842,
+        0, 0, 1.4500000476837158, 0, 0, 1.225000023841858, 0, 0,
+        1, 0, 2, 1.899999976158142, 0, 1.75, 1.899999976158142, 0,
+        1.75, 1.6749999523162842, 0, 2, 1.6749999523162842, 0, 1.75, 1.4500000476837158,
+        0, 2, 1.4500000476837158, 0, 1.75, 1.225000023841858, 0, 2,
+        1.225000023841858, 0, 1.75, 1, 0, 2, 1, 0,
+        1.5, 1.899999976158142, 0, 1.5, 1.6749999523162842, 0, 1.5, 1.4500000476837158,
+        0, 1.5, 1.225000023841858, 0, 1.5, 1, 0, 1.25,
+        1.899999976158142, 0, 1.25, 1.6749999523162842, 0, 1.25, 1.4500000476837158, 0,
+        1.25, 1.225000023841858, 0, 1.25, 1, 0, 1, 1.899999976158142,
+        0, 1, 1.6749999523162842, 0, 1, 1.4500000476837158, 0, 1,
+        1.225000023841858, 0, 1, 1, 0, 1, 1.899999976158142, 0,
+        0.75, 1.899999976158142, 0, 0.75, 1.6749999523162842, 0, 1, 1.6749999523162842,
+        0, 0.75, 1.4500000476837158, 0, 1, 1.4500000476837158, 0, 0.75,
+        1.225000023841858, 0, 1, 1.225000023841858, 0, 0.75, 1, 0,
+        1, 1, 0, 0.5, 1.899999976158142, 0, 0.5, 1.6749999523162842,
+        0, 0.5, 1.4500000476837158, 0, 0.5, 1.225000023841858, 0, 0.5,
+        1, 0, 0.25, 1.899999976158142, 0, 0.25, 1.6749999523162842, 0,
+        0.25, 1.4500000476837158, 0, 0.25, 1.225000023841858, 0, 0.25, 1,
+        0, 0, 1.899999976158142, 0, 0, 1.6749999523162842, 0, 0,
+        1.4500000476837158, 0, 0, 1.225000023841858, 0, 0, 1, 0,
+        2, 1, 0, 1.75, 1, 0, 1.75, 0.8500000238418579,
+        0, 2, 0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2,
+        0.699999988079071, 0, 1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0,
+        1.75, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.5, 1,
+        0, 1.5, 0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5,
+        0.550000011920929, 0, 1.5, 0.4000000059604645, 0, 1.25, 1, 0,
+        1.25, 0.8500000238418579, 0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929,
+        0, 1.25, 0.4000000059604645, 0, 1, 1, 0, 1,
+        0.8500000238418579, 0, 1, 0.699999988079071, 0, 1, 0.550000011920929, 0,
+        1, 0.4000000059604645, 0, 1, 1, 0, 0.75, 1,
+        0, 0.75, 0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75,
+        0.699999988079071, 0, 1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0,
+        1, 0.550000011920929, 0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645,
+        0, 0.5, 1, 0, 0.5, 0.8500000238418579, 0, 0.5,
+        0.699999988079071, 0, 0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0,
+        0.25, 1, 0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071,
+        0, 0.25, 0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0,
+        1, 0, 0, 0.8500000238418579, 0, 0, 0.699999988079071, 0,
+        0, 0.550000011920929, 0, 0, 0.4000000059604645, 0, 2, 1,
+        0, 1.75, 1, 0, 1.75, 0.8500000238418579, 0, 2,
+        0.8500000238418579, 0, 1.75, 0.699999988079071, 0, 2, 0.699999988079071, 0,
+        1.75, 0.550000011920929, 0, 2, 0.550000011920929, 0, 1.75, 0.4000000059604645,
+        0, 2, 0.4000000059604645, 0, 1.5, 1, 0, 1.5,
+        0.8500000238418579, 0, 1.5, 0.699999988079071, 0, 1.5, 0.550000011920929, 0,
+        1.5, 0.4000000059604645, 0, 1.25, 1, 0, 1.25, 0.8500000238418579,
+        0, 1.25, 0.699999988079071, 0, 1.25, 0.550000011920929, 0, 1.25,
+        0.4000000059604645, 0, 1, 1, 0, 1, 0.8500000238418579, 0,
+        1, 0.699999988079071, 0, 1, 0.550000011920929, 0, 1, 0.4000000059604645,
+        0, 1, 1, 0, 0.75, 1, 0, 0.75,
+        0.8500000238418579, 0, 1, 0.8500000238418579, 0, 0.75, 0.699999988079071, 0,
+        1, 0.699999988079071, 0, 0.75, 0.550000011920929, 0, 1, 0.550000011920929,
+        0, 0.75, 0.4000000059604645, 0, 1, 0.4000000059604645, 0, 0.5,
+        1, 0, 0.5, 0.8500000238418579, 0, 0.5, 0.699999988079071, 0,
+        0.5, 0.550000011920929, 0, 0.5, 0.4000000059604645, 0, 0.25, 1,
+        0, 0.25, 0.8500000238418579, 0, 0.25, 0.699999988079071, 0, 0.25,
+        0.550000011920929, 0, 0.25, 0.4000000059604645, 0, 0, 1, 0,
+        0, 0.8500000238418579, 0, 0, 0.699999988079071, 0, 0, 0.550000011920929,
+        0, 0, 0.4000000059604645, 0, 2, 0.4000000059604645, 0, 1.75,
+        0.4000000059604645, 0, 1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0,
+        1.75, 0.20000000298023224, 0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612,
+        0, 2, 0.10000000149011612, 0, 1.75, 0, 0, 2,
+        0, 0, 1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0,
+        1.5, 0.20000000298023224, 0, 1.5, 0.10000000149011612, 0, 1.5, 0,
+        0, 1.25, 0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25,
+        0.20000000298023224, 0, 1.25, 0.10000000149011612, 0, 1.25, 0, 0,
+        1, 0.4000000059604645, 0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224,
+        0, 1, 0.10000000149011612, 0, 1, 0, 0, 1,
+        0.4000000059604645, 0, 0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0,
+        1, 0.30000001192092896, 0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224,
+        0, 0.75, 0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75,
+        0, 0, 1, 0, 0, 0.5, 0.4000000059604645, 0,
+        0.5, 0.30000001192092896, 0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612,
+        0, 0.5, 0, 0, 0.25, 0.4000000059604645, 0, 0.25,
+        0.30000001192092896, 0, 0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0,
+        0.25, 0, 0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896,
+        0, 0, 0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0,
+        0, 0, 2, 0.4000000059604645, 0, 1.75, 0.4000000059604645, 0,
+        1.75, 0.30000001192092896, 0, 2, 0.30000001192092896, 0, 1.75, 0.20000000298023224,
+        0, 2, 0.20000000298023224, 0, 1.75, 0.10000000149011612, 0, 2,
+        0.10000000149011612, 0, 1.75, 0, 0, 2, 0, 0,
+        1.5, 0.4000000059604645, 0, 1.5, 0.30000001192092896, 0, 1.5, 0.20000000298023224,
+        0, 1.5, 0.10000000149011612, 0, 1.5, 0, 0, 1.25,
+        0.4000000059604645, 0, 1.25, 0.30000001192092896, 0, 1.25, 0.20000000298023224, 0,
+        1.25, 0.10000000149011612, 0, 1.25, 0, 0, 1, 0.4000000059604645,
+        0, 1, 0.30000001192092896, 0, 1, 0.20000000298023224, 0, 1,
+        0.10000000149011612, 0, 1, 0, 0, 1, 0.4000000059604645, 0,
+        0.75, 0.4000000059604645, 0, 0.75, 0.30000001192092896, 0, 1, 0.30000001192092896,
+        0, 0.75, 0.20000000298023224, 0, 1, 0.20000000298023224, 0, 0.75,
+        0.10000000149011612, 0, 1, 0.10000000149011612, 0, 0.75, 0, 0,
+        1, 0, 0, 0.5, 0.4000000059604645, 0, 0.5, 0.30000001192092896,
+        0, 0.5, 0.20000000298023224, 0, 0.5, 0.10000000149011612, 0, 0.5,
+        0, 0, 0.25, 0.4000000059604645, 0, 0.25, 0.30000001192092896, 0,
+        0.25, 0.20000000298023224, 0, 0.25, 0.10000000149011612, 0, 0.25, 0,
+        0, 0, 0.4000000059604645, 0, 0, 0.30000001192092896, 0, 0,
+        0.20000000298023224, 0, 0, 0.10000000149011612, 0, 0, 0, 0,
+        1, 1, 0, 0.875, 1, 0, 0.875, 0.875,
+        0, 1, 0.875, 0, 0.875, 0.75, 0, 1,
+        0.75, 0, 0.875, 0.625, 0, 1, 0.625, 0,
+        0.875, 0.5, 0, 1, 0.5, 0, 0.75, 1,
+        0, 0.75, 0.875, 0, 0.75, 0.75, 0, 0.75,
+        0.625, 0, 0.75, 0.5, 0, 0.625, 1, 0,
+        0.625, 0.875, 0, 0.625, 0.75, 0, 0.625, 0.625,
+        0, 0.625, 0.5, 0, 0.5, 1, 0, 0.5,
+        0.875, 0, 0.5, 0.75, 0, 0.5, 0.625, 0,
+        0.5, 0.5, 0, 0.5, 1, 0, 0.375, 1,
+        0, 0.375, 0.875, 0, 0.5, 0.875, 0, 0.375,
+        0.75, 0, 0.5, 0.75, 0, 0.375, 0.625, 0,
+        0.5, 0.625, 0, 0.375, 0.5, 0, 0.5, 0.5,
+        0, 0.25, 1, 0, 0.25, 0.875, 0, 0.25,
+        0.75, 0, 0.25, 0.625, 0, 0.25, 0.5, 0,
+        0.125, 1, 0, 0.125, 0.875, 0, 0.125, 0.75,
+        0, 0.125, 0.625, 0, 0.125, 0.5, 0, 0,
+        1, 0, 0, 0.875, 0, 0, 0.75, 0,
+        0, 0.625, 0, 0, 0.5, 0, 1, 0.5,
+        0, 0.875, 0.5, 0, 0.875, 0.375, 0, 1,
+        0.375, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+        0.875, 0.125, 0, 1, 0.125, 0, 0.875, 0,
+        0, 1, 0, 0, 0.75, 0.5, 0, 0.75,
+        0.375, 0, 0.75, 0.25, 0, 0.75, 0.125, 0,
+        0.75, 0, 0, 0.625, 0.5, 0, 0.625, 0.375,
+        0, 0.625, 0.25, 0, 0.625, 0.125, 0, 0.625,
+        0, 0, 0.5, 0.5, 0, 0.5, 0.375, 0,
+        0.5, 0.25, 0, 0.5, 0.125, 0, 0.5, 0,
+        0, 0.5, 0.5, 0, 0.375, 0.5, 0, 0.375,
+        0.375, 0, 0.5, 0.375, 0, 0.375, 0.25, 0,
+        0.5, 0.25, 0, 0.375, 0.125, 0, 0.5, 0.125,
+        0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+        0.5, 0, 0.25, 0.375, 0, 0.25, 0.25, 0,
+        0.25, 0.125, 0, 0.25, 0, 0, 0.125, 0.5,
+        0, 0.125, 0.375, 0, 0.125, 0.25, 0, 0.125,
+        0.125, 0, 0.125, 0, 0, 0, 0.5, 0,
+        0, 0.375, 0, 0, 0.25, 0, 0, 0.125,
+        0, 0, 0, 0, 0.5, 0, 0, 0.625,
+        0, 0, 0.625, 0.22499999403953552, 0, 0.5, 0.22499999403953552, 0,
+        0.625, 0.44999998807907104, 0, 0.5, 0.44999998807907104, 0, 0.625, 0.675000011920929,
+        0, 0.5, 0.675000011920929, 0, 0.625, 0.8999999761581421, 0, 0.5,
+        0.8999999761581421, 0, 0.75, 0, 0, 0.75, 0.22499999403953552, 0,
+        0.75, 0.44999998807907104, 0, 0.75, 0.675000011920929, 0, 0.75, 0.8999999761581421,
+        0, 0.875, 0, 0, 0.875, 0.22499999403953552, 0, 0.875,
+        0.44999998807907104, 0, 0.875, 0.675000011920929, 0, 0.875, 0.8999999761581421, 0,
+        1, 0, 0, 1, 0.22499999403953552, 0, 1, 0.44999998807907104,
+        0, 1, 0.675000011920929, 0, 1, 0.8999999761581421, 0, 0,
+        0, 0, 0.125, 0, 0, 0.125, 0.22499999403953552, 0,
+        0, 0.22499999403953552, 0, 0.125, 0.44999998807907104, 0, 0, 0.44999998807907104,
+        0, 0.125, 0.675000011920929, 0, 0, 0.675000011920929, 0, 0.125,
+        0.8999999761581421, 0, 0, 0.8999999761581421, 0, 0.25, 0, 0,
+        0.25, 0.22499999403953552, 0, 0.25, 0.44999998807907104, 0, 0.25, 0.675000011920929,
+        0, 0.25, 0.8999999761581421, 0, 0.375, 0, 0, 0.375,
+        0.22499999403953552, 0, 0.375, 0.44999998807907104, 0, 0.375, 0.675000011920929, 0,
+        0.375, 0.8999999761581421, 0, 0.5, 0, 0, 0.5, 0.22499999403953552,
+        0, 0.5, 0.44999998807907104, 0, 0.5, 0.675000011920929, 0, 0.5,
+        0.8999999761581421, 0, 0.5, 0.8999999761581421, 0, 0.625, 0.8999999761581421, 0,
+        0.625, 0.925000011920929, 0, 0.5, 0.925000011920929, 0, 0.625, 0.949999988079071,
+        0, 0.5, 0.949999988079071, 0, 0.625, 0.9750000238418579, 0, 0.5,
+        0.9750000238418579, 0, 0.625, 1, 0, 0.5, 1, 0,
+        0.75, 0.8999999761581421, 0, 0.75, 0.925000011920929, 0, 0.75, 0.949999988079071,
+        0, 0.75, 0.9750000238418579, 0, 0.75, 1, 0, 0.875,
+        0.8999999761581421, 0, 0.875, 0.925000011920929, 0, 0.875, 0.949999988079071, 0,
+        0.875, 0.9750000238418579, 0, 0.875, 1, 0, 1, 0.8999999761581421,
+        0, 1, 0.925000011920929, 0, 1, 0.949999988079071, 0, 1,
+        0.9750000238418579, 0, 1, 1, 0, 0, 0.8999999761581421, 0,
+        0.125, 0.8999999761581421, 0, 0.125, 0.925000011920929, 0, 0, 0.925000011920929,
+        0, 0.125, 0.949999988079071, 0, 0, 0.949999988079071, 0, 0.125,
+        0.9750000238418579, 0, 0, 0.9750000238418579, 0, 0.125, 1, 0,
+        0, 1, 0, 0.25, 0.8999999761581421, 0, 0.25, 0.925000011920929,
+        0, 0.25, 0.949999988079071, 0, 0.25, 0.9750000238418579, 0, 0.25,
+        1, 0, 0.375, 0.8999999761581421, 0, 0.375, 0.925000011920929, 0,
+        0.375, 0.949999988079071, 0, 0.375, 0.9750000238418579, 0, 0.375, 1,
+        0, 0.5, 0.8999999761581421, 0, 0.5, 0.925000011920929, 0, 0.5,
+        0.949999988079071, 0, 0.5, 0.9750000238418579, 0, 0.5, 1, 0,
+        1, 1, 0, 0.875, 1, 0, 0.875, 0.75,
+        0, 1, 0.75, 0, 0.875, 0.5, 0, 1,
+        0.5, 0, 0.875, 0.25, 0, 1, 0.25, 0,
+        0.875, 0, 0, 1, 0, 0, 0.75, 1,
+        0, 0.75, 0.75, 0, 0.75, 0.5, 0, 0.75,
+        0.25, 0, 0.75, 0, 0, 0.625, 1, 0,
+        0.625, 0.75, 0, 0.625, 0.5, 0, 0.625, 0.25,
+        0, 0.625, 0, 0, 0.5, 1, 0, 0.5,
+        0.75, 0, 0.5, 0.5, 0, 0.5, 0.25, 0,
+        0.5, 0, 0, 0.5, 1, 0, 0.375, 1,
+        0, 0.375, 0.75, 0, 0.5, 0.75, 0, 0.375,
+        0.5, 0, 0.5, 0.5, 0, 0.375, 0.25, 0,
+        0.5, 0.25, 0, 0.375, 0, 0, 0.5, 0,
+        0, 0.25, 1, 0, 0.25, 0.75, 0, 0.25,
+        0.5, 0, 0.25, 0.25, 0, 0.25, 0, 0,
+        0.125, 1, 0, 0.125, 0.75, 0, 0.125, 0.5,
+        0, 0.125, 0.25, 0, 0.125, 0, 0, 0,
+        1, 0, 0, 0.75, 0, 0, 0.5, 0,
+        0, 0.25, 0, 0, 0, 0, 1, 1,
+        0, 0.875, 1, 0, 0.875, 0.75, 0, 1,
+        0.75, 0, 0.875, 0.5, 0, 1, 0.5, 0,
+        0.875, 0.25, 0, 1, 0.25, 0, 0.875, 0,
+        0, 1, 0, 0, 0.75, 1, 0, 0.75,
+        0.75, 0, 0.75, 0.5, 0, 0.75, 0.25, 0,
+        0.75, 0, 0, 0.625, 1, 0, 0.625, 0.75,
+        0, 0.625, 0.5, 0, 0.625, 0.25, 0, 0.625,
+        0, 0, 0.5, 1, 0, 0.5, 0.75, 0,
+        0.5, 0.5, 0, 0.5, 0.25, 0, 0.5, 0,
+        0, 0.5, 1, 0, 0.375, 1, 0, 0.375,
+        0.75, 0, 0.5, 0.75, 0, 0.375, 0.5, 0,
+        0.5, 0.5, 0, 0.375, 0.25, 0, 0.5, 0.25,
+        0, 0.375, 0, 0, 0.5, 0, 0, 0.25,
+        1, 0, 0.25, 0.75, 0, 0.25, 0.5, 0,
+        0.25, 0.25, 0, 0.25, 0, 0, 0.125, 1,
+        0, 0.125, 0.75, 0, 0.125, 0.5, 0, 0.125,
+        0.25, 0, 0.125, 0, 0, 0, 1, 0,
+        0, 0.75, 0, 0, 0.5, 0, 0, 0.25,
+        0, 0, 0, 0, 1, 1, 0, 0.875,
+        1, 0, 0.875, 0.75, 0, 1, 0.75, 0,
+        0.875, 0.5, 0, 1, 0.5, 0, 0.875, 0.25,
+        0, 1, 0.25, 0, 0.875, 0, 0, 1,
+        0, 0, 0.75, 1, 0, 0.75, 0.75, 0,
+        0.75, 0.5, 0, 0.75, 0.25, 0, 0.75, 0,
+        0, 0.625, 1, 0, 0.625, 0.75, 0, 0.625,
+        0.5, 0, 0.625, 0.25, 0, 0.625, 0, 0,
+        0.5, 1, 0, 0.5, 0.75, 0, 0.5, 0.5,
+        0, 0.5, 0.25, 0, 0.5, 0, 0, 0.5,
+        1, 0, 0.375, 1, 0, 0.375, 0.75, 0,
+        0.5, 0.75, 0, 0.375, 0.5, 0, 0.5, 0.5,
+        0, 0.375, 0.25, 0, 0.5, 0.25, 0, 0.375,
+        0, 0, 0.5, 0, 0, 0.25, 1, 0,
+        0.25, 0.75, 0, 0.25, 0.5, 0, 0.25, 0.25,
+        0, 0.25, 0, 0, 0.125, 1, 0, 0.125,
+        0.75, 0, 0.125, 0.5, 0, 0.125, 0.25, 0,
+        0.125, 0, 0, 0, 1, 0, 0, 0.75,
+        0, 0, 0.5, 0, 0, 0.25, 0, 0,
+        0, 0, 1, 1, 0, 0.875, 1, 0,
+        0.875, 0.75, 0, 1, 0.75, 0, 0.875, 0.5,
+        0, 1, 0.5, 0, 0.875, 0.25, 0, 1,
+        0.25, 0, 0.875, 0, 0, 1, 0, 0,
+        0.75, 1, 0, 0.75, 0.75, 0, 0.75, 0.5,
+        0, 0.75, 0.25, 0, 0.75, 0, 0, 0.625,
+        1, 0, 0.625, 0.75, 0, 0.625, 0.5, 0,
+        0.625, 0.25, 0, 0.625, 0, 0, 0.5, 1,
+        0, 0.5, 0.75, 0, 0.5, 0.5, 0, 0.5,
+        0.25, 0, 0.5, 0, 0, 0.5, 1, 0,
+        0.375, 1, 0, 0.375, 0.75, 0, 0.5, 0.75,
+        0, 0.375, 0.5, 0, 0.5, 0.5, 0, 0.375,
+        0.25, 0, 0.5, 0.25, 0, 0.375, 0, 0,
+        0.5, 0, 0, 0.25, 1, 0, 0.25, 0.75,
+        0, 0.25, 0.5, 0, 0.25, 0.25, 0, 0.25,
+        0, 0, 0.125, 1, 0, 0.125, 0.75, 0,
+        0.125, 0.5, 0, 0.125, 0.25, 0, 0.125, 0,
+        0, 0, 1, 0, 0, 0.75, 0, 0,
+        0.5, 0, 0, 0.25, 0, 0, 0, 0 };
+
+uint16_t  teapotIndices[] = { 0, 1, 2, 2, 3, 0, 3, 2, 4, 4, 5, 3, 5, 4, 6, 6, 7, 5, 7, 6, 8, 8, 9, 7,
+        1, 10, 11, 11, 2, 1, 2, 11, 12, 12, 4, 2, 4, 12, 13, 13, 6, 4, 6, 13, 14, 14, 8, 6,
+        10, 15, 16, 16, 11, 10, 11, 16, 17, 17, 12, 11, 12, 17, 18, 18, 13, 12, 13, 18, 19, 19, 14, 13,
+        15, 20, 21, 21, 16, 15, 16, 21, 22, 22, 17, 16, 17, 22, 23, 23, 18, 17, 18, 23, 24, 24, 19, 18,
+        25, 26, 27, 27, 28, 25, 28, 27, 29, 29, 30, 28, 30, 29, 31, 31, 32, 30, 32, 31, 33, 33, 34, 32,
+        26, 35, 36, 36, 27, 26, 27, 36, 37, 37, 29, 27, 29, 37, 38, 38, 31, 29, 31, 38, 39, 39, 33, 31,
+        35, 40, 41, 41, 36, 35, 36, 41, 42, 42, 37, 36, 37, 42, 43, 43, 38, 37, 38, 43, 44, 44, 39, 38,
+        40, 45, 46, 46, 41, 40, 41, 46, 47, 47, 42, 41, 42, 47, 48, 48, 43, 42, 43, 48, 49, 49, 44, 43,
+        50, 51, 52, 52, 53, 50, 53, 52, 54, 54, 55, 53, 55, 54, 56, 56, 57, 55, 57, 56, 58, 58, 59, 57,
+        51, 60, 61, 61, 52, 51, 52, 61, 62, 62, 54, 52, 54, 62, 63, 63, 56, 54, 56, 63, 64, 64, 58, 56,
+        60, 65, 66, 66, 61, 60, 61, 66, 67, 67, 62, 61, 62, 67, 68, 68, 63, 62, 63, 68, 69, 69, 64, 63,
+        65, 70, 71, 71, 66, 65, 66, 71, 72, 72, 67, 66, 67, 72, 73, 73, 68, 67, 68, 73, 74, 74, 69, 68,
+        75, 76, 77, 77, 78, 75, 78, 77, 79, 79, 80, 78, 80, 79, 81, 81, 82, 80, 82, 81, 83, 83, 84, 82,
+        76, 85, 86, 86, 77, 76, 77, 86, 87, 87, 79, 77, 79, 87, 88, 88, 81, 79, 81, 88, 89, 89, 83, 81,
+        85, 90, 91, 91, 86, 85, 86, 91, 92, 92, 87, 86, 87, 92, 93, 93, 88, 87, 88, 93, 94, 94, 89, 88,
+        90, 95, 96, 96, 91, 90, 91, 96, 97, 97, 92, 91, 92, 97, 98, 98, 93, 92, 93, 98, 99, 99, 94, 93,
+        100, 101, 102, 102, 103, 100, 103, 102, 104, 104, 105, 103, 105, 104, 106, 106, 107, 105, 107, 106, 108, 108, 109, 107,
+        101, 110, 111, 111, 102, 101, 102, 111, 112, 112, 104, 102, 104, 112, 113, 113, 106, 104, 106, 113, 114, 114, 108, 106,
+        110, 115, 116, 116, 111, 110, 111, 116, 117, 117, 112, 111, 112, 117, 118, 118, 113, 112, 113, 118, 119, 119, 114, 113,
+        115, 120, 121, 121, 116, 115, 116, 121, 122, 122, 117, 116, 117, 122, 123, 123, 118, 117, 118, 123, 124, 124, 119, 118,
+        125, 126, 127, 127, 128, 125, 128, 127, 129, 129, 130, 128, 130, 129, 131, 131, 132, 130, 132, 131, 133, 133, 134, 132,
+        126, 135, 136, 136, 127, 126, 127, 136, 137, 137, 129, 127, 129, 137, 138, 138, 131, 129, 131, 138, 139, 139, 133, 131,
+        135, 140, 141, 141, 136, 135, 136, 141, 142, 142, 137, 136, 137, 142, 143, 143, 138, 137, 138, 143, 144, 144, 139, 138,
+        140, 145, 146, 146, 141, 140, 141, 146, 147, 147, 142, 141, 142, 147, 148, 148, 143, 142, 143, 148, 149, 149, 144, 143,
+        150, 151, 152, 152, 153, 150, 153, 152, 154, 154, 155, 153, 155, 154, 156, 156, 157, 155, 157, 156, 158, 158, 159, 157,
+        151, 160, 161, 161, 152, 151, 152, 161, 162, 162, 154, 152, 154, 162, 163, 163, 156, 154, 156, 163, 164, 164, 158, 156,
+        160, 165, 166, 166, 161, 160, 161, 166, 167, 167, 162, 161, 162, 167, 168, 168, 163, 162, 163, 168, 169, 169, 164, 163,
+        165, 170, 171, 171, 166, 165, 166, 171, 172, 172, 167, 166, 167, 172, 173, 173, 168, 167, 168, 173, 174, 174, 169, 168,
+        175, 176, 177, 177, 178, 175, 178, 177, 179, 179, 180, 178, 180, 179, 181, 181, 182, 180, 182, 181, 183, 183, 184, 182,
+        176, 185, 186, 186, 177, 176, 177, 186, 187, 187, 179, 177, 179, 187, 188, 188, 181, 179, 181, 188, 189, 189, 183, 181,
+        185, 190, 191, 191, 186, 185, 186, 191, 192, 192, 187, 186, 187, 192, 193, 193, 188, 187, 188, 193, 194, 194, 189, 188,
+        190, 195, 196, 196, 191, 190, 191, 196, 197, 197, 192, 191, 192, 197, 198, 198, 193, 192, 193, 198, 199, 199, 194, 193,
+        200, 201, 202, 202, 203, 200, 203, 202, 204, 204, 205, 203, 205, 204, 206, 206, 207, 205, 207, 206, 208, 208, 209, 207,
+        201, 210, 211, 211, 202, 201, 202, 211, 212, 212, 204, 202, 204, 212, 213, 213, 206, 204, 206, 213, 214, 214, 208, 206,
+        210, 215, 216, 216, 211, 210, 211, 216, 217, 217, 212, 211, 212, 217, 218, 218, 213, 212, 213, 218, 219, 219, 214, 213,
+        215, 220, 221, 221, 216, 215, 216, 221, 222, 222, 217, 216, 217, 222, 223, 223, 218, 217, 218, 223, 224, 224, 219, 218,
+        225, 226, 227, 227, 228, 225, 228, 227, 229, 229, 230, 228, 230, 229, 231, 231, 232, 230, 232, 231, 233, 233, 234, 232,
+        226, 235, 236, 236, 227, 226, 227, 236, 237, 237, 229, 227, 229, 237, 238, 238, 231, 229, 231, 238, 239, 239, 233, 231,
+        235, 240, 241, 241, 236, 235, 236, 241, 242, 242, 237, 236, 237, 242, 243, 243, 238, 237, 238, 243, 244, 244, 239, 238,
+        240, 245, 246, 246, 241, 240, 241, 246, 247, 247, 242, 241, 242, 247, 248, 248, 243, 242, 243, 248, 249, 249, 244, 243,
+        250, 251, 252, 252, 253, 250, 253, 252, 254, 254, 255, 253, 255, 254, 256, 256, 257, 255, 257, 256, 258, 258, 259, 257,
+        251, 260, 261, 261, 252, 251, 252, 261, 262, 262, 254, 252, 254, 262, 263, 263, 256, 254, 256, 263, 264, 264, 258, 256,
+        260, 265, 266, 266, 261, 260, 261, 266, 267, 267, 262, 261, 262, 267, 268, 268, 263, 262, 263, 268, 269, 269, 264, 263,
+        265, 270, 271, 271, 266, 265, 266, 271, 272, 272, 267, 266, 267, 272, 273, 273, 268, 267, 268, 273, 274, 274, 269, 268,
+        275, 276, 277, 277, 278, 275, 278, 277, 279, 279, 280, 278, 280, 279, 281, 281, 282, 280, 282, 281, 283, 283, 284, 282,
+        276, 285, 286, 286, 277, 276, 277, 286, 287, 287, 279, 277, 279, 287, 288, 288, 281, 279, 281, 288, 289, 289, 283, 281,
+        285, 290, 291, 291, 286, 285, 286, 291, 292, 292, 287, 286, 287, 292, 293, 293, 288, 287, 288, 293, 294, 294, 289, 288,
+        290, 295, 296, 296, 291, 290, 291, 296, 297, 297, 292, 291, 292, 297, 298, 298, 293, 292, 293, 298, 299, 299, 294, 293,
+        300, 301, 302, 302, 303, 300, 303, 302, 304, 304, 305, 303, 305, 304, 306, 306, 307, 305, 307, 306, 308, 308, 309, 307,
+        301, 310, 311, 311, 302, 301, 302, 311, 312, 312, 304, 302, 304, 312, 313, 313, 306, 304, 306, 313, 314, 314, 308, 306,
+        310, 315, 316, 316, 311, 310, 311, 316, 317, 317, 312, 311, 312, 317, 318, 318, 313, 312, 313, 318, 319, 319, 314, 313,
+        315, 320, 321, 321, 316, 315, 316, 321, 322, 322, 317, 316, 317, 322, 323, 323, 318, 317, 318, 323, 324, 324, 319, 318,
+        325, 326, 327, 327, 328, 325, 328, 327, 329, 329, 330, 328, 330, 329, 331, 331, 332, 330, 332, 331, 333, 333, 334, 332,
+        326, 335, 336, 336, 327, 326, 327, 336, 337, 337, 329, 327, 329, 337, 338, 338, 331, 329, 331, 338, 339, 339, 333, 331,
+        335, 340, 341, 341, 336, 335, 336, 341, 342, 342, 337, 336, 337, 342, 343, 343, 338, 337, 338, 343, 344, 344, 339, 338,
+        340, 345, 346, 346, 341, 340, 341, 346, 347, 347, 342, 341, 342, 347, 348, 348, 343, 342, 343, 348, 349, 349, 344, 343,
+        350, 351, 352, 352, 353, 350, 353, 352, 354, 354, 355, 353, 355, 354, 356, 356, 357, 355, 357, 356, 358, 358, 359, 357,
+        351, 360, 361, 361, 352, 351, 352, 361, 362, 362, 354, 352, 354, 362, 363, 363, 356, 354, 356, 363, 364, 364, 358, 356,
+        360, 365, 366, 366, 361, 360, 361, 366, 367, 367, 362, 361, 362, 367, 368, 368, 363, 362, 363, 368, 369, 369, 364, 363,
+        365, 370, 371, 371, 366, 365, 366, 371, 372, 372, 367, 366, 367, 372, 373, 373, 368, 367, 368, 373, 374, 374, 369, 368,
+        375, 376, 377, 377, 378, 375, 378, 377, 379, 379, 380, 378, 380, 379, 381, 381, 382, 380, 382, 381, 383, 383, 384, 382,
+        376, 385, 386, 386, 377, 376, 377, 386, 387, 387, 379, 377, 379, 387, 388, 388, 381, 379, 381, 388, 389, 389, 383, 381,
+        385, 390, 391, 391, 386, 385, 386, 391, 392, 392, 387, 386, 387, 392, 393, 393, 388, 387, 388, 393, 394, 394, 389, 388,
+        390, 395, 396, 396, 391, 390, 391, 396, 397, 397, 392, 391, 392, 397, 398, 398, 393, 392, 393, 398, 399, 399, 394, 393,
+        400, 401, 402, 402, 403, 400, 403, 402, 404, 404, 405, 403, 405, 404, 406, 406, 407, 405, 407, 406, 408, 408, 409, 407,
+        401, 410, 411, 411, 402, 401, 402, 411, 412, 412, 404, 402, 404, 412, 413, 413, 406, 404, 406, 413, 414, 414, 408, 406,
+        410, 415, 416, 416, 411, 410, 411, 416, 417, 417, 412, 411, 412, 417, 418, 418, 413, 412, 413, 418, 419, 419, 414, 413,
+        415, 420, 421, 421, 416, 415, 416, 421, 422, 422, 417, 416, 417, 422, 423, 423, 418, 417, 418, 423, 424, 424, 419, 418,
+        425, 426, 427, 427, 428, 425, 428, 427, 429, 429, 430, 428, 430, 429, 431, 431, 432, 430, 432, 431, 433, 433, 434, 432,
+        426, 435, 436, 436, 427, 426, 427, 436, 437, 437, 429, 427, 429, 437, 438, 438, 431, 429, 431, 438, 439, 439, 433, 431,
+        435, 440, 441, 441, 436, 435, 436, 441, 442, 442, 437, 436, 437, 442, 443, 443, 438, 437, 438, 443, 444, 444, 439, 438,
+        440, 445, 446, 446, 441, 440, 441, 446, 447, 447, 442, 441, 442, 447, 448, 448, 443, 442, 443, 448, 449, 449, 444, 443,
+        450, 451, 452, 452, 453, 450, 453, 452, 454, 454, 455, 453, 455, 454, 456, 456, 457, 455, 457, 456, 458, 458, 459, 457,
+        451, 460, 461, 461, 452, 451, 452, 461, 462, 462, 454, 452, 454, 462, 463, 463, 456, 454, 456, 463, 464, 464, 458, 456,
+        460, 465, 466, 466, 461, 460, 461, 466, 467, 467, 462, 461, 462, 467, 468, 468, 463, 462, 463, 468, 469, 469, 464, 463,
+        465, 470, 471, 471, 466, 465, 466, 471, 472, 472, 467, 466, 467, 472, 473, 473, 468, 467, 468, 473, 474, 474, 469, 468,
+        475, 476, 477, 477, 478, 475, 478, 477, 479, 479, 480, 478, 480, 479, 481, 481, 482, 480, 482, 481, 483, 483, 484, 482,
+        476, 485, 486, 486, 477, 476, 477, 486, 487, 487, 479, 477, 479, 487, 488, 488, 481, 479, 481, 488, 489, 489, 483, 481,
+        485, 490, 491, 491, 486, 485, 486, 491, 492, 492, 487, 486, 487, 492, 493, 493, 488, 487, 488, 493, 494, 494, 489, 488,
+        490, 495, 496, 496, 491, 490, 491, 496, 497, 497, 492, 491, 492, 497, 498, 498, 493, 492, 493, 498, 499, 499, 494, 493,
+        500, 501, 502, 502, 503, 500, 503, 502, 504, 504, 505, 503, 505, 504, 506, 506, 507, 505, 507, 506, 508, 508, 509, 507,
+        501, 510, 511, 511, 502, 501, 502, 511, 512, 512, 504, 502, 504, 512, 513, 513, 506, 504, 506, 513, 514, 514, 508, 506,
+        510, 515, 516, 516, 511, 510, 511, 516, 517, 517, 512, 511, 512, 517, 518, 518, 513, 512, 513, 518, 519, 519, 514, 513,
+        515, 520, 521, 521, 516, 515, 516, 521, 522, 522, 517, 516, 517, 522, 523, 523, 518, 517, 518, 523, 524, 524, 519, 518,
+        525, 526, 527, 527, 528, 525, 528, 527, 529, 529, 530, 528, 530, 529, 531, 531, 532, 530, 532, 531, 533, 533, 534, 532,
+        526, 535, 536, 536, 527, 526, 527, 536, 537, 537, 529, 527, 529, 537, 538, 538, 531, 529, 531, 538, 539, 539, 533, 531,
+        535, 540, 541, 541, 536, 535, 536, 541, 542, 542, 537, 536, 537, 542, 543, 543, 538, 537, 538, 543, 544, 544, 539, 538,
+        540, 545, 546, 546, 541, 540, 541, 546, 547, 547, 542, 541, 542, 547, 548, 548, 543, 542, 543, 548, 549, 549, 544, 543,
+        550, 551, 552, 552, 553, 550, 553, 552, 554, 554, 555, 553, 555, 554, 556, 556, 557, 555, 557, 556, 558, 558, 559, 557,
+        551, 560, 561, 561, 552, 551, 552, 561, 562, 562, 554, 552, 554, 562, 563, 563, 556, 554, 556, 563, 564, 564, 558, 556,
+        560, 565, 566, 566, 561, 560, 561, 566, 567, 567, 562, 561, 562, 567, 568, 568, 563, 562, 563, 568, 569, 569, 564, 563,
+        565, 570, 571, 571, 566, 565, 566, 571, 572, 572, 567, 566, 567, 572, 573, 573, 568, 567, 568, 573, 574, 574, 569, 568,
+        575, 576, 577, 577, 578, 575, 578, 577, 579, 579, 580, 578, 580, 579, 581, 581, 582, 580, 582, 581, 583, 583, 584, 582,
+        576, 585, 586, 586, 577, 576, 577, 586, 587, 587, 579, 577, 579, 587, 588, 588, 581, 579, 581, 588, 589, 589, 583, 581,
+        585, 590, 591, 591, 586, 585, 586, 591, 592, 592, 587, 586, 587, 592, 593, 593, 588, 587, 588, 593, 594, 594, 589, 588,
+        590, 595, 596, 596, 591, 590, 591, 596, 597, 597, 592, 591, 592, 597, 598, 598, 593, 592, 593, 598, 599, 599, 594, 593,
+        600, 601, 602, 602, 603, 600, 603, 602, 604, 604, 605, 603, 605, 604, 606, 606, 607, 605, 607, 606, 608, 608, 609, 607,
+        601, 610, 611, 611, 602, 601, 602, 611, 612, 612, 604, 602, 604, 612, 613, 613, 606, 604, 606, 613, 614, 614, 608, 606,
+        610, 615, 616, 616, 611, 610, 611, 616, 617, 617, 612, 611, 612, 617, 618, 618, 613, 612, 613, 618, 619, 619, 614, 613,
+        615, 620, 621, 621, 616, 615, 616, 621, 622, 622, 617, 616, 617, 622, 623, 623, 618, 617, 618, 623, 624, 624, 619, 618,
+        625, 626, 627, 627, 628, 625, 628, 627, 629, 629, 630, 628, 630, 629, 631, 631, 632, 630, 632, 631, 633, 633, 634, 632,
+        626, 635, 636, 636, 627, 626, 627, 636, 637, 637, 629, 627, 629, 637, 638, 638, 631, 629, 631, 638, 639, 639, 633, 631,
+        635, 640, 641, 641, 636, 635, 636, 641, 642, 642, 637, 636, 637, 642, 643, 643, 638, 637, 638, 643, 644, 644, 639, 638,
+        640, 645, 646, 646, 641, 640, 641, 646, 647, 647, 642, 641, 642, 647, 648, 648, 643, 642, 643, 648, 649, 649, 644, 643,
+        650, 651, 652, 652, 653, 650, 653, 652, 654, 654, 655, 653, 655, 654, 656, 656, 657, 655, 657, 656, 658, 658, 659, 657,
+        651, 660, 661, 661, 652, 651, 652, 661, 662, 662, 654, 652, 654, 662, 663, 663, 656, 654, 656, 663, 664, 664, 658, 656,
+        660, 665, 666, 666, 661, 660, 661, 666, 667, 667, 662, 661, 662, 667, 668, 668, 663, 662, 663, 668, 669, 669, 664, 663,
+        665, 670, 671, 671, 666, 665, 666, 671, 672, 672, 667, 666, 667, 672, 673, 673, 668, 667, 668, 673, 674, 674, 669, 668,
+        675, 676, 677, 677, 678, 675, 678, 677, 679, 679, 680, 678, 680, 679, 681, 681, 682, 680, 682, 681, 683, 683, 684, 682,
+        676, 685, 686, 686, 677, 676, 677, 686, 687, 687, 679, 677, 679, 687, 688, 688, 681, 679, 681, 688, 689, 689, 683, 681,
+        685, 690, 691, 691, 686, 685, 686, 691, 692, 692, 687, 686, 687, 692, 693, 693, 688, 687, 688, 693, 694, 694, 689, 688,
+        690, 695, 696, 696, 691, 690, 691, 696, 697, 697, 692, 691, 692, 697, 698, 698, 693, 692, 693, 698, 699, 699, 694, 693,
+        700, 701, 702, 702, 703, 700, 703, 702, 704, 704, 705, 703, 705, 704, 706, 706, 707, 705, 707, 706, 708, 708, 709, 707,
+        701, 710, 711, 711, 702, 701, 702, 711, 712, 712, 704, 702, 704, 712, 713, 713, 706, 704, 706, 713, 714, 714, 708, 706,
+        710, 715, 716, 716, 711, 710, 711, 716, 717, 717, 712, 711, 712, 717, 718, 718, 713, 712, 713, 718, 719, 719, 714, 713,
+        715, 720, 721, 721, 716, 715, 716, 721, 722, 722, 717, 716, 717, 722, 723, 723, 718, 717, 718, 723, 724, 724, 719, 718,
+        725, 726, 727, 727, 728, 725, 728, 727, 729, 729, 730, 728, 730, 729, 731, 731, 732, 730, 732, 731, 733, 733, 734, 732,
+        726, 735, 736, 736, 727, 726, 727, 736, 737, 737, 729, 727, 729, 737, 738, 738, 731, 729, 731, 738, 739, 739, 733, 731,
+        735, 740, 741, 741, 736, 735, 736, 741, 742, 742, 737, 736, 737, 742, 743, 743, 738, 737, 738, 743, 744, 744, 739, 738,
+        740, 745, 746, 746, 741, 740, 741, 746, 747, 747, 742, 741, 742, 747, 748, 748, 743, 742, 743, 748, 749, 749, 744, 743,
+        750, 751, 752, 752, 753, 750, 753, 752, 754, 754, 755, 753, 755, 754, 756, 756, 757, 755, 757, 756, 758, 758, 759, 757,
+        751, 760, 761, 761, 752, 751, 752, 761, 762, 762, 754, 752, 754, 762, 763, 763, 756, 754, 756, 763, 764, 764, 758, 756,
+        760, 765, 766, 766, 761, 760, 761, 766, 767, 767, 762, 761, 762, 767, 768, 768, 763, 762, 763, 768, 769, 769, 764, 763,
+        765, 770, 771, 771, 766, 765, 766, 771, 772, 772, 767, 766, 767, 772, 773, 773, 768, 767, 768, 773, 774, 774, 769, 768,
+        775, 776, 777, 777, 778, 775, 778, 777, 779, 779, 780, 778, 780, 779, 781, 781, 782, 780, 782, 781, 783, 783, 784, 782,
+        776, 785, 786, 786, 777, 776, 777, 786, 787, 787, 779, 777, 779, 787, 788, 788, 781, 779, 781, 788, 789, 789, 783, 781,
+        785, 790, 791, 791, 786, 785, 786, 791, 792, 792, 787, 786, 787, 792, 793, 793, 788, 787, 788, 793, 794, 794, 789, 788,
+        790, 795, 796, 796, 791, 790, 791, 796, 797, 797, 792, 791, 792, 797, 798, 798, 793, 792, 793, 798, 799, 799, 794, 793 };
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/lint.xml b/ndk/platforms/android-18/samples/MoreTeapots/lint.xml
new file mode 100644
index 0000000..ee0eead
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/lint.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+</lint>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/project.properties b/ndk/platforms/android-18/samples/MoreTeapots/project.properties
new file mode 100644
index 0000000..d5ad9f8
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=Google Inc.:Google APIs:19
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..ea01cbf
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..a3d6a18
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8f80897
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..b779a2b
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml
new file mode 100644
index 0000000..36b64f3
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/layout/widgets.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="top"
+    android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/textViewFPS"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="right"
+        android:text="0.0 FPS"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="@android:color/white" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml
new file mode 100644
index 0000000..541752f
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+
+    <!--
+        Base application theme for API 11+. This theme completely replaces
+        AppBaseTheme from res/values/styles.xml on API 11+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+        <!-- API 11 theme customizations can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml
new file mode 100644
index 0000000..f20e015
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+<resources>
+
+    <!--
+        Base application theme for API 14+. This theme completely replaces
+        AppBaseTheme from BOTH res/values/styles.xml and
+        res/values-v11/styles.xml on API 14+ devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
+        <!-- API 14 theme customizations can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml
new file mode 100644
index 0000000..c6620a9
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values/strings.xml
@@ -0,0 +1,5 @@
+<resources>
+
+    <string name="app_name">More Teapots</string>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml b/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml
new file mode 100644
index 0000000..4a10ca4
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/res/values/styles.xml
@@ -0,0 +1,20 @@
+<resources>
+
+    <!--
+        Base application theme, dependent on API level. This theme is replaced
+        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+    -->
+    <style name="AppBaseTheme" parent="android:Theme.Light">
+        <!--
+            Theme customizations available in newer API levels can go in
+            res/values-vXX/styles.xml, while customizations related to
+            backward-compatibility can go here.
+        -->
+    </style>
+
+    <!-- Application theme. -->
+    <style name="AppTheme" parent="AppBaseTheme">
+        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
new file mode 100644
index 0000000..c864e72
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.helper;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.opengl.GLUtils;
+import android.util.Log;
+
+public class NDKHelper
+{
+    private static Context context;
+
+    public static void setContext(Context c)
+    {
+        Log.i("NDKHelper", "setContext:" + c);
+        context = c;
+    }
+
+    //
+    // Load Bitmap
+    // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+    // etc separately
+    //
+    private int nextPOT(int i)
+    {
+        int pot = 1;
+        while (pot < i)
+            pot <<= 1;
+        return pot;
+    }
+
+    private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
+    {
+        if (bitmapToScale == null)
+            return null;
+        // get the original width and height
+        int width = bitmapToScale.getWidth();
+        int height = bitmapToScale.getHeight();
+        // create a matrix for the manipulation
+        Matrix matrix = new Matrix();
+
+        // resize the bit map
+        matrix.postScale(newWidth / width, newHeight / height);
+
+        // recreate the new Bitmap and set it back
+        return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+                bitmapToScale.getHeight(), matrix, true);
+    }
+
+    public boolean loadTexture(String path)
+    {
+        Bitmap bitmap = null;
+        try
+        {
+            String str = path;
+            if (!path.startsWith("/"))
+            {
+                str = "/" + path;
+            }
+
+            File file = new File(context.getExternalFilesDir(null), str);
+            if (file.canRead())
+            {
+                bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
+            } else
+            {
+                bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+                        .open(path));
+            }
+            // Matrix matrix = new Matrix();
+            // // resize the bit map
+            // matrix.postScale(-1F, 1F);
+            //
+            // // recreate the new Bitmap and set it back
+            // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+            // bitmap.getHeight(), matrix, true);
+
+        } catch (Exception e)
+        {
+            Log.w("NDKHelper", "Coundn't load a file:" + path);
+            return false;
+        }
+
+        if (bitmap != null)
+        {
+            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
+        }
+        return true;
+
+    }
+
+    public Bitmap openBitmap(String path, boolean iScalePOT)
+    {
+        Bitmap bitmap = null;
+        try
+        {
+            bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+                    .open(path));
+            if (iScalePOT)
+            {
+                int originalWidth = getBitmapWidth(bitmap);
+                int originalHeight = getBitmapHeight(bitmap);
+                int width = nextPOT(originalWidth);
+                int height = nextPOT(originalHeight);
+                if (originalWidth != width || originalHeight != height)
+                {
+                    // Scale it
+                    bitmap = scaleBitmap(bitmap, width, height);
+                }
+            }
+
+        } catch (Exception e)
+        {
+            Log.w("NDKHelper", "Coundn't load a file:" + path);
+        }
+
+        return bitmap;
+    }
+
+    public int getBitmapWidth(Bitmap bmp)
+    {
+        return bmp.getWidth();
+    }
+
+    public int getBitmapHeight(Bitmap bmp)
+    {
+        return bmp.getHeight();
+    }
+
+    public void getBitmapPixels(Bitmap bmp, int[] pixels)
+    {
+        int w = bmp.getWidth();
+        int h = bmp.getHeight();
+        bmp.getPixels(pixels, 0, w, 0, 0, w, h);
+    }
+
+    public void closeBitmap(Bitmap bmp)
+    {
+        bmp.recycle();
+    }
+
+    public static String getNativeLibraryDirectory(Context appContext)
+    {
+        ApplicationInfo ai = context.getApplicationInfo();
+
+        Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
+
+        if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+                || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+        {
+            return ai.nativeLibraryDir;
+        }
+        return "/system/lib/";
+    }
+
+    public int getNativeAudioBufferSize()
+    {
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        if (SDK_INT >= 17)
+        {
+            AudioManager am = (AudioManager) context
+                    .getSystemService(Context.AUDIO_SERVICE);
+            String framesPerBuffer = am
+                    .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+            return Integer.parseInt(framesPerBuffer);
+        } else
+        {
+            return 0;
+        }
+    }
+
+    public int getNativeAudioSampleRate()
+    {
+        return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+    }
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
new file mode 100644
index 0000000..b37d75a
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.moreteapots;
+
+import javax.microedition.khronos.opengles.GL10;
+
+import com.sample.helper.NDKHelper;
+
+import android.app.Application;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.opengl.GLUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+public class MoreTeapotsApplication extends Application {
+    private static Context context;
+    public void onCreate(){
+        context=getApplicationContext();
+        NDKHelper.setContext(context);
+        Log.w("native-activity", "onCreate");
+
+        final PackageManager pm = getApplicationContext().getPackageManager();
+        ApplicationInfo ai;
+        try {
+            ai = pm.getApplicationInfo( this.getPackageName(), 0);
+        } catch (final NameNotFoundException e) {
+            ai = null;
+        }
+        final String applicationName = (String) (ai != null ? pm.getApplicationLabel(ai) : "(unknown)");
+        Toast.makeText(this, applicationName, Toast.LENGTH_SHORT).show();
+    }
+
+}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
new file mode 100644
index 0000000..14fe1ba
--- /dev/null
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.sample.moreteapots;
+
+import android.app.NativeActivity;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup.MarginLayoutParams;
+import android.view.WindowManager.LayoutParams;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+public class MoreTeapotsNativeActivity extends NativeActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        //Hide toolbar
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        Log.i("OnCreate", "OnCreate!!!");
+        if(SDK_INT >= 19)
+        {
+            setImmersiveSticky();
+            View decorView = getWindow().getDecorView();
+            decorView.setOnSystemUiVisibilityChangeListener
+                    (new View.OnSystemUiVisibilityChangeListener() {
+                @Override
+                public void onSystemUiVisibilityChange(int visibility) {
+                    setImmersiveSticky();
+                }
+            });
+        }
+
+    }
+
+    protected void onResume() {
+        super.onResume();
+
+        //Hide toolbar
+        int SDK_INT = android.os.Build.VERSION.SDK_INT;
+        if(SDK_INT >= 11 && SDK_INT < 14)
+        {
+            getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
+        }
+        else if(SDK_INT >= 14 && SDK_INT < 19)
+        {
+            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LOW_PROFILE);
+        }
+        else if(SDK_INT >= 19)
+        {
+            setImmersiveSticky();
+        }
+    }
+
+    protected void onPause()
+    {
+        super.onPause();
+        if (_popupWindow != null) {
+
+            _popupWindow.dismiss();
+            _popupWindow = null;
+        }
+    }
+    // Our popup window, you will call it from your C/C++ code later
+
+    void setImmersiveSticky() {
+        View decorView = getWindow().getDecorView();
+        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+    }
+
+    MoreTeapotsNativeActivity _activity;
+    PopupWindow _popupWindow;
+    TextView _label;
+
+    public void showUI()
+    {
+        if( _popupWindow != null )
+            return;
+
+        _activity = this;
+
+        this.runOnUiThread(new Runnable()  {
+            @Override
+            public void run()  {
+                LayoutInflater layoutInflater
+                = (LayoutInflater)getBaseContext()
+                .getSystemService(LAYOUT_INFLATER_SERVICE);
+                View popupView = layoutInflater.inflate(R.layout.widgets, null);
+                _popupWindow = new PopupWindow(
+                        popupView,
+                        LayoutParams.WRAP_CONTENT,
+                        LayoutParams.WRAP_CONTENT);
+
+                LinearLayout mainLayout = new LinearLayout(_activity);
+                MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+                params.setMargins(0, 0, 0, 0);
+                _activity.setContentView(mainLayout, params);
+
+                // Show our UI over NativeActivity window
+                _popupWindow.showAtLocation(mainLayout, Gravity.TOP | Gravity.LEFT, 10, 10);
+                _popupWindow.update();
+
+                _label = (TextView)popupView.findViewById(R.id.textViewFPS);
+
+            }});
+    }
+
+    public void updateFPS(final float fFPS)
+    {
+        if( _label == null )
+            return;
+
+        _activity = this;
+        this.runOnUiThread(new Runnable()  {
+            @Override
+            public void run()  {
+                _label.setText(String.format("%2.2f FPS", fFPS));
+            }});
+    }
+}
+
+
diff --git a/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..1b31038
--- /dev/null
+++ b/ndk/platforms/android-19/arch-arm/symbols/libc.so.functions.txt
@@ -0,0 +1,1086 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+_Unwind_Backtrace
+_Unwind_Complete
+_Unwind_DeleteException
+_Unwind_ForcedUnwind
+_Unwind_GetCFA
+_Unwind_GetDataRelBase
+_Unwind_GetLanguageSpecificData
+_Unwind_GetRegionStart
+_Unwind_GetTextRelBase
+_Unwind_RaiseException
+_Unwind_Resume
+_Unwind_Resume_or_Rethrow
+_Unwind_VRS_Get
+_Unwind_VRS_Pop
+_Unwind_VRS_Set
+___Unwind_Backtrace
+___Unwind_ForcedUnwind
+___Unwind_RaiseException
+___Unwind_Resume
+___Unwind_Resume_or_Rethrow
+__adddf3
+__addsf3
+__aeabi_atexit
+__aeabi_cdcmpeq
+__aeabi_cdcmple
+__aeabi_cdrcmple
+__aeabi_d2f
+__aeabi_d2iz
+__aeabi_dadd
+__aeabi_dcmpeq
+__aeabi_dcmpge
+__aeabi_dcmpgt
+__aeabi_dcmple
+__aeabi_dcmplt
+__aeabi_dcmpun
+__aeabi_ddiv
+__aeabi_dmul
+__aeabi_drsub
+__aeabi_dsub
+__aeabi_f2d
+__aeabi_f2iz
+__aeabi_fadd
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2d
+__aeabi_i2f
+__aeabi_idiv
+__aeabi_idiv0
+__aeabi_idivmod
+__aeabi_l2d
+__aeabi_l2f
+__aeabi_ldiv0
+__aeabi_ldivmod
+__aeabi_lmul
+__aeabi_memclr
+__aeabi_memclr4
+__aeabi_memclr8
+__aeabi_memcpy
+__aeabi_memcpy4
+__aeabi_memcpy8
+__aeabi_memmove
+__aeabi_memmove4
+__aeabi_memmove8
+__aeabi_memset
+__aeabi_memset4
+__aeabi_memset8
+__aeabi_ui2d
+__aeabi_ui2f
+__aeabi_uidiv
+__aeabi_uidivmod
+__aeabi_ul2d
+__aeabi_ul2f
+__aeabi_uldivmod
+__aeabi_unwind_cpp_pr0
+__aeabi_unwind_cpp_pr1
+__aeabi_unwind_cpp_pr2
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__bionic_clone
+__bionic_clone_entry
+__bionic_libgcc_compat_hooks
+__brk
+__cmpdf2
+__cxa_atexit
+__cxa_finalize
+__div0
+__divdf3
+__divdi3
+__divsf3
+__divsi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__eqdf2
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__extendsfdf2
+__fcntl
+__fcntl64
+__findenv
+__fixdfsi
+__fixsfsi
+__floatdidf
+__floatdisf
+__floatsidf
+__floatsisf
+__floatundidf
+__floatundisf
+__floatunsidf
+__floatunsisf
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__gedf2
+__get_h_errno
+__get_pc
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__getcwd
+__getpriority
+__gnu_Unwind_Backtrace
+__gnu_Unwind_Find_exidx
+__gnu_Unwind_ForcedUnwind
+__gnu_Unwind_RaiseException
+__gnu_Unwind_Restore_VFP
+__gnu_Unwind_Restore_VFP_D
+__gnu_Unwind_Restore_VFP_D_16_to_31
+__gnu_Unwind_Restore_WMMXC
+__gnu_Unwind_Restore_WMMXD
+__gnu_Unwind_Resume
+__gnu_Unwind_Resume_or_Rethrow
+__gnu_Unwind_Save_VFP
+__gnu_Unwind_Save_VFP_D
+__gnu_Unwind_Save_VFP_D_16_to_31
+__gnu_Unwind_Save_WMMXC
+__gnu_Unwind_Save_WMMXD
+__gnu_ldivmod_helper
+__gnu_uldivmod_helper
+__gnu_unwind_execute
+__gnu_unwind_frame
+__gtdf2
+__hostalias
+__init_tls
+__ioctl
+__ledf2
+__libc_android_abort
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__ltdf2
+__memcmp16
+__mmap2
+__muldf3
+__muldi3
+__mulsf3
+__nedf2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__restore_core_regs
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__subdf3
+__subsf3
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__truncdfsf2
+__udivdi3
+__udivsi3
+__unorddf2
+__unordsf2
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+restore_core_regs
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+wait4
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-arm/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..7451547
--- /dev/null
+++ b/ndk/platforms/android-19/arch-mips/symbols/libc.so.functions.txt
@@ -0,0 +1,952 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__atomic_cmpxchg
+__atomic_dec
+__atomic_inc
+__atomic_swap
+__b64_ntop
+__b64_pton
+__brk
+__clone_thread_start
+__cxa_atexit
+__cxa_finalize
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__memcmp16
+__mmap2
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_flush_cache
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atexit
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+cacheflush
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+ffs
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimes
+utimensat
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+wait4
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-mips/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt b/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt
new file mode 100644
index 0000000..8fefa5f
--- /dev/null
+++ b/ndk/platforms/android-19/arch-x86/symbols/libc.so.functions.txt
@@ -0,0 +1,946 @@
+MD5_Final
+MD5_Init
+MD5_Update
+SHA1Final
+SHA1Init
+SHA1Transform
+SHA1Update
+__arc4_getbyte
+__assert
+__assert2
+__atexit_register_cleanup
+__b64_ntop
+__b64_pton
+__brk
+__cxa_atexit
+__cxa_finalize
+__divdi3
+__dn_comp
+__dn_count_labels
+__dn_skipname
+__dorand48
+__dtoa
+__errno
+__evAddTime
+__evCmpTime
+__evConsIovec
+__evConsTime
+__evNowTime
+__evSubTime
+__evTimeSpec
+__evTimeVal
+__evUTCTime
+__fcntl
+__fcntl64
+__findenv
+__fork
+__fp_nquery
+__fp_query
+__fremovelock
+__fstatfs64
+__futex_syscall3
+__futex_syscall4
+__futex_wait
+__futex_wait_ex
+__futex_wake
+__futex_wake_ex
+__get_h_errno
+__get_res_cache
+__get_sp
+__get_stack_base
+__get_thread
+__get_tls
+__getcwd
+__getpriority
+__hostalias
+__init_tls
+__ioctl
+__libc_android_log_assert
+__libc_android_log_print
+__libc_android_log_vprint
+__libc_fini
+__libc_init
+__libc_init_common
+__libc_preinit
+__llseek
+__loc_aton
+__loc_ntoa
+__mmap2
+__moddi3
+__ns_format_ttl
+__ns_get16
+__ns_get32
+__ns_initparse
+__ns_makecanon
+__ns_msg_getflag
+__ns_name_compress
+__ns_name_ntol
+__ns_name_ntop
+__ns_name_pack
+__ns_name_pton
+__ns_name_rollback
+__ns_name_skip
+__ns_name_uncompress
+__ns_name_unpack
+__ns_parserr
+__ns_put16
+__ns_put32
+__ns_samename
+__ns_skiprr
+__ns_sprintrr
+__ns_sprintrrf
+__open
+__openat
+__p_cdname
+__p_cdnname
+__p_class
+__p_fqname
+__p_fqnname
+__p_option
+__p_query
+__p_rcode
+__p_secstodate
+__p_section
+__p_sockun
+__p_time
+__p_type
+__pread64
+__pthread_cleanup_pop
+__pthread_cleanup_push
+__pthread_clone
+__pthread_cond_timedwait
+__pthread_cond_timedwait_relative
+__ptrace
+__putlong
+__putshort
+__pwrite64
+__reboot
+__res_close
+__res_dnok
+__res_get_nibblesuffix
+__res_get_nibblesuffix2
+__res_get_state
+__res_get_static
+__res_getservers
+__res_hnok
+__res_hostalias
+__res_isourserver
+__res_mailok
+__res_nameinquery
+__res_nametoclass
+__res_nametotype
+__res_nclose
+__res_ndestroy
+__res_ninit
+__res_nmkquery
+__res_nopt
+__res_nquery
+__res_nquerydomain
+__res_nsearch
+__res_nsend
+__res_opt
+__res_ourserver_p
+__res_ownok
+__res_pquery
+__res_put_state
+__res_queriesmatch
+__res_querydomain
+__res_randomid
+__res_send
+__res_send_setqhook
+__res_send_setrhook
+__res_setservers
+__res_vinit
+__rt_sigaction
+__rt_sigprocmask
+__rt_sigtimedwait
+__sclose
+__set_syscall_errno
+__set_thread_area
+__set_tls
+__setresuid
+__setreuid
+__setuid
+__sflags
+__sflush
+__sfp
+__sfvwrite
+__sigsuspend
+__sinit
+__slbexpand
+__smakebuf
+__sread
+__srefill
+__srget
+__sseek
+__stack_chk_fail
+__statfs64
+__swbuf
+__swhatbuf
+__swrite
+__swsetup
+__sym_ntop
+__sym_ntos
+__sym_ston
+__sys_clone
+__syslog
+__system_properties_init
+__system_property_find
+__system_property_find_nth
+__system_property_get
+__system_property_read
+__system_property_wait
+__thread_entry
+__timer_create
+__timer_delete
+__timer_getoverrun
+__timer_gettime
+__timer_settime
+__timer_table_start_stop
+__udivdi3
+__umoddi3
+__wait4
+__waitid
+_cleanup
+_dorand48
+_endhtent
+_exit
+_exit_thread
+_exit_with_stack_teardown
+_fwalk
+_gethtbyaddr
+_gethtbyname
+_gethtbyname2
+_gethtent
+_getlong
+_getshort
+_init_thread
+_longjmp
+_mktemp
+_sethtent
+_setjmp
+_thread_created_hook
+_waitpid
+abort
+accept
+access
+acct
+alarm
+alphasort
+arc4random
+arc4random_addrandom
+arc4random_buf
+arc4random_stir
+arc4random_uniform
+asctime
+asctime64
+asctime64_r
+asctime_r
+asprintf
+atoi
+atol
+atoll
+basename
+basename_r
+bcopy
+bind
+bindresvport
+brk
+bsd_signal
+bsearch
+btowc
+bzero
+calloc
+capget
+capset
+chdir
+chmod
+chown
+chroot
+clearenv
+clearerr
+clock
+clock_getres
+clock_gettime
+clock_nanosleep
+clock_settime
+clone
+close
+closedir
+closelog
+closelog_r
+connect
+copy_TM_to_tm
+copy_tm_to_TM
+cpuacct_add
+creat
+ctime
+ctime64
+ctime64_r
+ctime_r
+daemon
+delete_module
+difftime
+dirfd
+dirname
+dirname_r
+div
+dlcalloc
+dlfree
+dlindependent_calloc
+dlindependent_comalloc
+dlmallinfo
+dlmalloc
+dlmalloc_footprint
+dlmalloc_max_footprint
+dlmalloc_stats
+dlmalloc_trim
+dlmalloc_usable_size
+dlmalloc_walk_free_pages
+dlmalloc_walk_heap
+dlmallopt
+dlmemalign
+dlpvalloc
+dlrealloc
+dlvalloc
+dn_expand
+drand48
+dup
+dup2
+endpwent
+endservent
+endusershell
+endutent
+epoll_create
+epoll_ctl
+epoll_wait
+erand48
+err
+errx
+eventfd
+eventfd_read
+eventfd_write
+execl
+execle
+execlp
+execv
+execve
+execvp
+exit
+fchdir
+fchmod
+fchmodat
+fchown
+fchownat
+fclose
+fcntl
+fdatasync
+fdopen
+fdopendir
+fdprintf
+feof
+ferror
+fflush
+fgetc
+fgetln
+fgetpos
+fgets
+fgetwc
+fgetws
+fileno
+flock
+flockfile
+fnmatch
+fopen
+fork
+fpathconf
+fprintf
+fpurge
+fputc
+fputs
+fputwc
+fputws
+fread
+free
+freeaddrinfo
+freedtoa
+freopen
+fscanf
+fseek
+fseeko
+fsetpos
+fstat
+fstatat
+fstatfs
+fsync
+ftell
+ftello
+ftime
+ftok
+ftruncate
+ftrylockfile
+fts_children
+fts_close
+fts_open
+fts_read
+fts_set
+funlockfile
+funopen
+futex
+futimens
+fwide
+fwprintf
+fwrite
+fwscanf
+gai_strerror
+get_malloc_leak_info
+getaddrinfo
+getc
+getc_unlocked
+getchar
+getchar_unlocked
+getcwd
+getdents
+getdtablesize
+getegid
+getenv
+geteuid
+getgid
+getgrgid
+getgrnam
+getgrouplist
+getgroups
+gethostbyaddr
+gethostbyname
+gethostbyname2
+gethostbyname_r
+gethostent
+gethostname
+getitimer
+getlogin
+getmntent
+getnameinfo
+getnetbyaddr
+getnetbyname
+getopt
+getopt_long
+getopt_long_only
+getpeername
+getpgid
+getpgrp
+getpid
+getppid
+getpriority
+getprotobyname
+getprotobynumber
+getpt
+getpwnam
+getpwuid
+getresgid
+getresuid
+getrlimit
+getrusage
+gets
+getservbyname
+getservbyport
+getservent
+getservent_r
+getsockname
+getsockopt
+gettid
+gettimeofday
+getuid
+getusershell
+getutent
+getwc
+getwchar
+gmtime
+gmtime64
+gmtime64_r
+gmtime_r
+herror
+hstrerror
+if_indextoname
+if_nametoindex
+index
+inet_addr
+inet_aton
+inet_nsap_addr
+inet_nsap_ntoa
+inet_ntoa
+inet_ntop
+inet_pton
+init_module
+initgroups
+inotify_add_watch
+inotify_init
+inotify_rm_watch
+ioctl
+ioprio_get
+ioprio_set
+isalnum
+isalpha
+isascii
+isatty
+isblank
+iscntrl
+isdigit
+isgraph
+islower
+isprint
+ispunct
+issetugid
+isspace
+isupper
+iswalnum
+iswalpha
+iswcntrl
+iswctype
+iswdigit
+iswgraph
+iswlower
+iswprint
+iswpunct
+iswspace
+iswupper
+iswxdigit
+isxdigit
+jrand48
+kill
+killpg
+klogctl
+lchown
+ldexp
+ldiv
+link
+listen
+lldiv
+localtime
+localtime64
+localtime64_r
+localtime_r
+longjmp
+longjmperror
+lrand48
+lseek
+lseek64
+lstat
+madvise
+mallinfo
+malloc
+malloc_debug_init
+mbrlen
+mbrtowc
+mbsinit
+mbsrtowcs
+mbstowcs
+memalign
+memccpy
+memchr
+memcmp
+memcpy
+memmem
+memmove
+memrchr
+memset
+memswap
+mincore
+mkdir
+mkdirat
+mkdtemp
+mknod
+mkstemp
+mkstemps
+mktemp
+mktime
+mktime64
+mlock
+mmap
+mount
+mprotect
+mrand48
+mremap
+msync
+munlock
+munmap
+nanosleep
+nice
+nrand48
+nsdispatch
+open
+openat
+opendir
+openlog
+openlog_r
+pathconf
+pause
+pclose
+perror
+pipe
+pipe2
+poll
+popen
+prctl
+pread
+printf
+pselect
+pthread_attr_destroy
+pthread_attr_getdetachstate
+pthread_attr_getguardsize
+pthread_attr_getschedparam
+pthread_attr_getschedpolicy
+pthread_attr_getscope
+pthread_attr_getstack
+pthread_attr_getstackaddr
+pthread_attr_getstacksize
+pthread_attr_init
+pthread_attr_setdetachstate
+pthread_attr_setguardsize
+pthread_attr_setschedparam
+pthread_attr_setschedpolicy
+pthread_attr_setscope
+pthread_attr_setstack
+pthread_attr_setstackaddr
+pthread_attr_setstacksize
+pthread_cond_broadcast
+pthread_cond_destroy
+pthread_cond_init
+pthread_cond_signal
+pthread_cond_timedwait
+pthread_cond_timedwait_monotonic
+pthread_cond_timedwait_monotonic_np
+pthread_cond_timedwait_relative_np
+pthread_cond_timeout_np
+pthread_cond_wait
+pthread_condattr_destroy
+pthread_condattr_getpshared
+pthread_condattr_init
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_equal
+pthread_exit
+pthread_getattr_np
+pthread_getcpuclockid
+pthread_getschedparam
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_mutex_destroy
+pthread_mutex_init
+pthread_mutex_lock
+pthread_mutex_lock_timeout_np
+pthread_mutex_trylock
+pthread_mutex_unlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_once
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setpshared
+pthread_self
+pthread_setname_np
+pthread_setschedparam
+pthread_setspecific
+pthread_sigmask
+ptrace
+ptsname
+ptsname_r
+putc
+putc_unlocked
+putchar
+putchar_unlocked
+putenv
+puts
+pututline
+putw
+putwc
+putwchar
+pwrite
+qsort
+raise
+read
+readdir
+readdir_r
+readlink
+readv
+realloc
+realpath
+reboot
+recv
+recvfrom
+recvmsg
+regcomp
+regerror
+regexec
+regfree
+remove
+rename
+renameat
+res_init
+res_mkquery
+res_need_init
+res_query
+res_search
+rewind
+rewinddir
+rmdir
+sbrk
+scandir
+scanf
+sched_get_priority_max
+sched_get_priority_min
+sched_getparam
+sched_getscheduler
+sched_rr_get_interval
+sched_setparam
+sched_setscheduler
+sched_yield
+seed48
+select
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+send
+sendfile
+sendmsg
+sendto
+setbuf
+setbuffer
+setegid
+setenv
+seteuid
+setgid
+setgroups
+setitimer
+setjmp
+setlinebuf
+setlocale
+setlogmask
+setlogmask_r
+setpgid
+setpgrp
+setpriority
+setregid
+setresgid
+setresuid
+setreuid
+setrlimit
+setservent
+setsid
+setsockopt
+settimeofday
+setuid
+setusershell
+setutent
+setvbuf
+shutdown
+sigaction
+sigaltstack
+sigblock
+siginterrupt
+siglongjmp
+sigpending
+sigprocmask
+sigsetjmp
+sigsetmask
+sigsuspend
+sigwait
+sleep
+snprintf
+socket
+socketpair
+sprintf
+srand48
+sscanf
+stat
+statfs
+strcasecmp
+strcasestr
+strcat
+strchr
+strcmp
+strcoll
+strcpy
+strcspn
+strdup
+strerror
+strerror_r
+strftime
+strftime_tz
+strlcat
+strlcpy
+strlen
+strncasecmp
+strncat
+strncmp
+strncpy
+strndup
+strnlen
+strntoimax
+strntoumax
+strpbrk
+strptime
+strrchr
+strsep
+strsignal
+strspn
+strstr
+strtod
+strtoimax
+strtok
+strtok_r
+strtol
+strtoll
+strtotimeval
+strtoul
+strtoull
+strtoumax
+strxfrm
+swprintf
+swscanf
+symlink
+sync
+syscall
+sysconf
+sysinfo
+syslog
+syslog_r
+system
+sysv_signal
+tcgetpgrp
+tcsetpgrp
+tempnam
+time
+timegm64
+timelocal64
+timer_create
+timer_delete
+timer_getoverrun
+timer_gettime
+timer_settime
+times
+tkill
+tmpfile
+tmpnam
+toascii
+tolower
+toupper
+towlower
+towupper
+truncate
+ttyname
+ttyname_r
+tzset
+umask
+umount
+umount2
+uname
+ungetc
+ungetwc
+unlink
+unlinkat
+unlockpt
+unsetenv
+usleep
+utime
+utimensat
+utimes
+utmpname
+valid_tm_mon
+valid_tm_wday
+valloc
+vasprintf
+verr
+verrx
+vfdprintf
+vfork
+vfprintf
+vfscanf
+vfwprintf
+vprintf
+vscanf
+vsnprintf
+vsprintf
+vsscanf
+vswprintf
+vsyslog
+vsyslog_r
+vwarn
+vwarnx
+vwprintf
+wait
+wait3
+wait4
+waitid
+waitpid
+warn
+warnx
+wcpcpy
+wcpncpy
+wcrtomb
+wcscasecmp
+wcscat
+wcschr
+wcscmp
+wcscoll
+wcscpy
+wcscspn
+wcsdup
+wcsftime
+wcslcat
+wcslcpy
+wcslen
+wcsncasecmp
+wcsncat
+wcsncmp
+wcsncpy
+wcsnlen
+wcspbrk
+wcsrchr
+wcsrtombs
+wcsspn
+wcsstr
+wcstod
+wcstok
+wcstol
+wcstombs
+wcstoul
+wcswcs
+wcswidth
+wcsxfrm
+wctob
+wctype
+wcwidth
+wmemchr
+wmemcmp
+wmemcpy
+wmemmove
+wmemset
+wprintf
+write
+writev
+wscanf
diff --git a/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt b/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt
new file mode 100644
index 0000000..ce5ef63
--- /dev/null
+++ b/ndk/platforms/android-19/arch-x86/symbols/libc.so.variables.txt
@@ -0,0 +1,51 @@
+_C_ctype_
+_C_tolower_
+_C_toupper_
+__atexit
+__atexit_invalid
+__bionic_brk
+__evOptMonoTime
+__isthreaded
+__libc_malloc_default_dispatch
+__libc_malloc_dispatch
+__p_cert_syms
+__p_class_syms
+__p_default_section_syms
+__p_key_syms
+__p_rcode_syms
+__p_type_syms
+__p_update_section_syms
+__page_shift
+__page_size
+__progname
+__rand48_add
+__rand48_mult
+__rand48_seed
+__sF
+__sFext
+__sdidinit
+__sglue
+__stack_chk_guard
+__system_property_area__
+_ctype_
+_nres
+_ns_flagdata
+_rand48_add
+_rand48_mult
+_rand48_seed
+_res_opcodes
+_tolower_tab_
+_toupper_tab_
+daylight
+environ
+h_errlist
+h_nerr
+optarg
+opterr
+optind
+optopt
+optreset
+sys_siglist
+sys_signame
+timezone
+tzname
diff --git a/ndk/platforms/android-19/include/android/keycodes.h b/ndk/platforms/android-19/include/android/keycodes.h
new file mode 100644
index 0000000..1ca1332
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/keycodes.h
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+    AKEYCODE_UNKNOWN         = 0,
+    AKEYCODE_SOFT_LEFT       = 1,
+    AKEYCODE_SOFT_RIGHT      = 2,
+    AKEYCODE_HOME            = 3,
+    AKEYCODE_BACK            = 4,
+    AKEYCODE_CALL            = 5,
+    AKEYCODE_ENDCALL         = 6,
+    AKEYCODE_0               = 7,
+    AKEYCODE_1               = 8,
+    AKEYCODE_2               = 9,
+    AKEYCODE_3               = 10,
+    AKEYCODE_4               = 11,
+    AKEYCODE_5               = 12,
+    AKEYCODE_6               = 13,
+    AKEYCODE_7               = 14,
+    AKEYCODE_8               = 15,
+    AKEYCODE_9               = 16,
+    AKEYCODE_STAR            = 17,
+    AKEYCODE_POUND           = 18,
+    AKEYCODE_DPAD_UP         = 19,
+    AKEYCODE_DPAD_DOWN       = 20,
+    AKEYCODE_DPAD_LEFT       = 21,
+    AKEYCODE_DPAD_RIGHT      = 22,
+    AKEYCODE_DPAD_CENTER     = 23,
+    AKEYCODE_VOLUME_UP       = 24,
+    AKEYCODE_VOLUME_DOWN     = 25,
+    AKEYCODE_POWER           = 26,
+    AKEYCODE_CAMERA          = 27,
+    AKEYCODE_CLEAR           = 28,
+    AKEYCODE_A               = 29,
+    AKEYCODE_B               = 30,
+    AKEYCODE_C               = 31,
+    AKEYCODE_D               = 32,
+    AKEYCODE_E               = 33,
+    AKEYCODE_F               = 34,
+    AKEYCODE_G               = 35,
+    AKEYCODE_H               = 36,
+    AKEYCODE_I               = 37,
+    AKEYCODE_J               = 38,
+    AKEYCODE_K               = 39,
+    AKEYCODE_L               = 40,
+    AKEYCODE_M               = 41,
+    AKEYCODE_N               = 42,
+    AKEYCODE_O               = 43,
+    AKEYCODE_P               = 44,
+    AKEYCODE_Q               = 45,
+    AKEYCODE_R               = 46,
+    AKEYCODE_S               = 47,
+    AKEYCODE_T               = 48,
+    AKEYCODE_U               = 49,
+    AKEYCODE_V               = 50,
+    AKEYCODE_W               = 51,
+    AKEYCODE_X               = 52,
+    AKEYCODE_Y               = 53,
+    AKEYCODE_Z               = 54,
+    AKEYCODE_COMMA           = 55,
+    AKEYCODE_PERIOD          = 56,
+    AKEYCODE_ALT_LEFT        = 57,
+    AKEYCODE_ALT_RIGHT       = 58,
+    AKEYCODE_SHIFT_LEFT      = 59,
+    AKEYCODE_SHIFT_RIGHT     = 60,
+    AKEYCODE_TAB             = 61,
+    AKEYCODE_SPACE           = 62,
+    AKEYCODE_SYM             = 63,
+    AKEYCODE_EXPLORER        = 64,
+    AKEYCODE_ENVELOPE        = 65,
+    AKEYCODE_ENTER           = 66,
+    AKEYCODE_DEL             = 67,
+    AKEYCODE_GRAVE           = 68,
+    AKEYCODE_MINUS           = 69,
+    AKEYCODE_EQUALS          = 70,
+    AKEYCODE_LEFT_BRACKET    = 71,
+    AKEYCODE_RIGHT_BRACKET   = 72,
+    AKEYCODE_BACKSLASH       = 73,
+    AKEYCODE_SEMICOLON       = 74,
+    AKEYCODE_APOSTROPHE      = 75,
+    AKEYCODE_SLASH           = 76,
+    AKEYCODE_AT              = 77,
+    AKEYCODE_NUM             = 78,
+    AKEYCODE_HEADSETHOOK     = 79,
+    AKEYCODE_FOCUS           = 80,   // *Camera* focus
+    AKEYCODE_PLUS            = 81,
+    AKEYCODE_MENU            = 82,
+    AKEYCODE_NOTIFICATION    = 83,
+    AKEYCODE_SEARCH          = 84,
+    AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+    AKEYCODE_MEDIA_STOP      = 86,
+    AKEYCODE_MEDIA_NEXT      = 87,
+    AKEYCODE_MEDIA_PREVIOUS  = 88,
+    AKEYCODE_MEDIA_REWIND    = 89,
+    AKEYCODE_MEDIA_FAST_FORWARD = 90,
+    AKEYCODE_MUTE            = 91,
+    AKEYCODE_PAGE_UP         = 92,
+    AKEYCODE_PAGE_DOWN       = 93,
+    AKEYCODE_PICTSYMBOLS     = 94,
+    AKEYCODE_SWITCH_CHARSET  = 95,
+    AKEYCODE_BUTTON_A        = 96,
+    AKEYCODE_BUTTON_B        = 97,
+    AKEYCODE_BUTTON_C        = 98,
+    AKEYCODE_BUTTON_X        = 99,
+    AKEYCODE_BUTTON_Y        = 100,
+    AKEYCODE_BUTTON_Z        = 101,
+    AKEYCODE_BUTTON_L1       = 102,
+    AKEYCODE_BUTTON_R1       = 103,
+    AKEYCODE_BUTTON_L2       = 104,
+    AKEYCODE_BUTTON_R2       = 105,
+    AKEYCODE_BUTTON_THUMBL   = 106,
+    AKEYCODE_BUTTON_THUMBR   = 107,
+    AKEYCODE_BUTTON_START    = 108,
+    AKEYCODE_BUTTON_SELECT   = 109,
+    AKEYCODE_BUTTON_MODE     = 110,
+    AKEYCODE_ESCAPE          = 111,
+    AKEYCODE_FORWARD_DEL     = 112,
+    AKEYCODE_CTRL_LEFT       = 113,
+    AKEYCODE_CTRL_RIGHT      = 114,
+    AKEYCODE_CAPS_LOCK       = 115,
+    AKEYCODE_SCROLL_LOCK     = 116,
+    AKEYCODE_META_LEFT       = 117,
+    AKEYCODE_META_RIGHT      = 118,
+    AKEYCODE_FUNCTION        = 119,
+    AKEYCODE_SYSRQ           = 120,
+    AKEYCODE_BREAK           = 121,
+    AKEYCODE_MOVE_HOME       = 122,
+    AKEYCODE_MOVE_END        = 123,
+    AKEYCODE_INSERT          = 124,
+    AKEYCODE_FORWARD         = 125,
+    AKEYCODE_MEDIA_PLAY      = 126,
+    AKEYCODE_MEDIA_PAUSE     = 127,
+    AKEYCODE_MEDIA_CLOSE     = 128,
+    AKEYCODE_MEDIA_EJECT     = 129,
+    AKEYCODE_MEDIA_RECORD    = 130,
+    AKEYCODE_F1              = 131,
+    AKEYCODE_F2              = 132,
+    AKEYCODE_F3              = 133,
+    AKEYCODE_F4              = 134,
+    AKEYCODE_F5              = 135,
+    AKEYCODE_F6              = 136,
+    AKEYCODE_F7              = 137,
+    AKEYCODE_F8              = 138,
+    AKEYCODE_F9              = 139,
+    AKEYCODE_F10             = 140,
+    AKEYCODE_F11             = 141,
+    AKEYCODE_F12             = 142,
+    AKEYCODE_NUM_LOCK        = 143,
+    AKEYCODE_NUMPAD_0        = 144,
+    AKEYCODE_NUMPAD_1        = 145,
+    AKEYCODE_NUMPAD_2        = 146,
+    AKEYCODE_NUMPAD_3        = 147,
+    AKEYCODE_NUMPAD_4        = 148,
+    AKEYCODE_NUMPAD_5        = 149,
+    AKEYCODE_NUMPAD_6        = 150,
+    AKEYCODE_NUMPAD_7        = 151,
+    AKEYCODE_NUMPAD_8        = 152,
+    AKEYCODE_NUMPAD_9        = 153,
+    AKEYCODE_NUMPAD_DIVIDE   = 154,
+    AKEYCODE_NUMPAD_MULTIPLY = 155,
+    AKEYCODE_NUMPAD_SUBTRACT = 156,
+    AKEYCODE_NUMPAD_ADD      = 157,
+    AKEYCODE_NUMPAD_DOT      = 158,
+    AKEYCODE_NUMPAD_COMMA    = 159,
+    AKEYCODE_NUMPAD_ENTER    = 160,
+    AKEYCODE_NUMPAD_EQUALS   = 161,
+    AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+    AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+    AKEYCODE_VOLUME_MUTE     = 164,
+    AKEYCODE_INFO            = 165,
+    AKEYCODE_CHANNEL_UP      = 166,
+    AKEYCODE_CHANNEL_DOWN    = 167,
+    AKEYCODE_ZOOM_IN         = 168,
+    AKEYCODE_ZOOM_OUT        = 169,
+    AKEYCODE_TV              = 170,
+    AKEYCODE_WINDOW          = 171,
+    AKEYCODE_GUIDE           = 172,
+    AKEYCODE_DVR             = 173,
+    AKEYCODE_BOOKMARK        = 174,
+    AKEYCODE_CAPTIONS        = 175,
+    AKEYCODE_SETTINGS        = 176,
+    AKEYCODE_TV_POWER        = 177,
+    AKEYCODE_TV_INPUT        = 178,
+    AKEYCODE_STB_POWER       = 179,
+    AKEYCODE_STB_INPUT       = 180,
+    AKEYCODE_AVR_POWER       = 181,
+    AKEYCODE_AVR_INPUT       = 182,
+    AKEYCODE_PROG_RED        = 183,
+    AKEYCODE_PROG_GREEN      = 184,
+    AKEYCODE_PROG_YELLOW     = 185,
+    AKEYCODE_PROG_BLUE       = 186,
+    AKEYCODE_APP_SWITCH      = 187,
+    AKEYCODE_BUTTON_1        = 188,
+    AKEYCODE_BUTTON_2        = 189,
+    AKEYCODE_BUTTON_3        = 190,
+    AKEYCODE_BUTTON_4        = 191,
+    AKEYCODE_BUTTON_5        = 192,
+    AKEYCODE_BUTTON_6        = 193,
+    AKEYCODE_BUTTON_7        = 194,
+    AKEYCODE_BUTTON_8        = 195,
+    AKEYCODE_BUTTON_9        = 196,
+    AKEYCODE_BUTTON_10       = 197,
+    AKEYCODE_BUTTON_11       = 198,
+    AKEYCODE_BUTTON_12       = 199,
+    AKEYCODE_BUTTON_13       = 200,
+    AKEYCODE_BUTTON_14       = 201,
+    AKEYCODE_BUTTON_15       = 202,
+    AKEYCODE_BUTTON_16       = 203,
+    AKEYCODE_LANGUAGE_SWITCH = 204,
+    AKEYCODE_MANNER_MODE     = 205,
+    AKEYCODE_3D_MODE         = 206,
+    AKEYCODE_CONTACTS        = 207,
+    AKEYCODE_CALENDAR        = 208,
+    AKEYCODE_MUSIC           = 209,
+    AKEYCODE_CALCULATOR      = 210,
+    AKEYCODE_ZENKAKU_HANKAKU = 211,
+    AKEYCODE_EISU            = 212,
+    AKEYCODE_MUHENKAN        = 213,
+    AKEYCODE_HENKAN          = 214,
+    AKEYCODE_KATAKANA_HIRAGANA = 215,
+    AKEYCODE_YEN             = 216,
+    AKEYCODE_RO              = 217,
+    AKEYCODE_KANA            = 218,
+    AKEYCODE_ASSIST          = 219,
+    AKEYCODE_BRIGHTNESS_DOWN = 220,
+    AKEYCODE_BRIGHTNESS_UP   = 221,
+    AKEYCODE_MEDIA_AUDIO_TRACK = 222,
+
+    // NOTE: If you add a new keycode here you must also add it to several other files.
+    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-19/include/android/sensor.h b/ndk/platforms/android-19/include/android/sensor.h
new file mode 100644
index 0000000..589058d
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/sensor.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_SENSOR_H
+#define ANDROID_SENSOR_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ *   This file is part of Android's set of stable system headers
+ *   exposed by the Android NDK (Native Development Kit).
+ *
+ *   Third-party source AND binary code relies on the definitions
+ *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process sensor events in
+ * native code.
+ *
+ */
+
+#include <sys/types.h>
+
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Sensor types
+ * (keep in sync with hardware/sensor.h)
+ */
+
+enum {
+    ASENSOR_TYPE_ACCELEROMETER      = 1,
+    ASENSOR_TYPE_MAGNETIC_FIELD     = 2,
+    ASENSOR_TYPE_GYROSCOPE          = 4,
+    ASENSOR_TYPE_LIGHT              = 5,
+    ASENSOR_TYPE_PROXIMITY          = 8
+};
+
+/*
+ * Sensor accuracy measure
+ */
+enum {
+    ASENSOR_STATUS_UNRELIABLE       = 0,
+    ASENSOR_STATUS_ACCURACY_LOW     = 1,
+    ASENSOR_STATUS_ACCURACY_MEDIUM  = 2,
+    ASENSOR_STATUS_ACCURACY_HIGH    = 3
+};
+
+/*
+ * A few useful constants
+ */
+
+/* Earth's gravity in m/s^2 */
+#define ASENSOR_STANDARD_GRAVITY            (9.80665f)
+/* Maximum magnetic field on Earth's surface in uT */
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MAX    (60.0f)
+/* Minimum magnetic field on Earth's surface in uT*/
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MIN    (30.0f)
+
+/*
+ * A sensor event.
+ */
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorVector {
+    union {
+        float v[3];
+        struct {
+            float x;
+            float y;
+            float z;
+        };
+        struct {
+            float azimuth;
+            float pitch;
+            float roll;
+        };
+    };
+    int8_t status;
+    uint8_t reserved[3];
+} ASensorVector;
+
+typedef struct AMetaDataEvent {
+    int32_t what;
+    int32_t sensor;
+} AMetaDataEvent;
+
+typedef struct AUncalibratedEvent {
+  union {
+    float uncalib[3];
+    struct {
+      float x_uncalib;
+      float y_uncalib;
+      float z_uncalib;
+    };
+  };
+  union {
+    float bias[3];
+    struct {
+      float x_bias;
+      float y_bias;
+      float z_bias;
+    };
+  };
+} AUncalibratedEvent;
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorEvent {
+    int32_t version; /* sizeof(struct ASensorEvent) */
+    int32_t sensor;
+    int32_t type;
+    int32_t reserved0;
+    int64_t timestamp;
+    union {
+        union {
+            float           data[16];
+            ASensorVector   vector;
+            ASensorVector   acceleration;
+            ASensorVector   magnetic;
+            float           temperature;
+            float           distance;
+            float           light;
+            float           pressure;
+            float           relative_humidity;
+            AUncalibratedEvent uncalibrated_gyro;
+            AUncalibratedEvent uncalibrated_magnetic;
+            AMetaDataEvent meta_data;
+        };
+        union {
+            uint64_t        data[8];
+            uint64_t        step_counter;
+        } u64;
+    };
+    int32_t reserved1[4];
+} ASensorEvent;
+
+struct ASensorManager;
+typedef struct ASensorManager ASensorManager;
+
+struct ASensorEventQueue;
+typedef struct ASensorEventQueue ASensorEventQueue;
+
+struct ASensor;
+typedef struct ASensor ASensor;
+typedef ASensor const* ASensorRef;
+typedef ASensorRef const* ASensorList;
+
+/*****************************************************************************/
+
+/*
+ * Get a reference to the sensor manager. ASensorManager is a singleton.
+ *
+ * Example:
+ *
+ *     ASensorManager* sensorManager = ASensorManager_getInstance();
+ *
+ */
+ASensorManager* ASensorManager_getInstance();
+
+
+/*
+ * Returns the list of available sensors.
+ */
+int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
+
+/*
+ * Returns the default sensor for the given type, or NULL if no sensor
+ * of that type exist.
+ */
+ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
+
+/*
+ * Creates a new sensor event queue and associate it with a looper.
+ */
+ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
+        ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Destroys the event queue and free all resources associated to it.
+ */
+int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
+
+
+/*****************************************************************************/
+
+/*
+ * Enable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Disable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Sets the delivery rate of events in microseconds for the given sensor.
+ * Note that this is a hint only, generally event will arrive at a higher
+ * rate. It is an error to set a rate inferior to the value returned by
+ * ASensor_getMinDelay().
+ * Returns a negative error code on failure.
+ */
+int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
+
+/*
+ * Returns true if there are one or more events available in the
+ * sensor queue.  Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
+
+/*
+ * Returns the next available events from the queue.  Returns a negative
+ * value if no events are available or an error has occurred, otherwise
+ * the number of events returned.
+ *
+ * Examples:
+ *   ASensorEvent event;
+ *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
+ *
+ *   ASensorEvent eventBuffer[8];
+ *   ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
+ *
+ */
+ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
+                ASensorEvent* events, size_t count);
+
+
+/*****************************************************************************/
+
+/*
+ * Returns this sensor's name (non localized)
+ */
+const char* ASensor_getName(ASensor const* sensor);
+
+/*
+ * Returns this sensor's vendor's name (non localized)
+ */
+const char* ASensor_getVendor(ASensor const* sensor);
+
+/*
+ * Return this sensor's type
+ */
+int ASensor_getType(ASensor const* sensor);
+
+/*
+ * Returns this sensors's resolution
+ */
+float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
+
+/*
+ * Returns the minimum delay allowed between events in microseconds.
+ * A value of zero means that this sensor doesn't report events at a
+ * constant rate, but rather only when a new data is available.
+ */
+int ASensor_getMinDelay(ASensor const* sensor);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_SENSOR_H
diff --git a/ndk/platforms/android-19/include/sys/stat.h b/ndk/platforms/android-19/include/sys/stat.h
new file mode 100644
index 0000000..c156f43
--- /dev/null
+++ b/ndk/platforms/android-19/include/sys/stat.h
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+    unsigned long long  st_dev;
+    unsigned char       __pad0[4];
+
+    unsigned long       __st_ino;
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long long  st_rdev;
+    unsigned char       __pad3[4];
+
+    long long           st_size;
+    unsigned long	st_blksize;
+    unsigned long long  st_blocks;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long long  st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define  st_atimensec  st_atime_nsec
+#define  st_mtimensec  st_mtime_nsec
+#define  st_ctimensec  st_ctime_nsec
+
+extern int    chmod(const char *, mode_t);
+extern int    fchmod(int, mode_t);
+extern int    mkdir(const char *, mode_t);
+
+extern int    stat(const char *, struct stat *);
+extern int    fstat(int, struct stat *);
+extern int    lstat(const char *, struct stat *);
+extern int    mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define  stat64    stat
+#define  fstat64   fstat
+#define  lstat64   lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+  return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int  fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int  mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+# define UTIME_NOW      ((1l << 30) - 1l)
+# define UTIME_OMIT     ((1l << 30) - 2l)
+extern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
+extern int futimens(int fd, const struct timespec times[2]);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-19/include/sys/wait.h b/ndk/platforms/android-19/include/sys/wait.h
new file mode 100644
index 0000000..b30b7ec
--- /dev/null
+++ b/ndk/platforms/android-19/include/sys/wait.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_WAIT_H_
+#define _SYS_WAIT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <linux/wait.h>
+#include <signal.h>
+
+__BEGIN_DECLS
+
+#define WEXITSTATUS(s)  (((s) & 0xff00) >> 8)
+#define WCOREDUMP(s)    ((s) & 0x80)
+#define WTERMSIG(s)     ((s) & 0x7f)
+#define WSTOPSIG(s)     WEXITSTATUS(s)
+
+#define WIFEXITED(s)    (WTERMSIG(s) == 0)
+#define WIFSTOPPED(s)   (WTERMSIG(s) == 0x7f)
+#define WIFSIGNALED(s)  (WTERMSIG((s)+1) >= 2)
+
+extern pid_t  wait(int *);
+extern pid_t  waitpid(pid_t, int *, int);
+extern pid_t  wait3(int *, int, struct rusage *);
+extern pid_t  wait4(pid_t, int *, int, struct rusage *);
+
+/* Posix states that idtype_t should be an enumeration type, but
+ * the kernel headers define P_ALL, P_PID and P_PGID as constant macros
+ * instead.
+ */
+typedef int idtype_t;
+
+extern int  waitid(idtype_t which, id_t id, siginfo_t *info, int options);
+
+__END_DECLS
+
+#endif /* _SYS_WAIT_H_ */
diff --git a/ndk/platforms/android-3/arch-arm/lib/libc.a b/ndk/platforms/android-3/arch-arm/lib/libc.a
index 1877053..67ff818 100644
--- a/ndk/platforms/android-3/arch-arm/lib/libc.a
+++ b/ndk/platforms/android-3/arch-arm/lib/libc.a
Binary files differ
diff --git a/ndk/platforms/android-3/arch-arm/lib/libm_hard.a b/ndk/platforms/android-3/arch-arm/lib/libm_hard.a
new file mode 100644
index 0000000..2ff6e1d
--- /dev/null
+++ b/ndk/platforms/android-3/arch-arm/lib/libm_hard.a
Binary files differ
diff --git a/ndk/platforms/android-3/header-patches/headers.patch b/ndk/platforms/android-3/header-patches/headers.patch
new file mode 100644
index 0000000..56b44a4
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/headers.patch
@@ -0,0 +1,138 @@
+diff -Naur a/include/asm/a.out.h b/include/asm/a.out.h
+--- a/include/asm/a.out.h	2013-06-10 08:16:13.496310000 +0800
++++ b/include/asm/a.out.h	2013-09-06 14:13:28.366275000 +0800
+@@ -33,7 +33,7 @@
+ #define N_DRSIZE(a) ((a).a_drsize)
+ #define N_SYMSIZE(a) ((a).a_syms)
+
+-#define M_MACHINE 103
++#define M_ARM 103
+
+ #ifndef LIBRARY_START_TEXT
+ #define LIBRARY_START_TEXT (0x00c00000)
+diff -Naur a/include/asm/byteorder.h b/include/asm/byteorder.h
+--- a/include/asm/byteorder.h	2013-09-03 12:33:37.353419000 +0800
++++ b/include/asm/byteorder.h	2013-08-30 17:41:09.234265000 +0800
+@@ -19,12 +19,6 @@
+ {
+  __u32 t;
+ 
+-#ifndef __thumb__
+- if (!__builtin_constant_p(x)) {
+-
+- __asm__ ("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
+- } else
+-#endif
+  t = x ^ ((x << 16) | (x >> 16));
+ 
+  x = (x << 24) | (x >> 8);
+diff -Naur a/include/asm/stat.h b/include/asm/stat.h
+--- a/include/asm/stat.h	2013-09-03 12:33:37.367418000 +0800
++++ b/include/asm/stat.h	2013-08-30 17:41:09.431302000 +0800
+@@ -29,23 +29,13 @@
+ #define STAT_HAVE_NSEC 
+ 
+ struct stat {
+-#ifdef __ARMEB__
+- unsigned short st_dev;
+- unsigned short __pad1;
+-#else
+  unsigned long st_dev;
+-#endif
+  unsigned long st_ino;
+  unsigned short st_mode;
+  unsigned short st_nlink;
+  unsigned short st_uid;
+  unsigned short st_gid;
+-#ifdef __ARMEB__
+- unsigned short st_rdev;
+- unsigned short __pad2;
+-#else
+  unsigned long st_rdev;
+-#endif
+  unsigned long st_size;
+  unsigned long st_blksize;
+  unsigned long st_blocks;
+diff -Naur a/include/asm/types.h b/include/asm/types.h
+--- a/include/asm/types.h	2013-09-03 12:33:37.313428000 +0800
++++ b/include/asm/types.h	2013-08-30 17:41:09.467274000 +0800
+@@ -25,7 +25,7 @@
+ typedef __signed__ int __s32;
+ typedef unsigned int __u32;
+ 
+-#ifdef __GNUC__
++#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+ typedef __signed__ long long __s64;
+ typedef unsigned long long __u64;
+ #endif
+diff -Naur a/include/asm/unaligned.h b/include/asm/unaligned.h
+--- a/include/asm/unaligned.h	2013-09-03 12:33:37.376422000 +0800
++++ b/include/asm/unaligned.h	2013-08-30 17:41:09.500316000 +0800
+@@ -28,11 +28,6 @@
+ 
+ #define __put_unaligned_le(val,ptr)   ({   switch (sizeof(*(ptr))) {   case 1:   *(ptr) = (val);   break;   case 2: __put_unaligned_2_le((val),(__u8 *)(ptr));   break;   case 4: __put_unaligned_4_le((val),(__u8 *)(ptr));   break;   case 8: __put_unaligned_8_le((val),(__u8 *)(ptr));   break;   default: __bug_unaligned_x(ptr);   break;   }   (void) 0;   })
+ #define __put_unaligned_be(val,ptr)   ({   switch (sizeof(*(ptr))) {   case 1:   *(ptr) = (val);   break;   case 2: __put_unaligned_2_be((val),(__u8 *)(ptr));   break;   case 4: __put_unaligned_4_be((val),(__u8 *)(ptr));   break;   case 8: __put_unaligned_8_be((val),(__u8 *)(ptr));   break;   default: __bug_unaligned_x(ptr);   break;   }   (void) 0;   })
+-#ifndef __ARMEB__
+ #define get_unaligned __get_unaligned_le
+ #define put_unaligned __put_unaligned_le
+-#else
+-#define get_unaligned __get_unaligned_be
+-#define put_unaligned __put_unaligned_be
+-#endif
+ #endif
+diff -Naur a/include/asm/unistd.h b/include/asm/unistd.h
+--- a/include/asm/unistd.h	2013-09-03 12:33:37.322427000 +0800
++++ b/include/asm/unistd.h	2013-08-30 17:41:09.506276000 +0800
+@@ -19,12 +19,7 @@
+ #ifndef __ASM_MACHINE_UNISTD_H
+ #define __ASM_MACHINE_UNISTD_H
+ #define __NR_OABI_SYSCALL_BASE 0x900000
+-#if defined(__thumb__) || defined(__ARM_EABI__)
+-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ #define __NR_SYSCALL_BASE 0
+-#else
+-#define __NR_SYSCALL_BASE __NR_OABI_SYSCALL_BASE
+-#endif
+ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ #define __NR_restart_syscall (__NR_SYSCALL_BASE+ 0)
+ #define __NR_exit (__NR_SYSCALL_BASE+ 1)
+diff -Naur a/include/asm/user.h b/include/asm/user.h
+--- a/include/asm/user.h	2013-09-03 12:33:37.118421000 +0800
++++ b/include/asm/user.h	2013-08-30 17:41:09.519301000 +0800
+@@ -58,15 +58,4 @@
+ #define HOST_TEXT_START_ADDR (u.start_code)
+ #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
+ 
+-struct user_vfp {
+- unsigned long long fpregs[32];
+- unsigned long fpscr;
+-};
+-
+-struct user_vfp_exc {
+- unsigned long fpexc;
+- unsigned long fpinst;
+- unsigned long fpinst2;
+-};
+-
+ #endif
+diff -Naur a/include/machine/asm.h b/include/machine/asm.h
+--- a/include/machine/asm.h	2013-09-03 12:33:37.135419000 +0800
++++ b/include/machine/asm.h	2013-08-30 17:41:09.533294000 +0800
+@@ -78,17 +78,7 @@
+ 	.fnend; \
+ 	_ASM_SIZE(x)
+ 
+-#ifdef GPROF
+-# ifdef __ELF__
+-#  define _PROF_PROLOGUE	\
+-	mov ip, lr; bl __mcount
+-# else
+-#  define _PROF_PROLOGUE	\
+-	mov ip,lr; bl mcount
+-# endif
+-#else
+ # define _PROF_PROLOGUE
+-#endif
+ 
+ #define	ENTRY(y)	_ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
+ #define	ENTRY_NP(y)	_ENTRY(_C_LABEL(y))
diff --git a/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h b/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h
new file mode 100644
index 0000000..83c58e6
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm-generic/fcntl.h
@@ -0,0 +1,138 @@
+#ifndef _ASM_GENERIC_FCNTL_H
+#define _ASM_GENERIC_FCNTL_H
+
+#include <linux/types.h>
+
+#define O_ACCMODE 00000003
+#define O_RDONLY 00000000
+#define O_WRONLY 00000001
+#define O_RDWR 00000002
+#ifndef O_CREAT
+#define O_CREAT 00000100
+#endif
+#ifndef O_EXCL
+#define O_EXCL 00000200
+#endif
+#ifndef O_NOCTTY
+#define O_NOCTTY 00000400
+#endif
+#ifndef O_TRUNC
+#define O_TRUNC 00001000
+#endif
+#ifndef O_APPEND
+#define O_APPEND 00002000
+#endif
+#ifndef O_NONBLOCK
+#define O_NONBLOCK 00004000
+#endif
+#ifndef O_SYNC
+#define O_SYNC 00010000
+#endif
+#ifndef FASYNC
+#define FASYNC 00020000
+#endif
+#ifndef O_DIRECT
+#define O_DIRECT 00040000
+#endif
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 00100000
+#endif
+#ifndef O_DIRECTORY
+#define O_DIRECTORY 00200000
+#endif
+#ifndef O_NOFOLLOW
+#define O_NOFOLLOW 00400000
+#endif
+#ifndef O_NOATIME
+#define O_NOATIME 01000000
+#endif
+#ifndef O_NDELAY
+#define O_NDELAY O_NONBLOCK
+#endif
+
+#define F_DUPFD 0
+#define F_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+#ifndef F_GETLK
+#define F_GETLK 5
+#define F_SETLK 6
+#define F_SETLKW 7
+#endif
+#ifndef F_SETOWN
+#define F_SETOWN 8
+#define F_GETOWN 9
+#endif
+#ifndef F_SETSIG
+#define F_SETSIG 10
+#define F_GETSIG 11
+#endif
+
+#define FD_CLOEXEC 1
+
+#ifndef F_RDLCK
+#define F_RDLCK 0
+#define F_WRLCK 1
+#define F_UNLCK 2
+#endif
+
+#ifndef F_EXLCK
+#define F_EXLCK 4
+#define F_SHLCK 8
+#endif
+
+#ifndef F_INPROGRESS
+#define F_INPROGRESS 16
+#endif
+
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+#define LOCK_MAND 32
+#define LOCK_READ 64
+#define LOCK_WRITE 128
+#define LOCK_RW 192
+
+#define F_LINUX_SPECIFIC_BASE 1024
+
+#ifndef HAVE_ARCH_STRUCT_FLOCK
+#ifndef __ARCH_FLOCK_PAD
+#define __ARCH_FLOCK_PAD
+#endif
+
+struct flock {
+ short l_type;
+ short l_whence;
+ off_t l_start;
+ off_t l_len;
+ pid_t l_pid;
+ __ARCH_FLOCK_PAD
+};
+#endif
+
+#ifndef F_GETLK64
+#define F_GETLK64 12
+#define F_SETLK64 13
+#define F_SETLKW64 14
+#endif
+
+#ifndef HAVE_ARCH_STRUCT_FLOCK64
+#ifndef __ARCH_FLOCK64_PAD
+#define __ARCH_FLOCK64_PAD
+#endif
+
+struct flock64 {
+ short l_type;
+ short l_whence;
+ unsigned char __padding[4];
+ loff_t l_start;
+ loff_t l_len;
+ pid_t l_pid;
+ __ARCH_FLOCK64_PAD
+};
+
+#endif
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/div64.h b/ndk/platforms/android-3/header-patches/include/asm/div64.h
new file mode 100644
index 0000000..cde7274
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/div64.h
@@ -0,0 +1,6 @@
+#ifndef __ASM_DIV64_H
+#define __ASM_DIV64_H
+
+#include <asm/system.h>
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/elf.h b/ndk/platforms/android-3/header-patches/include/asm/elf.h
new file mode 100644
index 0000000..cec9338
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/elf.h
@@ -0,0 +1,31 @@
+#ifndef __ASM_ELF_H
+#define __ASM_ELF_H
+
+#include <asm/ptrace.h>
+#include <asm/user.h>
+
+typedef unsigned long elf_greg_t;
+typedef unsigned long elf_freg_t[3];
+
+
+#define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef struct user_fp elf_fpregset_t;
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2LSB
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
+
+
+#define ELF_HWCAP (elf_hwcap)
+
+#define ELF_PLATFORM_SIZE 8
+
+#define ELF_PLATFORM (elf_platform)
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/locks.h b/ndk/platforms/android-3/header-patches/include/asm/locks.h
new file mode 100644
index 0000000..4463603
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/locks.h
@@ -0,0 +1,7 @@
+#ifndef __ASM_PROC_LOCKS_H
+#define __ASM_PROC_LOCKS_H
+
+#define RW_LOCK_BIAS 0x01000000
+#define RW_LOCK_BIAS_STR "0x01000000"
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/ptrace.h b/ndk/platforms/android-3/header-patches/include/asm/ptrace.h
new file mode 100644
index 0000000..a0877cf
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/ptrace.h
@@ -0,0 +1,105 @@
+#ifndef __ASM_PTRACE_H
+#define __ASM_PTRACE_H
+
+#define PTRACE_GETREGS 12
+#define PTRACE_SETREGS 13
+#define PTRACE_GETFPREGS 14
+#define PTRACE_SETFPREGS 15
+
+#define PTRACE_GETWMMXREGS 18
+#define PTRACE_SETWMMXREGS 19
+
+#define PTRACE_OLDSETOPTIONS 21
+
+#define PTRACE_GET_THREAD_AREA 22
+
+#define PTRACE_SET_SYSCALL 23
+
+#define PTRACE_GETCRUNCHREGS 25
+#define PTRACE_SETCRUNCHREGS 26
+
+#define USR26_MODE 0x00000000
+#define FIQ26_MODE 0x00000001
+#define IRQ26_MODE 0x00000002
+#define SVC26_MODE 0x00000003
+#define USR_MODE 0x00000010
+#define FIQ_MODE 0x00000011
+#define IRQ_MODE 0x00000012
+#define SVC_MODE 0x00000013
+#define ABT_MODE 0x00000017
+#define UND_MODE 0x0000001b
+#define SYSTEM_MODE 0x0000001f
+#define MODE32_BIT 0x00000010
+#define MODE_MASK 0x0000001f
+#define PSR_T_BIT 0x00000020
+#define PSR_F_BIT 0x00000040
+#define PSR_I_BIT 0x00000080
+#define PSR_J_BIT 0x01000000
+#define PSR_Q_BIT 0x08000000
+#define PSR_V_BIT 0x10000000
+#define PSR_C_BIT 0x20000000
+#define PSR_Z_BIT 0x40000000
+#define PSR_N_BIT 0x80000000
+#define PCMASK 0
+
+#define PSR_f 0xff000000
+#define PSR_s 0x00ff0000
+#define PSR_x 0x0000ff00
+#define PSR_c 0x000000ff
+
+#ifndef __ASSEMBLY__
+
+struct pt_regs {
+ long uregs[44];   // Increase array size for ARM/x86/MIPS compatibility
+};
+
+#define ARM_cpsr uregs[16]
+#define ARM_pc uregs[15]
+#define ARM_lr uregs[14]
+#define ARM_sp uregs[13]
+#define ARM_ip uregs[12]
+#define ARM_fp uregs[11]
+#define ARM_r10 uregs[10]
+#define ARM_r9 uregs[9]
+#define ARM_r8 uregs[8]
+#define ARM_r7 uregs[7]
+#define ARM_r6 uregs[6]
+#define ARM_r5 uregs[5]
+#define ARM_r4 uregs[4]
+#define ARM_r3 uregs[3]
+#define ARM_r2 uregs[2]
+#define ARM_r1 uregs[1]
+#define ARM_r0 uregs[0]
+#define ARM_ORIG_r0 uregs[17]
+
+#define x86_r15 uregs[0]
+#define x86_r14 uregs[1]
+#define x86_r13 uregs[2]
+#define x86_r12 uregs[3]
+#define x86_rbp uregs[4]
+#define x86_rbx uregs[5]
+#define x86_r11 uregs[6]
+#define x86_r10 uregs[7]
+#define x86_r9 uregs[8]
+#define x86_r8 uregs[9]
+#define x86_rax uregs[10]
+#define x86_rcx uregs[11]
+#define x86_rdx uregs[12]
+#define x86_rsi uregs[13]
+#define x86_rdi uregs[14]
+#define x86_orig_rax uregs[15]
+#define x86_rip uregs[16]
+#define x86_cs uregs[17]
+#define x86_eflags uregs[18]
+#define x86_rsp uregs[19]
+#define x86_ss uregs[20]
+
+#define pc_pointer(v)   ((v) & ~PCMASK)
+
+#define instruction_pointer(regs)   (pc_pointer((regs)->ARM_pc))
+
+#define profile_pc(regs) instruction_pointer(regs)
+
+#endif
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h b/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h
new file mode 100644
index 0000000..ebbcafa
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/sigcontext.h
@@ -0,0 +1,4 @@
+#ifndef _ASM_SIGCONTEXT_H
+#define _ASM_SIGCONTEXT_H
+
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/asm/uaccess.h b/ndk/platforms/android-3/header-patches/include/asm/uaccess.h
new file mode 100644
index 0000000..ace935e
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/asm/uaccess.h
@@ -0,0 +1,37 @@
+#ifndef _ASM_UACCESS_H
+#define _ASM_UACCESS_H
+
+#include <linux/sched.h>
+#include <asm/errno.h>
+#include <asm/memory.h>
+#include <asm/system.h>
+
+#define VERIFY_READ 0
+#define VERIFY_WRITE 1
+
+struct exception_table_entry
+{
+ unsigned long insn, fixup;
+};
+
+#define KERNEL_DS 0x00000000
+#define get_ds() (KERNEL_DS)
+
+#define USER_DS KERNEL_DS
+
+#define segment_eq(a,b) (1)
+#define __addr_ok(addr) (1)
+#define __range_ok(addr,size) (0)
+#define get_fs() (KERNEL_DS)
+
+#define get_user(x,p)
+#define put_user(x,p)
+#define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
+#define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0)
+#define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0)
+#define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0)
+
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
+#define strlen_user(s) strnlen_user(s, ~0UL >> 1)
+#endif
diff --git a/ndk/platforms/android-3/header-patches/include/fenv.h b/ndk/platforms/android-3/header-patches/include/fenv.h
new file mode 100644
index 0000000..2ee530d
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/fenv.h
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2004-2005 David Schultz <das@FreeBSD.ORG>
+ * 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.
+ *
+ * $FreeBSD: src/lib/msun/arm/fenv.h,v 1.5 2005/03/16 19:03:45 das Exp $
+ */
+
+/*
+ * Rewritten for Android.
+ *
+ * The ARM FPSCR is described here:
+ * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Chdfafia.html
+ */
+
+#ifndef _FENV_H_
+#define _FENV_H_
+
+#include <sys/types.h>
+
+__BEGIN_DECLS
+
+/* 
+ * arm/mips definition
+ */
+typedef __uint32_t fenv_t;
+typedef __uint32_t fexcept_t;
+
+/*
+ * x86 definition
+ */
+/*
+typedef struct {
+        __uint16_t      __control;
+        __uint16_t      __mxcsr_hi;
+        __uint16_t      __status;
+        __uint16_t      __mxcsr_lo;
+        __uint32_t      __tag;
+        char            __other[16];
+} fenv_t;
+*/
+
+
+/* Exception flags. */
+#define FE_INVALID    0x01
+#define FE_DIVBYZERO  0x02
+#define FE_OVERFLOW   0x04
+#define FE_UNDERFLOW  0x08
+#define FE_INEXACT    0x10
+#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
+
+/* Rounding modes. */
+#define FE_TONEAREST  0x0
+#define FE_UPWARD     0x1
+#define FE_DOWNWARD   0x2
+#define FE_TOWARDZERO 0x3
+
+/* Default floating-point environment. */
+extern const fenv_t __fe_dfl_env;
+#define FE_DFL_ENV (&__fe_dfl_env)
+
+/*
+ * Need implementations in libportable to enable following functions
+ *
+ * int fegetenv(fenv_t* __envp);
+ * int fesetenv(const fenv_t* __envp);
+ * int feholdexcept(fenv_t* __envp);
+ * int feupdateenv(const fenv_t* __envp);
+ */
+
+int feclearexcept(int __excepts);
+int fegetexceptflag(fexcept_t* __flagp, int __excepts);
+int fesetexceptflag(const fexcept_t* __flagp, int __excepts);
+int feraiseexcept(int __excepts);
+int fetestexcept(int __excepts);
+int fegetround(void);
+int fesetround(int __round);
+
+__END_DECLS
+
+#endif /* !_FENV_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-3/header-patches/include/machine/endian.h
similarity index 66%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-3/header-patches/include/machine/endian.h
index 3e80128..5f69357 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-3/header-patches/include/machine/endian.h
@@ -1,5 +1,7 @@
+/*	$OpenBSD: endian.h,v 1.3 2005/12/13 00:35:23 millert Exp $	*/
+
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,17 +28,28 @@
  * SUCH DAMAGE.
  */
 
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
-        .section .bss
-        .align 4
+#ifndef _MACHINE_ENDIAN_H_
+#define _MACHINE_ENDIAN_H_
 
-#ifndef CRT_LEGACY_WORKAROUND
-	.hidden __dso_handle
-#endif
+#ifdef __GNUC__
 
-        .globl __dso_handle
-__dso_handle:
-        .long 0
+/*
+ * Implement below swap{16,32,64}md functions in libportable
+ * that are optimized for your architecture.
+ *
+ * uint16_t __swap16md(uint16_t x);
+ * uint32_t __swap32md(uint32_t x);
+ * uint64_t __swap64md(uint64_t x);
+ */
+
+/* Tell sys/endian.h we have MD variants of the swap macros.
+ * #define MD_SWAP
+ */
+#endif  /* __GNUC__ */
+
+#define _BYTE_ORDER _LITTLE_ENDIAN
+#define __STRICT_ALIGNMENT
+#include <sys/types.h>
+#include <sys/endian.h>
+
+#endif  /* !_MACHINE_ENDIAN_H_ */
diff --git a/ndk/platforms/android-3/header-patches/include/machine/ieee.h b/ndk/platforms/android-3/header-patches/include/machine/ieee.h
new file mode 100644
index 0000000..823f5ef
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/machine/ieee.h
@@ -0,0 +1,151 @@
+/*	$OpenBSD: ieee.h,v 1.1 2004/02/01 05:09:49 drahn Exp $	*/
+/*	$NetBSD: ieee.h,v 1.2 2001/02/21 17:43:50 bjh21 Exp $	*/
+
+/*
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Lawrence Berkeley Laboratory.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ *	@(#)ieee.h	8.1 (Berkeley) 6/11/93
+ */
+
+/*
+ * ieee.h defines the machine-dependent layout of the machine's IEEE
+ * floating point.
+ */
+
+/*
+ * Define the number of bits in each fraction and exponent.
+ *
+ *		     k	         k+1
+ * Note that  1.0 x 2  == 0.1 x 2      and that denorms are represented
+ *
+ *					  (-exp_bias+1)
+ * as fractions that look like 0.fffff x 2             .  This means that
+ *
+ *			 -126
+ * the number 0.10000 x 2    , for instance, is the same as the normalized
+ *
+ *		-127			   -128
+ * float 1.0 x 2    .  Thus, to represent 2    , we need one leading zero
+ *
+ *				  -129
+ * in the fraction; to represent 2    , we need two, and so on.  This
+ *
+ *						     (-exp_bias-fracbits+1)
+ * implies that the smallest denormalized number is 2
+ *
+ * for whichever format we are talking about: for single precision, for
+ *
+ *						-126		-149
+ * instance, we get .00000000000000000000001 x 2    , or 1.0 x 2    , and
+ *
+ * -149 == -127 - 23 + 1.
+ */
+
+/*
+ * The ARM has two sets of FP data formats.  The FPA supports 32-bit, 64-bit
+ * and 96-bit IEEE formats, with the words in big-endian order.  VFP supports
+ * 32-bin and 64-bit IEEE formats with the words in the CPU's native byte
+ * order.
+ *
+ * The FPA also has two packed decimal formats, but we ignore them here.
+ */
+
+#define	SNG_EXPBITS	8
+#define	SNG_FRACBITS	23
+
+#define	DBL_EXPBITS	11
+#define	DBL_FRACBITS	52
+
+#define	EXT_EXPBITS	15
+#define	EXT_FRACBITS	112
+
+struct ieee_single {
+	u_int	sng_frac:23;
+	u_int	sng_exp:8;
+	u_int	sng_sign:1;
+};
+
+struct ieee_double {
+	u_int	dbl_fracl;
+	u_int	dbl_frach:20;
+	u_int	dbl_exp:11;
+	u_int	dbl_sign:1;
+};
+
+union ieee_double_u {
+	double                  dblu_d;
+	struct ieee_double      dblu_dbl;
+};
+
+struct ieee_ext {
+	u_int	ext_frach:16;
+	u_int	ext_exp:15;
+	u_int	ext_sign:1;
+	u_int	ext_frachm;
+	u_int	ext_fraclm;
+	u_int	ext_fracl;
+};
+
+/*
+ * Floats whose exponent is in [1..INFNAN) (of whatever type) are
+ * `normal'.  Floats whose exponent is INFNAN are either Inf or NaN.
+ * Floats whose exponent is zero are either zero (iff all fraction
+ * bits are zero) or subnormal values.
+ *
+ * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its
+ * high fraction; if the bit is set, it is a `quiet NaN'.
+ */
+#define	SNG_EXP_INFNAN	255
+#define	DBL_EXP_INFNAN	2047
+#define	EXT_EXP_INFNAN	32767
+
+#if 0
+#define	SNG_QUIETNAN	(1 << 22)
+#define	DBL_QUIETNAN	(1 << 19)
+#define	EXT_QUIETNAN	(1 << 15)
+#endif
+
+/*
+ * Exponent biases.
+ */
+#define	SNG_EXP_BIAS	127
+#define	DBL_EXP_BIAS	1023
+#define	EXT_EXP_BIAS	16383
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-3/header-patches/include/machine/setjmp.h
similarity index 77%
rename from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
rename to ndk/platforms/android-3/header-patches/include/machine/setjmp.h
index 3e80128..d7b792e 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-3/header-patches/include/machine/setjmp.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,17 +26,14 @@
  * SUCH DAMAGE.
  */
 
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
-        .section .bss
-        .align 4
+/*
+ * machine/setjmp.h: machine dependent setjmp-related information.
+ */
 
-#ifndef CRT_LEGACY_WORKAROUND
-	.hidden __dso_handle
-#endif
-
-        .globl __dso_handle
-__dso_handle:
-        .long 0
+/* _JBLEN is the size of a jmp_buf in longs.
+ * Do not modify this value or you will break the ABI !
+ *
+ * This value comes from the mips machine/setjmp.h header
+ * because it has the biggest jump buffer length.
+ */
+#define _JBLEN  157
diff --git a/ndk/platforms/android-3/header-patches/include/sys/epoll.h b/ndk/platforms/android-3/header-patches/include/sys/epoll.h
new file mode 100644
index 0000000..c6b0882
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/sys/epoll.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_EPOLL_H_
+#define _SYS_EPOLL_H_
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+#define EPOLLIN          0x00000001
+#define EPOLLPRI         0x00000002
+#define EPOLLOUT         0x00000004
+#define EPOLLERR         0x00000008
+#define EPOLLHUP         0x00000010
+#define EPOLLRDNORM      0x00000040
+#define EPOLLRDBAND      0x00000080
+#define EPOLLWRNORM      0x00000100
+#define EPOLLWRBAND      0x00000200
+#define EPOLLMSG         0x00000400
+#define EPOLLET          0x80000000
+
+#define EPOLL_CTL_ADD    1
+#define EPOLL_CTL_DEL    2
+#define EPOLL_CTL_MOD    3
+
+typedef union epoll_data 
+{
+    void *ptr;
+    int fd;
+    unsigned int u32;
+    unsigned long long u64;
+} epoll_data_t;
+
+struct epoll_event
+{
+    unsigned int events;
+    unsigned char __padding[4];
+    epoll_data_t data;
+};
+
+int epoll_create(int size);
+int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
+int epoll_wait(int epfd, struct epoll_event *events, int max, int timeout);
+
+__END_DECLS
+
+#endif  /* _SYS_EPOLL_H_ */
diff --git a/ndk/platforms/android-3/header-patches/include/sys/stat.h b/ndk/platforms/android-3/header-patches/include/sys/stat.h
new file mode 100644
index 0000000..0a9af5b
--- /dev/null
+++ b/ndk/platforms/android-3/header-patches/include/sys/stat.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_STAT_H_
+#define _SYS_STAT_H_
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <linux/stat.h>
+
+#include <endian.h>
+
+__BEGIN_DECLS
+
+/* really matches stat64 in the kernel, hence the padding
+ * Note: The kernel zero's the padded region because glibc might read them
+ * in the hope that the kernel has stretched to using larger sizes.
+ */
+struct stat {
+    unsigned long long  st_dev;
+    unsigned char       __pad0[4];
+
+    unsigned long       __st_ino;
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long long  st_rdev;
+    unsigned char       __pad3[4];
+
+    unsigned char       __pad4[4];
+    long long           st_size;
+    unsigned long       st_blksize;
+    unsigned char       __pad5[4];
+    unsigned long long  st_blocks;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long long  st_ino;
+};
+
+/* For compatibility with GLibc, we provide macro aliases
+ * for the non-Posix nano-seconds accessors.
+ */
+#define  st_atimensec  st_atime_nsec
+#define  st_mtimensec  st_mtime_nsec
+#define  st_ctimensec  st_ctime_nsec
+
+extern int    chmod(const char *, mode_t);
+extern int    fchmod(int, mode_t);
+extern int    mkdir(const char *, mode_t);
+
+extern int    stat(const char *, struct stat *);
+extern int    fstat(int, struct stat *);
+extern int    lstat(const char *, struct stat *);
+extern int    mknod(const char *, mode_t, dev_t);
+extern mode_t umask(mode_t);
+
+#define  stat64    stat
+#define  fstat64   fstat
+#define  lstat64   lstat
+
+static __inline__ int mkfifo(const char *__p, mode_t __m)
+{
+  return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
+}
+
+extern int  fstatat(int dirfd, const char *path, struct stat *buf, int flags);
+extern int  mkdirat(int dirfd, const char *pathname, mode_t mode);
+extern int fchownat(int dirfd, const char *path, uid_t owner, gid_t group, int flags);
+extern int fchmodat(int dirfd, const char *path, mode_t mode, int flags);
+extern int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
+
+__END_DECLS
+
+#endif /* _SYS_STAT_H_ */
diff --git a/ndk/platforms/android-3/include/inttypes.h b/ndk/platforms/android-3/include/inttypes.h
index 73b22db..62e12c6 100644
--- a/ndk/platforms/android-3/include/inttypes.h
+++ b/ndk/platforms/android-3/include/inttypes.h
@@ -249,8 +249,6 @@
 } imaxdiv_t;
 
 __BEGIN_DECLS
-intmax_t	imaxabs(intmax_t);
-imaxdiv_t	imaxdiv(intmax_t, intmax_t);
 intmax_t	strtoimax(const char *, char **, int);
 uintmax_t	strtoumax(const char *, char **, int);
 
diff --git a/ndk/platforms/android-3/include/jni.h b/ndk/platforms/android-3/include/jni.h
index 495902c..f36398f 100644
--- a/ndk/platforms/android-3/include/jni.h
+++ b/ndk/platforms/android-3/include/jni.h
@@ -24,6 +24,7 @@
 #ifndef JNI_H_
 #define JNI_H_
 
+#include <sys/cdefs.h>
 #include <stdarg.h>
 
 /*
@@ -231,12 +232,12 @@
     jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
     jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
     jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
+    jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
+    jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
+    jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
+    jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...) __NDK_FPABI__;
+    jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list) __NDK_FPABI__;
+    jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*) __NDK_FPABI__;
     void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
     void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
     void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
@@ -284,17 +285,17 @@
     jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,
                         jmethodID, jvalue*);
     jfloat      (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
+                        jmethodID, ...) __NDK_FPABI__;
     jfloat      (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
+                        jmethodID, va_list) __NDK_FPABI__;
     jfloat      (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
+                        jmethodID, jvalue*) __NDK_FPABI__;
     jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
+                        jmethodID, ...) __NDK_FPABI__;
     jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
+                        jmethodID, va_list) __NDK_FPABI__;
     jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
+                        jmethodID, jvalue*) __NDK_FPABI__;
     void        (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,
                         jmethodID, ...);
     void        (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,
@@ -311,8 +312,8 @@
     jshort      (*GetShortField)(JNIEnv*, jobject, jfieldID);
     jint        (*GetIntField)(JNIEnv*, jobject, jfieldID);
     jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);
-    jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID);
-    jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID);
+    jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;
+    jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID) __NDK_FPABI__;
 
     void        (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);
     void        (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);
@@ -321,8 +322,8 @@
     void        (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
     void        (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
     void        (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);
-    void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);
-    void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);
+    void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat) __NDK_FPABI__;
+    void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble) __NDK_FPABI__;
 
     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
 
@@ -349,12 +350,12 @@
     jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);
     jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);
     jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
+    jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;
+    jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;
+    jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;
+    jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...) __NDK_FPABI__;
+    jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list) __NDK_FPABI__;
+    jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*) __NDK_FPABI__;
     void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
     void        (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);
     void        (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
@@ -369,8 +370,8 @@
     jshort      (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);
     jint        (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);
     jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);
-    jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);
-    jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);
+    jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;
+    jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID) __NDK_FPABI__;
 
     void        (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);
     void        (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
@@ -379,8 +380,8 @@
     void        (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);
     void        (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);
     void        (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);
-    void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);
-    void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);
+    void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat) __NDK_FPABI__;
+    void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble) __NDK_FPABI__;
 
     jstring     (*NewString)(JNIEnv*, const jchar*, jsize);
     jsize       (*GetStringLength)(JNIEnv*, jstring);
@@ -605,6 +606,7 @@
     { return functions->GetMethodID(this, clazz, name, sig); }
 
 #define CALL_TYPE_METHOD(_jtype, _jname)                                    \
+    __NDK_FPABI__                                                           \
     _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \
     {                                                                       \
         _jtype result;                                                      \
@@ -616,10 +618,12 @@
         return result;                                                      \
     }
 #define CALL_TYPE_METHODV(_jtype, _jname)                                   \
+    __NDK_FPABI__                                                           \
     _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \
         va_list args)                                                       \
     { return functions->Call##_jname##MethodV(this, obj, methodID, args); }
 #define CALL_TYPE_METHODA(_jtype, _jname)                                   \
+    __NDK_FPABI__                                                           \
     _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,           \
         jvalue* args)                                                       \
     { return functions->Call##_jname##MethodA(this, obj, methodID, args); }
@@ -652,6 +656,7 @@
     { functions->CallVoidMethodA(this, obj, methodID, args); }
 
 #define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                            \
+    __NDK_FPABI__                                                           \
     _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,        \
         jmethodID methodID, ...)                                            \
     {                                                                       \
@@ -664,11 +669,13 @@
         return result;                                                      \
     }
 #define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                           \
+    __NDK_FPABI__                                                           \
     _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,       \
         jmethodID methodID, va_list args)                                   \
     { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,   \
         methodID, args); }
 #define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                           \
+    __NDK_FPABI__                                                           \
     _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,       \
         jmethodID methodID, jvalue* args)                                   \
     { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,   \
@@ -721,8 +728,10 @@
     { return functions->GetIntField(this, obj, fieldID); }
     jlong GetLongField(jobject obj, jfieldID fieldID)
     { return functions->GetLongField(this, obj, fieldID); }
+    __NDK_FPABI__
     jfloat GetFloatField(jobject obj, jfieldID fieldID)
     { return functions->GetFloatField(this, obj, fieldID); }
+    __NDK_FPABI__
     jdouble GetDoubleField(jobject obj, jfieldID fieldID)
     { return functions->GetDoubleField(this, obj, fieldID); }
 
@@ -740,8 +749,10 @@
     { functions->SetIntField(this, obj, fieldID, value); }
     void SetLongField(jobject obj, jfieldID fieldID, jlong value)
     { functions->SetLongField(this, obj, fieldID, value); }
+    __NDK_FPABI__
     void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)
     { functions->SetFloatField(this, obj, fieldID, value); }
+    __NDK_FPABI__
     void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)
     { functions->SetDoubleField(this, obj, fieldID, value); }
 
@@ -749,6 +760,7 @@
     { return functions->GetStaticMethodID(this, clazz, name, sig); }
 
 #define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                             \
+    __NDK_FPABI__                                                           \
     _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,     \
         ...)                                                                \
     {                                                                       \
@@ -761,11 +773,13 @@
         return result;                                                      \
     }
 #define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                            \
+    __NDK_FPABI__                                                           \
     _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,    \
         va_list args)                                                       \
     { return functions->CallStatic##_jname##MethodV(this, clazz, methodID,  \
         args); }
 #define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                            \
+    __NDK_FPABI__                                                           \
     _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,    \
         jvalue* args)                                                       \
     { return functions->CallStatic##_jname##MethodA(this, clazz, methodID,  \
@@ -815,8 +829,10 @@
     { return functions->GetStaticIntField(this, clazz, fieldID); }
     jlong GetStaticLongField(jclass clazz, jfieldID fieldID)
     { return functions->GetStaticLongField(this, clazz, fieldID); }
+    __NDK_FPABI__
     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)
     { return functions->GetStaticFloatField(this, clazz, fieldID); }
+    __NDK_FPABI__
     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)
     { return functions->GetStaticDoubleField(this, clazz, fieldID); }
 
@@ -834,8 +850,10 @@
     { functions->SetStaticIntField(this, clazz, fieldID, value); }
     void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)
     { functions->SetStaticLongField(this, clazz, fieldID, value); }
+    __NDK_FPABI__
     void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)
     { functions->SetStaticFloatField(this, clazz, fieldID, value); }
+    __NDK_FPABI__
     void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)
     { functions->SetStaticDoubleField(this, clazz, fieldID, value); }
 
@@ -1120,14 +1138,14 @@
 
 #define JNIIMPORT
 #define JNIEXPORT  __attribute__ ((visibility ("default")))
-#define JNICALL
+#define JNICALL __NDK_FPABI__
 
 /*
  * Prototypes for functions exported by loadable shared libs.  These are
  * called by JNI, not provided by JNI.
  */
-JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
-JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);
+JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved);
 
 #ifdef __cplusplus
 }
diff --git a/ndk/platforms/android-3/include/math.h b/ndk/platforms/android-3/include/math.h
index ef6a9e6..b572298 100644
--- a/ndk/platforms/android-3/include/math.h
+++ b/ndk/platforms/android-3/include/math.h
@@ -183,219 +183,219 @@
 /*
  * ANSI/POSIX
  */
-int	__fpclassifyd(double) __pure2;
-int	__fpclassifyf(float) __pure2;
-int	__fpclassifyl(long double) __pure2;
-int	__isfinitef(float) __pure2;
-int	__isfinite(double) __pure2;
-int	__isfinitel(long double) __pure2;
-int	__isinff(float) __pure2;
-int     __isinf(double) __pure2;
-int	__isinfl(long double) __pure2;
-int	__isnanl(long double) __pure2;
-int	__isnormalf(float) __pure2;
-int	__isnormal(double) __pure2;
-int	__isnormall(long double) __pure2;
-int	__signbit(double) __pure2;
-int	__signbitf(float) __pure2;
-int	__signbitl(long double) __pure2;
+int	__fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int	__isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isinff(float) __NDK_FPABI_MATH__ __pure2;
+int     __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int	__isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int	__isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int	__signbit(double) __NDK_FPABI_MATH__ __pure2;
+int	__signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int	__signbitl(long double) __NDK_FPABI_MATH__ __pure2;
 
-double	acos(double);
-double	asin(double);
-double	atan(double);
-double	atan2(double, double);
-double	cos(double);
-double	sin(double);
-double	tan(double);
+double	acos(double) __NDK_FPABI_MATH__;
+double	asin(double) __NDK_FPABI_MATH__;
+double	atan(double) __NDK_FPABI_MATH__;
+double	atan2(double, double) __NDK_FPABI_MATH__;
+double	cos(double) __NDK_FPABI_MATH__;
+double	sin(double) __NDK_FPABI_MATH__;
+double	tan(double) __NDK_FPABI_MATH__;
 
-double	cosh(double);
-double	sinh(double);
-double	tanh(double);
+double	cosh(double) __NDK_FPABI_MATH__;
+double	sinh(double) __NDK_FPABI_MATH__;
+double	tanh(double) __NDK_FPABI_MATH__;
 
-double	exp(double);
-double	frexp(double, int *);	/* fundamentally !__pure2 */
-double	ldexp(double, int);
-double	log(double);
-double	log10(double);
-double	modf(double, double *);	/* fundamentally !__pure2 */
+double	exp(double) __NDK_FPABI_MATH__;
+double	frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	ldexp(double, int) __NDK_FPABI_MATH__;
+double	log(double) __NDK_FPABI_MATH__;
+double	log10(double) __NDK_FPABI_MATH__;
+double	modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
 
-double	pow(double, double);
-double	sqrt(double);
+double	pow(double, double) __NDK_FPABI_MATH__;
+double	sqrt(double) __NDK_FPABI_MATH__;
 
-double	ceil(double);
-double	fabs(double) __pure2;
-double	floor(double);
-double	fmod(double, double);
+double	ceil(double) __NDK_FPABI_MATH__;
+double	fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	floor(double) __NDK_FPABI_MATH__;
+double	fmod(double, double) __NDK_FPABI_MATH__;
 
 /*
  * These functions are not in C90.
  */
 /* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
-double	acosh(double);
-double	asinh(double);
-double	atanh(double);
-double	cbrt(double);
-double	erf(double);
-double	erfc(double);
-double	exp2(double);
-double	expm1(double);
-double	fma(double, double, double);
-double	hypot(double, double);
-int	ilogb(double) __pure2;
-/* int	(isinf)(double) __pure2; */
-int	(isnan)(double) __pure2;
-double	lgamma(double);
-long long llrint(double);
-long long llround(double);
-double	log1p(double);
-double	logb(double);
-long	lrint(double);
-long	lround(double);
-double	nextafter(double, double);
-double	remainder(double, double);
-double	remquo(double, double, int *);
-double	rint(double);
+double	acosh(double) __NDK_FPABI_MATH__;
+double	asinh(double) __NDK_FPABI_MATH__;
+double	atanh(double) __NDK_FPABI_MATH__;
+double	cbrt(double) __NDK_FPABI_MATH__;
+double	erf(double) __NDK_FPABI_MATH__;
+double	erfc(double) __NDK_FPABI_MATH__;
+double	exp2(double) __NDK_FPABI_MATH__;
+double	expm1(double) __NDK_FPABI_MATH__;
+double	fma(double, double, double) __NDK_FPABI_MATH__;
+double	hypot(double, double) __NDK_FPABI_MATH__;
+int	ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	(isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int	(isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double	lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double	log1p(double) __NDK_FPABI_MATH__;
+double	logb(double) __NDK_FPABI_MATH__;
+long	lrint(double) __NDK_FPABI_MATH__;
+long	lround(double) __NDK_FPABI_MATH__;
+double	nextafter(double, double) __NDK_FPABI_MATH__;
+double	remainder(double, double) __NDK_FPABI_MATH__;
+double	remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	rint(double) __NDK_FPABI_MATH__;
 /* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
 
 /* #if __BSD_VISIBLE || __XSI_VISIBLE */
-double	j0(double);
-double	j1(double);
-double	jn(int, double);
-double	scalb(double, double);
-double	y0(double);
-double	y1(double);
-double	yn(int, double);
+double	j0(double) __NDK_FPABI_MATH__;
+double	j1(double) __NDK_FPABI_MATH__;
+double	jn(int, double) __NDK_FPABI_MATH__;
+double	scalb(double, double) __NDK_FPABI_MATH__;
+double	y0(double) __NDK_FPABI_MATH__;
+double	y1(double) __NDK_FPABI_MATH__;
+double	yn(int, double) __NDK_FPABI_MATH__;
 
 /* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
-double	gamma(double);
+double	gamma(double) __NDK_FPABI_MATH__;
 /* #endif */
 /* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
 
 /* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
-double	copysign(double, double) __pure2;
-double	fdim(double, double);
-double	fmax(double, double) __pure2;
-double	fmin(double, double) __pure2;
-double	nearbyint(double);
-double	round(double);
-double	scalbln(double, long);
-double	scalbn(double, int);
-double	tgamma(double);
-double	trunc(double);
+double	copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fdim(double, double) __NDK_FPABI_MATH__;
+double	fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	nearbyint(double) __NDK_FPABI_MATH__;
+double	round(double) __NDK_FPABI_MATH__;
+double	scalbln(double, long) __NDK_FPABI_MATH__;
+double	scalbn(double, int) __NDK_FPABI_MATH__;
+double	tgamma(double) __NDK_FPABI_MATH__;
+double	trunc(double) __NDK_FPABI_MATH__;
 /* #endif */
 
 /*
  * BSD math library entry points
  */
 /* #if __BSD_VISIBLE */
-double	drem(double, double);
-int	finite(double) __pure2;
-int	isnanf(float) __pure2;
+double	drem(double, double) __NDK_FPABI_MATH__;
+int	finite(double) __NDK_FPABI_MATH__ __pure2;
+int	isnanf(float) __NDK_FPABI_MATH__ __pure2;
 
 /*
  * Reentrant version of gamma & lgamma; passes signgam back by reference
  * as the second argument; user must allocate space for signgam.
  */
-double	gamma_r(double, int *);
-double	lgamma_r(double, int *);
+double	gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	lgamma_r(double, int *) __NDK_FPABI_MATH__;
 
 /*
  * IEEE Test Vector
  */
-double	significand(double);
+double	significand(double) __NDK_FPABI_MATH__;
 /* #endif */ /* __BSD_VISIBLE */
 
 /* float versions of ANSI/POSIX functions */
 /*#if __ISO_C_VISIBLE >= 1999 */
-float	acosf(float);
-float	asinf(float);
-float	atanf(float);
-float	atan2f(float, float);
-float	cosf(float);
-float	sinf(float);
-float	tanf(float);
+float	acosf(float) __NDK_FPABI_MATH__;
+float	asinf(float) __NDK_FPABI_MATH__;
+float	atanf(float) __NDK_FPABI_MATH__;
+float	atan2f(float, float) __NDK_FPABI_MATH__;
+float	cosf(float) __NDK_FPABI_MATH__;
+float	sinf(float) __NDK_FPABI_MATH__;
+float	tanf(float) __NDK_FPABI_MATH__;
 
-float	coshf(float);
-float	sinhf(float);
-float	tanhf(float);
+float	coshf(float) __NDK_FPABI_MATH__;
+float	sinhf(float) __NDK_FPABI_MATH__;
+float	tanhf(float) __NDK_FPABI_MATH__;
 
-float	exp2f(float);
-float	expf(float);
-float	expm1f(float);
-float	frexpf(float, int *);	/* fundamentally !__pure2 */
-int	ilogbf(float) __pure2;
-float	ldexpf(float, int);
-float	log10f(float);
-float	log1pf(float);
-float	logf(float);
-float	modff(float, float *);	/* fundamentally !__pure2 */
+float	exp2f(float) __NDK_FPABI_MATH__;
+float	expf(float) __NDK_FPABI_MATH__;
+float	expm1f(float) __NDK_FPABI_MATH__;
+float	frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	ldexpf(float, int) __NDK_FPABI_MATH__;
+float	log10f(float) __NDK_FPABI_MATH__;
+float	log1pf(float) __NDK_FPABI_MATH__;
+float	logf(float) __NDK_FPABI_MATH__;
+float	modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
 
-float	powf(float, float);
-float	sqrtf(float);
+float	powf(float, float) __NDK_FPABI_MATH__;
+float	sqrtf(float) __NDK_FPABI_MATH__;
 
-float	ceilf(float);
-float	fabsf(float) __pure2;
-float	floorf(float);
-float	fmodf(float, float);
-float	roundf(float);
+float	ceilf(float) __NDK_FPABI_MATH__;
+float	fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	floorf(float) __NDK_FPABI_MATH__;
+float	fmodf(float, float) __NDK_FPABI_MATH__;
+float	roundf(float) __NDK_FPABI_MATH__;
 
-float	erff(float);
-float	erfcf(float);
-float	hypotf(float, float);
-float	lgammaf(float);
+float	erff(float) __NDK_FPABI_MATH__;
+float	erfcf(float) __NDK_FPABI_MATH__;
+float	hypotf(float, float) __NDK_FPABI_MATH__;
+float	lgammaf(float) __NDK_FPABI_MATH__;
 
-float	acoshf(float);
-float	asinhf(float);
-float	atanhf(float);
-float	cbrtf(float);
-float	logbf(float);
-float	copysignf(float, float) __pure2;
-long long llrintf(float);
-long long llroundf(float);
-long	lrintf(float);
-long	lroundf(float);
-float	nearbyintf(float);
-float	nextafterf(float, float);
-float	remainderf(float, float);
-float	remquof(float, float, int *);
-float	rintf(float);
-float	scalblnf(float, long);
-float	scalbnf(float, int);
-float	truncf(float);
+float	acoshf(float) __NDK_FPABI_MATH__;
+float	asinhf(float) __NDK_FPABI_MATH__;
+float	atanhf(float) __NDK_FPABI_MATH__;
+float	cbrtf(float) __NDK_FPABI_MATH__;
+float	logbf(float) __NDK_FPABI_MATH__;
+float	copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long	lrintf(float) __NDK_FPABI_MATH__;
+long	lroundf(float) __NDK_FPABI_MATH__;
+float	nearbyintf(float) __NDK_FPABI_MATH__;
+float	nextafterf(float, float) __NDK_FPABI_MATH__;
+float	remainderf(float, float) __NDK_FPABI_MATH__;
+float	remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	rintf(float) __NDK_FPABI_MATH__;
+float	scalblnf(float, long) __NDK_FPABI_MATH__;
+float	scalbnf(float, int) __NDK_FPABI_MATH__;
+float	truncf(float) __NDK_FPABI_MATH__;
 
-float	fdimf(float, float);
-float	fmaf(float, float, float);
-float	fmaxf(float, float) __pure2;
-float	fminf(float, float) __pure2;
+float	fdimf(float, float) __NDK_FPABI_MATH__;
+float	fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	fminf(float, float) __NDK_FPABI_MATH__ __pure2;
 /* #endif */
 
 /*
  * float versions of BSD math library entry points
  */
 /* #if __BSD_VISIBLE */
-float	dremf(float, float);
-int	finitef(float) __pure2;
-float	gammaf(float);
-float	j0f(float);
-float	j1f(float);
-float	jnf(int, float);
-float	scalbf(float, float);
-float	y0f(float);
-float	y1f(float);
-float	ynf(int, float);
+float	dremf(float, float) __NDK_FPABI_MATH__;
+int	finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	gammaf(float) __NDK_FPABI_MATH__;
+float	j0f(float) __NDK_FPABI_MATH__;
+float	j1f(float) __NDK_FPABI_MATH__;
+float	jnf(int, float) __NDK_FPABI_MATH__;
+float	scalbf(float, float) __NDK_FPABI_MATH__;
+float	y0f(float) __NDK_FPABI_MATH__;
+float	y1f(float) __NDK_FPABI_MATH__;
+float	ynf(int, float) __NDK_FPABI_MATH__;
 
 /*
  * Float versions of reentrant version of gamma & lgamma; passes
  * signgam back by reference as the second argument; user must
  * allocate space for signgam.
  */
-float	gammaf_r(float, int *);
-float	lgammaf_r(float, int *);
+float	gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	lgammaf_r(float, int *) __NDK_FPABI_MATH__;
 
 /*
  * float version of IEEE Test Vector
  */
-float	significandf(float);
+float	significandf(float) __NDK_FPABI_MATH__;
 /* #endif */	/* __BSD_VISIBLE */ 
 
 /*
@@ -403,84 +403,298 @@
  */
 /* #if __ISO_C_VISIBLE >= 1999 */
 #if 0
-long double	acoshl(long double);
-long double	acosl(long double);
-long double	asinhl(long double);
-long double	asinl(long double);
-long double	atan2l(long double, long double);
-long double	atanhl(long double);
-long double	atanl(long double);
-long double	cbrtl(long double);
+long double	acoshl(long double) __NDK_FPABI_MATH__;
+long double	acosl(long double) __NDK_FPABI_MATH__;
+long double	asinhl(long double) __NDK_FPABI_MATH__;
+long double	asinl(long double) __NDK_FPABI_MATH__;
+long double	atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	atanhl(long double) __NDK_FPABI_MATH__;
+long double	atanl(long double) __NDK_FPABI_MATH__;
+long double	cbrtl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	ceill(long double);
-long double	copysignl(long double, long double) __pure2;
+long double	ceill(long double) __NDK_FPABI_MATH__;
+long double	copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
 #if 0
-long double	coshl(long double);
-long double	cosl(long double);
-long double	erfcl(long double);
-long double	erfl(long double);
-long double	exp2l(long double);
-long double	expl(long double);
-long double	expm1l(long double);
+long double	coshl(long double) __NDK_FPABI_MATH__;
+long double	cosl(long double) __NDK_FPABI_MATH__;
+long double	erfcl(long double) __NDK_FPABI_MATH__;
+long double	erfl(long double) __NDK_FPABI_MATH__;
+long double	exp2l(long double) __NDK_FPABI_MATH__;
+long double	expl(long double) __NDK_FPABI_MATH__;
+long double	expm1l(long double) __NDK_FPABI_MATH__;
 #endif
-long double	fabsl(long double) __pure2;
-long double	fdiml(long double, long double);
-long double	floorl(long double);
-long double	fmal(long double, long double, long double);
-long double	fmaxl(long double, long double) __pure2;
-long double	fminl(long double, long double) __pure2;
+long double	fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	floorl(long double) __NDK_FPABI_MATH__;
+long double	fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
 #if 0
-long double	fmodl(long double, long double);
+long double	fmodl(long double, long double) __NDK_FPABI_MATH__;
 #endif
-long double	frexpl(long double value, int *); /* fundamentally !__pure2 */
+long double	frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
 #if 0
-long double	hypotl(long double, long double);
+long double	hypotl(long double, long double) __NDK_FPABI_MATH__;
 #endif
-int		ilogbl(long double) __pure2;
-long double	ldexpl(long double, int);
+int		ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	ldexpl(long double, int) __NDK_FPABI_MATH__;
 #if 0
-long double	lgammal(long double);
-long long	llrintl(long double);
+long double	lgammal(long double) __NDK_FPABI_MATH__;
+long long	llrintl(long double) __NDK_FPABI_MATH__;
 #endif
-long long	llroundl(long double);
+long long	llroundl(long double) __NDK_FPABI_MATH__;
 #if 0
-long double	log10l(long double);
-long double	log1pl(long double);
-long double	log2l(long double);
-long double	logbl(long double);
-long double	logl(long double);
-long		lrintl(long double);
+long double	log10l(long double) __NDK_FPABI_MATH__;
+long double	log1pl(long double) __NDK_FPABI_MATH__;
+long double	log2l(long double) __NDK_FPABI_MATH__;
+long double	logbl(long double) __NDK_FPABI_MATH__;
+long double	logl(long double) __NDK_FPABI_MATH__;
+long		lrintl(long double) __NDK_FPABI_MATH__;
 #endif
-long		lroundl(long double);
+long		lroundl(long double) __NDK_FPABI_MATH__;
 #if 0
-long double	modfl(long double, long double *); /* fundamentally !__pure2 */
-long double	nanl(const char *) __pure2;
-long double	nearbyintl(long double);
+long double	modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	nearbyintl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	nextafterl(long double, long double);
-double		nexttoward(double, long double);
-float		nexttowardf(float, long double);
-long double	nexttowardl(long double, long double);
+long double	nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double		nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double	nexttowardl(long double, long double) __NDK_FPABI_MATH__;
 #if 0
-long double	powl(long double, long double);
-long double	remainderl(long double, long double);
-long double	remquol(long double, long double, int *);
-long double	rintl(long double);
+long double	powl(long double, long double) __NDK_FPABI_MATH__;
+long double	remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	rintl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	roundl(long double);
-long double	scalblnl(long double, long);
-long double	scalbnl(long double, int);
+long double	roundl(long double) __NDK_FPABI_MATH__;
+long double	scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	scalbnl(long double, int) __NDK_FPABI_MATH__;
 #if 0
-long double	sinhl(long double);
-long double	sinl(long double);
-long double	sqrtl(long double);
-long double	tanhl(long double);
-long double	tanl(long double);
-long double	tgammal(long double);
+long double	sinhl(long double) __NDK_FPABI_MATH__;
+long double	sinl(long double) __NDK_FPABI_MATH__;
+long double	sqrtl(long double) __NDK_FPABI_MATH__;
+long double	tanhl(long double) __NDK_FPABI_MATH__;
+long double	tanl(long double) __NDK_FPABI_MATH__;
+long double	tgammal(long double) __NDK_FPABI_MATH__;
 #endif
-long double	truncl(long double);
+long double	truncl(long double) __NDK_FPABI_MATH__;
 
-/* #endif */ /* __ISO_C_VISIBLE >= 1999 */
+/* BIONIC: GLibc compatibility - required by the ARM toolchain */
+#ifdef _GNU_SOURCE
+void  sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+#endif
+
+/* builtin version of all the above math functions are annotated too */
+
+double	__builtin_acos(double) __NDK_FPABI_MATH__;
+double	__builtin_asin(double) __NDK_FPABI_MATH__;
+double	__builtin_atan(double) __NDK_FPABI_MATH__;
+double	__builtin_atan2(double, double) __NDK_FPABI_MATH__;
+double	__builtin_cos(double) __NDK_FPABI_MATH__;
+double	__builtin_sin(double) __NDK_FPABI_MATH__;
+double	__builtin_tan(double) __NDK_FPABI_MATH__;
+double	__builtin_cosh(double) __NDK_FPABI_MATH__;
+double	__builtin_sinh(double) __NDK_FPABI_MATH__;
+double	__builtin_tanh(double) __NDK_FPABI_MATH__;
+double	__builtin_exp(double) __NDK_FPABI_MATH__;
+double	__builtin_frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_ldexp(double, int) __NDK_FPABI_MATH__;
+double	__builtin_log(double) __NDK_FPABI_MATH__;
+double	__builtin_log10(double) __NDK_FPABI_MATH__;
+double	__builtin_modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_pow(double, double) __NDK_FPABI_MATH__;
+double	__builtin_sqrt(double) __NDK_FPABI_MATH__;
+double	__builtin_ceil(double) __NDK_FPABI_MATH__;
+double	__builtin_fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_floor(double) __NDK_FPABI_MATH__;
+double	__builtin_fmod(double, double) __NDK_FPABI_MATH__;
+double	__builtin_acosh(double) __NDK_FPABI_MATH__;
+double	__builtin_asinh(double) __NDK_FPABI_MATH__;
+double	__builtin_atanh(double) __NDK_FPABI_MATH__;
+double	__builtin_cbrt(double) __NDK_FPABI_MATH__;
+double	__builtin_erf(double) __NDK_FPABI_MATH__;
+double	__builtin_erfc(double) __NDK_FPABI_MATH__;
+double	__builtin_exp2(double) __NDK_FPABI_MATH__;
+double	__builtin_expm1(double) __NDK_FPABI_MATH__;
+double	__builtin_fma(double, double, double) __NDK_FPABI_MATH__;
+double	__builtin_hypot(double, double) __NDK_FPABI_MATH__;
+int	__builtin_ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	__builtin_isinf(double) __NDK_FPABI_MATH__ __pure2; */
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 5)
+int	__builtin_isnan(double) __NDK_FPABI_MATH__ __pure2;
+#else
+/* clang < 3.5 has faulty prototype for __builtin_isnan */
+#endif
+double	__builtin_lgamma(double) __NDK_FPABI_MATH__;
+long long __builtin_llrint(double) __NDK_FPABI_MATH__;
+long long __builtin_llround(double) __NDK_FPABI_MATH__;
+double	__builtin_log1p(double) __NDK_FPABI_MATH__;
+double	__builtin_logb(double) __NDK_FPABI_MATH__;
+long	__builtin_lrint(double) __NDK_FPABI_MATH__;
+long	__builtin_lround(double) __NDK_FPABI_MATH__;
+double	__builtin_nextafter(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remainder(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	__builtin_rint(double) __NDK_FPABI_MATH__;
+double	__builtin_j0(double) __NDK_FPABI_MATH__;
+double	__builtin_j1(double) __NDK_FPABI_MATH__;
+double	__builtin_jn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_scalb(double, double) __NDK_FPABI_MATH__;
+double	__builtin_y0(double) __NDK_FPABI_MATH__;
+double	__builtin_y1(double) __NDK_FPABI_MATH__;
+double	__builtin_yn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_gamma(double) __NDK_FPABI_MATH__;
+double	__builtin_copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fdim(double, double) __NDK_FPABI_MATH__;
+double	__builtin_fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nearbyint(double) __NDK_FPABI_MATH__;
+double	__builtin_round(double) __NDK_FPABI_MATH__;
+double	__builtin_scalbln(double, long) __NDK_FPABI_MATH__;
+double	__builtin_scalbn(double, int) __NDK_FPABI_MATH__;
+double	__builtin_tgamma(double) __NDK_FPABI_MATH__;
+double	__builtin_trunc(double) __NDK_FPABI_MATH__;
+double	__builtin_drem(double, double) __NDK_FPABI_MATH__;
+int	__builtin_finite(double) __NDK_FPABI_MATH__ __pure2;
+int	__builtin_isnanf(float) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_lgamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_significand(double) __NDK_FPABI_MATH__;
+float	__builtin_acosf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanf(float) __NDK_FPABI_MATH__;
+float	__builtin_atan2f(float, float) __NDK_FPABI_MATH__;
+float	__builtin_cosf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanf(float) __NDK_FPABI_MATH__;
+float	__builtin_coshf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_exp2f(float) __NDK_FPABI_MATH__;
+float	__builtin_expf(float) __NDK_FPABI_MATH__;
+float	__builtin_expm1f(float) __NDK_FPABI_MATH__;
+float	__builtin_frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	__builtin_ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_ldexpf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_log10f(float) __NDK_FPABI_MATH__;
+float	__builtin_log1pf(float) __NDK_FPABI_MATH__;
+float	__builtin_logf(float) __NDK_FPABI_MATH__;
+float	__builtin_modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+float	__builtin_powf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_sqrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_ceilf(float) __NDK_FPABI_MATH__;
+float	__builtin_fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_floorf(float) __NDK_FPABI_MATH__;
+float	__builtin_fmodf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_roundf(float) __NDK_FPABI_MATH__;
+float	__builtin_erff(float) __NDK_FPABI_MATH__;
+float	__builtin_erfcf(float) __NDK_FPABI_MATH__;
+float	__builtin_hypotf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_acoshf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_cbrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_logbf(float) __NDK_FPABI_MATH__;
+float	__builtin_copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long __builtin_llrintf(float) __NDK_FPABI_MATH__;
+long long __builtin_llroundf(float) __NDK_FPABI_MATH__;
+long	__builtin_lrintf(float) __NDK_FPABI_MATH__;
+long	__builtin_lroundf(float) __NDK_FPABI_MATH__;
+float	__builtin_nearbyintf(float) __NDK_FPABI_MATH__;
+float	__builtin_nextafterf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remainderf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	__builtin_rintf(float) __NDK_FPABI_MATH__;
+float	__builtin_scalblnf(float, long) __NDK_FPABI_MATH__;
+float	__builtin_scalbnf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_truncf(float) __NDK_FPABI_MATH__;
+float	__builtin_fdimf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_dremf(float, float) __NDK_FPABI_MATH__;
+int	__builtin_finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_gammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_j0f(float) __NDK_FPABI_MATH__;
+float	__builtin_j1f(float) __NDK_FPABI_MATH__;
+float	__builtin_jnf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_scalbf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_y0f(float) __NDK_FPABI_MATH__;
+float	__builtin_y1f(float) __NDK_FPABI_MATH__;
+float	__builtin_ynf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_significandf(float) __NDK_FPABI_MATH__;
+long double	__builtin_acoshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_acosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cbrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_ceill(long double) __NDK_FPABI_MATH__;
+long double	__builtin_copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_coshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfcl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_exp2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expm1l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_floorl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fmodl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_hypotl(long double, long double) __NDK_FPABI_MATH__;
+int		__builtin_ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_ldexpl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_lgammal(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llrintl(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log10l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log1pl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logbl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lrintl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_nearbyintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_nextafterl(long double, long double) __NDK_FPABI_MATH__;
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)
+double		__builtin_nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, long double) __NDK_FPABI_MATH__;
+#else
+/* clang < 3.4 */
+double		__builtin_nexttoward(double, double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, float) __NDK_FPABI_MATH__;
+#endif
+long double	__builtin_nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_powl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	__builtin_rintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_roundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	__builtin_scalbnl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_sinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sqrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tgammal(long double) __NDK_FPABI_MATH__;
+long double	__builtin_truncl(long double) __NDK_FPABI_MATH__;
+
 __END_DECLS
 
 #endif /* !_MATH_H_ */
diff --git a/ndk/platforms/android-3/include/poll.h b/ndk/platforms/android-3/include/poll.h
index 560be89..91068e4 100644
--- a/ndk/platforms/android-3/include/poll.h
+++ b/ndk/platforms/android-3/include/poll.h
@@ -35,8 +35,7 @@
 
 typedef unsigned int  nfds_t;
 
-/* POSIX specifies "int" for the timeout, Linux seems to use long... */
-extern int poll(struct pollfd *, nfds_t, long);
+extern int poll(struct pollfd *, nfds_t, int);
 
 __END_DECLS
 
diff --git a/ndk/platforms/android-3/include/pthread.h b/ndk/platforms/android-3/include/pthread.h
index ae55782..63ddb76 100644
--- a/ndk/platforms/android-3/include/pthread.h
+++ b/ndk/platforms/android-3/include/pthread.h
@@ -138,7 +138,9 @@
 
 int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
                    void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
 int pthread_join(pthread_t thid, void ** ret_val);
 int pthread_detach(pthread_t  thid);
 
diff --git a/ndk/platforms/android-3/include/stdlib.h b/ndk/platforms/android-3/include/stdlib.h
index 424adb4..bb5b3b8 100644
--- a/ndk/platforms/android-3/include/stdlib.h
+++ b/ndk/platforms/android-3/include/stdlib.h
@@ -56,6 +56,7 @@
 extern int setenv(const char *, const char *, int);
 extern int unsetenv(const char *);
 
+extern char *mkdtemp(char *);
 extern char *mktemp (char *);
 extern int mkstemp (char *);
 
@@ -63,8 +64,9 @@
 extern long long strtoll(const char *, char **, int);
 extern unsigned long strtoul(const char *, char **, int);
 extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
 
+__NDK_FPABI__
 static __inline__ float strtof(const char *nptr, char **endptr)
 {
     return (float)strtod(nptr, endptr);
@@ -74,6 +76,7 @@
 extern long atol(const char *);
 extern long long atoll(const char *);
 
+ __NDK_FPABI__
 static __inline__ double atof(const char *nptr)
 {
     return (strtod(nptr, NULL));
@@ -105,8 +108,8 @@
 extern long nrand48(unsigned short *);
 extern long lrand48(void);
 extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
 extern void srand48(long);
 extern unsigned int arc4random(void);
 extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-3/include/sys/cdefs.h b/ndk/platforms/android-3/include/sys/cdefs.h
index 88ce720..e840064 100644
--- a/ndk/platforms/android-3/include/sys/cdefs.h
+++ b/ndk/platforms/android-3/include/sys/cdefs.h
@@ -530,4 +530,31 @@
 #define  __BIONIC__   1
 #include <android/api-level.h>
 
+/* __NDK_FPABI__ or __NDK_FPABI_MATH__ are applied to APIs taking or returning float or
+   [long] double, to ensure even at the presence of -mhard-float (which implies
+   -mfloat-abi=hard), calling to 32-bit Android native APIs still follow -mfloat-abi=softfp.
+
+   __NDK_FPABI_MATH__ is applied to APIs in math.h.  It normally equals to __NDK_FPABI__,
+   but allows use of customized libm.a compiled with -mhard-float by -D_NDK_MATH_NO_SOFTFP=1
+
+   NOTE: Disable for clang for now unless _NDK_MATH_NO_SOFTFP=1, because clang before 3.4 doesn't
+         allow change of calling convension for builtin and produces error message reads:
+
+           a.i:564:6: error: function declared 'aapcs' here was previously declared without calling convention
+           int  sin(double d) __attribute__((pcs("aapcs")));
+                ^
+           a.i:564:6: note: previous declaration is here
+ */
+#if defined(__ANDROID__) && !__LP64__ && defined( __arm__)
+#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
+#else
+#define __NDK_FPABI__
+#endif
+
+#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
+#define __NDK_FPABI_MATH__ __NDK_FPABI__
+#else
+#define __NDK_FPABI_MATH__  /* nothing */
+#endif
+
 #endif /* !_SYS_CDEFS_H_ */
diff --git a/ndk/platforms/android-3/include/sys/cdefs_elf.h b/ndk/platforms/android-3/include/sys/cdefs_elf.h
index 1e57470..5d2e0f3 100644
--- a/ndk/platforms/android-3/include/sys/cdefs_elf.h
+++ b/ndk/platforms/android-3/include/sys/cdefs_elf.h
@@ -32,7 +32,7 @@
 
 #ifdef __LEADING_UNDERSCORE
 #define	_C_LABEL(x)	__CONCAT(_,x)
-#define _C_LABEL_STRING(x)	"_"x
+#define _C_LABEL_STRING(x)	"_" x
 #else
 #define	_C_LABEL(x)	x
 #define _C_LABEL_STRING(x)	x
diff --git a/ndk/platforms/android-3/include/sys/prctl.h b/ndk/platforms/android-3/include/sys/prctl.h
index 359d684..00e5837 100644
--- a/ndk/platforms/android-3/include/sys/prctl.h
+++ b/ndk/platforms/android-3/include/sys/prctl.h
@@ -29,6 +29,7 @@
 #define _SYS_PRCTL_H
 
 #include <linux/prctl.h>
+#include <sys/cdefs.h>
 
 __BEGIN_DECLS
 
diff --git a/ndk/platforms/android-3/include/sys/utime.h b/ndk/platforms/android-3/include/sys/utime.h
index 9f8810e..918d153 100644
--- a/ndk/platforms/android-3/include/sys/utime.h
+++ b/ndk/platforms/android-3/include/sys/utime.h
@@ -28,6 +28,7 @@
 #ifndef _SYS_UTIME_H_
 #define _SYS_UTIME_H_
 
+#include <sys/types.h>
 #include <linux/utime.h>
 
 #endif /* _SYS_UTIME_H_ */
diff --git a/ndk/platforms/android-3/include/sys/vfs.h b/ndk/platforms/android-3/include/sys/vfs.h
index 4adaf5f..4ec0e0d 100644
--- a/ndk/platforms/android-3/include/sys/vfs.h
+++ b/ndk/platforms/android-3/include/sys/vfs.h
@@ -34,20 +34,42 @@
 
 __BEGIN_DECLS
 
-/* note: this corresponds to the kernel's statfs64 type */
+/* The kernel's __kernel_fsid_t has a 'val' member but glibc uses '__val'. */
+typedef struct { int __val[2]; } __fsid_t;
+
+/* Our struct statfs corresponds to the kernel's statfs64 type. */
+#ifdef __mips__
 struct statfs {
-    uint32_t        f_type;
-    uint32_t        f_bsize;
-    uint64_t        f_blocks;
-    uint64_t        f_bfree;
-    uint64_t        f_bavail;
-    uint64_t        f_files;
-    uint64_t        f_ffree;
-    __kernel_fsid_t f_fsid;
-    uint32_t        f_namelen;
-    uint32_t        f_frsize;
-    uint32_t        f_spare[5];
+    uint32_t f_type;
+    uint32_t f_bsize;
+    uint32_t f_frsize;
+    uint32_t __pad;
+    uint64_t f_blocks;
+    uint64_t f_bfree;
+    uint64_t f_files;
+    uint64_t f_ffree;
+    uint64_t f_bavail;
+    __fsid_t f_fsid;
+    uint32_t f_namelen;
+    uint32_t f_flags;
+    uint32_t f_spare[5];
 };
+#else
+struct statfs {
+    uint32_t f_type;
+    uint32_t f_bsize;
+    uint64_t f_blocks;
+    uint64_t f_bfree;
+    uint64_t f_bavail;
+    uint64_t f_files;
+    uint64_t f_ffree;
+    __fsid_t f_fsid;
+    uint32_t f_namelen;
+    uint32_t f_frsize;
+    uint32_t f_flags;
+    uint32_t f_spare[4];
+};
+#endif
 
 #define  ADFS_SUPER_MAGIC      0xadf5
 #define  AFFS_SUPER_MAGIC      0xADFF
diff --git a/ndk/platforms/android-3/include/sys/wait.h b/ndk/platforms/android-3/include/sys/wait.h
index 8ba1837..e720c2c 100644
--- a/ndk/platforms/android-3/include/sys/wait.h
+++ b/ndk/platforms/android-3/include/sys/wait.h
@@ -32,6 +32,9 @@
 #include <sys/types.h>
 #include <sys/resource.h>
 #include <linux/wait.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+
 
 __BEGIN_DECLS
 
@@ -47,7 +50,10 @@
 extern pid_t  wait(int *);
 extern pid_t  waitpid(pid_t, int *, int);
 extern pid_t  wait3(int *, int, struct rusage *);
-extern pid_t  wait4(pid_t, int *, int, struct rusage *);
+static __inline__ pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage)
+{
+  return (pid_t)syscall(__NR_wait4, pid, status, options, rusage);
+}
 
 __END_DECLS
 
diff --git a/ndk/platforms/android-3/include/time.h b/ndk/platforms/android-3/include/time.h
index caf6aa7..87f5314 100644
--- a/ndk/platforms/android-3/include/time.h
+++ b/ndk/platforms/android-3/include/time.h
@@ -67,7 +67,7 @@
 extern char* asctime_r(const struct tm* a, char* buf);
 
 /* Return the difference between TIME1 and TIME0.  */
-extern double difftime (time_t __time1, time_t __time0);
+extern double difftime (time_t __time1, time_t __time0) __NDK_FPABI__;
 extern time_t mktime (struct tm *a);
 
 extern struct tm*  localtime(const time_t *t);
@@ -105,8 +105,12 @@
 #define CLOCK_MONOTONIC            1
 #define CLOCK_PROCESS_CPUTIME_ID   2
 #define CLOCK_THREAD_CPUTIME_ID    3
-#define CLOCK_REALTIME_HR          4
-#define CLOCK_MONOTONIC_HR         5
+#define CLOCK_MONOTONIC_RAW        4
+#define CLOCK_REALTIME_COARSE      5
+#define CLOCK_MONOTONIC_COARSE     6
+#define CLOCK_BOOTTIME             7
+#define CLOCK_REALTIME_ALARM       8
+#define CLOCK_BOOTTIME_ALARM       9
 
 extern int  timer_create(int, struct sigevent*, timer_t*);
 extern int  timer_delete(timer_t);
diff --git a/ndk/platforms/android-3/include/wchar.h b/ndk/platforms/android-3/include/wchar.h
index 575da4d..0e61859 100644
--- a/ndk/platforms/android-3/include/wchar.h
+++ b/ndk/platforms/android-3/include/wchar.h
@@ -134,7 +134,7 @@
 extern size_t            wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
 extern size_t            wcsspn(const wchar_t *, const wchar_t *);
 extern wchar_t          *wcsstr(const wchar_t *, const wchar_t *);
-extern double            wcstod(const wchar_t *, wchar_t **);
+extern double            wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
 extern wchar_t          *wcstok(wchar_t *, const wchar_t *, wchar_t **);
 extern long int          wcstol(const wchar_t *, wchar_t **, int);
 extern unsigned long int wcstoul(const wchar_t *, wchar_t **, int);
diff --git a/ndk/platforms/android-4/include/GLES/glext.h b/ndk/platforms/android-4/include/GLES/glext.h
index 65ab5e4..015165f 100644
--- a/ndk/platforms/android-4/include/GLES/glext.h
+++ b/ndk/platforms/android-4/include/GLES/glext.h
@@ -3,6 +3,8 @@
 
 /* $Revision: 10965 $ on $Date:: 2010-04-09 02:11:29 -0700 #$ */
 
+#include <GLES/gl.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/ndk/platforms/android-4/include/KHR/khrplatform.h b/ndk/platforms/android-4/include/KHR/khrplatform.h
index 75bc551..2bca446 100644
--- a/ndk/platforms/android-4/include/KHR/khrplatform.h
+++ b/ndk/platforms/android-4/include/KHR/khrplatform.h
@@ -92,7 +92,8 @@
 #elif defined (__SYMBIAN32__)
 #   define KHRONOS_APICALL IMPORT_C
 #elif defined(__ANDROID__)
-#   define KHRONOS_APICALL __attribute__((visibility("default")))
+#   include <sys/cdefs.h>
+#   define KHRONOS_APICALL __attribute__((visibility("default"))) __NDK_FPABI__
 #else
 #   define KHRONOS_APICALL
 #endif
diff --git a/ndk/platforms/android-5/include/GLES2/gl2ext.h b/ndk/platforms/android-5/include/GLES2/gl2ext.h
index 9db4e25..793e0c2 100644
--- a/ndk/platforms/android-5/include/GLES2/gl2ext.h
+++ b/ndk/platforms/android-5/include/GLES2/gl2ext.h
@@ -3,6 +3,8 @@
 
 /* $Revision: 10969 $ on $Date:: 2010-04-09 02:27:15 -0700 #$ */
 
+#include <GLES2/gl2.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/ndk/platforms/android-5/include/pthread.h b/ndk/platforms/android-5/include/pthread.h
index ba40fa1..b3e0f9f 100644
--- a/ndk/platforms/android-5/include/pthread.h
+++ b/ndk/platforms/android-5/include/pthread.h
@@ -138,7 +138,9 @@
 
 int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
                    void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
 int pthread_join(pthread_t thid, void ** ret_val);
 int pthread_detach(pthread_t  thid);
 
diff --git a/ndk/platforms/android-8/include/fts.h b/ndk/platforms/android-8/include/fts.h
index da26a88..d18fc2c 100644
--- a/ndk/platforms/android-8/include/fts.h
+++ b/ndk/platforms/android-8/include/fts.h
@@ -35,6 +35,8 @@
 #ifndef	_FTS_H_
 #define	_FTS_H_
 
+#include <sys/types.h>
+
 typedef struct {
 	struct _ftsent *fts_cur;	/* current node */
 	struct _ftsent *fts_child;	/* linked list of children */
diff --git a/ndk/platforms/android-8/include/pthread.h b/ndk/platforms/android-8/include/pthread.h
index 7741fcf..7de3634 100644
--- a/ndk/platforms/android-8/include/pthread.h
+++ b/ndk/platforms/android-8/include/pthread.h
@@ -138,7 +138,9 @@
 
 int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
                    void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
 int pthread_join(pthread_t thid, void ** ret_val);
 int pthread_detach(pthread_t  thid);
 
diff --git a/ndk/platforms/android-8/include/stdlib.h b/ndk/platforms/android-8/include/stdlib.h
index ddaf32c..e89db56 100644
--- a/ndk/platforms/android-8/include/stdlib.h
+++ b/ndk/platforms/android-8/include/stdlib.h
@@ -57,6 +57,7 @@
 extern int unsetenv(const char *);
 extern int clearenv(void);
 
+extern char *mkdtemp(char *);
 extern char *mktemp (char *);
 extern int mkstemp (char *);
 
@@ -64,8 +65,9 @@
 extern long long strtoll(const char *, char **, int);
 extern unsigned long strtoul(const char *, char **, int);
 extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
 
+__NDK_FPABI__
 static __inline__ float strtof(const char *nptr, char **endptr)
 {
     return (float)strtod(nptr, endptr);
@@ -75,6 +77,7 @@
 extern long atol(const char *);
 extern long long atoll(const char *);
 
+ __NDK_FPABI__
 static __inline__ double atof(const char *nptr)
 {
     return (strtod(nptr, NULL));
@@ -106,8 +109,8 @@
 extern long nrand48(unsigned short *);
 extern long lrand48(void);
 extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
 extern void srand48(long);
 extern unsigned int arc4random(void);
 extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-8/include/time.h b/ndk/platforms/android-8/include/time.h
index 6163c6d..38e89fd 100644
--- a/ndk/platforms/android-8/include/time.h
+++ b/ndk/platforms/android-8/include/time.h
@@ -67,7 +67,7 @@
 extern char* asctime_r(const struct tm* a, char* buf);
 
 /* Return the difference between TIME1 and TIME0.  */
-extern double difftime (time_t __time1, time_t __time0);
+extern double difftime (time_t __time1, time_t __time0) __NDK_FPABI__;
 extern time_t mktime (struct tm *a);
 
 extern struct tm*  localtime(const time_t *t);
@@ -94,15 +94,21 @@
 extern clock_t   clock(void);
 
 /* BIONIC: extra linux clock goodies */
-extern int clock_getres(int, struct timespec *);
-extern int clock_gettime(int, struct timespec *);
+extern int clock_getres(clockid_t, struct timespec *);
+extern int clock_gettime(clockid_t, struct timespec *);
+extern int clock_settime(clockid_t, const struct timespec *);
+extern int clock_nanosleep(clockid_t, int, const struct timespec *, struct timespec *);
 
 #define CLOCK_REALTIME             0
 #define CLOCK_MONOTONIC            1
 #define CLOCK_PROCESS_CPUTIME_ID   2
 #define CLOCK_THREAD_CPUTIME_ID    3
-#define CLOCK_REALTIME_HR          4
-#define CLOCK_MONOTONIC_HR         5
+#define CLOCK_MONOTONIC_RAW        4
+#define CLOCK_REALTIME_COARSE      5
+#define CLOCK_MONOTONIC_COARSE     6
+#define CLOCK_BOOTTIME             7
+#define CLOCK_REALTIME_ALARM       8
+#define CLOCK_BOOTTIME_ALARM       9
 
 extern int  timer_create(int, struct sigevent*, timer_t*);
 extern int  timer_delete(timer_t);
diff --git a/ndk/platforms/android-8/include/wchar.h b/ndk/platforms/android-8/include/wchar.h
index 453b6d5..b9dfa66 100644
--- a/ndk/platforms/android-8/include/wchar.h
+++ b/ndk/platforms/android-8/include/wchar.h
@@ -140,7 +140,7 @@
 extern size_t            wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
 extern size_t            wcsspn(const wchar_t *, const wchar_t *);
 extern wchar_t          *wcsstr(const wchar_t *, const wchar_t *);
-extern double            wcstod(const wchar_t *, wchar_t **);
+extern double            wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
 extern wchar_t          *wcstok(wchar_t *, const wchar_t *, wchar_t **);
 extern long int          wcstol(const wchar_t *, wchar_t **, int);
 extern size_t            wcstombs(char *, const wchar_t *, size_t);
diff --git a/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java b/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
index f0938d1..281d3ef 100644
--- a/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
+++ b/ndk/platforms/android-8/samples/bitmap-plasma/src/com/example/plasma/Plasma.java
@@ -21,6 +21,8 @@
 import android.view.View;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.view.Display;
+import android.view.WindowManager;
 
 public class Plasma extends Activity
 {
@@ -29,7 +31,8 @@
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
-        setContentView(new PlasmaView(this));
+        Display display = getWindowManager().getDefaultDisplay();
+        setContentView(new PlasmaView(this, display.getWidth(), display.getHeight()));
     }
 
     /* load our native library */
@@ -45,13 +48,9 @@
     /* implementend by libplasma.so */
     private static native void renderPlasma(Bitmap  bitmap, long time_ms);
 
-    public PlasmaView(Context context) {
+    public PlasmaView(Context context, int width, int height) {
         super(context);
-
-        final int W = 200;
-        final int H = 200;
-
-        mBitmap = Bitmap.createBitmap(W, H, Bitmap.Config.RGB_565);
+        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
         mStartTime = System.currentTimeMillis();
     }
 
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h
new file mode 100644
index 0000000..7f0a0fc
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/bitsperlong.h
@@ -0,0 +1,25 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_GENERIC_BITS_PER_LONG
+#define _UAPI__ASM_GENERIC_BITS_PER_LONG
+#ifndef __BITS_PER_LONG
+#define __BITS_PER_LONG 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h
new file mode 100644
index 0000000..7622c49
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/int-ll64.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_GENERIC_INT_LL64_H
+#define _UAPI_ASM_GENERIC_INT_LL64_H
+#include <asm/bitsperlong.h>
+#ifndef __ASSEMBLY__
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+#ifdef __GNUC__
+__extension__ typedef __signed__ long long __s64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+__extension__ typedef unsigned long long __u64;
+#else
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h
new file mode 100644
index 0000000..1519aff
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/posix_types.h
@@ -0,0 +1,100 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_GENERIC_POSIX_TYPES_H
+#define __ASM_GENERIC_POSIX_TYPES_H
+#include <asm/bitsperlong.h>
+#ifndef __kernel_long_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef long __kernel_long_t;
+typedef unsigned long __kernel_ulong_t;
+#endif
+#ifndef __kernel_ino_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_ulong_t __kernel_ino_t;
+#endif
+#ifndef __kernel_mode_t
+typedef unsigned int __kernel_mode_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_pid_t
+typedef int __kernel_pid_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __kernel_ipc_pid_t
+typedef int __kernel_ipc_pid_t;
+#endif
+#ifndef __kernel_uid_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef unsigned int __kernel_uid_t;
+typedef unsigned int __kernel_gid_t;
+#endif
+#ifndef __kernel_suseconds_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_suseconds_t;
+#endif
+#ifndef __kernel_daddr_t
+typedef int __kernel_daddr_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_uid32_t
+typedef unsigned int __kernel_uid32_t;
+typedef unsigned int __kernel_gid32_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_old_uid_t
+typedef __kernel_uid_t __kernel_old_uid_t;
+typedef __kernel_gid_t __kernel_old_gid_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __kernel_old_dev_t
+typedef unsigned int __kernel_old_dev_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __kernel_size_t
+#if __BITS_PER_LONG != 64
+typedef unsigned int __kernel_size_t;
+typedef int __kernel_ssize_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __kernel_ptrdiff_t;
+#else
+typedef __kernel_ulong_t __kernel_size_t;
+typedef __kernel_long_t __kernel_ssize_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_ptrdiff_t;
+#endif
+#endif
+#ifndef __kernel_fsid_t
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct {
+ int val[2];
+} __kernel_fsid_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __kernel_long_t __kernel_off_t;
+typedef long long __kernel_loff_t;
+typedef __kernel_long_t __kernel_time_t;
+typedef __kernel_long_t __kernel_clock_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __kernel_timer_t;
+typedef int __kernel_clockid_t;
+typedef char * __kernel_caddr_t;
+typedef unsigned short __kernel_uid16_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef unsigned short __kernel_gid16_t;
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h
new file mode 100644
index 0000000..f47cbe7
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal-defs.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_GENERIC_SIGNAL_DEFS_H
+#define __ASM_GENERIC_SIGNAL_DEFS_H
+#include <linux/compiler.h>
+#ifndef SIG_BLOCK
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIG_BLOCK 0
+#endif
+#ifndef SIG_UNBLOCK
+#define SIG_UNBLOCK 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef SIG_SETMASK
+#define SIG_SETMASK 2
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __ASSEMBLY__
+typedef void __signalfn_t(int);
+typedef __signalfn_t __user *__sighandler_t;
+typedef void __restorefn_t(void);
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __restorefn_t __user *__sigrestore_t;
+#define SIG_DFL ((__force __sighandler_t)0)
+#define SIG_IGN ((__force __sighandler_t)1)
+#define SIG_ERR ((__force __sighandler_t)-1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h
new file mode 100644
index 0000000..c4c7e00
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/signal.h
@@ -0,0 +1,116 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_GENERIC_SIGNAL_H
+#define _UAPI__ASM_GENERIC_SIGNAL_H
+#include <linux/types.h>
+#define _NSIG 64
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _NSIG_BPW __BITS_PER_LONG
+#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
+#define SIGHUP 1
+#define SIGINT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGQUIT 3
+#define SIGILL 4
+#define SIGTRAP 5
+#define SIGABRT 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGIOT 6
+#define SIGBUS 7
+#define SIGFPE 8
+#define SIGKILL 9
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGUSR1 10
+#define SIGSEGV 11
+#define SIGUSR2 12
+#define SIGPIPE 13
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGALRM 14
+#define SIGTERM 15
+#define SIGSTKFLT 16
+#define SIGCHLD 17
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGCONT 18
+#define SIGSTOP 19
+#define SIGTSTP 20
+#define SIGTTIN 21
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGTTOU 22
+#define SIGURG 23
+#define SIGXCPU 24
+#define SIGXFSZ 25
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGVTALRM 26
+#define SIGPROF 27
+#define SIGWINCH 28
+#define SIGIO 29
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGPOLL SIGIO
+#define SIGPWR 30
+#define SIGSYS 31
+#define SIGUNUSED 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGRTMIN 32
+#ifndef SIGRTMAX
+#define SIGRTMAX _NSIG
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_NOCLDSTOP 0x00000001
+#define SA_NOCLDWAIT 0x00000002
+#define SA_SIGINFO 0x00000004
+#define SA_ONSTACK 0x08000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_RESTART 0x10000000
+#define SA_NODEFER 0x40000000
+#define SA_RESETHAND 0x80000000
+#define SA_NOMASK SA_NODEFER
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SA_ONESHOT SA_RESETHAND
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#ifndef __ASSEMBLY__
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct {
+ unsigned long sig[_NSIG_WORDS];
+} sigset_t;
+typedef unsigned long old_sigset_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <asm-generic/signal-defs.h>
+#ifdef SA_RESTORER
+#define __ARCH_HAS_SA_RESTORER
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct sigaction {
+ __sighandler_t sa_handler;
+ unsigned long sa_flags;
+#ifdef SA_RESTORER
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __sigrestore_t sa_restorer;
+#endif
+ sigset_t sa_mask;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct sigaltstack {
+ void __user *ss_sp;
+ int ss_flags;
+ size_t ss_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} stack_t;
+#endif
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h
new file mode 100644
index 0000000..c0d4bea
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm-generic/types.h
@@ -0,0 +1,23 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _ASM_GENERIC_TYPES_H
+#define _ASM_GENERIC_TYPES_H
+#include <asm-generic/int-ll64.h>
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h b/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h
new file mode 100644
index 0000000..e53ff65
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/bitsperlong.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_BITSPERLONG_H
+#define __ASM_BITSPERLONG_H
+#define __BITS_PER_LONG 64
+#include <asm-generic/bitsperlong.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h b/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h
new file mode 100644
index 0000000..392cd94
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/errno.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/errno.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h b/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h
new file mode 100644
index 0000000..c62f260
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/fcntl.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_FCNTL_H
+#define __ASM_FCNTL_H
+#define O_DIRECTORY 040000
+#define O_NOFOLLOW 0100000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define O_DIRECT 0200000
+#define O_LARGEFILE 0400000
+#include <asm-generic/fcntl.h>
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/page.h b/ndk/platforms/android-9/arch-aarch64/include/asm/page.h
new file mode 100644
index 0000000..f980343
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/page.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _ASMARM_PAGE_H
+#define _ASMARM_PAGE_H
+
+#define PAGE_SHIFT 12
+#define PAGE_SIZE (1UL << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h b/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h
new file mode 100644
index 0000000..1b89253
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/posix_types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/posix_types.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h b/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h
new file mode 100644
index 0000000..c59f9c0
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/sigcontext.h
@@ -0,0 +1,46 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_SIGCONTEXT_H
+#define _UAPI__ASM_SIGCONTEXT_H
+#include <linux/types.h>
+struct sigcontext {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 fault_address;
+ __u64 regs[31];
+ __u64 sp;
+ __u64 pc;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 pstate;
+ __u8 __reserved[4096] __attribute__((__aligned__(16)));
+};
+struct _aarch64_ctx {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 magic;
+ __u32 size;
+};
+#define FPSIMD_MAGIC 0x46508001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct fpsimd_context {
+ struct _aarch64_ctx head;
+ __u32 fpsr;
+ __u32 fpcr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __uint128_t vregs[32];
+};
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h b/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h
new file mode 100644
index 0000000..82fe0a2
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/siginfo.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_SIGINFO_H
+#define __ASM_SIGINFO_H
+#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
+#include <asm-generic/siginfo.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h b/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h
new file mode 100644
index 0000000..39f8c48
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/signal.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __ASM_SIGNAL_H
+#define __ASM_SIGNAL_H
+#define SA_RESTORER 0x04000000
+#include <asm-generic/signal.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/asm/types.h b/ndk/platforms/android-9/arch-aarch64/include/asm/types.h
new file mode 100644
index 0000000..8250f43
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/asm/types.h
@@ -0,0 +1,19 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#include <asm-generic/types.h>
diff --git a/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h b/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h
new file mode 100644
index 0000000..dbab9d5
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/_types.h
@@ -0,0 +1,139 @@
+/*	$OpenBSD: _types.h,v 1.13 2013/07/05 19:46:27 guenther Exp $	*/
+
+/*
+ * Copyright (c) 1990, 1993
+ *	The Regents of the University of California.  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.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ *	@(#)types.h	8.3 (Berkeley) 1/5/94
+ *	@(#)ansi.h	8.2 (Berkeley) 1/4/94
+ */
+
+#ifndef _MACHINE__TYPES_H_
+#define _MACHINE__TYPES_H_
+
+/*
+ * _ALIGN(p) rounds p (pointer or byte index) up to a correctly-aligned
+ * value for all data types (int, long, ...).   The result is an
+ * unsigned long and must be cast to any desired pointer type.
+ *
+ * _ALIGNED_POINTER is a boolean macro that checks whether an address
+ * is valid to fetch data elements of type t from on this architecture.
+ * This does not reflect the optimal alignment, just the possibility
+ * (within reasonable limits).
+ */
+#define	_ALIGNBYTES	(sizeof(long) - 1)
+#define	_ALIGN(p)	(((unsigned long)(p) + _ALIGNBYTES) &~_ALIGNBYTES)
+#define	_ALIGNED_POINTER(p,t)	1
+
+#if defined(_KERNEL)
+typedef struct label_t {
+	long val[8];
+} label_t;
+#endif
+
+/* 7.18.1.1 Exact-width integer types */
+typedef	__signed char		__int8_t;
+typedef	unsigned char		__uint8_t;
+typedef	short			__int16_t;
+typedef	unsigned short		__uint16_t;
+typedef	int			__int32_t;
+typedef	unsigned int		__uint32_t;
+/* LONGLONG */
+typedef	long long		__int64_t;
+/* LONGLONG */
+typedef	unsigned long long	__uint64_t;
+
+/* 7.18.1.2 Minimum-width integer types */
+typedef	__int8_t		__int_least8_t;
+typedef	__uint8_t		__uint_least8_t;
+typedef	__int16_t		__int_least16_t;
+typedef	__uint16_t		__uint_least16_t;
+typedef	__int32_t		__int_least32_t;
+typedef	__uint32_t		__uint_least32_t;
+typedef	__int64_t		__int_least64_t;
+typedef	__uint64_t		__uint_least64_t;
+
+/* 7.18.1.3 Fastest minimum-width integer types */
+typedef	__int32_t		__int_fast8_t;
+typedef	__uint32_t		__uint_fast8_t;
+typedef	__int32_t		__int_fast16_t;
+typedef	__uint32_t		__uint_fast16_t;
+typedef	__int32_t		__int_fast32_t;
+typedef	__uint32_t		__uint_fast32_t;
+typedef	__int64_t		__int_fast64_t;
+typedef	__uint64_t		__uint_fast64_t;
+#define	__INT_FAST8_MIN		INT32_MIN
+#define	__INT_FAST16_MIN	INT32_MIN
+#define	__INT_FAST32_MIN	INT32_MIN
+#define	__INT_FAST64_MIN	INT64_MIN
+#define	__INT_FAST8_MAX		INT32_MAX
+#define	__INT_FAST16_MAX	INT32_MAX
+#define	__INT_FAST32_MAX	INT32_MAX
+#define	__INT_FAST64_MAX	INT64_MAX
+#define	__UINT_FAST8_MAX	UINT32_MAX
+#define	__UINT_FAST16_MAX	UINT32_MAX
+#define	__UINT_FAST32_MAX	UINT32_MAX
+#define	__UINT_FAST64_MAX	UINT64_MAX
+
+/* 7.18.1.4 Integer types capable of holding object pointers */
+typedef	long			__intptr_t;
+typedef	unsigned long		__uintptr_t;
+
+/* 7.18.1.5 Greatest-width integer types */
+typedef	__int64_t		__intmax_t;
+typedef	__uint64_t		__uintmax_t;
+
+/* Register size */
+typedef long			__register_t;
+
+/* VM system types */
+typedef unsigned long		__vaddr_t;
+typedef unsigned long		__paddr_t;
+typedef unsigned long		__vsize_t;
+typedef unsigned long		__psize_t;
+
+/* Standard system types */
+typedef	double			__double_t;
+typedef	float			__float_t;
+typedef long			__ptrdiff_t;
+typedef	long			__ssize_t;
+#if defined(__GNUC__) && __GNUC__ >= 3
+typedef	__builtin_va_list	__va_list;
+#else
+typedef char *			__va_list;
+#endif
+
+/* Wide character support types */
+#ifndef __cplusplus
+typedef	int			__wchar_t;
+#endif
+typedef int			__wint_t;
+typedef	int			__rune_t;
+typedef	void *			__wctrans_t;
+typedef	void *			__wctype_t;
+
+#endif	/* _MACHINE__TYPES_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S b/ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
similarity index 79%
rename from ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
rename to ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
index 77a5d7f..3a62e9c 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/endian.h
@@ -1,5 +1,7 @@
+/*      $OpenBSD: endian.h,v 1.6 2011/11/08 17:06:51 deraadt Exp $      */
+
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,13 +28,12 @@
  * SUCH DAMAGE.
  */
 
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
-	.data
-        .align 4
-	.hidden __dso_handle
-        .globl __dso_handle
-__dso_handle:
-        .long __dso_handle
+#ifndef __AARCH64_ENDIAN_H_
+#define __AARCH64_ENDIAN_H_
+
+/* FIXME - work in progress */
+#define _BYTE_ORDER _LITTLE_ENDIAN
+#define __STRICT_ALIGNMENT
+#include <sys/endian.h>
+
+#endif /* __AARCH64_ENDIAN_H_ */
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
similarity index 75%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
index 3e80128..a8e1641 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/exec.h
@@ -1,5 +1,10 @@
+/*	$OpenBSD: exec.h,v 1.4 2012/09/11 15:44:17 deraadt Exp $	*/
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Written by Artur Grabowski <art@openbsd.org> Public Domain
+ */
+
+/*
+ * Copyright (C) 2013 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,17 +31,18 @@
  * SUCH DAMAGE.
  */
 
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
-        .section .bss
-        .align 4
+#ifndef _MACHINE_EXEC_H_
+#define _MACHINE_EXEC_H_
 
-#ifndef CRT_LEGACY_WORKAROUND
-	.hidden __dso_handle
+#define __LDPGSZ 4096
+
+#define ARCH_ELFSIZE 64
+
+#define ELF_TARG_CLASS		ELFCLASS64
+#define ELF_TARG_DATA		ELFDATA2LSB
+#define ELF_TARG_MACH		EM_AARCH64
+
+#define _NLIST_DO_ELF
+#define _KERN_DO_ELF64
+
 #endif
-
-        .globl __dso_handle
-__dso_handle:
-        .long 0
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
similarity index 69%
copy from ndk/platforms/android-9/arch-x86/src/__dso_handle.S
copy to ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
index 3e80128..c6f0c8c 100644
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/kernel.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2013 The Android Open Source Project
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -26,17 +26,18 @@
  * SUCH DAMAGE.
  */
 
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
-        .section .bss
-        .align 4
+#ifndef _ARCH_AARCH64_KERNEL_H
+#define _ARCH_AARCH64_KERNEL_H
 
-#ifndef CRT_LEGACY_WORKAROUND
-	.hidden __dso_handle
-#endif
+/* this file contains kernel-specific definitions that were optimized out of
+   our processed kernel headers, but still useful nonetheless... */
 
-        .globl __dso_handle
-__dso_handle:
-        .long 0
+typedef __kernel_ulong_t __kernel_blkcnt_t;
+typedef __kernel_ulong_t __kernel_blksize_t;
+
+/* these aren't really defined by the kernel headers though... */
+typedef __kernel_ulong_t __kernel_fsblkcnt_t;
+typedef __kernel_ulong_t __kernel_fsfilcnt_t;
+typedef unsigned int __kernel_id_t;
+
+#endif /* _ARCH_AARCH64_KERNEL_H */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h b/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h
new file mode 100644
index 0000000..a8c4a88
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/machine/limits.h
@@ -0,0 +1,55 @@
+/*	$OpenBSD: limits.h,v 1.5 2009/11/27 19:54:35 guenther Exp $	*/
+
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * 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.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
+ *
+ *	@(#)limits.h	7.2 (Berkeley) 6/28/90
+ */
+
+#ifndef	_MACHINE_LIMITS_H_
+#define	_MACHINE_LIMITS_H_
+
+#include <sys/cdefs.h>
+
+#if __POSIX_VISIBLE || __XPG_VISIBLE
+#ifndef	SIZE_MAX
+#define SIZE_MAX	ULONG_MAX	/* max value for a size_t */
+#endif
+#define SSIZE_MAX	LONG_MAX	/* max value for a ssize_t */
+#endif
+
+#if __BSD_VISIBLE
+#define	SIZE_T_MAX	ULONG_MAX	/* max value for a size_t (historic) */
+
+#define	UQUAD_MAX	0xffffffffffffffffULL		/* max unsigned quad */
+#define	QUAD_MAX	0x7fffffffffffffffLL		/* max signed quad */
+#define	QUAD_MIN	(-0x7fffffffffffffffLL-1)	/* min signed quad */
+
+#endif /* __BSD_VISIBLE */
+
+#endif /* _MACHINE_LIMITS_H_ */
diff --git a/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h b/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h
new file mode 100644
index 0000000..36f73b2
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/sys/limits.h
@@ -0,0 +1,174 @@
+/* $OpenBSD: limits.h,v 1.6 2005/12/13 00:35:23 millert Exp $ */
+/*
+ * Copyright (c) 2002 Marc Espie.
+ *
+ * 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 OPENBSD PROJECT 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 OPENBSD
+ * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _SYS_LIMITS_H_
+#define _SYS_LIMITS_H_
+
+#include <sys/cdefs.h>
+#include <linux/limits.h>
+
+/* Common definitions for limits.h. */
+
+/* Legacy */
+#include <machine/limits.h>
+
+#define	CHAR_BIT	8		/* number of bits in a char */
+
+#define	SCHAR_MAX	0x7f		/* max value for a signed char */
+#define SCHAR_MIN	(-0x7f-1)	/* min value for a signed char */
+
+#define	UCHAR_MAX	0xffU		/* max value for an unsigned char */
+#ifdef __CHAR_UNSIGNED__
+# define CHAR_MIN	0		/* min value for a char */
+# define CHAR_MAX	0xff		/* max value for a char */
+#else
+# define CHAR_MAX	0x7f
+# define CHAR_MIN	(-0x7f-1)
+#endif
+
+#define	USHRT_MAX	0xffffU		/* max value for an unsigned short */
+#define	SHRT_MAX	0x7fff		/* max value for a short */
+#define SHRT_MIN        (-0x7fff-1)     /* min value for a short */
+
+#define	UINT_MAX	0xffffffffU	/* max value for an unsigned int */
+#define	INT_MAX		0x7fffffff	/* max value for an int */
+#define	INT_MIN		(-0x7fffffff-1)	/* min value for an int */
+
+#ifdef __LP64__
+# define ULONG_MAX	0xffffffffffffffffUL
+					/* max value for unsigned long */
+# define LONG_MAX	0x7fffffffffffffffL
+					/* max value for a signed long */
+# define LONG_MIN	(-0x7fffffffffffffffL-1)
+					/* min value for a signed long */
+#else
+# define ULONG_MAX	0xffffffffUL	/* max value for an unsigned long */
+# define LONG_MAX	0x7fffffffL	/* max value for a long */
+# define LONG_MIN	(-0x7fffffffL-1)/* min value for a long */
+#endif
+
+#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
+# define ULLONG_MAX	0xffffffffffffffffULL
+					/* max value for unsigned long long */
+# define LLONG_MAX	0x7fffffffffffffffLL
+					/* max value for a signed long long */
+# define LLONG_MIN	(-0x7fffffffffffffffLL-1)
+					/* min value for a signed long long */
+#endif
+
+#if __BSD_VISIBLE
+# define UID_MAX	UINT_MAX	/* max value for a uid_t */
+# define GID_MAX	UINT_MAX	/* max value for a gid_t */
+#endif
+
+
+#ifdef __LP64__
+# define LONG_BIT	64
+#else
+# define LONG_BIT	32
+#endif
+
+/* float.h defines these as well */
+# if !defined(DBL_DIG)
+#  if defined(__DBL_DIG)
+#   define DBL_DIG	__DBL_DIG
+#   define DBL_MAX	__DBL_MAX
+#   define DBL_MIN	__DBL_MIN
+
+#   define FLT_DIG	__FLT_DIG
+#   define FLT_MAX	__FLT_MAX
+#   define FLT_MIN	__FLT_MIN
+#  else
+#   define DBL_DIG	15
+#   define DBL_MAX	1.7976931348623157E+308
+#   define DBL_MIN	2.2250738585072014E-308
+
+#   define FLT_DIG	6
+#   define FLT_MAX	3.40282347E+38F
+#   define FLT_MIN	1.17549435E-38F
+#  endif
+# endif
+
+/* Bionic: the following has been optimized out from our processed kernel headers */
+
+#define  CHILD_MAX   999
+#define  OPEN_MAX    256
+
+/* Bionic-specific definitions */
+
+#define  _POSIX_VERSION             200112L   /* Posix C language bindings version */
+#define  _POSIX2_VERSION            -1        /* we don't support Posix command-line tools */
+#define  _POSIX2_C_VERSION          _POSIX_VERSION
+#define  _XOPEN_VERSION             500       /* by Posix definition */
+#define  _XOPEN_XCU_VERSION         -1        /* we don't support command-line utilities */
+
+/* tell what we implement legacy stuff when appropriate */
+#if _POSIX_VERSION > 0
+#define  _XOPEN_XPG2                1
+#define  _XOPEN_XPG3                1
+#define  _XOPEN_XPG4                1
+#define  _XOPEN_UNIX                1
+#endif
+
+#define  _XOPEN_ENH_I18N          -1  /* we don't support internationalization in the C library */
+#define  _XOPEN_CRYPT             -1  /* don't support X/Open Encryption */
+#define  _XOPEN_LEGACY            -1  /* don't claim we support these, we have some of them but not all */
+#define  _XOPEN_REALTIME          -1 /* we don't support all these functions */
+#define  _XOPEN_REALTIME_THREADS  -1  /* same here */
+
+#define  _POSIX_REALTIME_SIGNALS    -1  /* for now, this is not supported */
+#define  _POSIX_PRIORITY_SCHEDULING  1  /* priority scheduling is a Linux feature */
+#define  _POSIX_TIMERS               1  /* Posix timers are supported */
+#undef   _POSIX_ASYNCHRONOUS_IO         /* aio_ functions are not supported */
+#define  _POSIX_SYNCHRONIZED_IO      1  /* synchronized i/o supported */
+#define  _POSIX_FSYNC                1  /* fdatasync() supported */
+#define  _POSIX_MAPPED_FILES         1  /* mmap-ed files supported */
+
+/* XXX: TODO: complete and check list here */
+
+
+#define  _POSIX_THREADS             1    /* we support threads */
+#define  _POSIX_THREAD_STACKADDR    1    /* we support thread stack address */
+#define  _POSIX_THREAD_STACKSIZE    1    /* we support thread stack size */
+#define  _POSIX_THREAD_PRIO_INHERIT 200112L   /* linux feature */
+#define  _POSIX_THREAD_PRIO_PROTECT 200112L   /* linux feature */
+
+#undef   _POSIX_PROCESS_SHARED           /* we don't support process-shared synchronization */
+#undef   _POSIX_THREAD_SAFE_FUNCTIONS    /* most functions are, but not everything yet */
+#define  _POSIX_CHOWN_RESTRICTED    1    /* yes, chown requires appropriate privileges */
+#define  _POSIX_MONOTONIC_CLOCK     0    /* the monotonic clock may be available; ask sysconf */
+#define  _POSIX_NO_TRUNC            1    /* very long pathnames generate an error */
+#define  _POSIX_SAVED_IDS           1    /* saved user ids is a Linux feature */
+#define  _POSIX_JOB_CONTROL         1    /* job control is a Linux feature */
+
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 /* the minimum mandated by POSIX */
+#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+#define _POSIX_THREAD_KEYS_MAX 128            /* the minimum mandated by POSIX */
+#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX
+#define _POSIX_THREAD_THREADS_MAX 64          /* the minimum mandated by POSIX */
+#define PTHREAD_THREADS_MAX                   /* bionic has no specific limit */
+
+
+#endif
diff --git a/ndk/platforms/android-9/arch-aarch64/include/sys/types.h b/ndk/platforms/android-9/arch-aarch64/include/sys/types.h
new file mode 100644
index 0000000..875692d
--- /dev/null
+++ b/ndk/platforms/android-9/arch-aarch64/include/sys/types.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _SYS_TYPES_H_
+#define _SYS_TYPES_H_
+
+#define __need_size_t
+#define __need_ptrdiff_t
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/cdefs.h>
+
+#include <linux/posix_types.h>
+#include <asm/types.h>
+#include <linux/types.h>
+#include <machine/kernel.h>
+
+typedef __u32    __kernel_dev_t;
+
+/* be careful with __kernel_gid_t and __kernel_uid_t
+ * these are defined as 16-bit for legacy reason, but
+ * the kernel uses 32-bits instead.
+ *
+ * 32-bit valuea are required for Android, so use
+ * __kernel_uid32_t and __kernel_gid32_t
+ */
+
+typedef __kernel_blkcnt_t    blkcnt_t;
+typedef __kernel_blksize_t   blksize_t;
+typedef __kernel_clock_t     clock_t;
+typedef __kernel_clockid_t   clockid_t;
+typedef __kernel_dev_t       dev_t;
+typedef __kernel_fsblkcnt_t  fsblkcnt_t;
+typedef __kernel_fsfilcnt_t  fsfilcnt_t;
+typedef __kernel_gid32_t     gid_t;
+typedef __kernel_id_t        id_t;
+typedef __kernel_ino_t       ino_t;
+typedef __kernel_key_t       key_t;
+typedef __kernel_mode_t      mode_t;
+#ifndef _OFF_T_DEFINED_
+#define _OFF_T_DEFINED_
+typedef __kernel_off_t       off_t;
+#endif
+typedef __kernel_loff_t      loff_t;
+typedef loff_t               off64_t;  /* GLibc-specific */
+
+typedef __kernel_pid_t		 pid_t;
+
+/* while POSIX wants these in <sys/types.h>, we
+ * declare then in <pthread.h> instead */
+#if 0
+typedef  .... pthread_attr_t;
+typedef  .... pthread_cond_t;
+typedef  .... pthread_condattr_t;
+typedef  .... pthread_key_t;
+typedef  .... pthread_mutex_t;
+typedef  .... pthread_once_t;
+typedef  .... pthread_rwlock_t;
+typedef  .... pthread_rwlock_attr_t;
+typedef  .... pthread_t;
+#endif
+
+#ifndef _SSIZE_T_DEFINED_
+#define _SSIZE_T_DEFINED_
+typedef long int  ssize_t;
+#endif
+
+typedef __kernel_suseconds_t  suseconds_t;
+typedef __kernel_time_t       time_t;
+typedef __kernel_uid32_t        uid_t;
+typedef signed long           useconds_t;
+
+typedef __kernel_daddr_t	daddr_t;
+typedef __kernel_timer_t	timer_t;
+typedef __kernel_mqd_t		mqd_t;
+
+typedef __kernel_caddr_t    caddr_t;
+typedef unsigned int        uint_t;
+typedef unsigned int        uint;
+
+/* for some applications */
+#include <sys/sysmacros.h>
+
+#ifdef __BSD_VISIBLE
+typedef	unsigned char	u_char;
+typedef	unsigned short	u_short;
+typedef	unsigned int	u_int;
+typedef	unsigned long	u_long;
+
+typedef uint32_t       u_int32_t;
+typedef uint16_t       u_int16_t;
+typedef uint8_t        u_int8_t;
+typedef uint64_t       u_int64_t;
+#endif
+
+#endif
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-arm/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
 AAssetDir_close
 AAssetDir_getNextFileName
 AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
 AAsset_getBuffer
 AAsset_getLength
 AAsset_getRemainingLength
 AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
 AAsset_openFileDescriptor
 AAsset_read
 AAsset_seek
@@ -83,8 +83,15 @@
 AMotionEvent_getEventTime
 AMotionEvent_getFlags
 AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
 AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
 AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
 AMotionEvent_getHistoricalX
 AMotionEvent_getHistoricalY
 AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
 ASensorEventQueue_getEvents
 ASensorEventQueue_hasEvents
 ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
 ASensor_getMinDelay
 ASensor_getName
 ASensor_getResolution
 ASensor_getType
 ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
 AStorageManager_delete
 AStorageManager_getMountedObbPath
 AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt b/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt
new file mode 100644
index 0000000..a9b2d7a
--- /dev/null
+++ b/ndk/platforms/android-9/arch-arm/symbols/libm.so.functions.txt
@@ -0,0 +1,229 @@
+__addsf3
+__aeabi_cfcmpeq
+__aeabi_cfcmple
+__aeabi_cfrcmple
+__aeabi_d2lz
+__aeabi_d2uiz
+__aeabi_d2ulz
+__aeabi_dcmpun
+__aeabi_f2iz
+__aeabi_f2lz
+__aeabi_f2ulz
+__aeabi_fadd
+__aeabi_fcmpeq
+__aeabi_fcmpge
+__aeabi_fcmpgt
+__aeabi_fcmple
+__aeabi_fcmplt
+__aeabi_fcmpun
+__aeabi_fdiv
+__aeabi_fmul
+__aeabi_frsub
+__aeabi_fsub
+__aeabi_i2f
+__aeabi_l2f
+__aeabi_ui2f
+__aeabi_ul2f
+__cmpsf2
+__divsf3
+__eqsf2
+__exp__D
+__fixdfdi
+__fixsfdi
+__fixsfsi
+__fixunsdfdi
+__fixunsdfsi
+__fixunssfdi
+__floatdisf
+__floatsisf
+__floatundisf
+__floatunsisf
+__fpclassifyd
+__fpclassifyf
+__fpclassifyl
+__gesf2
+__gtsf2
+__ieee754_rem_pio2
+__ieee754_rem_pio2f
+__isfinite
+__isfinitef
+__isfinitel
+__isinf
+__isinff
+__isinfl
+__isnanl
+__isnormal
+__isnormalf
+__isnormall
+__kernel_cos
+__kernel_cosdf
+__kernel_rem_pio2
+__kernel_sin
+__kernel_sindf
+__kernel_tan
+__kernel_tandf
+__lesf2
+__log__D
+__ltsf2
+__mulsf3
+__nesf2
+__signbit
+__signbitf
+__signbitl
+__subsf3
+__unorddf2
+__unordsf2
+acos
+acosf
+acosh
+acoshf
+asin
+asinf
+asinh
+asinhf
+atan
+atan2
+atan2f
+atanf
+atanh
+atanhf
+cbrt
+cbrtf
+ceil
+ceilf
+ceill
+copysign
+copysignf
+copysignl
+cos
+cosf
+cosh
+coshf
+drem
+dremf
+erf
+erfc
+erfcf
+erff
+exp
+exp2
+exp2f
+expf
+expm1
+expm1f
+fabs
+fabsf
+fabsl
+fdim
+fdimf
+fdiml
+finite
+finitef
+floor
+floorf
+floorl
+fma
+fmaf
+fmax
+fmaxf
+fmaxl
+fmin
+fminf
+fminl
+fmod
+fmodf
+frexp
+frexpf
+gamma
+gamma_r
+gammaf
+gammaf_r
+hypot
+hypotf
+ilogb
+ilogbf
+ilogbl
+isnan
+isnanf
+j0
+j0f
+j1
+j1f
+jn
+jnf
+ldexp
+ldexpf
+ldexpl
+lgamma
+lgamma_r
+lgammaf
+lgammaf_r
+llrint
+llrintf
+llround
+llroundf
+llroundl
+log
+log10
+log10f
+log1p
+log1pf
+logb
+logbf
+logf
+lrint
+lrintf
+lround
+lroundf
+lroundl
+modf
+modff
+nearbyint
+nearbyintf
+nextafter
+nextafterf
+nexttowardf
+pow
+powf
+remainder
+remainderf
+remquo
+remquof
+rint
+rintf
+round
+roundf
+roundl
+scalb
+scalbf
+scalbln
+scalblnf
+scalblnl
+scalbn
+scalbnf
+scalbnl
+significand
+significandf
+sin
+sincos
+sincosf
+sincosl
+sinf
+sinh
+sinhf
+sqrt
+sqrtf
+tan
+tanf
+tanh
+tanhf
+tgamma
+trunc
+truncf
+truncl
+y0
+y0f
+y1
+y1f
+yn
+ynf
diff --git a/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt b/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt
new file mode 100644
index 0000000..a1b63fc
--- /dev/null
+++ b/ndk/platforms/android-9/arch-arm/symbols/libm.so.variables.txt
@@ -0,0 +1,2 @@
+__fe_dfl_env
+signgam
diff --git a/ndk/platforms/android-9/arch-mips/include/sys/vfs.h b/ndk/platforms/android-9/arch-mips/include/sys/vfs.h
deleted file mode 100644
index d14944d..0000000
--- a/ndk/platforms/android-9/arch-mips/include/sys/vfs.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#ifndef _SYS_VFS_H_
-#define _SYS_VFS_H_
-
-#include <stdint.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-__BEGIN_DECLS
-
-/* note: this corresponds to the kernel's statfs64 type */
-#ifdef __mips__
-struct statfs {
-    uint32_t        f_type;
-    uint32_t        f_bsize;
-    uint32_t        f_frsize;
-    uint32_t        __pad;
-    uint64_t        f_blocks;
-    uint64_t        f_bfree;
-    uint64_t        f_files;
-    uint64_t        f_ffree;
-    uint64_t        f_bavail;
-    __kernel_fsid_t f_fsid;
-    uint32_t        f_namelen;
-    uint32_t        f_spare[6];
-};
-#else
-struct statfs {
-    uint32_t        f_type;
-    uint32_t        f_bsize;
-    uint64_t        f_blocks;
-    uint64_t        f_bfree;
-    uint64_t        f_bavail;
-    uint64_t        f_files;
-    uint64_t        f_ffree;
-    __kernel_fsid_t f_fsid;
-    uint32_t        f_namelen;
-    uint32_t        f_frsize;
-    uint32_t        f_spare[5];
-};
-#endif
-
-#define  ADFS_SUPER_MAGIC      0xadf5
-#define  AFFS_SUPER_MAGIC      0xADFF
-#define  BEFS_SUPER_MAGIC      0x42465331
-#define  BFS_MAGIC             0x1BADFACE
-#define  CIFS_MAGIC_NUMBER     0xFF534D42
-#define  CODA_SUPER_MAGIC      0x73757245
-#define  COH_SUPER_MAGIC       0x012FF7B7
-#define  CRAMFS_MAGIC          0x28cd3d45
-#define  DEVFS_SUPER_MAGIC     0x1373
-#define  EFS_SUPER_MAGIC       0x00414A53
-#define  EXT_SUPER_MAGIC       0x137D
-#define  EXT2_OLD_SUPER_MAGIC  0xEF51
-#define  EXT2_SUPER_MAGIC      0xEF53
-#define  EXT3_SUPER_MAGIC      0xEF53
-#define  HFS_SUPER_MAGIC       0x4244
-#define  HPFS_SUPER_MAGIC      0xF995E849
-#define  HUGETLBFS_MAGIC       0x958458f6
-#define  ISOFS_SUPER_MAGIC     0x9660
-#define  JFFS2_SUPER_MAGIC     0x72b6
-#define  JFS_SUPER_MAGIC       0x3153464a
-#define  MINIX_SUPER_MAGIC     0x137F /* orig. minix */
-#define  MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
-#define  MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
-#define  MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
-#define  MSDOS_SUPER_MAGIC     0x4d44
-#define  NCP_SUPER_MAGIC       0x564c
-#define  NFS_SUPER_MAGIC       0x6969
-#define  NTFS_SB_MAGIC         0x5346544e
-#define  OPENPROM_SUPER_MAGIC  0x9fa1
-#define  PROC_SUPER_MAGIC      0x9fa0
-#define  QNX4_SUPER_MAGIC      0x002f
-#define  REISERFS_SUPER_MAGIC  0x52654973
-#define  ROMFS_MAGIC           0x7275
-#define  SMB_SUPER_MAGIC       0x517B
-#define  SYSV2_SUPER_MAGIC     0x012FF7B6
-#define  SYSV4_SUPER_MAGIC     0x012FF7B5
-#define  TMPFS_MAGIC           0x01021994
-#define  UDF_SUPER_MAGIC       0x15013346
-#define  UFS_MAGIC             0x00011954
-#define  USBDEVICE_SUPER_MAGIC 0x9fa2
-#define  VXFS_SUPER_MAGIC      0xa501FCF5
-#define  XENIX_SUPER_MAGIC     0x012FF7B4
-#define  XFS_SUPER_MAGIC       0x58465342
-#define  _XIAFS_SUPER_MAGIC    0x012FD16D
-
-extern int statfs(const char *, struct statfs *);
-extern int fstatfs(int, struct statfs *);
-
-__END_DECLS
-
-#endif /* _SYS_VFS_H_ */
diff --git a/ndk/platforms/android-9/arch-mips/lib/libc.a b/ndk/platforms/android-9/arch-mips/lib/libc.a
index d84d6b3..6a85a6d 100644
--- a/ndk/platforms/android-9/arch-mips/lib/libc.a
+++ b/ndk/platforms/android-9/arch-mips/lib/libc.a
Binary files differ
diff --git a/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-mips/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
 AAssetDir_close
 AAssetDir_getNextFileName
 AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
 AAsset_getBuffer
 AAsset_getLength
 AAsset_getRemainingLength
 AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
 AAsset_openFileDescriptor
 AAsset_read
 AAsset_seek
@@ -83,8 +83,15 @@
 AMotionEvent_getEventTime
 AMotionEvent_getFlags
 AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
 AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
 AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
 AMotionEvent_getHistoricalX
 AMotionEvent_getHistoricalY
 AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
 ASensorEventQueue_getEvents
 ASensorEventQueue_hasEvents
 ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
 ASensor_getMinDelay
 ASensor_getName
 ASensor_getResolution
 ASensor_getType
 ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
 AStorageManager_delete
 AStorageManager_getMountedObbPath
 AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/arch-mips64 b/ndk/platforms/android-9/arch-mips64
new file mode 120000
index 0000000..8f3e95f
--- /dev/null
+++ b/ndk/platforms/android-9/arch-mips64
@@ -0,0 +1 @@
+arch-mips
\ No newline at end of file
diff --git a/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt b/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
index 4438c5e..f71d8f8 100644
--- a/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
+++ b/ndk/platforms/android-9/arch-x86/symbols/libandroid.so.functions.txt
@@ -1,14 +1,14 @@
+AAsset_close
 AAssetDir_close
 AAssetDir_getNextFileName
 AAssetDir_rewind
-AAssetManager_fromJava
-AAssetManager_open
-AAssetManager_openDir
-AAsset_close
 AAsset_getBuffer
 AAsset_getLength
 AAsset_getRemainingLength
 AAsset_isAllocated
+AAssetManager_fromJava
+AAssetManager_open
+AAssetManager_openDir
 AAsset_openFileDescriptor
 AAsset_read
 AAsset_seek
@@ -83,8 +83,15 @@
 AMotionEvent_getEventTime
 AMotionEvent_getFlags
 AMotionEvent_getHistoricalEventTime
+AMotionEvent_getHistoricalOrientation
 AMotionEvent_getHistoricalPressure
+AMotionEvent_getHistoricalRawX
+AMotionEvent_getHistoricalRawY
 AMotionEvent_getHistoricalSize
+AMotionEvent_getHistoricalToolMajor
+AMotionEvent_getHistoricalToolMinor
+AMotionEvent_getHistoricalTouchMajor
+AMotionEvent_getHistoricalTouchMinor
 AMotionEvent_getHistoricalX
 AMotionEvent_getHistoricalY
 AMotionEvent_getHistorySize
@@ -130,16 +137,16 @@
 ASensorEventQueue_getEvents
 ASensorEventQueue_hasEvents
 ASensorEventQueue_setEventRate
-ASensorManager_createEventQueue
-ASensorManager_destroyEventQueue
-ASensorManager_getDefaultSensor
-ASensorManager_getInstance
-ASensorManager_getSensorList
 ASensor_getMinDelay
 ASensor_getName
 ASensor_getResolution
 ASensor_getType
 ASensor_getVendor
+ASensorManager_createEventQueue
+ASensorManager_destroyEventQueue
+ASensorManager_getDefaultSensor
+ASensorManager_getInstance
+ASensorManager_getSensorList
 AStorageManager_delete
 AStorageManager_getMountedObbPath
 AStorageManager_isObbMounted
diff --git a/ndk/platforms/android-9/include/EGL/eglext.h b/ndk/platforms/android-9/include/EGL/eglext.h
index a08932a..7b6ed1b 100644
--- a/ndk/platforms/android-9/include/EGL/eglext.h
+++ b/ndk/platforms/android-9/include/EGL/eglext.h
@@ -28,7 +28,7 @@
 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 */
 
-#include <EGL/eglplatform.h>
+#include <EGL/egl.h>
 
 /*************************************************************/
 
diff --git a/ndk/platforms/android-9/include/SLES/OpenSLES_Android.h b/ndk/platforms/android-9/include/SLES/OpenSLES_Android.h
index 829df68..01568d2 100644
--- a/ndk/platforms/android-9/include/SLES/OpenSLES_Android.h
+++ b/ndk/platforms/android-9/include/SLES/OpenSLES_Android.h
@@ -21,6 +21,8 @@
 extern "C" {
 #endif
 
+#include "OpenSLES.h"
+
 /*---------------------------------------------------------------------------*/
 /* Android common types                                                      */
 /*---------------------------------------------------------------------------*/
diff --git a/ndk/platforms/android-9/include/android/input.h b/ndk/platforms/android-9/include/android/input.h
index b9dffad..0aac02f 100644
--- a/ndk/platforms/android-9/include/android/input.h
+++ b/ndk/platforms/android-9/include/android/input.h
@@ -433,23 +433,23 @@
  * For touch events on the screen, this is the delta that was added to the raw
  * screen coordinates to adjust for the absolute position of the containing windows
  * and views. */
-float AMotionEvent_getXOffset(const AInputEvent* motion_event);
+float AMotionEvent_getXOffset(const AInputEvent* motion_event) __NDK_FPABI__;
 
 /* Get the precision of the Y coordinates being reported.
  * For touch events on the screen, this is the delta that was added to the raw
  * screen coordinates to adjust for the absolute position of the containing windows
  * and views. */
-float AMotionEvent_getYOffset(const AInputEvent* motion_event);
+float AMotionEvent_getYOffset(const AInputEvent* motion_event) __NDK_FPABI__;
 
 /* Get the precision of the X coordinates being reported.
  * You can multiply this number with an X coordinate sample to find the
  * actual hardware value of the X coordinate. */
-float AMotionEvent_getXPrecision(const AInputEvent* motion_event);
+float AMotionEvent_getXPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
 
 /* Get the precision of the Y coordinates being reported.
  * You can multiply this number with a Y coordinate sample to find the
  * actual hardware value of the Y coordinate. */
-float AMotionEvent_getYPrecision(const AInputEvent* motion_event);
+float AMotionEvent_getYPrecision(const AInputEvent* motion_event) __NDK_FPABI__;
 
 /* Get the number of pointers of data contained in this event.
  * Always >= 1. */
@@ -465,29 +465,29 @@
  * For touch events on the screen, this is the original location of the event
  * on the screen, before it had been adjusted for the containing window
  * and views. */
-float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the original raw X coordinate of this event.
  * For touch events on the screen, this is the original location of the event
  * on the screen, before it had been adjusted for the containing window
  * and views. */
-float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current X coordinate of this event for the given pointer index.
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
-float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current Y coordinate of this event for the given pointer index.
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
-float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current pressure of this event for the given pointer index.
  * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
  * although values higher than 1 may be generated depending on the calibration of
  * the input device. */
-float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current scaled value of the approximate size for the given pointer index.
  * This represents some approximation of the area of the screen being
@@ -495,27 +495,27 @@
  * touch is normalized with the device specific range of values
  * and scaled to a value between 0 and 1.  The value of size can be used to
  * determine fat touch events. */
-float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current length of the major axis of an ellipse that describes the touch area
  * at the point of contact for the given pointer index. */
-float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getTouchMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current length of the minor axis of an ellipse that describes the touch area
  * at the point of contact for the given pointer index. */
-float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getTouchMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current length of the major axis of an ellipse that describes the size
  * of the approaching tool for the given pointer index.
  * The tool area represents the estimated size of the finger or pen that is
  * touching the device independent of its actual touch area at the point of contact. */
-float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getToolMajor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current length of the minor axis of an ellipse that describes the size
  * of the approaching tool for the given pointer index.
  * The tool area represents the estimated size of the finger or pen that is
  * touching the device independent of its actual touch area at the point of contact. */
-float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getToolMinor(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the current orientation of the touch area and tool area in radians clockwise from
  * vertical for the given pointer index.
@@ -525,7 +525,7 @@
  * indicates that the major axis of contact is oriented to the left.
  * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
  * (finger pointing fully right). */
-float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index);
+float AMotionEvent_getOrientation(const AInputEvent* motion_event, size_t pointer_index) __NDK_FPABI__;
 
 /* Get the number of historical points in this event.  These are movements that
  * have occurred between this event and the previous event.  This only applies
@@ -546,7 +546,7 @@
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
 float AMotionEvent_getHistoricalRawX(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical raw Y coordinate of this event for the given pointer index that
  * occurred between this event and the previous motion event.
@@ -556,21 +556,21 @@
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
 float AMotionEvent_getHistoricalRawY(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical X coordinate of this event for the given pointer index that
  * occurred between this event and the previous motion event.
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
 float AMotionEvent_getHistoricalX(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical Y coordinate of this event for the given pointer index that
  * occurred between this event and the previous motion event.
  * Whole numbers are pixels; the value may have a fraction for input devices
  * that are sub-pixel precise. */
 float AMotionEvent_getHistoricalY(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical pressure of this event for the given pointer index that
  * occurred between this event and the previous motion event.
@@ -578,7 +578,7 @@
  * although values higher than 1 may be generated depending on the calibration of
  * the input device. */
 float AMotionEvent_getHistoricalPressure(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the current scaled value of the approximate size for the given pointer index that
  * occurred between this event and the previous motion event.
@@ -588,19 +588,19 @@
  * and scaled to a value between 0 and 1.  The value of size can be used to
  * determine fat touch events. */
 float AMotionEvent_getHistoricalSize(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical length of the major axis of an ellipse that describes the touch area
  * at the point of contact for the given pointer index that
  * occurred between this event and the previous motion event. */
 float AMotionEvent_getHistoricalTouchMajor(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical length of the minor axis of an ellipse that describes the touch area
  * at the point of contact for the given pointer index that
  * occurred between this event and the previous motion event. */
 float AMotionEvent_getHistoricalTouchMinor(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical length of the major axis of an ellipse that describes the size
  * of the approaching tool for the given pointer index that
@@ -608,7 +608,7 @@
  * The tool area represents the estimated size of the finger or pen that is
  * touching the device independent of its actual touch area at the point of contact. */
 float AMotionEvent_getHistoricalToolMajor(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical length of the minor axis of an ellipse that describes the size
  * of the approaching tool for the given pointer index that
@@ -616,7 +616,7 @@
  * The tool area represents the estimated size of the finger or pen that is
  * touching the device independent of its actual touch area at the point of contact. */
 float AMotionEvent_getHistoricalToolMinor(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 /* Get the historical orientation of the touch area and tool area in radians clockwise from
  * vertical for the given pointer index that
@@ -628,7 +628,7 @@
  * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
  * (finger pointing fully right). */
 float AMotionEvent_getHistoricalOrientation(const AInputEvent* motion_event, size_t pointer_index,
-        size_t history_index);
+        size_t history_index) __NDK_FPABI__;
 
 
 /*
diff --git a/ndk/platforms/android-9/include/android/looper.h b/ndk/platforms/android-9/include/android/looper.h
index a9d8426..74c0383 100644
--- a/ndk/platforms/android-9/include/android/looper.h
+++ b/ndk/platforms/android-9/include/android/looper.h
@@ -148,7 +148,8 @@
 
 /**
  * For callback-based event loops, this is the prototype of the function
- * that is called.  It is given the file descriptor it is associated with,
+ * that is called when a file descriptor event occurs.
+ * It is given the file descriptor it is associated with,
  * a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT),
  * and the data pointer that was originally supplied.
  *
@@ -252,4 +253,4 @@
 };
 #endif
 
-#endif // ANDROID_NATIVE_WINDOW_H
+#endif // ANDROID_LOOPER_H
diff --git a/ndk/platforms/android-9/include/android/sensor.h b/ndk/platforms/android-9/include/android/sensor.h
index f163f18..e6a63c2 100644
--- a/ndk/platforms/android-9/include/android/sensor.h
+++ b/ndk/platforms/android-9/include/android/sensor.h
@@ -239,7 +239,7 @@
 /*
  * Returns this sensors's resolution
  */
-float ASensor_getResolution(ASensor const* sensor);
+float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
 
 /*
  * Returns the minimum delay allowed between events in microseconds.
diff --git a/ndk/platforms/android-9/include/math.h b/ndk/platforms/android-9/include/math.h
index 3b5660f..97c76d3 100644
--- a/ndk/platforms/android-9/include/math.h
+++ b/ndk/platforms/android-9/include/math.h
@@ -183,219 +183,219 @@
 /*
  * ANSI/POSIX
  */
-int	__fpclassifyd(double) __pure2;
-int	__fpclassifyf(float) __pure2;
-int	__fpclassifyl(long double) __pure2;
-int	__isfinitef(float) __pure2;
-int	__isfinite(double) __pure2;
-int	__isfinitel(long double) __pure2;
-int	__isinff(float) __pure2;
-int     __isinf(double) __pure2;
-int	__isinfl(long double) __pure2;
-int	__isnanl(long double) __pure2;
-int	__isnormalf(float) __pure2;
-int	__isnormal(double) __pure2;
-int	__isnormall(long double) __pure2;
-int	__signbit(double) __pure2;
-int	__signbitf(float) __pure2;
-int	__signbitl(long double) __pure2;
+int	__fpclassifyd(double) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyf(float) __NDK_FPABI_MATH__ __pure2;
+int	__fpclassifyl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitef(float) __NDK_FPABI_MATH__ __pure2;
+int	__isfinite(double) __NDK_FPABI_MATH__ __pure2;
+int	__isfinitel(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isinff(float) __NDK_FPABI_MATH__ __pure2;
+int     __isinf(double) __NDK_FPABI_MATH__ __pure2;
+int	__isinfl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnanl(long double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormalf(float) __NDK_FPABI_MATH__ __pure2;
+int	__isnormal(double) __NDK_FPABI_MATH__ __pure2;
+int	__isnormall(long double) __NDK_FPABI_MATH__ __pure2;
+int	__signbit(double) __NDK_FPABI_MATH__ __pure2;
+int	__signbitf(float) __NDK_FPABI_MATH__ __pure2;
+int	__signbitl(long double) __NDK_FPABI_MATH__ __pure2;
 
-double	acos(double);
-double	asin(double);
-double	atan(double);
-double	atan2(double, double);
-double	cos(double);
-double	sin(double);
-double	tan(double);
+double	acos(double) __NDK_FPABI_MATH__;
+double	asin(double) __NDK_FPABI_MATH__;
+double	atan(double) __NDK_FPABI_MATH__;
+double	atan2(double, double) __NDK_FPABI_MATH__;
+double	cos(double) __NDK_FPABI_MATH__;
+double	sin(double) __NDK_FPABI_MATH__;
+double	tan(double) __NDK_FPABI_MATH__;
 
-double	cosh(double);
-double	sinh(double);
-double	tanh(double);
+double	cosh(double) __NDK_FPABI_MATH__;
+double	sinh(double) __NDK_FPABI_MATH__;
+double	tanh(double) __NDK_FPABI_MATH__;
 
-double	exp(double);
-double	frexp(double, int *);	/* fundamentally !__pure2 */
-double	ldexp(double, int);
-double	log(double);
-double	log10(double);
-double	modf(double, double *);	/* fundamentally !__pure2 */
+double	exp(double) __NDK_FPABI_MATH__;
+double	frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	ldexp(double, int) __NDK_FPABI_MATH__;
+double	log(double) __NDK_FPABI_MATH__;
+double	log10(double) __NDK_FPABI_MATH__;
+double	modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
 
-double	pow(double, double);
-double	sqrt(double);
+double	pow(double, double) __NDK_FPABI_MATH__;
+double	sqrt(double) __NDK_FPABI_MATH__;
 
-double	ceil(double);
-double	fabs(double) __pure2;
-double	floor(double);
-double	fmod(double, double);
+double	ceil(double) __NDK_FPABI_MATH__;
+double	fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	floor(double) __NDK_FPABI_MATH__;
+double	fmod(double, double) __NDK_FPABI_MATH__;
 
 /*
  * These functions are not in C90.
  */
 /* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
-double	acosh(double);
-double	asinh(double);
-double	atanh(double);
-double	cbrt(double);
-double	erf(double);
-double	erfc(double);
-double	exp2(double);
-double	expm1(double);
-double	fma(double, double, double);
-double	hypot(double, double);
-int	ilogb(double) __pure2;
-/* int	(isinf)(double) __pure2; */
-int	(isnan)(double) __pure2;
-double	lgamma(double);
-long long llrint(double);
-long long llround(double);
-double	log1p(double);
-double	logb(double);
-long	lrint(double);
-long	lround(double);
-double	nextafter(double, double);
-double	remainder(double, double);
-double	remquo(double, double, int *);
-double	rint(double);
+double	acosh(double) __NDK_FPABI_MATH__;
+double	asinh(double) __NDK_FPABI_MATH__;
+double	atanh(double) __NDK_FPABI_MATH__;
+double	cbrt(double) __NDK_FPABI_MATH__;
+double	erf(double) __NDK_FPABI_MATH__;
+double	erfc(double) __NDK_FPABI_MATH__;
+double	exp2(double) __NDK_FPABI_MATH__;
+double	expm1(double) __NDK_FPABI_MATH__;
+double	fma(double, double, double) __NDK_FPABI_MATH__;
+double	hypot(double, double) __NDK_FPABI_MATH__;
+int	ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	(isinf)(double) __NDK_FPABI_MATH__ __pure2; */
+int	(isnan)(double) __NDK_FPABI_MATH__ __pure2;
+double	lgamma(double) __NDK_FPABI_MATH__;
+long long llrint(double) __NDK_FPABI_MATH__;
+long long llround(double) __NDK_FPABI_MATH__;
+double	log1p(double) __NDK_FPABI_MATH__;
+double	logb(double) __NDK_FPABI_MATH__;
+long	lrint(double) __NDK_FPABI_MATH__;
+long	lround(double) __NDK_FPABI_MATH__;
+double	nextafter(double, double) __NDK_FPABI_MATH__;
+double	remainder(double, double) __NDK_FPABI_MATH__;
+double	remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	rint(double) __NDK_FPABI_MATH__;
 /* #endif */ /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE */
 
 /* #if __BSD_VISIBLE || __XSI_VISIBLE */
-double	j0(double);
-double	j1(double);
-double	jn(int, double);
-double	scalb(double, double);
-double	y0(double);
-double	y1(double);
-double	yn(int, double);
+double	j0(double) __NDK_FPABI_MATH__;
+double	j1(double) __NDK_FPABI_MATH__;
+double	jn(int, double) __NDK_FPABI_MATH__;
+double	scalb(double, double) __NDK_FPABI_MATH__;
+double	y0(double) __NDK_FPABI_MATH__;
+double	y1(double) __NDK_FPABI_MATH__;
+double	yn(int, double) __NDK_FPABI_MATH__;
 
 /* #if __XSI_VISIBLE <= 500 || __BSD_VISIBLE */
-double	gamma(double);
+double	gamma(double) __NDK_FPABI_MATH__;
 /* #endif */
 /* #endif */ /* __BSD_VISIBLE || __XSI_VISIBLE */
 
 /* #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 */
-double	copysign(double, double) __pure2;
-double	fdim(double, double);
-double	fmax(double, double) __pure2;
-double	fmin(double, double) __pure2;
-double	nearbyint(double);
-double	round(double);
-double	scalbln(double, long);
-double	scalbn(double, int);
-double	tgamma(double);
-double	trunc(double);
+double	copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fdim(double, double) __NDK_FPABI_MATH__;
+double	fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	nearbyint(double) __NDK_FPABI_MATH__;
+double	round(double) __NDK_FPABI_MATH__;
+double	scalbln(double, long) __NDK_FPABI_MATH__;
+double	scalbn(double, int) __NDK_FPABI_MATH__;
+double	tgamma(double) __NDK_FPABI_MATH__;
+double	trunc(double) __NDK_FPABI_MATH__;
 /* #endif */
 
 /*
  * BSD math library entry points
  */
 /* #if __BSD_VISIBLE */
-double	drem(double, double);
-int	finite(double) __pure2;
-int	isnanf(float) __pure2;
+double	drem(double, double) __NDK_FPABI_MATH__;
+int	finite(double) __NDK_FPABI_MATH__ __pure2;
+int	isnanf(float) __NDK_FPABI_MATH__ __pure2;
 
 /*
  * Reentrant version of gamma & lgamma; passes signgam back by reference
  * as the second argument; user must allocate space for signgam.
  */
-double	gamma_r(double, int *);
-double	lgamma_r(double, int *);
+double	gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	lgamma_r(double, int *) __NDK_FPABI_MATH__;
 
 /*
  * IEEE Test Vector
  */
-double	significand(double);
+double	significand(double) __NDK_FPABI_MATH__;
 /* #endif */ /* __BSD_VISIBLE */
 
 /* float versions of ANSI/POSIX functions */
 /*#if __ISO_C_VISIBLE >= 1999 */
-float	acosf(float);
-float	asinf(float);
-float	atanf(float);
-float	atan2f(float, float);
-float	cosf(float);
-float	sinf(float);
-float	tanf(float);
+float	acosf(float) __NDK_FPABI_MATH__;
+float	asinf(float) __NDK_FPABI_MATH__;
+float	atanf(float) __NDK_FPABI_MATH__;
+float	atan2f(float, float) __NDK_FPABI_MATH__;
+float	cosf(float) __NDK_FPABI_MATH__;
+float	sinf(float) __NDK_FPABI_MATH__;
+float	tanf(float) __NDK_FPABI_MATH__;
 
-float	coshf(float);
-float	sinhf(float);
-float	tanhf(float);
+float	coshf(float) __NDK_FPABI_MATH__;
+float	sinhf(float) __NDK_FPABI_MATH__;
+float	tanhf(float) __NDK_FPABI_MATH__;
 
-float	exp2f(float);
-float	expf(float);
-float	expm1f(float);
-float	frexpf(float, int *);	/* fundamentally !__pure2 */
-int	ilogbf(float) __pure2;
-float	ldexpf(float, int);
-float	log10f(float);
-float	log1pf(float);
-float	logf(float);
-float	modff(float, float *);	/* fundamentally !__pure2 */
+float	exp2f(float) __NDK_FPABI_MATH__;
+float	expf(float) __NDK_FPABI_MATH__;
+float	expm1f(float) __NDK_FPABI_MATH__;
+float	frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	ldexpf(float, int) __NDK_FPABI_MATH__;
+float	log10f(float) __NDK_FPABI_MATH__;
+float	log1pf(float) __NDK_FPABI_MATH__;
+float	logf(float) __NDK_FPABI_MATH__;
+float	modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
 
-float	powf(float, float);
-float	sqrtf(float);
+float	powf(float, float) __NDK_FPABI_MATH__;
+float	sqrtf(float) __NDK_FPABI_MATH__;
 
-float	ceilf(float);
-float	fabsf(float) __pure2;
-float	floorf(float);
-float	fmodf(float, float);
-float	roundf(float);
+float	ceilf(float) __NDK_FPABI_MATH__;
+float	fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	floorf(float) __NDK_FPABI_MATH__;
+float	fmodf(float, float) __NDK_FPABI_MATH__;
+float	roundf(float) __NDK_FPABI_MATH__;
 
-float	erff(float);
-float	erfcf(float);
-float	hypotf(float, float);
-float	lgammaf(float);
+float	erff(float) __NDK_FPABI_MATH__;
+float	erfcf(float) __NDK_FPABI_MATH__;
+float	hypotf(float, float) __NDK_FPABI_MATH__;
+float	lgammaf(float) __NDK_FPABI_MATH__;
 
-float	acoshf(float);
-float	asinhf(float);
-float	atanhf(float);
-float	cbrtf(float);
-float	logbf(float);
-float	copysignf(float, float) __pure2;
-long long llrintf(float);
-long long llroundf(float);
-long	lrintf(float);
-long	lroundf(float);
-float	nearbyintf(float);
-float	nextafterf(float, float);
-float	remainderf(float, float);
-float	remquof(float, float, int *);
-float	rintf(float);
-float	scalblnf(float, long);
-float	scalbnf(float, int);
-float	truncf(float);
+float	acoshf(float) __NDK_FPABI_MATH__;
+float	asinhf(float) __NDK_FPABI_MATH__;
+float	atanhf(float) __NDK_FPABI_MATH__;
+float	cbrtf(float) __NDK_FPABI_MATH__;
+float	logbf(float) __NDK_FPABI_MATH__;
+float	copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long llrintf(float) __NDK_FPABI_MATH__;
+long long llroundf(float) __NDK_FPABI_MATH__;
+long	lrintf(float) __NDK_FPABI_MATH__;
+long	lroundf(float) __NDK_FPABI_MATH__;
+float	nearbyintf(float) __NDK_FPABI_MATH__;
+float	nextafterf(float, float) __NDK_FPABI_MATH__;
+float	remainderf(float, float) __NDK_FPABI_MATH__;
+float	remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	rintf(float) __NDK_FPABI_MATH__;
+float	scalblnf(float, long) __NDK_FPABI_MATH__;
+float	scalbnf(float, int) __NDK_FPABI_MATH__;
+float	truncf(float) __NDK_FPABI_MATH__;
 
-float	fdimf(float, float);
-float	fmaf(float, float, float);
-float	fmaxf(float, float) __pure2;
-float	fminf(float, float) __pure2;
+float	fdimf(float, float) __NDK_FPABI_MATH__;
+float	fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	fminf(float, float) __NDK_FPABI_MATH__ __pure2;
 /* #endif */
 
 /*
  * float versions of BSD math library entry points
  */
 /* #if __BSD_VISIBLE */
-float	dremf(float, float);
-int	finitef(float) __pure2;
-float	gammaf(float);
-float	j0f(float);
-float	j1f(float);
-float	jnf(int, float);
-float	scalbf(float, float);
-float	y0f(float);
-float	y1f(float);
-float	ynf(int, float);
+float	dremf(float, float) __NDK_FPABI_MATH__;
+int	finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	gammaf(float) __NDK_FPABI_MATH__;
+float	j0f(float) __NDK_FPABI_MATH__;
+float	j1f(float) __NDK_FPABI_MATH__;
+float	jnf(int, float) __NDK_FPABI_MATH__;
+float	scalbf(float, float) __NDK_FPABI_MATH__;
+float	y0f(float) __NDK_FPABI_MATH__;
+float	y1f(float) __NDK_FPABI_MATH__;
+float	ynf(int, float) __NDK_FPABI_MATH__;
 
 /*
  * Float versions of reentrant version of gamma & lgamma; passes
  * signgam back by reference as the second argument; user must
  * allocate space for signgam.
  */
-float	gammaf_r(float, int *);
-float	lgammaf_r(float, int *);
+float	gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	lgammaf_r(float, int *) __NDK_FPABI_MATH__;
 
 /*
  * float version of IEEE Test Vector
  */
-float	significandf(float);
+float	significandf(float) __NDK_FPABI_MATH__;
 /* #endif */	/* __BSD_VISIBLE */ 
 
 /*
@@ -403,90 +403,301 @@
  */
 /* #if __ISO_C_VISIBLE >= 1999 */
 #if 0
-long double	acoshl(long double);
-long double	acosl(long double);
-long double	asinhl(long double);
-long double	asinl(long double);
-long double	atan2l(long double, long double);
-long double	atanhl(long double);
-long double	atanl(long double);
-long double	cbrtl(long double);
+long double	acoshl(long double) __NDK_FPABI_MATH__;
+long double	acosl(long double) __NDK_FPABI_MATH__;
+long double	asinhl(long double) __NDK_FPABI_MATH__;
+long double	asinl(long double) __NDK_FPABI_MATH__;
+long double	atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	atanhl(long double) __NDK_FPABI_MATH__;
+long double	atanl(long double) __NDK_FPABI_MATH__;
+long double	cbrtl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	ceill(long double);
-long double	copysignl(long double, long double) __pure2;
+long double	ceill(long double) __NDK_FPABI_MATH__;
+long double	copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
 #if 0
-long double	coshl(long double);
-long double	cosl(long double);
-long double	erfcl(long double);
-long double	erfl(long double);
-long double	exp2l(long double);
-long double	expl(long double);
-long double	expm1l(long double);
+long double	coshl(long double) __NDK_FPABI_MATH__;
+long double	cosl(long double) __NDK_FPABI_MATH__;
+long double	erfcl(long double) __NDK_FPABI_MATH__;
+long double	erfl(long double) __NDK_FPABI_MATH__;
+long double	exp2l(long double) __NDK_FPABI_MATH__;
+long double	expl(long double) __NDK_FPABI_MATH__;
+long double	expm1l(long double) __NDK_FPABI_MATH__;
 #endif
-long double	fabsl(long double) __pure2;
-long double	fdiml(long double, long double);
-long double	floorl(long double);
-long double	fmal(long double, long double, long double);
-long double	fmaxl(long double, long double) __pure2;
-long double	fminl(long double, long double) __pure2;
+long double	fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	floorl(long double) __NDK_FPABI_MATH__;
+long double	fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
 #if 0
-long double	fmodl(long double, long double);
+long double	fmodl(long double, long double) __NDK_FPABI_MATH__;
 #endif
-long double	frexpl(long double value, int *); /* fundamentally !__pure2 */
+long double	frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
 #if 0
-long double	hypotl(long double, long double);
+long double	hypotl(long double, long double) __NDK_FPABI_MATH__;
 #endif
-int		ilogbl(long double) __pure2;
-long double	ldexpl(long double, int);
+int		ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	ldexpl(long double, int) __NDK_FPABI_MATH__;
 #if 0
-long double	lgammal(long double);
-long long	llrintl(long double);
+long double	lgammal(long double) __NDK_FPABI_MATH__;
+long long	llrintl(long double) __NDK_FPABI_MATH__;
 #endif
-long long	llroundl(long double);
+long long	llroundl(long double) __NDK_FPABI_MATH__;
 #if 0
-long double	log10l(long double);
-long double	log1pl(long double);
-long double	log2l(long double);
-long double	logbl(long double);
-long double	logl(long double);
-long		lrintl(long double);
+long double	log10l(long double) __NDK_FPABI_MATH__;
+long double	log1pl(long double) __NDK_FPABI_MATH__;
+long double	log2l(long double) __NDK_FPABI_MATH__;
+long double	logbl(long double) __NDK_FPABI_MATH__;
+long double	logl(long double) __NDK_FPABI_MATH__;
+long		lrintl(long double) __NDK_FPABI_MATH__;
 #endif
-long		lroundl(long double);
+long		lroundl(long double) __NDK_FPABI_MATH__;
 #if 0
-long double	modfl(long double, long double *); /* fundamentally !__pure2 */
-long double	nanl(const char *) __pure2;
-long double	nearbyintl(long double);
+long double	modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	nearbyintl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	nextafterl(long double, long double);
-double		nexttoward(double, long double);
-float		nexttowardf(float, long double);
-long double	nexttowardl(long double, long double);
+long double	nextafterl(long double, long double) __NDK_FPABI_MATH__;
+double		nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		nexttowardf(float, long double) __NDK_FPABI_MATH__;
+long double	nexttowardl(long double, long double) __NDK_FPABI_MATH__;
 #if 0
-long double	powl(long double, long double);
-long double	remainderl(long double, long double);
-long double	remquol(long double, long double, int *);
-long double	rintl(long double);
+long double	powl(long double, long double) __NDK_FPABI_MATH__;
+long double	remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	rintl(long double) __NDK_FPABI_MATH__;
 #endif
-long double	roundl(long double);
-long double	scalblnl(long double, long);
-long double	scalbnl(long double, int);
+long double	roundl(long double) __NDK_FPABI_MATH__;
+long double	scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	scalbnl(long double, int) __NDK_FPABI_MATH__;
 #if 0
-long double	sinhl(long double);
-long double	sinl(long double);
-long double	sqrtl(long double);
-long double	tanhl(long double);
-long double	tanl(long double);
-long double	tgammal(long double);
+long double	sinhl(long double) __NDK_FPABI_MATH__;
+long double	sinl(long double) __NDK_FPABI_MATH__;
+long double	sqrtl(long double) __NDK_FPABI_MATH__;
+long double	tanhl(long double) __NDK_FPABI_MATH__;
+long double	tanl(long double) __NDK_FPABI_MATH__;
+long double	tgammal(long double) __NDK_FPABI_MATH__;
 #endif
-long double	truncl(long double);
+long double	truncl(long double) __NDK_FPABI_MATH__;
 
 /* BIONIC: GLibc compatibility - required by the ARM toolchain */
 #ifdef _GNU_SOURCE
-void  sincos(double x, double *sin, double *cos);
-void  sincosf(float x, float *sin, float *cos);
-void  sincosl(long double x, long double *sin, long double *cos);
+void  sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
 #endif
 
+/* builtin version of all the above math functions are annotated too */
+
+double	__builtin_acos(double) __NDK_FPABI_MATH__;
+double	__builtin_asin(double) __NDK_FPABI_MATH__;
+double	__builtin_atan(double) __NDK_FPABI_MATH__;
+double	__builtin_atan2(double, double) __NDK_FPABI_MATH__;
+double	__builtin_cos(double) __NDK_FPABI_MATH__;
+double	__builtin_sin(double) __NDK_FPABI_MATH__;
+double	__builtin_tan(double) __NDK_FPABI_MATH__;
+double	__builtin_cosh(double) __NDK_FPABI_MATH__;
+double	__builtin_sinh(double) __NDK_FPABI_MATH__;
+double	__builtin_tanh(double) __NDK_FPABI_MATH__;
+double	__builtin_exp(double) __NDK_FPABI_MATH__;
+double	__builtin_frexp(double, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_ldexp(double, int) __NDK_FPABI_MATH__;
+double	__builtin_log(double) __NDK_FPABI_MATH__;
+double	__builtin_log10(double) __NDK_FPABI_MATH__;
+double	__builtin_modf(double, double *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+double	__builtin_pow(double, double) __NDK_FPABI_MATH__;
+double	__builtin_sqrt(double) __NDK_FPABI_MATH__;
+double	__builtin_ceil(double) __NDK_FPABI_MATH__;
+double	__builtin_fabs(double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_floor(double) __NDK_FPABI_MATH__;
+double	__builtin_fmod(double, double) __NDK_FPABI_MATH__;
+double	__builtin_acosh(double) __NDK_FPABI_MATH__;
+double	__builtin_asinh(double) __NDK_FPABI_MATH__;
+double	__builtin_atanh(double) __NDK_FPABI_MATH__;
+double	__builtin_cbrt(double) __NDK_FPABI_MATH__;
+double	__builtin_erf(double) __NDK_FPABI_MATH__;
+double	__builtin_erfc(double) __NDK_FPABI_MATH__;
+double	__builtin_exp2(double) __NDK_FPABI_MATH__;
+double	__builtin_expm1(double) __NDK_FPABI_MATH__;
+double	__builtin_fma(double, double, double) __NDK_FPABI_MATH__;
+double	__builtin_hypot(double, double) __NDK_FPABI_MATH__;
+int	__builtin_ilogb(double) __NDK_FPABI_MATH__ __pure2;
+/* int	__builtin_isinf(double) __NDK_FPABI_MATH__ __pure2; */
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 5)
+int	__builtin_isnan(double) __NDK_FPABI_MATH__ __pure2;
+#else
+/* clang < 3.5 has faulty prototype for __builtin_isnan */
+#endif
+double	__builtin_lgamma(double) __NDK_FPABI_MATH__;
+long long __builtin_llrint(double) __NDK_FPABI_MATH__;
+long long __builtin_llround(double) __NDK_FPABI_MATH__;
+double	__builtin_log1p(double) __NDK_FPABI_MATH__;
+double	__builtin_logb(double) __NDK_FPABI_MATH__;
+long	__builtin_lrint(double) __NDK_FPABI_MATH__;
+long	__builtin_lround(double) __NDK_FPABI_MATH__;
+double	__builtin_nextafter(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remainder(double, double) __NDK_FPABI_MATH__;
+double	__builtin_remquo(double, double, int *) __NDK_FPABI_MATH__;
+double	__builtin_rint(double) __NDK_FPABI_MATH__;
+double	__builtin_j0(double) __NDK_FPABI_MATH__;
+double	__builtin_j1(double) __NDK_FPABI_MATH__;
+double	__builtin_jn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_scalb(double, double) __NDK_FPABI_MATH__;
+double	__builtin_y0(double) __NDK_FPABI_MATH__;
+double	__builtin_y1(double) __NDK_FPABI_MATH__;
+double	__builtin_yn(int, double) __NDK_FPABI_MATH__;
+double	__builtin_gamma(double) __NDK_FPABI_MATH__;
+double	__builtin_copysign(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fdim(double, double) __NDK_FPABI_MATH__;
+double	__builtin_fmax(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_fmin(double, double) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_nearbyint(double) __NDK_FPABI_MATH__;
+double	__builtin_round(double) __NDK_FPABI_MATH__;
+double	__builtin_scalbln(double, long) __NDK_FPABI_MATH__;
+double	__builtin_scalbn(double, int) __NDK_FPABI_MATH__;
+double	__builtin_tgamma(double) __NDK_FPABI_MATH__;
+double	__builtin_trunc(double) __NDK_FPABI_MATH__;
+double	__builtin_drem(double, double) __NDK_FPABI_MATH__;
+int	__builtin_finite(double) __NDK_FPABI_MATH__ __pure2;
+int	__builtin_isnanf(float) __NDK_FPABI_MATH__ __pure2;
+double	__builtin_gamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_lgamma_r(double, int *) __NDK_FPABI_MATH__;
+double	__builtin_significand(double) __NDK_FPABI_MATH__;
+float	__builtin_acosf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanf(float) __NDK_FPABI_MATH__;
+float	__builtin_atan2f(float, float) __NDK_FPABI_MATH__;
+float	__builtin_cosf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanf(float) __NDK_FPABI_MATH__;
+float	__builtin_coshf(float) __NDK_FPABI_MATH__;
+float	__builtin_sinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_tanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_exp2f(float) __NDK_FPABI_MATH__;
+float	__builtin_expf(float) __NDK_FPABI_MATH__;
+float	__builtin_expm1f(float) __NDK_FPABI_MATH__;
+float	__builtin_frexpf(float, int *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+int	__builtin_ilogbf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_ldexpf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_log10f(float) __NDK_FPABI_MATH__;
+float	__builtin_log1pf(float) __NDK_FPABI_MATH__;
+float	__builtin_logf(float) __NDK_FPABI_MATH__;
+float	__builtin_modff(float, float *) __NDK_FPABI_MATH__;	/* fundamentally !__pure2 */
+float	__builtin_powf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_sqrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_ceilf(float) __NDK_FPABI_MATH__;
+float	__builtin_fabsf(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_floorf(float) __NDK_FPABI_MATH__;
+float	__builtin_fmodf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_roundf(float) __NDK_FPABI_MATH__;
+float	__builtin_erff(float) __NDK_FPABI_MATH__;
+float	__builtin_erfcf(float) __NDK_FPABI_MATH__;
+float	__builtin_hypotf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_acoshf(float) __NDK_FPABI_MATH__;
+float	__builtin_asinhf(float) __NDK_FPABI_MATH__;
+float	__builtin_atanhf(float) __NDK_FPABI_MATH__;
+float	__builtin_cbrtf(float) __NDK_FPABI_MATH__;
+float	__builtin_logbf(float) __NDK_FPABI_MATH__;
+float	__builtin_copysignf(float, float) __NDK_FPABI_MATH__ __pure2;
+long long __builtin_llrintf(float) __NDK_FPABI_MATH__;
+long long __builtin_llroundf(float) __NDK_FPABI_MATH__;
+long	__builtin_lrintf(float) __NDK_FPABI_MATH__;
+long	__builtin_lroundf(float) __NDK_FPABI_MATH__;
+float	__builtin_nearbyintf(float) __NDK_FPABI_MATH__;
+float	__builtin_nextafterf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remainderf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_remquof(float, float, int *) __NDK_FPABI_MATH__;
+float	__builtin_rintf(float) __NDK_FPABI_MATH__;
+float	__builtin_scalblnf(float, long) __NDK_FPABI_MATH__;
+float	__builtin_scalbnf(float, int) __NDK_FPABI_MATH__;
+float	__builtin_truncf(float) __NDK_FPABI_MATH__;
+float	__builtin_fdimf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaf(float, float, float) __NDK_FPABI_MATH__;
+float	__builtin_fmaxf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_fminf(float, float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_dremf(float, float) __NDK_FPABI_MATH__;
+int	__builtin_finitef(float) __NDK_FPABI_MATH__ __pure2;
+float	__builtin_gammaf(float) __NDK_FPABI_MATH__;
+float	__builtin_j0f(float) __NDK_FPABI_MATH__;
+float	__builtin_j1f(float) __NDK_FPABI_MATH__;
+float	__builtin_jnf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_scalbf(float, float) __NDK_FPABI_MATH__;
+float	__builtin_y0f(float) __NDK_FPABI_MATH__;
+float	__builtin_y1f(float) __NDK_FPABI_MATH__;
+float	__builtin_ynf(int, float) __NDK_FPABI_MATH__;
+float	__builtin_gammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_lgammaf_r(float, int *) __NDK_FPABI_MATH__;
+float	__builtin_significandf(float) __NDK_FPABI_MATH__;
+long double	__builtin_acoshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_acosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_asinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atan2l(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_atanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cbrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_ceill(long double) __NDK_FPABI_MATH__;
+long double	__builtin_copysignl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_coshl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_cosl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfcl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_erfl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_exp2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_expm1l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fabsl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fdiml(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_floorl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmal(long double, long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_fmaxl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fminl(long double, long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_fmodl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_frexpl(long double value, int *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_hypotl(long double, long double) __NDK_FPABI_MATH__;
+int		__builtin_ilogbl(long double) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_ldexpl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_lgammal(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llrintl(long double) __NDK_FPABI_MATH__;
+long long	__builtin_llroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log10l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log1pl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_log2l(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logbl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_logl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lrintl(long double) __NDK_FPABI_MATH__;
+long		__builtin_lroundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_modfl(long double, long double *) __NDK_FPABI_MATH__; /* fundamentally !__pure2 */
+long double	__builtin_nanl(const char *) __NDK_FPABI_MATH__ __pure2;
+long double	__builtin_nearbyintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_nextafterl(long double, long double) __NDK_FPABI_MATH__;
+#if !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)
+double		__builtin_nexttoward(double, long double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, long double) __NDK_FPABI_MATH__;
+#else
+/* clang < 3.4 */
+double		__builtin_nexttoward(double, double) __NDK_FPABI_MATH__;
+float		__builtin_nexttowardf(float, float) __NDK_FPABI_MATH__;
+#endif
+long double	__builtin_nexttowardl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_powl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remainderl(long double, long double) __NDK_FPABI_MATH__;
+long double	__builtin_remquol(long double, long double, int *) __NDK_FPABI_MATH__;
+long double	__builtin_rintl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_roundl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_scalblnl(long double, long) __NDK_FPABI_MATH__;
+long double	__builtin_scalbnl(long double, int) __NDK_FPABI_MATH__;
+long double	__builtin_sinhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sinl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_sqrtl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanhl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tanl(long double) __NDK_FPABI_MATH__;
+long double	__builtin_tgammal(long double) __NDK_FPABI_MATH__;
+long double	__builtin_truncl(long double) __NDK_FPABI_MATH__;
+void  __builtin_sincos(double x, double *sin, double *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosf(float x, float *sin, float *cos) __NDK_FPABI_MATH__;
+void  __builtin_sincosl(long double x, long double *sin, long double *cos) __NDK_FPABI_MATH__;
+
 /* #endif */ /* __ISO_C_VISIBLE >= 1999 */
 __END_DECLS
 
diff --git a/ndk/platforms/android-9/include/pthread.h b/ndk/platforms/android-9/include/pthread.h
index c3f055e..0176abd 100644
--- a/ndk/platforms/android-9/include/pthread.h
+++ b/ndk/platforms/android-9/include/pthread.h
@@ -142,7 +142,9 @@
 
 int pthread_create(pthread_t *thread, pthread_attr_t const * attr,
                    void *(*start_routine)(void *), void * arg);
-void pthread_exit(void * retval);
+
+__noreturn void pthread_exit(void * retval);
+
 int pthread_join(pthread_t thid, void ** ret_val);
 int pthread_detach(pthread_t  thid);
 
diff --git a/ndk/platforms/android-9/include/stdlib.h b/ndk/platforms/android-9/include/stdlib.h
index 97d8e46..6011787 100644
--- a/ndk/platforms/android-9/include/stdlib.h
+++ b/ndk/platforms/android-9/include/stdlib.h
@@ -57,6 +57,7 @@
 extern int unsetenv(const char *);
 extern int clearenv(void);
 
+extern char *mkdtemp(char *);
 extern char *mktemp (char *);
 extern int mkstemp (char *);
 
@@ -64,8 +65,9 @@
 extern long long strtoll(const char *, char **, int);
 extern unsigned long strtoul(const char *, char **, int);
 extern unsigned long long strtoull(const char *, char **, int);
-extern double strtod(const char *nptr, char **endptr);
+extern double strtod(const char *nptr, char **endptr) __NDK_FPABI__;
 
+__NDK_FPABI__
 static __inline__ float strtof(const char *nptr, char **endptr)
 {
     return (float)strtod(nptr, endptr);
@@ -75,6 +77,7 @@
 extern long atol(const char *);
 extern long long atoll(const char *);
 
+ __NDK_FPABI__
 static __inline__ double atof(const char *nptr)
 {
     return (strtod(nptr, NULL));
@@ -106,8 +109,8 @@
 extern long nrand48(unsigned short *);
 extern long lrand48(void);
 extern unsigned short *seed48(unsigned short*);
-extern double erand48(unsigned short xsubi[3]);
-extern double drand48(void);
+extern double erand48(unsigned short xsubi[3]) __NDK_FPABI__;
+extern double drand48(void) __NDK_FPABI__;
 extern void srand48(long);
 extern unsigned int arc4random(void);
 extern void arc4random_stir(void);
diff --git a/ndk/platforms/android-9/include/sys/cdefs.h b/ndk/platforms/android-9/include/sys/cdefs.h
index 92035d4..beb35c4 100644
--- a/ndk/platforms/android-9/include/sys/cdefs.h
+++ b/ndk/platforms/android-9/include/sys/cdefs.h
@@ -499,4 +499,31 @@
 #define  __BIONIC__   1
 #include <android/api-level.h>
 
+/* __NDK_FPABI__ or __NDK_FPABI_MATH__ are applied to APIs taking or returning float or
+   [long] double, to ensure even at the presence of -mhard-float (which implies
+   -mfloat-abi=hard), calling to 32-bit Android native APIs still follow -mfloat-abi=softfp.
+
+   __NDK_FPABI_MATH__ is applied to APIs in math.h.  It normally equals to __NDK_FPABI__,
+   but allows use of customized libm.a compiled with -mhard-float by -D_NDK_MATH_NO_SOFTFP=1
+
+   NOTE: Disable for clang for now unless _NDK_MATH_NO_SOFTFP=1, because clang before 3.4 doesn't
+         allow change of calling convension for builtin and produces error message reads:
+
+           a.i:564:6: error: function declared 'aapcs' here was previously declared without calling convention
+           int  sin(double d) __attribute__((pcs("aapcs")));
+                ^
+           a.i:564:6: note: previous declaration is here
+ */
+#if defined(__ANDROID__) && !__LP64__ && defined( __arm__)
+#define __NDK_FPABI__ __attribute__((pcs("aapcs")))
+#else
+#define __NDK_FPABI__
+#endif
+
+#if (!defined(_NDK_MATH_NO_SOFTFP) || _NDK_MATH_NO_SOFTFP != 1) && !defined(__clang__)
+#define __NDK_FPABI_MATH__ __NDK_FPABI__
+#else
+#define __NDK_FPABI_MATH__  /* nothing */
+#endif
+
 #endif /* !_SYS_CDEFS_H_ */
diff --git a/ndk/platforms/android-9/include/sys/wait.h b/ndk/platforms/android-9/include/sys/wait.h
index b30b7ec..51e070b 100644
--- a/ndk/platforms/android-9/include/sys/wait.h
+++ b/ndk/platforms/android-9/include/sys/wait.h
@@ -33,6 +33,9 @@
 #include <sys/resource.h>
 #include <linux/wait.h>
 #include <signal.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+
 
 __BEGIN_DECLS
 
@@ -48,7 +51,10 @@
 extern pid_t  wait(int *);
 extern pid_t  waitpid(pid_t, int *, int);
 extern pid_t  wait3(int *, int, struct rusage *);
-extern pid_t  wait4(pid_t, int *, int, struct rusage *);
+static __inline__ pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage)
+{
+  return (pid_t)syscall(__NR_wait4, pid, status, options, rusage);
+}
 
 /* Posix states that idtype_t should be an enumeration type, but
  * the kernel headers define P_ALL, P_PID and P_PGID as constant macros
diff --git a/ndk/platforms/android-9/include/wchar.h b/ndk/platforms/android-9/include/wchar.h
index 806e3d1..b10f470 100644
--- a/ndk/platforms/android-9/include/wchar.h
+++ b/ndk/platforms/android-9/include/wchar.h
@@ -121,7 +121,7 @@
 extern size_t            wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *);
 extern size_t            wcsspn(const wchar_t *, const wchar_t *);
 extern wchar_t          *wcsstr(const wchar_t *, const wchar_t *);
-extern double            wcstod(const wchar_t *, wchar_t **);
+extern double            wcstod(const wchar_t *, wchar_t **) __NDK_FPABI__;
 extern wchar_t          *wcstok(wchar_t *, const wchar_t *, wchar_t **);
 extern long int          wcstol(const wchar_t *, wchar_t **, int);
 extern size_t            wcstombs(char *, const wchar_t *, size_t);
diff --git a/ndk/samples/hello-jni/jni/Application.mk b/ndk/samples/hello-jni/jni/Application.mk
new file mode 100644
index 0000000..e619d92
--- /dev/null
+++ b/ndk/samples/hello-jni/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := all
\ No newline at end of file
diff --git a/ndk/samples/hello-jni/jni/hello-jni.c b/ndk/samples/hello-jni/jni/hello-jni.c
index be1e6a7..19fcc6a 100644
--- a/ndk/samples/hello-jni/jni/hello-jni.c
+++ b/ndk/samples/hello-jni/jni/hello-jni.c
@@ -27,5 +27,23 @@
 Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                   jobject thiz )
 {
-    return (*env)->NewStringUTF(env, "Hello from JNI !");
+#if defined(__arm__)
+  #if defined(__ARM_ARCH_7A__)
+    #if defined(__ARM_NEON__)
+      #define ABI "armeabi-v7a/NEON"
+    #else
+      #define ABI "armeabi-v7a"
+    #endif
+  #else
+   #define ABI "armeabi"
+  #endif
+#elif defined(__i386__)
+   #define ABI "x86"
+#elif defined(__mips__)
+   #define ABI "mips"
+#else
+   #define ABI "unknown"
+#endif
+
+    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI " ABI ".");
 }
diff --git a/ndk/sources/android/libportable/arch-mips/poll.c b/ndk/sources/android/libportable/arch-mips/poll.c
index 3f97176..54059dd 100644
--- a/ndk/sources/android/libportable/arch-mips/poll.c
+++ b/ndk/sources/android/libportable/arch-mips/poll.c
@@ -104,9 +104,9 @@
     return mips_events;
 }
 
-extern int poll(struct pollfd *, nfds_t, long);
+extern int poll(struct pollfd *, nfds_t, int);
 
-int WRAP(poll)(struct pollfd *fds, nfds_t nfds, long timeout)
+int WRAP(poll)(struct pollfd *fds, nfds_t nfds, int timeout)
 {
   nfds_t i;
   int ret;
diff --git a/ndk/sources/android/libportable/arch-mips/pthread.c b/ndk/sources/android/libportable/arch-mips/pthread.c
index 5b75623..f6c3037 100644
--- a/ndk/sources/android/libportable/arch-mips/pthread.c
+++ b/ndk/sources/android/libportable/arch-mips/pthread.c
@@ -114,7 +114,7 @@
 PTHREAD_WRAPPER(pthread_attr_setscope, (pthread_attr_t *attr, int scope), (attr, scope),
                 "(attr:%p, scope:%d)");
 
-PTHREAD_WRAPPER(pthread_attr_getscope, (pthread_attr_t const *attr), (attr), "(attr:%p)");
+PTHREAD_WRAPPER(pthread_attr_getscope, (pthread_attr_t const *attr, int* scope), (attr, scope), "(attr:%p, scope:%p)");
 
 PTHREAD_WRAPPER(pthread_getattr_np, (pthread_t thid, pthread_attr_t *attr), (thid, attr),
                 "(thid:%lx, attr:%p)");
diff --git a/ndk/sources/android/libportable/arch-mips/signal.c b/ndk/sources/android/libportable/arch-mips/signal.c
index a06eff7..0c38d14 100644
--- a/ndk/sources/android/libportable/arch-mips/signal.c
+++ b/ndk/sources/android/libportable/arch-mips/signal.c
@@ -1027,7 +1027,7 @@
         ALOGV("%s: SA_THIRTYTWO_PORTABLE isn't SUPPORTED.", __func__);
     }
     if (portable_flags & SA_RESTORER_PORTABLE) {
-        mips_flags |= SA_RESTORER;
+        ALOGV("%s: SA_RESTORER isn't SUPPORTED.", __func__);
     }
     if (portable_flags & SA_ONSTACK_PORTABLE) {
         mips_flags |= SA_ONSTACK;
@@ -1059,7 +1059,6 @@
 #ifdef SA_THIRTYTWO
     if (mips_flags & SA_THIRTYTWO)      portable_flags |= SA_THIRTYTWO_PORTABLE;
 #endif
-    if (mips_flags & SA_RESTORER)       portable_flags |= SA_RESTORER_PORTABLE;
     if (mips_flags & SA_ONSTACK)        portable_flags |= SA_ONSTACK_PORTABLE;
     if (mips_flags & SA_RESTART)        portable_flags |= SA_RESTART_PORTABLE;
     if (mips_flags & SA_NODEFER)        portable_flags |= SA_NODEFER_PORTABLE;
diff --git a/ndk/sources/android/libportable/arch-mips/statfs.c b/ndk/sources/android/libportable/arch-mips/statfs.c
index 45dfd09..013cde9 100644
--- a/ndk/sources/android/libportable/arch-mips/statfs.c
+++ b/ndk/sources/android/libportable/arch-mips/statfs.c
@@ -33,6 +33,7 @@
     p_statfs->f_fsid = n_statfs->f_fsid;
     p_statfs->f_namelen = n_statfs->f_namelen;
     p_statfs->f_frsize = n_statfs->f_frsize;
+    p_statfs->f_flags = n_statfs->f_flags;
 }
 
 int WRAP(statfs)(const char*  path, struct statfs_portable*  stat)
diff --git a/ndk/sources/android/libportable/common/include/asm-generic/portability.h b/ndk/sources/android/libportable/common/include/asm-generic/portability.h
index 8d91854..a575b95 100644
--- a/ndk/sources/android/libportable/common/include/asm-generic/portability.h
+++ b/ndk/sources/android/libportable/common/include/asm-generic/portability.h
@@ -21,8 +21,8 @@
 #define WRAP(f)     f ## _portable
 #define REAL(f)     f
 #else
-/* On host app link with libpportable.a with -Wl,--wrap=symbol, which resolve symbol symbol to __wrap_symbol,
- * and __real_symbol refer to the original symbol
+/* On host app link with libpportable.a with -Wl,--wrap=symbol, which resolves undefined symbol to __wrap_symbol,
+ * and undefined __real_symbol to the original symbol
  */
 #define WRAP(f)     __wrap_ ## f
 #define REAL(f)     __real_ ## f
diff --git a/ndk/sources/android/libportable/common/include/statfs_portable.h b/ndk/sources/android/libportable/common/include/statfs_portable.h
index 23451ea..6774696 100644
--- a/ndk/sources/android/libportable/common/include/statfs_portable.h
+++ b/ndk/sources/android/libportable/common/include/statfs_portable.h
@@ -28,10 +28,11 @@
     uint64_t        f_bavail;
     uint64_t        f_files;
     uint64_t        f_ffree;
-    __kernel_fsid_t f_fsid;
+    __fsid_t        f_fsid;
     uint32_t        f_namelen;
     uint32_t        f_frsize;
-    uint32_t        f_spare[5];
+    uint32_t        f_flags;
+    uint32_t        f_spare[4];
 };
 
 /*
@@ -46,9 +47,10 @@
     uint64_t        f_files;
     uint64_t        f_ffree;
     uint64_t        f_bavail;
-    __kernel_fsid_t f_fsid;
+    __fsid_t        f_fsid;
     uint32_t        f_namelen;
-    uint32_t        f_spare[6];
+    uint32_t        f_flags;
+    uint32_t        f_spare[5];
 };
 */
 #endif /* _STATFS_PORTABLE_H_ */
diff --git a/ndk/sources/android/ndk_helper/Android.mk b/ndk/sources/android/ndk_helper/Android.mk
new file mode 100644
index 0000000..98dc1be
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= ndk_helper
+LOCAL_SRC_FILES:= JNIHelper.cpp interpolator.cpp tapCamera.cpp gestureDetector.cpp perfMonitor.cpp vecmath.cpp GLContext.cpp shader.cpp gl3stub.c
+
+LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
+LOCAL_EXPORT_LDLIBS    := -llog -landroid -lEGL -lGLESv2
+
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue
+
+
+ifneq ($(filter %armeabi-v7a,$(TARGET_ARCH_ABI)),)
+LOCAL_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
+LOCAL_EXPORT_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
+LOCAL_EXPORT_LDLIBS += -lm_hard
+ifeq (,$(filter -fuse-ld=mcld,$(APP_LDFLAGS) $(LOCAL_LDFLAGS)))
+LOCAL_EXPORT_LDFLAGS += -Wl,--no-warn-mismatch
+endif
+endif
+
+include $(BUILD_STATIC_LIBRARY)
+
+#$(call import-module,android/native_app_glue)
+#$(call import-module,android/cpufeatures)
\ No newline at end of file
diff --git a/ndk/sources/android/ndk_helper/GLContext.cpp b/ndk/sources/android/ndk_helper/GLContext.cpp
new file mode 100644
index 0000000..edfdd6c
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/GLContext.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// GLContext.cpp
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+#include <unistd.h>
+#include "GLContext.h"
+#include "gl3stub.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// eGLContext
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+GLContext::GLContext() :
+                display_( EGL_NO_DISPLAY ),
+                surface_( EGL_NO_SURFACE ),
+                context_( EGL_NO_CONTEXT ),
+                screen_width_( 0 ),
+                screen_height_( 0 ),
+                es3_supported_( false ),
+                egl_context_initialized_( false ),
+                gles_initialized_( false )
+{
+}
+
+void GLContext::InitGLES()
+{
+    if( gles_initialized_ )
+        return;
+    //
+    //Initialize OpenGL ES 3 if available
+    //
+    const char* versionStr = (const char*) glGetString( GL_VERSION );
+    if( strstr( versionStr, "OpenGL ES 3." ) && gl3stubInit() )
+    {
+        es3_supported_ = true;
+        gl_version_ = 3.0f;
+    }
+    else
+    {
+        gl_version_ = 2.0f;
+    }
+
+    gles_initialized_ = true;
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+GLContext::~GLContext()
+{
+    Terminate();
+}
+
+bool GLContext::Init( ANativeWindow* window )
+{
+    if( egl_context_initialized_ )
+        return true;
+
+    //
+    //Initialize EGL
+    //
+    window_ = window;
+    InitEGLSurface();
+    InitEGLContext();
+    InitGLES();
+
+    egl_context_initialized_ = true;
+
+    return true;
+}
+
+bool GLContext::InitEGLSurface()
+{
+    display_ = eglGetDisplay( EGL_DEFAULT_DISPLAY );
+    eglInitialize( display_, 0, 0 );
+
+    /*
+     * Here specify the attributes of the desired configuration.
+     * Below, we select an EGLConfig with at least 8 bits per color
+     * component compatible with on-screen windows
+     */
+    const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+            EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+            EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+            EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_NONE };
+    color_size_ = 8;
+    depth_size_ = 24;
+
+    EGLint num_configs;
+    eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+
+    if( !num_configs )
+    {
+        //Fall back to 16bit depth buffer
+        const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+                EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+                EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+                EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 16, EGL_NONE };
+        eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+        depth_size_ = 16;
+    }
+
+    if( !num_configs )
+    {
+        LOGW( "Unable to retrieve EGL config" );
+        return false;
+    }
+
+    surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+    eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+    eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+    /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+     * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
+     * As soon as we picked a EGLConfig, we can safely reconfigure the
+     * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+    EGLint format;
+    eglGetConfigAttrib( display_, config_, EGL_NATIVE_VISUAL_ID, &format );
+    ANativeWindow_setBuffersGeometry( window_, 0, 0, format );
+
+    return true;
+}
+
+bool GLContext::InitEGLContext()
+{
+    const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, //Request opengl ES2.0
+            EGL_NONE };
+    context_ = eglCreateContext( display_, config_, NULL, context_attribs );
+
+    if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_FALSE )
+    {
+        LOGW( "Unable to eglMakeCurrent" );
+        return false;
+    }
+
+    context_valid_ = true;
+    return true;
+}
+
+EGLint GLContext::Swap()
+{
+    bool b = eglSwapBuffers( display_, surface_ );
+    if( !b )
+    {
+        EGLint err = eglGetError();
+        if( err == EGL_BAD_SURFACE )
+        {
+            //Recreate surface
+            InitEGLSurface();
+            return EGL_SUCCESS; //Still consider glContext is valid
+        }
+        else if( err == EGL_CONTEXT_LOST || err == EGL_BAD_CONTEXT )
+        {
+            //Context has been lost!!
+            context_valid_ = false;
+            Terminate();
+            InitEGLContext();
+        }
+        return err;
+    }
+    return EGL_SUCCESS;
+}
+
+void GLContext::Terminate()
+{
+    if( display_ != EGL_NO_DISPLAY )
+    {
+        eglMakeCurrent( display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+        if( context_ != EGL_NO_CONTEXT )
+        {
+            eglDestroyContext( display_, context_ );
+        }
+
+        if( surface_ != EGL_NO_SURFACE )
+        {
+            eglDestroySurface( display_, surface_ );
+        }
+        eglTerminate( display_ );
+    }
+
+    display_ = EGL_NO_DISPLAY;
+    context_ = EGL_NO_CONTEXT;
+    surface_ = EGL_NO_SURFACE;
+    context_valid_ = false;
+
+}
+
+EGLint GLContext::Resume( ANativeWindow* window )
+{
+    if( egl_context_initialized_ == false )
+    {
+        Init( window );
+        return EGL_SUCCESS;
+    }
+
+    int32_t original_widhth = screen_width_;
+    int32_t original_height = screen_height_;
+
+    //Create surface
+    window_ = window;
+    surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+    eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+    eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+    if( screen_width_ != original_widhth || screen_height_ != original_height )
+    {
+        //Screen resized
+        LOGI( "Screen resized" );
+    }
+
+    if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_TRUE )
+        return EGL_SUCCESS;
+
+    EGLint err = eglGetError();
+    LOGW( "Unable to eglMakeCurrent %d", err );
+
+    if( err == EGL_CONTEXT_LOST )
+    {
+        //Recreate context
+        LOGI( "Re-creating egl context" );
+        InitEGLContext();
+    }
+    else
+    {
+        //Recreate surface
+        Terminate();
+        InitEGLSurface();
+        InitEGLContext();
+    }
+
+    return err;
+
+}
+
+void GLContext::Suspend()
+{
+    if( surface_ != EGL_NO_SURFACE )
+    {
+        eglDestroySurface( display_, surface_ );
+        surface_ = EGL_NO_SURFACE;
+    }
+}
+
+bool GLContext::Invalidate()
+{
+    Terminate();
+
+    egl_context_initialized_ = false;
+    return true;
+}
+
+bool GLContext::CheckExtension( const char* extension )
+{
+    if( extension == NULL )
+        return false;
+
+    std::string extensions = std::string( (char*) glGetString( GL_EXTENSIONS ) );
+    std::string str = std::string( extension );
+    str.append( " " );
+
+    size_t pos = 0;
+    if( extensions.find( extension, pos ) != std::string::npos )
+    {
+        return true;
+    }
+
+    return false;
+}
+
+}   //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/GLContext.h b/ndk/sources/android/ndk_helper/GLContext.h
new file mode 100644
index 0000000..cc0db46
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/GLContext.h
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// GLContext.h
+//--------------------------------------------------------------------------------
+#ifndef GLCONTEXT_H_
+#define GLCONTEXT_H_
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <android/log.h>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// Constants
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// Class
+//--------------------------------------------------------------------------------
+
+/******************************************************************
+ * OpenGL context handler
+ * The class handles OpenGL and EGL context based on Android activity life cycle
+ * The caller needs to call corresponding methods for each activity life cycle events as it's done in sample codes.
+ *
+ * Also the class initializes OpenGL ES3 when the compatible driver is installed in the device.
+ * getGLVersion() returns 3.0~ when the device supports OpenGLES3.0
+ *
+ * Thread safety: OpenGL context is expecting used within dedicated single thread,
+ * thus GLContext class is not designed as a thread-safe
+ */
+class GLContext
+{
+private:
+    //EGL configurations
+    ANativeWindow* window_;
+    EGLDisplay display_;
+    EGLSurface surface_;
+    EGLContext context_;
+    EGLConfig config_;
+
+    //Screen parameters
+    int32_t screen_width_;
+    int32_t screen_height_;
+    int32_t color_size_;
+    int32_t depth_size_;
+
+    //Flags
+    bool gles_initialized_;
+    bool egl_context_initialized_;
+    bool es3_supported_;
+    float gl_version_;
+    bool context_valid_;
+
+    void InitGLES();
+    void Terminate();
+    bool InitEGLSurface();
+    bool InitEGLContext();
+
+    GLContext( GLContext const& );
+    void operator=( GLContext const& );
+    GLContext();
+    virtual ~GLContext();
+public:
+    static GLContext* GetInstance()
+    {
+        //Singleton
+        static GLContext instance;
+
+        return &instance;
+    }
+
+    bool Init( ANativeWindow* window );
+    EGLint Swap();
+    bool Invalidate();
+
+    void Suspend();
+    EGLint Resume( ANativeWindow* window );
+
+    int32_t GetScreenWidth()
+    {
+        return screen_width_;
+    }
+    int32_t GetScreenHeight()
+    {
+        return screen_height_;
+    }
+
+    int32_t GetBufferColorSize()
+    {
+        return color_size_;
+    }
+    int32_t GetBufferDepthSize()
+    {
+        return depth_size_;
+    }
+    float GetGLVersion()
+    {
+        return gl_version_;
+    }
+    bool CheckExtension( const char* extension );
+};
+
+}   //namespace ndkHelper
+
+#endif /* GLCONTEXT_H_ */
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.cpp b/ndk/sources/android/ndk_helper/JNIHelper.cpp
new file mode 100644
index 0000000..e1e7f00
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.cpp
@@ -0,0 +1,376 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <fstream>
+#include <iostream>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define CLASS_NAME "android/app/NativeActivity"
+
+//---------------------------------------------------------------------------
+//JNI Helper functions
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+//Singleton
+//---------------------------------------------------------------------------
+JNIHelper* JNIHelper::GetInstance()
+{
+    static JNIHelper helper;
+    return &helper;
+}
+
+//---------------------------------------------------------------------------
+//Ctor
+//---------------------------------------------------------------------------
+JNIHelper::JNIHelper()
+{
+    pthread_mutex_init( &mutex_, NULL );
+}
+
+//---------------------------------------------------------------------------
+//Dtor
+//---------------------------------------------------------------------------
+JNIHelper::~JNIHelper()
+{
+    pthread_mutex_lock( &mutex_ );
+
+    JNIEnv *env;
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    env->DeleteGlobalRef( jni_helper_java_ref_ );
+    env->DeleteGlobalRef( jni_helper_java_class_ );
+
+    activity_->vm->DetachCurrentThread();
+
+    pthread_mutex_destroy( &mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//Init
+//---------------------------------------------------------------------------
+void JNIHelper::Init( ANativeActivity* activity,
+        const char* helper_class_name )
+{
+    JNIHelper& helper = *GetInstance();
+    pthread_mutex_lock( &helper.mutex_ );
+
+    helper.activity_ = activity;
+
+    JNIEnv *env;
+    helper.activity_->vm->AttachCurrentThread( &env, NULL );
+
+    //Retrieve app name
+    jclass android_content_Context = env->GetObjectClass( helper.activity_->clazz );
+    jmethodID midGetPackageName = env->GetMethodID( android_content_Context, "getPackageName",
+            "()Ljava/lang/String;" );
+
+    jstring packageName = (jstring) env->CallObjectMethod( helper.activity_->clazz,
+            midGetPackageName );
+    const char* appname = env->GetStringUTFChars( packageName, NULL );
+    helper.app_name_ = std::string( appname );
+
+    jclass cls = helper.RetrieveClass( env, helper_class_name );
+    helper.jni_helper_java_class_ = (jclass) env->NewGlobalRef( cls );
+
+    jmethodID constructor = env->GetMethodID( helper.jni_helper_java_class_, "<init>", "()V" );
+    helper.jni_helper_java_ref_ = env->NewObject( helper.jni_helper_java_class_, constructor );
+    helper.jni_helper_java_ref_ = env->NewGlobalRef( helper.jni_helper_java_ref_ );
+
+    env->ReleaseStringUTFChars( packageName, appname );
+    helper.activity_->vm->DetachCurrentThread();
+
+    pthread_mutex_unlock( &helper.mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//readFile
+//---------------------------------------------------------------------------
+bool JNIHelper::ReadFile( const char* fileName,
+        std::vector<uint8_t>* buffer_ref )
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized.Call init() to initialize the helper" );
+        return false;
+    }
+
+    //First, try reading from externalFileDir;
+    JNIEnv *env;
+    jmethodID mid;
+
+    pthread_mutex_lock( &mutex_ );
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    jstring str_path = GetExternalFilesDirJString( env );
+    const char* path = env->GetStringUTFChars( str_path, NULL );
+    std::string s( path );
+
+    if( fileName[0] != '/' )
+    {
+        s.append( "/" );
+    }
+    s.append( fileName );
+    std::ifstream f( s.c_str(), std::ios::binary );
+
+    env->ReleaseStringUTFChars( str_path, path );
+    env->DeleteLocalRef( str_path );
+    activity_->vm->DetachCurrentThread();
+
+    if( f )
+    {
+        LOGI( "reading:%s", s.c_str() );
+        f.seekg( 0, std::ifstream::end );
+        int32_t fileSize = f.tellg();
+        f.seekg( 0, std::ifstream::beg );
+        buffer_ref->reserve( fileSize );
+        buffer_ref->assign( std::istreambuf_iterator<char>( f ), std::istreambuf_iterator<char>() );
+        f.close();
+        pthread_mutex_unlock( &mutex_ );
+        return true;
+    }
+    else
+    {
+        //Fallback to assetManager
+        AAssetManager* assetManager = activity_->assetManager;
+        AAsset* assetFile = AAssetManager_open( assetManager, fileName, AASSET_MODE_BUFFER );
+        if( !assetFile )
+        {
+            pthread_mutex_unlock( &mutex_ );
+            return false;
+        }
+        uint8_t* data = (uint8_t*) AAsset_getBuffer( assetFile );
+        int32_t size = AAsset_getLength( assetFile );
+        if( data == NULL )
+        {
+            AAsset_close( assetFile );
+
+            LOGI( "Failed to load:%s", fileName );
+            pthread_mutex_unlock( &mutex_ );
+            return false;
+        }
+
+        buffer_ref->reserve( size );
+        buffer_ref->assign( data, data + size );
+
+        AAsset_close( assetFile );
+        pthread_mutex_unlock( &mutex_ );
+        return true;
+    }
+}
+
+std::string JNIHelper::GetExternalFilesDir()
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return std::string( "" );
+    }
+
+    pthread_mutex_lock( &mutex_ );
+
+    //First, try reading from externalFileDir;
+    JNIEnv *env;
+    jmethodID mid;
+
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    jstring strPath = GetExternalFilesDirJString( env );
+    const char* path = env->GetStringUTFChars( strPath, NULL );
+    std::string s( path );
+
+    env->ReleaseStringUTFChars( strPath, path );
+    env->DeleteLocalRef( strPath );
+    activity_->vm->DetachCurrentThread();
+
+    pthread_mutex_unlock( &mutex_ );
+    return s;
+}
+
+uint32_t JNIHelper::LoadTexture( const char* file_name )
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return 0;
+    }
+
+    JNIEnv *env;
+    jmethodID mid;
+
+    pthread_mutex_lock( &mutex_ );
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    jstring name = env->NewStringUTF( file_name );
+
+    GLuint tex;
+    glGenTextures( 1, &tex );
+    glBindTexture( GL_TEXTURE_2D, tex );
+
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+    mid = env->GetMethodID( jni_helper_java_class_, "loadTexture", "(Ljava/lang/String;)Z" );
+    jboolean ret = env->CallBooleanMethod( jni_helper_java_ref_, mid, name );
+    if( !ret )
+    {
+        glDeleteTextures( 1, &tex );
+        tex = -1;
+        LOGI( "Texture load failed %s", file_name );
+    }
+
+    //Generate mipmap
+    glGenerateMipmap( GL_TEXTURE_2D );
+
+    env->DeleteLocalRef( name );
+    activity_->vm->DetachCurrentThread();
+    pthread_mutex_unlock( &mutex_ );
+
+    return tex;
+
+}
+
+std::string JNIHelper::ConvertString( const char* str,
+        const char* encode )
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return std::string( "" );
+    }
+
+    JNIEnv *env;
+
+    pthread_mutex_lock( &mutex_ );
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    int32_t iLength = strlen( (const char*) str );
+
+    jbyteArray array = env->NewByteArray( iLength );
+    env->SetByteArrayRegion( array, 0, iLength, (const signed char*) str );
+
+    jstring strEncode = env->NewStringUTF( encode );
+
+    jclass cls = env->FindClass( "java/lang/String" );
+    jmethodID ctor = env->GetMethodID( cls, "<init>", "([BLjava/lang/String;)V" );
+    jstring object = (jstring) env->NewObject( cls, ctor, array, strEncode );
+
+    const char *cparam = env->GetStringUTFChars( object, NULL );
+
+    std::string s = std::string( cparam );
+
+    env->ReleaseStringUTFChars( object, cparam );
+    env->DeleteLocalRef( strEncode );
+    env->DeleteLocalRef( object );
+    activity_->vm->DetachCurrentThread();
+    pthread_mutex_unlock( &mutex_ );
+
+    return s;
+}
+
+//---------------------------------------------------------------------------
+//Audio helpers
+//---------------------------------------------------------------------------
+int32_t JNIHelper::GetNativeAudioBufferSize()
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return 0;
+    }
+
+    JNIEnv *env;
+    jmethodID mid;
+
+    pthread_mutex_lock( &mutex_ );
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioBufferSize", "()I" );
+    int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+    activity_->vm->DetachCurrentThread();
+    pthread_mutex_unlock( &mutex_ );
+
+    return i;
+}
+
+int32_t JNIHelper::GetNativeAudioSampleRate()
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return 0;
+    }
+
+    JNIEnv *env;
+    jmethodID mid;
+
+    pthread_mutex_lock( &mutex_ );
+    activity_->vm->AttachCurrentThread( &env, NULL );
+
+    mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioSampleRate", "()I" );
+    int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+    activity_->vm->DetachCurrentThread();
+    pthread_mutex_unlock( &mutex_ );
+
+    return i;
+}
+
+//---------------------------------------------------------------------------
+//Misc implementations
+//---------------------------------------------------------------------------
+jclass JNIHelper::RetrieveClass( JNIEnv *jni,
+        const char* class_name )
+{
+    jclass activity_class = jni->FindClass( CLASS_NAME );
+    jmethodID get_class_loader = jni->GetMethodID( activity_class, "getClassLoader",
+            "()Ljava/lang/ClassLoader;" );
+    jobject cls = jni->CallObjectMethod( activity_->clazz, get_class_loader );
+    jclass class_loader = jni->FindClass( "java/lang/ClassLoader" );
+    jmethodID find_class = jni->GetMethodID( class_loader, "loadClass",
+            "(Ljava/lang/String;)Ljava/lang/Class;" );
+
+    jstring str_class_name = jni->NewStringUTF( class_name );
+    jclass class_retrieved = (jclass) jni->CallObjectMethod( cls, find_class, str_class_name );
+    jni->DeleteLocalRef( str_class_name );
+    return class_retrieved;
+}
+
+jstring JNIHelper::GetExternalFilesDirJString( JNIEnv *env )
+{
+    if( activity_ == NULL )
+    {
+        LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+        return NULL;
+    }
+
+    // Invoking getExternalFilesDir() java API
+    jclass cls_Env = env->FindClass( CLASS_NAME );
+    jmethodID mid = env->GetMethodID( cls_Env, "getExternalFilesDir",
+            "(Ljava/lang/String;)Ljava/io/File;" );
+    jobject obj_File = env->CallObjectMethod( activity_->clazz, mid, NULL );
+    jclass cls_File = env->FindClass( "java/io/File" );
+    jmethodID mid_getPath = env->GetMethodID( cls_File, "getPath", "()Ljava/lang/String;" );
+    jstring obj_Path = (jstring) env->CallObjectMethod( obj_File, mid_getPath );
+
+    return obj_Path;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.h b/ndk/sources/android/ndk_helper/JNIHelper.h
new file mode 100644
index 0000000..7a77d76
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <jni.h>
+#include <vector>
+#include <string>
+
+#include <android/log.h>
+#include <android_native_app_glue.h>
+
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper functions for JNI calls
+ * This class wraps JNI calls and provides handy interface calling commonly used features
+ * in Java SDK.
+ * Such as
+ * - loading graphics files (e.g. PNG, JPG)
+ * - character code conversion
+ * - retrieving system properties which only supported in Java SDK
+ *
+ * NOTE: To use this class, add NDKHelper.java as a corresponding helpers in Java code
+ */
+class JNIHelper
+{
+private:
+    std::string app_name_;
+
+    ANativeActivity* activity_;
+    jobject jni_helper_java_ref_;
+    jclass jni_helper_java_class_;
+
+    //mutex for synchronization
+    //This class uses singleton pattern and can be invoked from multiple threads,
+    //each methods locks the mutex for a thread safety
+    mutable pthread_mutex_t mutex_;
+
+    jstring GetExternalFilesDirJString( JNIEnv *env );
+    jclass RetrieveClass( JNIEnv *jni,
+            const char* class_name );
+
+    JNIHelper();
+    ~JNIHelper();
+    JNIHelper( const JNIHelper& rhs );
+    JNIHelper& operator=( const JNIHelper& rhs );
+
+public:
+    /*
+     * To load your own Java classes, JNIHelper requires to be initialized with a ANativeActivity handle.
+     * This methods need to be called before any call to the helper class.
+     * Static member of the class
+     *
+     * arguments:
+     * in: activity, pointer to ANativeActivity. Used internally to set up JNI environment
+     * in: helper_class_name, pointer to Java side helper class name. (e.g. "com/sample/helper/NDKHelper" in samples )
+     */
+    static void Init( ANativeActivity* activity,
+            const char* helper_class_name );
+
+    /*
+     * Retrieve the singleton object of the helper.
+     * Static member of the class
+
+     * Methods in the class are designed as thread safe.
+     */
+    static JNIHelper* GetInstance();
+
+    /*
+     * Read a file from a strorage.
+     * First, the method tries to read the file from an external storage.
+     * If it fails to read, it falls back to use assset manager and try to read the file from APK asset.
+     *
+     * arguments:
+     * in: file_name, file name to read
+     * out: buffer_ref, pointer to a vector buffer to read a file.
+     *      when the call succeeded, the buffer includes contents of specified file
+     *      when the call failed, contents of the buffer remains same
+     * return:
+     * true when file read succeeded
+     * false when it failed to read the file
+     */
+    bool ReadFile( const char* file_name,
+            std::vector<uint8_t>* buffer_ref );
+
+    /*
+     * Load and create OpenGL texture from given file name.
+     * The method invokes BitmapFactory in Java so it can read jpeg/png formatted files
+     *
+     * The methods creates mip-map and set texture parameters like this,
+     * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+     * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+     * glGenerateMipmap( GL_TEXTURE_2D );
+     *
+     * arguments:
+     * in: file_name, file name to read, PNG&JPG is supported
+     * return:
+     * OpenGL texture name when the call succeeded
+     * When it failed to load the texture, it returns -1
+     */
+    uint32_t LoadTexture( const char* file_name );
+
+    /*
+     * Convert string from character code other than UTF-8
+     *
+     * arguments:
+     *  in: str, pointer to a string which is encoded other than UTF-8
+     *  in: encoding, pointer to a character encoding string.
+     *  The encoding string can be any valid java.nio.charset.Charset name
+     *  e.g. "UTF-16", "Shift_JIS"
+     * return: converted input string as an UTF-8 std::string
+     */
+    std::string ConvertString( const char* str,
+            const char* encode );
+    /*
+     * Retrieve external file directory through JNI call
+     *
+     * return: std::string containing external file diretory
+     */
+    std::string GetExternalFilesDir();
+
+    /*
+     * Audio helper
+     * Retrieves native audio buffer size which is required to achieve low latency audio
+     *
+     * return: Native audio buffer size which is a hint to achieve low latency audio
+     * If the API is not supported (API level < 17), it returns 0
+     */
+    int32_t GetNativeAudioBufferSize();
+
+    /*
+     * Audio helper
+     * Retrieves native audio sample rate which is required to achieve low latency audio
+     *
+     * return: Native audio sample rate which is a hint to achieve low latency audio
+     */
+    int32_t GetNativeAudioSampleRate();
+
+    /*
+     * Retrieves application bundle name
+     *
+     * return: pointer to an app name string
+     *
+     */
+    const char* GetAppName()
+    {
+        return app_name_.c_str();
+    }
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/NDKHelper.h b/ndk/sources/android/ndk_helper/NDKHelper.h
new file mode 100644
index 0000000..de2a10e
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/NDKHelper.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _NDKSUPPORT_H
+#define _NDKSUPPORT_H
+
+/******************************************************************
+ * NDK support helpers
+ * Utility module to provide misc functionalities that is used widely in native applications,
+ * such as gesture detection, jni bridge, openGL context etc.
+ *
+ * The purpose of this module is,
+ * - Provide best practices using NDK
+ * - Provide handy utility functions for NDK development
+ * - Make NDK samples more simpler and readable
+ */
+#include "gl3stub.h"            //GLES3 stubs
+#include "GLContext.h"          //EGL & OpenGL manager
+#include "shader.h"             //Shader compiler support
+#include "vecmath.h"            //Vector math support, C++ implementation n current version
+#include "tapCamera.h"          //Tap/Pinch camera control
+#include "JNIHelper.h"          //JNI support
+#include "gestureDetector.h"    //Tap/Doubletap/Pinch detector
+#include "perfMonitor.h"        //FPS counter
+#include "interpolator.h"       //Interpolator
+#endif
diff --git a/ndk/sources/android/ndk_helper/gestureDetector.cpp b/ndk/sources/android/ndk_helper/gestureDetector.cpp
new file mode 100644
index 0000000..19d8212
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gestureDetector.cpp
@@ -0,0 +1,350 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gestureDetector.h"
+
+//--------------------------------------------------------------------------------
+// gestureDetector.cpp
+//--------------------------------------------------------------------------------
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// GestureDetector
+//--------------------------------------------------------------------------------
+GestureDetector::GestureDetector()
+{
+    dp_factor_ = 1.f;
+}
+
+void GestureDetector::SetConfiguration( AConfiguration* config )
+{
+    dp_factor_ = 160.f / AConfiguration_getDensity( config );
+}
+
+//--------------------------------------------------------------------------------
+// TapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE TapDetector::Detect( const AInputEvent* motion_event )
+{
+    if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+    {
+        //Only support single touch
+        return false;
+    }
+
+    int32_t action = AMotionEvent_getAction( motion_event );
+    unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+    switch( flags )
+    {
+    case AMOTION_EVENT_ACTION_DOWN:
+        down_pointer_id_ = AMotionEvent_getPointerId( motion_event, 0 );
+        down_x_ = AMotionEvent_getX( motion_event, 0 );
+        down_y_ = AMotionEvent_getY( motion_event, 0 );
+        break;
+    case AMOTION_EVENT_ACTION_UP:
+    {
+        int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+        int64_t downTime = AMotionEvent_getDownTime( motion_event );
+        if( eventTime - downTime <= TAP_TIMEOUT )
+        {
+            if( down_pointer_id_ == AMotionEvent_getPointerId( motion_event, 0 ) )
+            {
+                float x = AMotionEvent_getX( motion_event, 0 ) - down_x_;
+                float y = AMotionEvent_getY( motion_event, 0 ) - down_y_;
+                if( x * x + y * y < TOUCH_SLOP * TOUCH_SLOP * dp_factor_ )
+                {
+                    LOGI( "TapDetector: Tap detected" );
+                    return GESTURE_STATE_ACTION;
+                }
+            }
+        }
+        break;
+    }
+    }
+    return GESTURE_STATE_NONE;
+}
+
+//--------------------------------------------------------------------------------
+// DoubletapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE DoubletapDetector::Detect( const AInputEvent* motion_event )
+{
+    if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+    {
+        //Only support single double tap
+        return false;
+    }
+
+    bool tap_detected = tap_detector_.Detect( motion_event );
+
+    int32_t action = AMotionEvent_getAction( motion_event );
+    unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+    switch( flags )
+    {
+    case AMOTION_EVENT_ACTION_DOWN:
+    {
+        int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+        if( eventTime - last_tap_time_ <= DOUBLE_TAP_TIMEOUT )
+        {
+            float x = AMotionEvent_getX( motion_event, 0 ) - last_tap_x_;
+            float y = AMotionEvent_getY( motion_event, 0 ) - last_tap_y_;
+            if( x * x + y * y < DOUBLE_TAP_SLOP * DOUBLE_TAP_SLOP * dp_factor_ )
+            {
+                LOGI( "DoubletapDetector: Doubletap detected" );
+                return GESTURE_STATE_ACTION;
+            }
+        }
+        break;
+    }
+    case AMOTION_EVENT_ACTION_UP:
+        if( tap_detected )
+        {
+            last_tap_time_ = AMotionEvent_getEventTime( motion_event );
+            last_tap_x_ = AMotionEvent_getX( motion_event, 0 );
+            last_tap_y_ = AMotionEvent_getY( motion_event, 0 );
+        }
+        break;
+    }
+    return GESTURE_STATE_NONE;
+}
+
+void DoubletapDetector::SetConfiguration( AConfiguration* config )
+{
+    dp_factor_ = 160.f / AConfiguration_getDensity( config );
+    tap_detector_.SetConfiguration( config );
+}
+
+//--------------------------------------------------------------------------------
+// PinchDetector
+//--------------------------------------------------------------------------------
+
+int32_t PinchDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+    int32_t count = AMotionEvent_getPointerCount( event );
+    for( uint32_t i = 0; i < count; ++i )
+    {
+        if( id == AMotionEvent_getPointerId( event, i ) )
+            return i;
+    }
+    return -1;
+}
+
+GESTURE_STATE PinchDetector::Detect( const AInputEvent* event )
+{
+    GESTURE_STATE ret = GESTURE_STATE_NONE;
+    int32_t action = AMotionEvent_getAction( event );
+    uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+    event_ = event;
+
+    int32_t count = AMotionEvent_getPointerCount( event );
+    switch( flags )
+    {
+    case AMOTION_EVENT_ACTION_DOWN:
+        vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+        break;
+    case AMOTION_EVENT_ACTION_POINTER_DOWN:
+    {
+        int32_t iIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+        vec_pointers_.push_back( AMotionEvent_getPointerId( event, iIndex ) );
+        if( count == 2 )
+        {
+            //Start new pinch
+            ret = GESTURE_STATE_START;
+        }
+    }
+        break;
+    case AMOTION_EVENT_ACTION_UP:
+        vec_pointers_.pop_back();
+        break;
+    case AMOTION_EVENT_ACTION_POINTER_UP:
+    {
+        int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+        int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+        std::vector<int32_t>::iterator it = vec_pointers_.begin();
+        std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+        int32_t i = 0;
+        for( ; it != it_end; ++it, ++i )
+        {
+            if( *it == released_pointer_id )
+            {
+                vec_pointers_.erase( it );
+                break;
+            }
+        }
+
+        if( i <= 1 )
+        {
+            //Reset pinch or drag
+            if( count != 2 )
+            {
+                //Start new pinch
+                ret = GESTURE_STATE_START | GESTURE_STATE_END;
+            }
+        }
+    }
+        break;
+    case AMOTION_EVENT_ACTION_MOVE:
+        switch( count )
+        {
+        case 1:
+            break;
+        default:
+            //Multi touch
+            ret = GESTURE_STATE_MOVE;
+            break;
+        }
+        break;
+    case AMOTION_EVENT_ACTION_CANCEL:
+        break;
+    }
+
+    return ret;
+}
+
+bool PinchDetector::GetPointers( Vec2& v1, Vec2& v2 )
+{
+    if( vec_pointers_.size() < 2 )
+        return false;
+
+    int32_t index = FindIndex( event_, vec_pointers_[0] );
+    if( index == -1 )
+        return false;
+
+    float x = AMotionEvent_getX( event_, index );
+    float y = AMotionEvent_getY( event_, index );
+
+    index = FindIndex( event_, vec_pointers_[1] );
+    if( index == -1 )
+        return false;
+
+    float x2 = AMotionEvent_getX( event_, index );
+    float y2 = AMotionEvent_getY( event_, index );
+
+    v1 = Vec2( x, y );
+    v2 = Vec2( x2, y2 );
+
+    return true;
+}
+
+//--------------------------------------------------------------------------------
+// DragDetector
+//--------------------------------------------------------------------------------
+
+int32_t DragDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+    int32_t count = AMotionEvent_getPointerCount( event );
+    for( uint32_t i = 0; i < count; ++i )
+    {
+        if( id == AMotionEvent_getPointerId( event, i ) )
+            return i;
+    }
+    return -1;
+}
+
+GESTURE_STATE DragDetector::Detect( const AInputEvent* event )
+{
+    GESTURE_STATE ret = GESTURE_STATE_NONE;
+    int32_t action = AMotionEvent_getAction( event );
+    int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+            >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+    uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+    event_ = event;
+
+    int32_t count = AMotionEvent_getPointerCount( event );
+    switch( flags )
+    {
+    case AMOTION_EVENT_ACTION_DOWN:
+        vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+        ret = GESTURE_STATE_START;
+        break;
+    case AMOTION_EVENT_ACTION_POINTER_DOWN:
+        vec_pointers_.push_back( AMotionEvent_getPointerId( event, index ) );
+        break;
+    case AMOTION_EVENT_ACTION_UP:
+        vec_pointers_.pop_back();
+        ret = GESTURE_STATE_END;
+        break;
+    case AMOTION_EVENT_ACTION_POINTER_UP:
+    {
+        int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+        std::vector<int32_t>::iterator it = vec_pointers_.begin();
+        std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+        int32_t i = 0;
+        for( ; it != it_end; ++it, ++i )
+        {
+            if( *it == released_pointer_id )
+            {
+                vec_pointers_.erase( it );
+                break;
+            }
+        }
+
+        if( i <= 1 )
+        {
+            //Reset pinch or drag
+            if( count == 2 )
+            {
+                ret = GESTURE_STATE_START;
+            }
+        }
+        break;
+    }
+    case AMOTION_EVENT_ACTION_MOVE:
+        switch( count )
+        {
+        case 1:
+            //Drag
+            ret = GESTURE_STATE_MOVE;
+            break;
+        default:
+            break;
+        }
+        break;
+    case AMOTION_EVENT_ACTION_CANCEL:
+        break;
+    }
+
+    return ret;
+}
+
+bool DragDetector::GetPointer( Vec2& v )
+{
+    if( vec_pointers_.size() < 1 )
+        return false;
+
+    int32_t iIndex = FindIndex( event_, vec_pointers_[0] );
+    if( iIndex == -1 )
+        return false;
+
+    float x = AMotionEvent_getX( event_, iIndex );
+    float y = AMotionEvent_getY( event_, iIndex );
+
+    v = Vec2( x, y );
+
+    return true;
+}
+
+}   //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/gestureDetector.h b/ndk/sources/android/ndk_helper/gestureDetector.h
new file mode 100644
index 0000000..6ae5d80
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gestureDetector.h
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// gestureDetector.h
+//--------------------------------------------------------------------------------
+#ifndef GESTUREDETECTOR_H_
+#define GESTUREDETECTOR_H_
+
+#include <vector>
+
+#include <android/sensor.h>
+#include <android/log.h>
+#include <android_native_app_glue.h>
+#include <android/native_window_jni.h>
+#include "JNIHelper.h"
+#include "vecmath.h"
+
+namespace ndk_helper
+{
+//--------------------------------------------------------------------------------
+// Constants
+//--------------------------------------------------------------------------------
+const int32_t DOUBLE_TAP_TIMEOUT = 300 * 1000000;
+const int32_t TAP_TIMEOUT = 180 * 1000000;
+const int32_t DOUBLE_TAP_SLOP = 100;
+const int32_t TOUCH_SLOP = 8;
+
+enum
+{
+    GESTURE_STATE_NONE = 0,
+    GESTURE_STATE_START = 1,
+    GESTURE_STATE_MOVE = 2,
+    GESTURE_STATE_END = 4,
+    GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END),
+};
+typedef int32_t GESTURE_STATE;
+
+/******************************************************************
+ * Base class of Gesture Detectors
+ * GestureDetectors handles input events and detect gestures
+ * Note that different detectors may detect gestures with an event at
+ * same time. The caller needs to manage gesture priority accordingly
+ *
+ */
+class GestureDetector
+{
+protected:
+    float dp_factor_;
+public:
+    GestureDetector();
+    virtual ~GestureDetector()
+    {
+    }
+    virtual void SetConfiguration( AConfiguration* config );
+
+    virtual GESTURE_STATE Detect( const AInputEvent* motion_event ) = 0;
+};
+
+/******************************************************************
+ * Tap gesture detector
+ * Returns GESTURE_STATE_ACTION when a tap gesture is detected
+ *
+ */
+class TapDetector: public GestureDetector
+{
+private:
+    int32_t down_pointer_id_;
+    float down_x_;
+    float down_y_;
+public:
+    TapDetector()
+    {
+    }
+    virtual ~TapDetector()
+    {
+    }
+    virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
+};
+
+/******************************************************************
+ * Pinch gesture detector
+ * Returns GESTURE_STATE_ACTION when a double-tap gesture is detected
+ *
+ */
+class DoubletapDetector: public GestureDetector
+{
+private:
+    TapDetector tap_detector_;
+    int64_t last_tap_time_;
+    float last_tap_x_;
+    float last_tap_y_;
+
+public:
+    DoubletapDetector()
+    {
+    }
+    virtual ~DoubletapDetector()
+    {
+    }
+    virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
+    virtual void SetConfiguration( AConfiguration* config );
+};
+
+/******************************************************************
+ * Double gesture detector
+ * Returns pinch gesture state when a pinch gesture is detected
+ * The class handles multiple touches more than 2
+ * When the finger 1,2,3 are tapped and then finger 1 is released,
+ * the detector start new pinch gesture with finger 2 & 3.
+ */
+class PinchDetector: public GestureDetector
+{
+private:
+    int32_t FindIndex( const AInputEvent* event, int32_t id );
+    const AInputEvent* event_;
+    std::vector<int32_t> vec_pointers_;
+
+public:
+    PinchDetector()
+    {
+    }
+    virtual ~PinchDetector()
+    {
+    }
+    virtual GESTURE_STATE Detect( const AInputEvent* event );
+    bool GetPointers( Vec2& v1, Vec2& v2 );
+};
+
+/******************************************************************
+ * Drag gesture detector
+ * Returns drag gesture state when a drag-tap gesture is detected
+ *
+ */
+class DragDetector: public GestureDetector
+{
+private:
+    int32_t FindIndex( const AInputEvent* event, int32_t id );
+    const AInputEvent* event_;
+    std::vector<int32_t> vec_pointers_;
+public:
+    DragDetector()
+    {
+    }
+    virtual ~DragDetector()
+    {
+    }
+    virtual GESTURE_STATE Detect( const AInputEvent* event );
+    bool GetPointer( Vec2& v );
+};
+
+}   //namespace ndkHelper
+#endif /* GESTUREDETECTOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/gl3stub.c b/ndk/sources/android/ndk_helper/gl3stub.c
new file mode 100644
index 0000000..c34d791
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gl3stub.c
@@ -0,0 +1,512 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <EGL/egl.h>
+#include "gl3stub.h"
+
+GLboolean gl3stubInit()
+{
+#define FIND_PROC(s) s = (void*)eglGetProcAddress(#s);
+    FIND_PROC( glReadBuffer );
+    FIND_PROC( glDrawRangeElements );
+    FIND_PROC( glTexImage3D );
+    FIND_PROC( glTexSubImage3D );
+    FIND_PROC( glCopyTexSubImage3D );
+    FIND_PROC( glCompressedTexImage3D );
+    FIND_PROC( glCompressedTexSubImage3D );
+    FIND_PROC( glGenQueries );
+    FIND_PROC( glDeleteQueries );
+    FIND_PROC( glIsQuery );
+    FIND_PROC( glBeginQuery );
+    FIND_PROC( glEndQuery );
+    FIND_PROC( glGetQueryiv );
+    FIND_PROC( glGetQueryObjectuiv );
+    FIND_PROC( glUnmapBuffer );
+    FIND_PROC( glGetBufferPointerv );
+    FIND_PROC( glDrawBuffers );
+    FIND_PROC( glUniformMatrix2x3fv );
+    FIND_PROC( glUniformMatrix3x2fv );
+    FIND_PROC( glUniformMatrix2x4fv );
+    FIND_PROC( glUniformMatrix4x2fv );
+    FIND_PROC( glUniformMatrix3x4fv );
+    FIND_PROC( glUniformMatrix4x3fv );
+    FIND_PROC( glBlitFramebuffer );
+    FIND_PROC( glRenderbufferStorageMultisample );
+    FIND_PROC( glFramebufferTextureLayer );
+    FIND_PROC( glMapBufferRange );
+    FIND_PROC( glFlushMappedBufferRange );
+    FIND_PROC( glBindVertexArray );
+    FIND_PROC( glDeleteVertexArrays );
+    FIND_PROC( glGenVertexArrays );
+    FIND_PROC( glIsVertexArray );
+    FIND_PROC( glGetIntegeri_v );
+    FIND_PROC( glBeginTransformFeedback );
+    FIND_PROC( glEndTransformFeedback );
+    FIND_PROC( glBindBufferRange );
+    FIND_PROC( glBindBufferBase );
+    FIND_PROC( glTransformFeedbackVaryings );
+    FIND_PROC( glGetTransformFeedbackVarying );
+    FIND_PROC( glVertexAttribIPointer );
+    FIND_PROC( glGetVertexAttribIiv );
+    FIND_PROC( glGetVertexAttribIuiv );
+    FIND_PROC( glVertexAttribI4i );
+    FIND_PROC( glVertexAttribI4ui );
+    FIND_PROC( glVertexAttribI4iv );
+    FIND_PROC( glVertexAttribI4uiv );
+    FIND_PROC( glGetUniformuiv );
+    FIND_PROC( glGetFragDataLocation );
+    FIND_PROC( glUniform1ui );
+    FIND_PROC( glUniform2ui );
+    FIND_PROC( glUniform3ui );
+    FIND_PROC( glUniform4ui );
+    FIND_PROC( glUniform1uiv );
+    FIND_PROC( glUniform2uiv );
+    FIND_PROC( glUniform3uiv );
+    FIND_PROC( glUniform4uiv );
+    FIND_PROC( glClearBufferiv );
+    FIND_PROC( glClearBufferuiv );
+    FIND_PROC( glClearBufferfv );
+    FIND_PROC( glClearBufferfi );
+    FIND_PROC( glGetStringi );
+    FIND_PROC( glCopyBufferSubData );
+    FIND_PROC( glGetUniformIndices );
+    FIND_PROC( glGetActiveUniformsiv );
+    FIND_PROC( glGetUniformBlockIndex );
+    FIND_PROC( glGetActiveUniformBlockiv );
+    FIND_PROC( glGetActiveUniformBlockName );
+    FIND_PROC( glUniformBlockBinding );
+    FIND_PROC( glDrawArraysInstanced );
+    FIND_PROC( glDrawElementsInstanced );
+    FIND_PROC( glFenceSync );
+    FIND_PROC( glIsSync );
+    FIND_PROC( glDeleteSync );
+    FIND_PROC( glClientWaitSync );
+    FIND_PROC( glWaitSync );
+    FIND_PROC( glGetInteger64v );
+    FIND_PROC( glGetSynciv );
+    FIND_PROC( glGetInteger64i_v );
+    FIND_PROC( glGetBufferParameteri64v );
+    FIND_PROC( glGenSamplers );
+    FIND_PROC( glDeleteSamplers );
+    FIND_PROC( glIsSampler );
+    FIND_PROC( glBindSampler );
+    FIND_PROC( glSamplerParameteri );
+    FIND_PROC( glSamplerParameteriv );
+    FIND_PROC( glSamplerParameterf );
+    FIND_PROC( glSamplerParameterfv );
+    FIND_PROC( glGetSamplerParameteriv );
+    FIND_PROC( glGetSamplerParameterfv );
+    FIND_PROC( glVertexAttribDivisor );
+    FIND_PROC( glBindTransformFeedback );
+    FIND_PROC( glDeleteTransformFeedbacks );
+    FIND_PROC( glGenTransformFeedbacks );
+    FIND_PROC( glIsTransformFeedback );
+    FIND_PROC( glPauseTransformFeedback );
+    FIND_PROC( glResumeTransformFeedback );
+    FIND_PROC( glGetProgramBinary );
+    FIND_PROC( glProgramBinary );
+    FIND_PROC( glProgramParameteri );
+    FIND_PROC( glInvalidateFramebuffer );
+    FIND_PROC( glInvalidateSubFramebuffer );
+    FIND_PROC( glTexStorage2D );
+    FIND_PROC( glTexStorage3D );
+    FIND_PROC( glGetInternalformativ );
+#undef FIND_PROC
+
+    if( !glReadBuffer || !glDrawRangeElements || !glTexImage3D || !glTexSubImage3D
+            || !glCopyTexSubImage3D || !glCompressedTexImage3D
+            || !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries
+            || !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv
+            || !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv
+            || !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv
+            || !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv
+            || !glUniformMatrix4x3fv || !glBlitFramebuffer
+            || !glRenderbufferStorageMultisample || !glFramebufferTextureLayer
+            || !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray
+            || !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray
+            || !glGetIntegeri_v || !glBeginTransformFeedback || !glEndTransformFeedback
+            || !glBindBufferRange || !glBindBufferBase || !glTransformFeedbackVaryings
+            || !glGetTransformFeedbackVarying || !glVertexAttribIPointer
+            || !glGetVertexAttribIiv || !glGetVertexAttribIuiv || !glVertexAttribI4i
+            || !glVertexAttribI4ui || !glVertexAttribI4iv || !glVertexAttribI4uiv
+            || !glGetUniformuiv || !glGetFragDataLocation || !glUniform1ui
+            || !glUniform2ui || !glUniform3ui || !glUniform4ui || !glUniform1uiv
+            || !glUniform2uiv || !glUniform3uiv || !glUniform4uiv || !glClearBufferiv
+            || !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi || !glGetStringi
+            || !glCopyBufferSubData || !glGetUniformIndices || !glGetActiveUniformsiv
+            || !glGetUniformBlockIndex || !glGetActiveUniformBlockiv
+            || !glGetActiveUniformBlockName || !glUniformBlockBinding
+            || !glDrawArraysInstanced || !glDrawElementsInstanced || !glFenceSync
+            || !glIsSync || !glDeleteSync || !glClientWaitSync || !glWaitSync
+            || !glGetInteger64v || !glGetSynciv || !glGetInteger64i_v
+            || !glGetBufferParameteri64v || !glGenSamplers || !glDeleteSamplers
+            || !glIsSampler || !glBindSampler || !glSamplerParameteri
+            || !glSamplerParameteriv || !glSamplerParameterf || !glSamplerParameterfv
+            || !glGetSamplerParameteriv || !glGetSamplerParameterfv
+            || !glVertexAttribDivisor || !glBindTransformFeedback
+            || !glDeleteTransformFeedbacks || !glGenTransformFeedbacks
+            || !glIsTransformFeedback || !glPauseTransformFeedback
+            || !glResumeTransformFeedback || !glGetProgramBinary || !glProgramBinary
+            || !glProgramParameteri || !glInvalidateFramebuffer
+            || !glInvalidateSubFramebuffer || !glTexStorage2D || !glTexStorage3D
+            || !glGetInternalformativ )
+    {
+        return GL_FALSE;
+    }
+
+    return GL_TRUE;
+}
+
+/* Function pointer definitions */GL_APICALL void (* GL_APIENTRY glReadBuffer)( GLenum mode );
+GL_APICALL void (* GL_APIENTRY glDrawRangeElements)( GLenum mode,
+        GLuint start,
+        GLuint end,
+        GLsizei count,
+        GLenum type,
+        const GLvoid* indices );
+GL_APICALL void (* GL_APIENTRY glTexImage3D)( GLenum target,
+        GLint level,
+        GLint internalformat,
+        GLsizei width,
+        GLsizei height,
+        GLsizei depth,
+        GLint border,
+        GLenum format,
+        GLenum type,
+        const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glTexSubImage3D)( GLenum target,
+        GLint level,
+        GLint xoffset,
+        GLint yoffset,
+        GLint zoffset,
+        GLsizei width,
+        GLsizei height,
+        GLsizei depth,
+        GLenum format,
+        GLenum type,
+        const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D)( GLenum target,
+        GLint level,
+        GLint xoffset,
+        GLint yoffset,
+        GLint zoffset,
+        GLint x,
+        GLint y,
+        GLsizei width,
+        GLsizei height );
+GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D)( GLenum target,
+        GLint level,
+        GLenum internalformat,
+        GLsizei width,
+        GLsizei height,
+        GLsizei depth,
+        GLint border,
+        GLsizei imageSize,
+        const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D)( GLenum target,
+        GLint level,
+        GLint xoffset,
+        GLint yoffset,
+        GLint zoffset,
+        GLsizei width,
+        GLsizei height,
+        GLsizei depth,
+        GLenum format,
+        GLsizei imageSize,
+        const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glGenQueries)( GLsizei n, GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glDeleteQueries)( GLsizei n, const GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsQuery)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glBeginQuery)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glEndQuery)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetQueryiv)( GLenum target, GLenum pname, GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv)( GLuint id,
+        GLenum pname,
+        GLuint* params );
+GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetBufferPointerv)( GLenum target,
+        GLenum pname,
+        GLvoid** params );
+GL_APICALL void (* GL_APIENTRY glDrawBuffers)( GLsizei n, const GLenum* bufs );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv)( GLint location,
+        GLsizei count,
+        GLboolean transpose,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glBlitFramebuffer)( GLint srcX0,
+        GLint srcY0,
+        GLint srcX1,
+        GLint srcY1,
+        GLint dstX0,
+        GLint dstY0,
+        GLint dstX1,
+        GLint dstY1,
+        GLbitfield mask,
+        GLenum filter );
+GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample)( GLenum target,
+        GLsizei samples,
+        GLenum internalformat,
+        GLsizei width,
+        GLsizei height );
+GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer)( GLenum target,
+        GLenum attachment,
+        GLuint texture,
+        GLint level,
+        GLint layer );
+GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange)( GLenum target,
+        GLintptr offset,
+        GLsizeiptr length,
+        GLbitfield access );
+GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange)( GLenum target,
+        GLintptr offset,
+        GLsizeiptr length );
+GL_APICALL void (* GL_APIENTRY glBindVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays)( GLsizei n, const GLuint* arrays );
+GL_APICALL void (* GL_APIENTRY glGenVertexArrays)( GLsizei n, GLuint* arrays );
+GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glGetIntegeri_v)( GLenum target,
+        GLuint index,
+        GLint* data );
+GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback)( GLenum primitiveMode );
+GL_APICALL void (* GL_APIENTRY glEndTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glBindBufferRange)( GLenum target,
+        GLuint index,
+        GLuint buffer,
+        GLintptr offset,
+        GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glBindBufferBase)( GLenum target,
+        GLuint index,
+        GLuint buffer );
+GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings)( GLuint program,
+        GLsizei count,
+        const GLchar* const * varyings,
+        GLenum bufferMode );
+GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying)( GLuint program,
+        GLuint index,
+        GLsizei bufSize,
+        GLsizei* length,
+        GLsizei* size,
+        GLenum* type,
+        GLchar* name );
+GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer)( GLuint index,
+        GLint size,
+        GLenum type,
+        GLsizei stride,
+        const GLvoid* pointer );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv)( GLuint index,
+        GLenum pname,
+        GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv)( GLuint index,
+        GLenum pname,
+        GLuint* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4i)( GLuint index,
+        GLint x,
+        GLint y,
+        GLint z,
+        GLint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui)( GLuint index,
+        GLuint x,
+        GLuint y,
+        GLuint z,
+        GLuint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv)( GLuint index, const GLint* v );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv)( GLuint index, const GLuint* v );
+GL_APICALL void (* GL_APIENTRY glGetUniformuiv)( GLuint program,
+        GLint location,
+        GLuint* params );
+GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation)( GLuint program,
+        const GLchar *name );
+GL_APICALL void (* GL_APIENTRY glUniform1ui)( GLint location, GLuint v0 );
+GL_APICALL void (* GL_APIENTRY glUniform2ui)( GLint location, GLuint v0, GLuint v1 );
+GL_APICALL void (* GL_APIENTRY glUniform3ui)( GLint location,
+        GLuint v0,
+        GLuint v1,
+        GLuint v2 );
+GL_APICALL void (* GL_APIENTRY glUniform4ui)( GLint location,
+        GLuint v0,
+        GLuint v1,
+        GLuint v2,
+        GLuint v3 );
+GL_APICALL void (* GL_APIENTRY glUniform1uiv)( GLint location,
+        GLsizei count,
+        const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform2uiv)( GLint location,
+        GLsizei count,
+        const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform3uiv)( GLint location,
+        GLsizei count,
+        const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform4uiv)( GLint location,
+        GLsizei count,
+        const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferiv)( GLenum buffer,
+        GLint drawbuffer,
+        const GLint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferuiv)( GLenum buffer,
+        GLint drawbuffer,
+        const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfv)( GLenum buffer,
+        GLint drawbuffer,
+        const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfi)( GLenum buffer,
+        GLint drawbuffer,
+        GLfloat depth,
+        GLint stencil );
+GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi)( GLenum name, GLuint index );
+GL_APICALL void (* GL_APIENTRY glCopyBufferSubData)( GLenum readTarget,
+        GLenum writeTarget,
+        GLintptr readOffset,
+        GLintptr writeOffset,
+        GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glGetUniformIndices)( GLuint program,
+        GLsizei uniformCount,
+        const GLchar* const * uniformNames,
+        GLuint* uniformIndices );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv)( GLuint program,
+        GLsizei uniformCount,
+        const GLuint* uniformIndices,
+        GLenum pname,
+        GLint* params );
+GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex)( GLuint program,
+        const GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv)( GLuint program,
+        GLuint uniformBlockIndex,
+        GLenum pname,
+        GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName)( GLuint program,
+        GLuint uniformBlockIndex,
+        GLsizei bufSize,
+        GLsizei* length,
+        GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glUniformBlockBinding)( GLuint program,
+        GLuint uniformBlockIndex,
+        GLuint uniformBlockBinding );
+GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced)( GLenum mode,
+        GLint first,
+        GLsizei count,
+        GLsizei instanceCount );
+GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced)( GLenum mode,
+        GLsizei count,
+        GLenum type,
+        const GLvoid* indices,
+        GLsizei instanceCount );
+GL_APICALL GLsync (* GL_APIENTRY glFenceSync)( GLenum condition, GLbitfield flags );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSync)( GLsync sync );
+GL_APICALL void (* GL_APIENTRY glDeleteSync)( GLsync sync );
+GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync)( GLsync sync,
+        GLbitfield flags,
+        GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glWaitSync)( GLsync sync,
+        GLbitfield flags,
+        GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glGetInteger64v)( GLenum pname, GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGetSynciv)( GLsync sync,
+        GLenum pname,
+        GLsizei bufSize,
+        GLsizei* length,
+        GLint* values );
+GL_APICALL void (* GL_APIENTRY glGetInteger64i_v)( GLenum target,
+        GLuint index,
+        GLint64* data );
+GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v)( GLenum target,
+        GLenum pname,
+        GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGenSamplers)( GLsizei count, GLuint* samplers );
+GL_APICALL void (* GL_APIENTRY glDeleteSamplers)( GLsizei count, const GLuint* samplers );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSampler)( GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glBindSampler)( GLuint unit, GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteri)( GLuint sampler,
+        GLenum pname,
+        GLint param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteriv)( GLuint sampler,
+        GLenum pname,
+        const GLint* param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterf)( GLuint sampler,
+        GLenum pname,
+        GLfloat param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterfv)( GLuint sampler,
+        GLenum pname,
+        const GLfloat* param );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv)( GLuint sampler,
+        GLenum pname,
+        GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv)( GLuint sampler,
+        GLenum pname,
+        GLfloat* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor)( GLuint index, GLuint divisor );
+GL_APICALL void (* GL_APIENTRY glBindTransformFeedback)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks)( GLsizei n, const GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks)( GLsizei n, GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glGetProgramBinary)( GLuint program,
+        GLsizei bufSize,
+        GLsizei* length,
+        GLenum* binaryFormat,
+        GLvoid* binary );
+GL_APICALL void (* GL_APIENTRY glProgramBinary)( GLuint program,
+        GLenum binaryFormat,
+        const GLvoid* binary,
+        GLsizei length );
+GL_APICALL void (* GL_APIENTRY glProgramParameteri)( GLuint program,
+        GLenum pname,
+        GLint value );
+GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer)( GLenum target,
+        GLsizei numAttachments,
+        const GLenum* attachments );
+GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer)( GLenum target,
+        GLsizei numAttachments,
+        const GLenum* attachments,
+        GLint x,
+        GLint y,
+        GLsizei width,
+        GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage2D)( GLenum target,
+        GLsizei levels,
+        GLenum internalformat,
+        GLsizei width,
+        GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage3D)( GLenum target,
+        GLsizei levels,
+        GLenum internalformat,
+        GLsizei width,
+        GLsizei height,
+        GLsizei depth );
+GL_APICALL void (* GL_APIENTRY glGetInternalformativ)( GLenum target,
+        GLenum internalformat,
+        GLenum pname,
+        GLsizei bufSize,
+        GLint* params );
diff --git a/ndk/sources/android/ndk_helper/gl3stub.h b/ndk/sources/android/ndk_helper/gl3stub.h
new file mode 100644
index 0000000..537dd28
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gl3stub.h
@@ -0,0 +1,501 @@
+#ifndef __gl3_h_
+#define __gl3_h_
+
+/*
+ * stub gl3.h for dynamic loading, based on:
+ * gl3.h last updated on $Date: 2013-02-12 14:37:24 -0800 (Tue, 12 Feb 2013) $
+ *
+ * Changes:
+ * - Added #include <GLES2/gl2.h>
+ * - Removed duplicate OpenGL ES 2.0 declarations
+ * - Converted OpenGL ES 3.0 function prototypes to function pointer
+ *   declarations
+ * - Added gl3stubInit() declaration
+ */
+
+#include <GLES2/gl2.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*
+ ** Copyright (c) 2007-2013 The Khronos Group Inc.
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a
+ ** copy of this software and/or associated documentation files (the
+ ** "Materials"), to deal in the Materials without restriction, including
+ ** without limitation the rights to use, copy, modify, merge, publish,
+ ** distribute, sublicense, and/or sell copies of the Materials, and to
+ ** permit persons to whom the Materials are furnished to do so, subject to
+ ** the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included
+ ** in all copies or substantial portions of the Materials.
+ **
+ ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ */
+
+/*
+ * This files is for apps that want to use ES3 if present,
+ * but continue to work on pre-API-18 devices. They can't just link to -lGLESv3 since
+ * that library doesn't exist on pre-API-18 devices.
+ * The function dynamically check if OpenGLES3.0 APIs are present and fill in if there are.
+ * Also the header defines some extra variables for OpenGLES3.0.
+ *
+ */
+
+/* Call this function before calling any OpenGL ES 3.0 functions. It will
+ * return GL_TRUE if the OpenGL ES 3.0 was successfully initialized, GL_FALSE
+ * otherwise. */
+GLboolean gl3stubInit();
+
+/*-------------------------------------------------------------------------
+ * Data type definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES 3.0 */
+
+typedef unsigned short GLhalf;
+typedef khronos_int64_t GLint64;
+typedef khronos_uint64_t GLuint64;
+typedef struct __GLsync *GLsync;
+
+/*-------------------------------------------------------------------------
+ * Token definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES core versions */
+#define GL_ES_VERSION_3_0                                1
+
+/* OpenGL ES 3.0 */
+
+#define GL_READ_BUFFER                                   0x0C02
+#define GL_UNPACK_ROW_LENGTH                             0x0CF2
+#define GL_UNPACK_SKIP_ROWS                              0x0CF3
+#define GL_UNPACK_SKIP_PIXELS                            0x0CF4
+#define GL_PACK_ROW_LENGTH                               0x0D02
+#define GL_PACK_SKIP_ROWS                                0x0D03
+#define GL_PACK_SKIP_PIXELS                              0x0D04
+#define GL_COLOR                                         0x1800
+#define GL_DEPTH                                         0x1801
+#define GL_STENCIL                                       0x1802
+#define GL_RED                                           0x1903
+#define GL_RGB8                                          0x8051
+#define GL_RGBA8                                         0x8058
+#define GL_RGB10_A2                                      0x8059
+#define GL_TEXTURE_BINDING_3D                            0x806A
+#define GL_UNPACK_SKIP_IMAGES                            0x806D
+#define GL_UNPACK_IMAGE_HEIGHT                           0x806E
+#define GL_TEXTURE_3D                                    0x806F
+#define GL_TEXTURE_WRAP_R                                0x8072
+#define GL_MAX_3D_TEXTURE_SIZE                           0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV                   0x8368
+#define GL_MAX_ELEMENTS_VERTICES                         0x80E8
+#define GL_MAX_ELEMENTS_INDICES                          0x80E9
+#define GL_TEXTURE_MIN_LOD                               0x813A
+#define GL_TEXTURE_MAX_LOD                               0x813B
+#define GL_TEXTURE_BASE_LEVEL                            0x813C
+#define GL_TEXTURE_MAX_LEVEL                             0x813D
+#define GL_MIN                                           0x8007
+#define GL_MAX                                           0x8008
+#define GL_DEPTH_COMPONENT24                             0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS                          0x84FD
+#define GL_TEXTURE_COMPARE_MODE                          0x884C
+#define GL_TEXTURE_COMPARE_FUNC                          0x884D
+#define GL_CURRENT_QUERY                                 0x8865
+#define GL_QUERY_RESULT                                  0x8866
+#define GL_QUERY_RESULT_AVAILABLE                        0x8867
+#define GL_BUFFER_MAPPED                                 0x88BC
+#define GL_BUFFER_MAP_POINTER                            0x88BD
+#define GL_STREAM_READ                                   0x88E1
+#define GL_STREAM_COPY                                   0x88E2
+#define GL_STATIC_READ                                   0x88E5
+#define GL_STATIC_COPY                                   0x88E6
+#define GL_DYNAMIC_READ                                  0x88E9
+#define GL_DYNAMIC_COPY                                  0x88EA
+#define GL_MAX_DRAW_BUFFERS                              0x8824
+#define GL_DRAW_BUFFER0                                  0x8825
+#define GL_DRAW_BUFFER1                                  0x8826
+#define GL_DRAW_BUFFER2                                  0x8827
+#define GL_DRAW_BUFFER3                                  0x8828
+#define GL_DRAW_BUFFER4                                  0x8829
+#define GL_DRAW_BUFFER5                                  0x882A
+#define GL_DRAW_BUFFER6                                  0x882B
+#define GL_DRAW_BUFFER7                                  0x882C
+#define GL_DRAW_BUFFER8                                  0x882D
+#define GL_DRAW_BUFFER9                                  0x882E
+#define GL_DRAW_BUFFER10                                 0x882F
+#define GL_DRAW_BUFFER11                                 0x8830
+#define GL_DRAW_BUFFER12                                 0x8831
+#define GL_DRAW_BUFFER13                                 0x8832
+#define GL_DRAW_BUFFER14                                 0x8833
+#define GL_DRAW_BUFFER15                                 0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS               0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS                 0x8B4A
+#define GL_SAMPLER_3D                                    0x8B5F
+#define GL_SAMPLER_2D_SHADOW                             0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT               0x8B8B
+#define GL_PIXEL_PACK_BUFFER                             0x88EB
+#define GL_PIXEL_UNPACK_BUFFER                           0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING                     0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING                   0x88EF
+#define GL_FLOAT_MAT2x3                                  0x8B65
+#define GL_FLOAT_MAT2x4                                  0x8B66
+#define GL_FLOAT_MAT3x2                                  0x8B67
+#define GL_FLOAT_MAT3x4                                  0x8B68
+#define GL_FLOAT_MAT4x2                                  0x8B69
+#define GL_FLOAT_MAT4x3                                  0x8B6A
+#define GL_SRGB                                          0x8C40
+#define GL_SRGB8                                         0x8C41
+#define GL_SRGB8_ALPHA8                                  0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE                        0x884E
+#define GL_MAJOR_VERSION                                 0x821B
+#define GL_MINOR_VERSION                                 0x821C
+#define GL_NUM_EXTENSIONS                                0x821D
+#define GL_RGBA32F                                       0x8814
+#define GL_RGB32F                                        0x8815
+#define GL_RGBA16F                                       0x881A
+#define GL_RGB16F                                        0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER                   0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS                      0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET                      0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET                      0x8905
+#define GL_MAX_VARYING_COMPONENTS                        0x8B4B
+#define GL_TEXTURE_2D_ARRAY                              0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY                      0x8C1D
+#define GL_R11F_G11F_B10F                                0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV                  0x8C3B
+#define GL_RGB9_E5                                       0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV                      0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH         0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE                0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS    0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS                   0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START               0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE                0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN         0x8C88
+#define GL_RASTERIZER_DISCARD                            0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS       0x8C8B
+#define GL_INTERLEAVED_ATTRIBS                           0x8C8C
+#define GL_SEPARATE_ATTRIBS                              0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER                     0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING             0x8C8F
+#define GL_RGBA32UI                                      0x8D70
+#define GL_RGB32UI                                       0x8D71
+#define GL_RGBA16UI                                      0x8D76
+#define GL_RGB16UI                                       0x8D77
+#define GL_RGBA8UI                                       0x8D7C
+#define GL_RGB8UI                                        0x8D7D
+#define GL_RGBA32I                                       0x8D82
+#define GL_RGB32I                                        0x8D83
+#define GL_RGBA16I                                       0x8D88
+#define GL_RGB16I                                        0x8D89
+#define GL_RGBA8I                                        0x8D8E
+#define GL_RGB8I                                         0x8D8F
+#define GL_RED_INTEGER                                   0x8D94
+#define GL_RGB_INTEGER                                   0x8D98
+#define GL_RGBA_INTEGER                                  0x8D99
+#define GL_SAMPLER_2D_ARRAY                              0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW                       0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW                           0x8DC5
+#define GL_UNSIGNED_INT_VEC2                             0x8DC6
+#define GL_UNSIGNED_INT_VEC3                             0x8DC7
+#define GL_UNSIGNED_INT_VEC4                             0x8DC8
+#define GL_INT_SAMPLER_2D                                0x8DCA
+#define GL_INT_SAMPLER_3D                                0x8DCB
+#define GL_INT_SAMPLER_CUBE                              0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY                          0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D                       0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D                       0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE                     0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY                 0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS                           0x911F
+#define GL_BUFFER_MAP_LENGTH                             0x9120
+#define GL_BUFFER_MAP_OFFSET                             0x9121
+#define GL_DEPTH_COMPONENT32F                            0x8CAC
+#define GL_DEPTH32F_STENCIL8                             0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV                0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE               0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           0x8217
+#define GL_FRAMEBUFFER_DEFAULT                           0x8218
+#define GL_FRAMEBUFFER_UNDEFINED                         0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT                      0x821A
+#define GL_DEPTH_STENCIL                                 0x84F9
+#define GL_UNSIGNED_INT_24_8                             0x84FA
+#define GL_DEPTH24_STENCIL8                              0x88F0
+#define GL_UNSIGNED_NORMALIZED                           0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING                      GL_FRAMEBUFFER_BINDING
+#define GL_READ_FRAMEBUFFER                              0x8CA8
+#define GL_DRAW_FRAMEBUFFER                              0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING                      0x8CAA
+#define GL_RENDERBUFFER_SAMPLES                          0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS                         0x8CDF
+#define GL_COLOR_ATTACHMENT1                             0x8CE1
+#define GL_COLOR_ATTACHMENT2                             0x8CE2
+#define GL_COLOR_ATTACHMENT3                             0x8CE3
+#define GL_COLOR_ATTACHMENT4                             0x8CE4
+#define GL_COLOR_ATTACHMENT5                             0x8CE5
+#define GL_COLOR_ATTACHMENT6                             0x8CE6
+#define GL_COLOR_ATTACHMENT7                             0x8CE7
+#define GL_COLOR_ATTACHMENT8                             0x8CE8
+#define GL_COLOR_ATTACHMENT9                             0x8CE9
+#define GL_COLOR_ATTACHMENT10                            0x8CEA
+#define GL_COLOR_ATTACHMENT11                            0x8CEB
+#define GL_COLOR_ATTACHMENT12                            0x8CEC
+#define GL_COLOR_ATTACHMENT13                            0x8CED
+#define GL_COLOR_ATTACHMENT14                            0x8CEE
+#define GL_COLOR_ATTACHMENT15                            0x8CEF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            0x8D56
+#define GL_MAX_SAMPLES                                   0x8D57
+#define GL_HALF_FLOAT                                    0x140B
+#define GL_MAP_READ_BIT                                  0x0001
+#define GL_MAP_WRITE_BIT                                 0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT                      0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT                     0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT                        0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT                        0x0020
+#define GL_RG                                            0x8227
+#define GL_RG_INTEGER                                    0x8228
+#define GL_R8                                            0x8229
+#define GL_RG8                                           0x822B
+#define GL_R16F                                          0x822D
+#define GL_R32F                                          0x822E
+#define GL_RG16F                                         0x822F
+#define GL_RG32F                                         0x8230
+#define GL_R8I                                           0x8231
+#define GL_R8UI                                          0x8232
+#define GL_R16I                                          0x8233
+#define GL_R16UI                                         0x8234
+#define GL_R32I                                          0x8235
+#define GL_R32UI                                         0x8236
+#define GL_RG8I                                          0x8237
+#define GL_RG8UI                                         0x8238
+#define GL_RG16I                                         0x8239
+#define GL_RG16UI                                        0x823A
+#define GL_RG32I                                         0x823B
+#define GL_RG32UI                                        0x823C
+#define GL_VERTEX_ARRAY_BINDING                          0x85B5
+#define GL_R8_SNORM                                      0x8F94
+#define GL_RG8_SNORM                                     0x8F95
+#define GL_RGB8_SNORM                                    0x8F96
+#define GL_RGBA8_SNORM                                   0x8F97
+#define GL_SIGNED_NORMALIZED                             0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX                 0x8D69
+#define GL_COPY_READ_BUFFER                              0x8F36
+#define GL_COPY_WRITE_BUFFER                             0x8F37
+#define GL_COPY_READ_BUFFER_BINDING                      GL_COPY_READ_BUFFER
+#define GL_COPY_WRITE_BUFFER_BINDING                     GL_COPY_WRITE_BUFFER
+#define GL_UNIFORM_BUFFER                                0x8A11
+#define GL_UNIFORM_BUFFER_BINDING                        0x8A28
+#define GL_UNIFORM_BUFFER_START                          0x8A29
+#define GL_UNIFORM_BUFFER_SIZE                           0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS                     0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS                   0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS                   0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS                   0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE                        0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS        0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS      0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT               0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH          0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS                         0x8A36
+#define GL_UNIFORM_TYPE                                  0x8A37
+#define GL_UNIFORM_SIZE                                  0x8A38
+#define GL_UNIFORM_NAME_LENGTH                           0x8A39
+#define GL_UNIFORM_BLOCK_INDEX                           0x8A3A
+#define GL_UNIFORM_OFFSET                                0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE                          0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE                         0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR                          0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING                         0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE                       0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH                     0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS                 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES          0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER     0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER   0x8A46
+#define GL_INVALID_INDEX                                 0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS                  0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS                 0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT                       0x9111
+#define GL_OBJECT_TYPE                                   0x9112
+#define GL_SYNC_CONDITION                                0x9113
+#define GL_SYNC_STATUS                                   0x9114
+#define GL_SYNC_FLAGS                                    0x9115
+#define GL_SYNC_FENCE                                    0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE                    0x9117
+#define GL_UNSIGNALED                                    0x9118
+#define GL_SIGNALED                                      0x9119
+#define GL_ALREADY_SIGNALED                              0x911A
+#define GL_TIMEOUT_EXPIRED                               0x911B
+#define GL_CONDITION_SATISFIED                           0x911C
+#define GL_WAIT_FAILED                                   0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT                       0x00000001
+#define GL_TIMEOUT_IGNORED                               0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR                   0x88FE
+#define GL_ANY_SAMPLES_PASSED                            0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE               0x8D6A
+#define GL_SAMPLER_BINDING                               0x8919
+#define GL_RGB10_A2UI                                    0x906F
+#define GL_TEXTURE_SWIZZLE_R                             0x8E42
+#define GL_TEXTURE_SWIZZLE_G                             0x8E43
+#define GL_TEXTURE_SWIZZLE_B                             0x8E44
+#define GL_TEXTURE_SWIZZLE_A                             0x8E45
+#define GL_GREEN                                         0x1904
+#define GL_BLUE                                          0x1905
+#define GL_INT_2_10_10_10_REV                            0x8D9F
+#define GL_TRANSFORM_FEEDBACK                            0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED                     0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE                     0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING                    0x8E25
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT               0x8257
+#define GL_PROGRAM_BINARY_LENGTH                         0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS                    0x87FE
+#define GL_PROGRAM_BINARY_FORMATS                        0x87FF
+#define GL_COMPRESSED_R11_EAC                            0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC                     0x9271
+#define GL_COMPRESSED_RG11_EAC                           0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC                    0x9273
+#define GL_COMPRESSED_RGB8_ETC2                          0x9274
+#define GL_COMPRESSED_SRGB8_ETC2                         0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2      0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2     0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC                     0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC              0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT                      0x912F
+#define GL_MAX_ELEMENT_INDEX                             0x8D6B
+#define GL_NUM_SAMPLE_COUNTS                             0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS                      0x82DF
+
+/*-------------------------------------------------------------------------
+ * Entrypoint definitions
+ *-----------------------------------------------------------------------*/
+
+/* OpenGL ES 3.0 */
+
+extern GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode);
+extern GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
+extern GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
+extern GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
+extern GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+extern GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+extern GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
+extern GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
+extern GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
+extern GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
+extern GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
+extern GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
+extern GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
+extern GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
+extern GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
+extern GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
+extern GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index);
+extern GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
+extern GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+extern GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
+extern GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
+extern GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync);
+extern GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
+extern GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
+extern GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
+extern GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ndk/sources/android/ndk_helper/interpolator.cpp b/ndk/sources/android/ndk_helper/interpolator.cpp
new file mode 100644
index 0000000..4167051
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/interpolator.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "interpolator.h"
+#include <math.h>
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+//-------------------------------------------------
+//Ctor
+//-------------------------------------------------
+Interpolator::Interpolator()
+{
+    list_params_.clear();
+}
+
+//-------------------------------------------------
+//Dtor
+//-------------------------------------------------
+Interpolator::~Interpolator()
+{
+    list_params_.clear();
+}
+
+void Interpolator::Clear()
+{
+    list_params_.clear();
+}
+
+Interpolator& Interpolator::Set( const float start,
+        const float dest,
+        const INTERPOLATOR_TYPE type,
+        const double duration )
+{
+    //init the parameters for the interpolation process
+    start_time_ = PerfMonitor::GetCurrentTime();
+    dest_time_ = start_time_ + duration;
+    type_ = type;
+
+    start_value_ = start;
+    dest_value_ = dest;
+    return *this;
+}
+
+Interpolator& Interpolator::Add( const float dest,
+        const INTERPOLATOR_TYPE type,
+        const double duration )
+{
+    InterpolatorParams param;
+    param.dest_value_ = dest;
+    param.type_ = type;
+    param.duration_ = duration;
+    list_params_.push_back( param );
+    return *this;
+}
+
+bool Interpolator::Update( const double current_time, float& p )
+{
+    bool bContinue;
+    if( current_time >= dest_time_ )
+    {
+        p = dest_value_;
+        if( list_params_.size() )
+        {
+            InterpolatorParams& item = list_params_.front();
+            Set( dest_value_, item.dest_value_, item.type_, item.duration_ );
+            list_params_.pop_front();
+
+            bContinue = true;
+        }
+        else
+        {
+            bContinue = false;
+        }
+    }
+    else
+    {
+        float t = (float) (current_time - start_time_);
+        float d = (float) (dest_time_ - start_time_);
+        float b = start_value_;
+        float c = dest_value_ - start_value_;
+        p = GetFormula( type_, t, b, d, c );
+
+        bContinue = true;
+    }
+    return bContinue;
+}
+
+float Interpolator::GetFormula( const INTERPOLATOR_TYPE type,
+        const float t,
+        const float b,
+        const float d,
+        const float c )
+{
+    float t1;
+    switch( type )
+    {
+    case INTERPOLATOR_TYPE_LINEAR:
+        // simple linear interpolation - no easing
+        return (c * t / d + b);
+
+    case INTERPOLATOR_TYPE_EASEINQUAD:
+        // quadratic (t^2) easing in - accelerating from zero velocity
+        t1 = t / d;
+        return (c * t1 * t1 + b);
+
+    case INTERPOLATOR_TYPE_EASEOUTQUAD:
+        // quadratic (t^2) easing out - decelerating to zero velocity
+        t1 = t / d;
+        return (-c * t1 * (t1 - 2) + b);
+
+    case INTERPOLATOR_TYPE_EASEINOUTQUAD:
+        // quadratic easing in/out - acceleration until halfway, then deceleration
+        t1 = t / d / 2;
+        if( t1 < 1 )
+            return (c / 2 * t1 * t1 + b);
+        else
+        {
+            t1 = t1 - 1;
+            return (-c / 2 * (t1 * (t1 - 2) - 1) + b);
+        }
+    case INTERPOLATOR_TYPE_EASEINCUBIC:
+        // cubic easing in - accelerating from zero velocity
+        t1 = t / d;
+        return (c * t1 * t1 * t1 + b);
+
+    case INTERPOLATOR_TYPE_EASEOUTCUBIC:
+        // cubic easing in - accelerating from zero velocity
+        t1 = t / d - 1;
+        return (c * (t1 * t1 * t1 + 1) + b);
+
+    case INTERPOLATOR_TYPE_EASEINOUTCUBIC:
+        // cubic easing in - accelerating from zero velocity
+        t1 = t / d / 2;
+
+        if( t1 < 1 )
+            return (c / 2 * t1 * t1 * t1 + b);
+        else
+        {
+            t1 -= 2;
+            return (c / 2 * (t1 * t1 * t1 + 2) + b);
+        }
+    case INTERPOLATOR_TYPE_EASEINQUART:
+        // quartic easing in - accelerating from zero velocity
+        t1 = t / d;
+        return (c * t1 * t1 * t1 * t1 + b);
+
+    case INTERPOLATOR_TYPE_EASEINEXPO:
+        // exponential (2^t) easing in - accelerating from zero velocity
+        if( t == 0 )
+            return b;
+        else
+            return (c * powf( 2, (10 * (t / d - 1)) ) + b);
+
+    case INTERPOLATOR_TYPE_EASEOUTEXPO:
+        // exponential (2^t) easing out - decelerating to zero velocity
+        if( t == d )
+            return (b + c);
+        else
+            return (c * (-powf( 2, -10 * t / d ) + 1) + b);
+    default:
+        return 0;
+    }
+}
+
+}   //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/interpolator.h b/ndk/sources/android/ndk_helper/interpolator.h
new file mode 100644
index 0000000..1226e33
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/interpolator.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INTERPOLATOR_H_
+#define INTERPOLATOR_H_
+
+#include <jni.h>
+#include <errno.h>
+#include <time.h>
+#include "JNIHelper.h"
+#include "perfMonitor.h"
+#include <list>
+
+namespace ndk_helper
+{
+
+enum INTERPOLATOR_TYPE
+{
+    INTERPOLATOR_TYPE_LINEAR,
+    INTERPOLATOR_TYPE_EASEINQUAD,
+    INTERPOLATOR_TYPE_EASEOUTQUAD,
+    INTERPOLATOR_TYPE_EASEINOUTQUAD,
+    INTERPOLATOR_TYPE_EASEINCUBIC,
+    INTERPOLATOR_TYPE_EASEOUTCUBIC,
+    INTERPOLATOR_TYPE_EASEINOUTCUBIC,
+    INTERPOLATOR_TYPE_EASEINQUART,
+    INTERPOLATOR_TYPE_EASEINEXPO,
+    INTERPOLATOR_TYPE_EASEOUTEXPO,
+};
+
+struct InterpolatorParams
+{
+    float dest_value_;
+    INTERPOLATOR_TYPE type_;
+    double duration_;
+};
+
+/******************************************************************
+ * Interpolates values with several interpolation methods
+ */
+class Interpolator
+{
+private:
+    double start_time_;
+    double dest_time_;
+    INTERPOLATOR_TYPE type_;
+
+    float start_value_;
+    float dest_value_;
+    std::list<InterpolatorParams> list_params_;
+
+    float GetFormula( const INTERPOLATOR_TYPE type,
+            const float t,
+            const float b,
+            const float d,
+            const float c );
+public:
+    Interpolator();
+    ~Interpolator();
+
+    Interpolator& Set( const float start,
+            const float dest,
+            const INTERPOLATOR_TYPE type,
+            double duration );
+
+    Interpolator& Add( const float dest,
+            const INTERPOLATOR_TYPE type,
+            const double duration );
+
+    bool Update( const double currentTime, float& p );
+
+    void Clear();
+};
+
+}   //namespace ndkHelper
+#endif /* INTERPOLATOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/perfMonitor.cpp b/ndk/sources/android/ndk_helper/perfMonitor.cpp
new file mode 100644
index 0000000..dad0e68
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/perfMonitor.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "perfMonitor.h"
+
+namespace ndk_helper
+{
+
+PerfMonitor::PerfMonitor() :
+                last_tick_( 0.f ),
+                tv_last_sec_( 0 ),
+                tickindex_( 0 ),
+                ticksum_( 0 )
+{
+    for( int32_t i = 0; i < NUM_SAMPLES; ++i )
+        ticklist_[i] = 0;
+}
+
+PerfMonitor::~PerfMonitor()
+{
+}
+
+double PerfMonitor::UpdateTick( double currentTick )
+{
+    ticksum_ -= ticklist_[tickindex_];
+    ticksum_ += currentTick;
+    ticklist_[tickindex_] = currentTick;
+    tickindex_ = (tickindex_ + 1) % NUM_SAMPLES;
+
+    return ((double) ticksum_ / NUM_SAMPLES);
+}
+
+bool PerfMonitor::Update( float &fFPS )
+{
+    struct timeval Time;
+    gettimeofday( &Time, NULL );
+
+    double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+    double tick = time - last_tick_;
+    double d = UpdateTick( tick );
+    last_tick_ = time;
+
+    if( Time.tv_sec - tv_last_sec_ >= 1 )
+    {
+        double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+        current_FPS_ = 1.f / d;
+        tv_last_sec_ = Time.tv_sec;
+        fFPS = current_FPS_;
+        return true;
+    }
+    else
+    {
+        fFPS = current_FPS_;
+        return false;
+    }
+}
+
+}   //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/perfMonitor.h b/ndk/sources/android/ndk_helper/perfMonitor.h
new file mode 100644
index 0000000..f418c43
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/perfMonitor.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef PERFMONITOR_H_
+#define PERFMONITOR_H_
+
+#include <jni.h>
+#include <errno.h>
+#include <time.h>
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+const int32_t NUM_SAMPLES = 100;
+
+/******************************************************************
+ * Helper class for a performance monitoring and get current tick time
+ */
+class PerfMonitor
+{
+private:
+    float current_FPS_;
+    time_t tv_last_sec_;
+
+    double last_tick_;
+    int32_t tickindex_;
+    double ticksum_;
+    double ticklist_[NUM_SAMPLES];
+
+    double UpdateTick( double current_tick );
+public:
+    PerfMonitor();
+    virtual ~PerfMonitor();
+
+    bool Update( float &fFPS );
+
+    static double GetCurrentTime()
+    {
+        struct timeval time;
+        gettimeofday( &time, NULL );
+        double ret = time.tv_sec + time.tv_usec * 1.0 / 1000000.0;
+        return ret;
+    }
+};
+
+}   //namespace ndkHelper
+#endif /* PERFMONITOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/shader.cpp b/ndk/sources/android/ndk_helper/shader.cpp
new file mode 100644
index 0000000..74b3887
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+#include "shader.h"
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define DEBUG (1)
+
+bool shader::CompileShader( GLuint *shader,
+        const GLenum type,
+        const char *str_file_name,
+        const std::map<std::string, std::string>& map_parameters )
+{
+    std::vector<uint8_t> data;
+    if( !JNIHelper::GetInstance()->ReadFile( str_file_name, &data ) )
+    {
+        LOGI( "Can not open a file:%s", str_file_name );
+        return false;
+    }
+
+    const char REPLACEMENT_TAG = '*';
+    //Fill-in parameters
+    std::string str( data.begin(), data.end() );
+    std::string str_replacement_map( data.size(), ' ' );
+
+    std::map<std::string, std::string>::const_iterator it = map_parameters.begin();
+    std::map<std::string, std::string>::const_iterator itEnd = map_parameters.end();
+    while( it != itEnd )
+    {
+        size_t pos = 0;
+        while( (pos = str.find( it->first, pos )) != std::string::npos )
+        {
+            //Check if the sub string is already touched
+
+            size_t replaced_pos = str_replacement_map.find( REPLACEMENT_TAG, pos );
+            if( replaced_pos == std::string::npos || replaced_pos > pos )
+            {
+
+                str.replace( pos, it->first.length(), it->second );
+                str_replacement_map.replace( pos, it->first.length(), it->first.length(),
+                        REPLACEMENT_TAG );
+                pos += it->second.length();
+            }
+            else
+            {
+                //The replacement target has been touched by other tag, skipping them
+                pos += it->second.length();
+            }
+        }
+        it++;
+    }
+
+    LOGI( "Patched Shdader:\n%s", str.c_str() );
+
+    std::vector<uint8_t> v( str.begin(), str.end() );
+    str.clear();
+    return shader::CompileShader( shader, type, v );
+}
+
+bool shader::CompileShader( GLuint *shader,
+        const GLenum type,
+        const GLchar *source,
+        const int32_t iSize )
+{
+    if( source == NULL || iSize <= 0 )
+        return false;
+
+    *shader = glCreateShader( type );
+    glShaderSource( *shader, 1, &source, &iSize ); //Not specifying 3rd parameter (size) could be troublesome..
+
+    glCompileShader( *shader );
+
+#if defined(DEBUG)
+    GLint logLength;
+    glGetShaderiv( *shader, GL_INFO_LOG_LENGTH, &logLength );
+    if( logLength > 0 )
+    {
+        GLchar *log = (GLchar *) malloc( logLength );
+        glGetShaderInfoLog( *shader, logLength, &logLength, log );
+        LOGI( "Shader compile log:\n%s", log );
+        free( log );
+    }
+#endif
+
+    GLint status;
+    glGetShaderiv( *shader, GL_COMPILE_STATUS, &status );
+    if( status == 0 )
+    {
+        glDeleteShader( *shader );
+        return false;
+    }
+
+    return true;
+}
+
+bool shader::CompileShader( GLuint *shader,
+        const GLenum type,
+        std::vector<uint8_t>& data )
+{
+    if( !data.size() )
+        return false;
+
+    const GLchar *source = (GLchar *) &data[0];
+    int32_t iSize = data.size();
+    return shader::CompileShader( shader, type, source, iSize );
+}
+
+bool shader::CompileShader( GLuint *shader,
+        const GLenum type,
+        const char *strFileName )
+{
+    std::vector<uint8_t> data;
+    bool b = JNIHelper::GetInstance()->ReadFile( strFileName, &data );
+    if( !b )
+    {
+        LOGI( "Can not open a file:%s", strFileName );
+        return false;
+    }
+
+    return shader::CompileShader( shader, type, data );
+}
+
+bool shader::LinkProgram( const GLuint prog )
+{
+    GLint status;
+
+    glLinkProgram( prog );
+
+#if defined(DEBUG)
+    GLint logLength;
+    glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+    if( logLength > 0 )
+    {
+        GLchar *log = (GLchar *) malloc( logLength );
+        glGetProgramInfoLog( prog, logLength, &logLength, log );
+        LOGI( "Program link log:\n%s", log );
+        free( log );
+    }
+#endif
+
+    glGetProgramiv( prog, GL_LINK_STATUS, &status );
+    if( status == 0 )
+    {
+        LOGI( "Program link failed\n" );
+        return false;
+    }
+
+    return true;
+}
+
+bool shader::ValidateProgram( const GLuint prog )
+{
+    GLint logLength, status;
+
+    glValidateProgram( prog );
+    glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+    if( logLength > 0 )
+    {
+        GLchar *log = (GLchar *) malloc( logLength );
+        glGetProgramInfoLog( prog, logLength, &logLength, log );
+        LOGI( "Program validate log:\n%s", log );
+        free( log );
+    }
+
+    glGetProgramiv( prog, GL_VALIDATE_STATUS, &status );
+    if( status == 0 )
+        return false;
+
+    return true;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/shader.h b/ndk/sources/android/ndk_helper/shader.h
new file mode 100644
index 0000000..d362a53
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SHADER_H_
+#define SHADER_H_
+
+#include <jni.h>
+
+#include <vector>
+#include <map>
+#include <string>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/log.h>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+namespace shader
+{
+
+/******************************************************************
+ * Shader compiler helper
+ * namespace: ndkHelper::shader
+ *
+ */
+
+/******************************************************************
+ * CompileShader() with vector
+ *
+ * arguments:
+ *  out: shader, shader variable
+ *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ *  in: data, source vector
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, std::vector<uint8_t>& data );
+
+/******************************************************************
+ * CompileShader() with buffer
+ *
+ * arguments:
+ *  out: shader, shader variable
+ *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ *  in: source, source buffer
+ *  in: iSize, buffer size
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+        const GLenum type,
+        const GLchar *source,
+        const int32_t iSize );
+
+/******************************************************************
+ * CompileShader() with filename
+ *
+ * arguments:
+ *  out: shader, shader variable
+ *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ *  in: strFilename, filename
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, const char *strFileName );
+
+/******************************************************************
+ * CompileShader() with std::map helps patching on a shader on the fly.
+ *
+ * arguments:
+ *  out: shader, shader variable
+ *  in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ *  in: mapParameters
+ *      For a example,
+ *      map : %KEY% -> %VALUE% replaces all %KEY% entries in the given shader code to %VALUE"
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+        const GLenum type,
+        const char *str_file_name,
+        const std::map<std::string, std::string>& map_parameters );
+
+/******************************************************************
+ * LinkProgram()
+ *
+ * arguments:
+ *  in: program, program
+ * return: true if a shader linkage succeeded, false if it failed
+ *
+ */
+bool LinkProgram( const GLuint prog );
+
+/******************************************************************
+ * validateProgram()
+ *
+ * arguments:
+ *  in: program, program
+ * return: true if a shader validation succeeded, false if it failed
+ *
+ */
+bool ValidateProgram( const GLuint prog );
+} //namespace shader
+
+} //namespace ndkHelper
+#endif /* SHADER_H_ */
diff --git a/ndk/sources/android/ndk_helper/tapCamera.cpp b/ndk/sources/android/ndk_helper/tapCamera.cpp
new file mode 100644
index 0000000..5a4ff8b
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//----------------------------------------------------------
+//  tapCamera.cpp
+//  Camera control with tap
+//
+//----------------------------------------------------------
+#include <fstream>
+#include "tapCamera.h"
+
+namespace ndk_helper
+{
+
+const float TRANSFORM_FACTOR = 15.f;
+const float TRANSFORM_FACTORZ = 10.f;
+
+const float MOMENTUM_FACTOR_DECREASE = 0.85f;
+const float MOMENTUM_FACTOR_DECREASE_SHIFT = 0.9f;
+const float MOMENTUM_FACTOR = 0.8f;
+const float MOMENTUM_FACTOR_THRESHOLD = 0.001f;
+
+//----------------------------------------------------------
+//  Ctor
+//----------------------------------------------------------
+TapCamera::TapCamera() :
+                dragging_( false ),
+                pinching_( false ),
+                momentum_( false ),
+                ball_radius_( 0.75f ),
+                pinch_start_distance_SQ_( 0.f ),
+                camera_rotation_( 0.f ),
+                camera_rotation_start_( 0.f ),
+                camera_rotation_now_( 0.f ),
+                momemtum_steps_( 0.f ),
+                flip_z_( 0.f )
+{
+    //Init offset
+    InitParameters();
+
+    vec_flip_ = Vec2( 1.f, -1.f );
+    flip_z_ = -1.f;
+    vec_pinch_transform_factor_ = Vec3( 1.f, 1.f, 1.f );
+
+    vec_ball_center_ = Vec2( 0, 0 );
+    vec_ball_now_ = Vec2( 0, 0 );
+    vec_ball_down_ = Vec2( 0, 0 );
+
+    vec_pinch_start_ = Vec2( 0, 0 );
+    vec_pinch_start_center_ = Vec2( 0, 0 );
+
+    vec_flip_ = Vec2( 0, 0 );
+
+}
+
+void TapCamera::InitParameters()
+{
+    //Init parameters
+    vec_offset_ = Vec3();
+    vec_offset_now_ = Vec3();
+
+    quat_ball_rot_ = Quaternion();
+    quat_ball_now_ = Quaternion();
+    quat_ball_now_.ToMatrix( mat_rotation_ );
+    camera_rotation_ = 0.f;
+
+    vec_drag_delta_ = Vec2();
+    vec_offset_delta_ = Vec3();
+
+    momentum_ = false;
+}
+
+//----------------------------------------------------------
+//  Dtor
+//----------------------------------------------------------
+TapCamera::~TapCamera()
+{
+
+}
+
+void TapCamera::Update()
+{
+    if( momentum_ )
+    {
+        float momenttum_steps = momemtum_steps_;
+
+        //Momentum rotation
+        Vec2 v = vec_drag_delta_;
+        BeginDrag( Vec2() ); //NOTE:This call reset _VDragDelta
+        Drag( v * vec_flip_ );
+
+        //Momentum shift
+        vec_offset_ += vec_offset_delta_;
+
+        BallUpdate();
+        EndDrag();
+
+        //Decrease deltas
+        vec_drag_delta_ = v * MOMENTUM_FACTOR_DECREASE;
+        vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR_DECREASE_SHIFT;
+
+        //Count steps
+        momemtum_steps_ = momenttum_steps * MOMENTUM_FACTOR_DECREASE;
+        if( momemtum_steps_ < MOMENTUM_FACTOR_THRESHOLD )
+        {
+            momentum_ = false;
+        }
+    }
+    else
+    {
+        vec_drag_delta_ *= MOMENTUM_FACTOR;
+        vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR;
+        BallUpdate();
+    }
+
+    Vec3 vec = vec_offset_ + vec_offset_now_;
+    Vec3 vec_tmp( TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ );
+
+    vec *= vec_tmp * vec_pinch_transform_factor_;
+
+    mat_transform_ = Mat4::Translation( vec );
+}
+
+Mat4& TapCamera::GetRotationMatrix()
+{
+    return mat_rotation_;
+}
+
+Mat4& TapCamera::GetTransformMatrix()
+{
+    return mat_transform_;
+}
+
+void TapCamera::Reset( const bool bAnimate )
+{
+    InitParameters();
+    Update();
+
+}
+
+//----------------------------------------------------------
+//Drag control
+//----------------------------------------------------------
+void TapCamera::BeginDrag( const Vec2& v )
+{
+    if( dragging_ )
+        EndDrag();
+
+    if( pinching_ )
+        EndPinch();
+
+    Vec2 vec = v * vec_flip_;
+    vec_ball_now_ = vec;
+    vec_ball_down_ = vec_ball_now_;
+
+    dragging_ = true;
+    momentum_ = false;
+    vec_last_input_ = vec;
+    vec_drag_delta_ = Vec2();
+}
+
+void TapCamera::EndDrag()
+{
+    quat_ball_down_ = quat_ball_now_;
+    quat_ball_rot_ = Quaternion();
+
+    dragging_ = false;
+    momentum_ = true;
+    momemtum_steps_ = 1.0f;
+}
+
+void TapCamera::Drag( const Vec2& v )
+{
+    if( !dragging_ )
+        return;
+
+    Vec2 vec = v * vec_flip_;
+    vec_ball_now_ = vec;
+
+    vec_drag_delta_ = vec_drag_delta_ * MOMENTUM_FACTOR + (vec - vec_last_input_);
+    vec_last_input_ = vec;
+}
+
+//----------------------------------------------------------
+//Pinch controll
+//----------------------------------------------------------
+void TapCamera::BeginPinch( const Vec2& v1, const Vec2& v2 )
+{
+    if( dragging_ )
+        EndDrag();
+
+    if( pinching_ )
+        EndPinch();
+
+    BeginDrag( Vec2() );
+
+    vec_pinch_start_center_ = (v1 + v2) / 2.f;
+
+    Vec2 vec = v1 - v2;
+    float x_diff;
+    float y_diff;
+    vec.Value( x_diff, y_diff );
+
+    pinch_start_distance_SQ_ = x_diff * x_diff + y_diff * y_diff;
+    camera_rotation_start_ = atan2f( y_diff, x_diff );
+    camera_rotation_now_ = 0;
+
+    pinching_ = true;
+    momentum_ = false;
+
+    //Init momentum factors
+    vec_offset_delta_ = Vec3();
+}
+
+void TapCamera::EndPinch()
+{
+    pinching_ = false;
+    momentum_ = true;
+    momemtum_steps_ = 1.f;
+    vec_offset_ += vec_offset_now_;
+    camera_rotation_ += camera_rotation_now_;
+    vec_offset_now_ = Vec3();
+
+    camera_rotation_now_ = 0;
+
+    EndDrag();
+}
+
+void TapCamera::Pinch( const Vec2& v1, const Vec2& v2 )
+{
+    if( !pinching_ )
+        return;
+
+    //Update momentum factor
+    vec_offset_last_ = vec_offset_now_;
+
+    float x_diff, y_diff;
+    Vec2 vec = v1 - v2;
+    vec.Value( x_diff, y_diff );
+
+    float fDistanceSQ = x_diff * x_diff + y_diff * y_diff;
+
+    float f = pinch_start_distance_SQ_ / fDistanceSQ;
+    if( f < 1.f )
+        f = -1.f / f + 1.0f;
+    else
+        f = f - 1.f;
+    if( isnan( f ) )
+        f = 0.f;
+
+    vec = (v1 + v2) / 2.f - vec_pinch_start_center_;
+    vec_offset_now_ = Vec3( vec, flip_z_ * f );
+
+    //Update momentum factor
+    vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR
+            + (vec_offset_now_ - vec_offset_last_);
+
+    //
+    //Update ration quaternion
+    float fRotation = atan2f( y_diff, x_diff );
+    camera_rotation_now_ = fRotation - camera_rotation_start_;
+
+    //Trackball rotation
+    quat_ball_rot_ = Quaternion( 0.f, 0.f, sinf( -camera_rotation_now_ * 0.5f ),
+            cosf( -camera_rotation_now_ * 0.5f ) );
+}
+
+//----------------------------------------------------------
+//Trackball controll
+//----------------------------------------------------------
+void TapCamera::BallUpdate()
+{
+    if( dragging_ )
+    {
+        Vec3 vec_from = PointOnSphere( vec_ball_down_ );
+        Vec3 vec_to = PointOnSphere( vec_ball_now_ );
+
+        Vec3 vec = vec_from.Cross( vec_to );
+        float w = vec_from.Dot( vec_to );
+
+        Quaternion qDrag = Quaternion( vec, w );
+        qDrag = qDrag * quat_ball_down_;
+        quat_ball_now_ = quat_ball_rot_ * qDrag;
+    }
+    quat_ball_now_.ToMatrix( mat_rotation_ );
+}
+
+Vec3 TapCamera::PointOnSphere( Vec2& point )
+{
+    Vec3 ball_mouse;
+    float mag;
+    Vec2 vec = (point - vec_ball_center_) / ball_radius_;
+    mag = vec.Dot( vec );
+    if( mag > 1.f )
+    {
+        float scale = 1.f / sqrtf( mag );
+        vec *= scale;
+        ball_mouse = Vec3( vec, 0.f );
+    }
+    else
+    {
+        ball_mouse = Vec3( vec, sqrtf( 1.f - mag ) );
+    }
+    return ball_mouse;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/tapCamera.h b/ndk/sources/android/ndk_helper/tapCamera.h
new file mode 100644
index 0000000..7d124e8
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <vector>
+#include <string>
+#include <GLES2/gl2.h>
+
+#include "JNIHelper.h"
+#include "vecmath.h"
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Camera control helper class with a tap gesture
+ * This class is mainly used for 3D space camera control in samples.
+ *
+ */
+class TapCamera
+{
+private:
+    //Trackball
+    Vec2 vec_ball_center_;
+    float ball_radius_;
+    Quaternion quat_ball_now_;
+    Quaternion quat_ball_down_;
+    Vec2 vec_ball_now_;
+    Vec2 vec_ball_down_;
+    Quaternion quat_ball_rot_;
+
+    bool dragging_;
+    bool pinching_;
+
+    //Pinch related info
+    Vec2 vec_pinch_start_;
+    Vec2 vec_pinch_start_center_;
+    float pinch_start_distance_SQ_;
+
+    //Camera shift
+    Vec3 vec_offset_;
+    Vec3 vec_offset_now_;
+
+    //Camera Rotation
+    float camera_rotation_;
+    float camera_rotation_start_;
+    float camera_rotation_now_;
+
+    //Momentum support
+    bool momentum_;
+    Vec2 vec_drag_delta_;
+    Vec2 vec_last_input_;
+    Vec3 vec_offset_last_;
+    Vec3 vec_offset_delta_;
+    float momemtum_steps_;
+
+    Vec2 vec_flip_;
+    float flip_z_;
+
+    Mat4 mat_rotation_;
+    Mat4 mat_transform_;
+
+    Vec3 vec_pinch_transform_factor_;
+
+    Vec3 PointOnSphere( Vec2& point );
+    void BallUpdate();
+    void InitParameters();
+public:
+    TapCamera();
+    virtual ~TapCamera();
+    void BeginDrag( const Vec2& vec );
+    void EndDrag();
+    void Drag( const Vec2& vec );
+    void Update();
+
+    Mat4& GetRotationMatrix();
+    Mat4& GetTransformMatrix();
+
+    void BeginPinch( const Vec2& v1, const Vec2& v2 );
+    void EndPinch();
+    void Pinch( const Vec2& v1, const Vec2& v2 );
+
+    void SetFlip( const float x, const float y, const float z )
+    {
+        vec_flip_ = Vec2( x, y );
+        flip_z_ = z;
+    }
+
+    void SetPinchTransformFactor( const float x, const float y, const float z )
+    {
+        vec_pinch_transform_factor_ = Vec3( x, y, z );
+    }
+
+    void Reset( const bool bAnimate );
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/vecmath.cpp b/ndk/sources/android/ndk_helper/vecmath.cpp
new file mode 100644
index 0000000..f4ae5f3
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copy_right 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * y_ou may_ not use this file ex_cept in compliance with the License.
+ * You may_ obtain a copy_ of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by_ applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either ex_press or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// vecmath.cpp
+//--------------------------------------------------------------------------------
+#include "vecmath.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// vec3
+//--------------------------------------------------------------------------------
+Vec3::Vec3( const Vec4& vec )
+{
+    x_ = vec.x_;
+    y_ = vec.y_;
+    z_ = vec.z_;
+}
+
+//--------------------------------------------------------------------------------
+// vec4
+//--------------------------------------------------------------------------------
+Vec4 Vec4::operator*( const Mat4& rhs ) const
+{
+    Vec4 out;
+    out.x_ = x_ * rhs.f_[0] + y_ * rhs.f_[1] + z_ * rhs.f_[2] + w_ * rhs.f_[3];
+    out.y_ = x_ * rhs.f_[4] + y_ * rhs.f_[5] + z_ * rhs.f_[6] + w_ * rhs.f_[7];
+    out.z_ = x_ * rhs.f_[8] + y_ * rhs.f_[9] + z_ * rhs.f_[10] + w_ * rhs.f_[11];
+    out.w_ = x_ * rhs.f_[12] + y_ * rhs.f_[13] + z_ * rhs.f_[14] + w_ * rhs.f_[15];
+    return out;
+}
+
+//--------------------------------------------------------------------------------
+// mat4
+//--------------------------------------------------------------------------------
+Mat4::Mat4()
+{
+    for( int32_t i = 0; i < 16; ++i )
+        f_[i] = 0.f;
+}
+
+Mat4::Mat4( const float* mIn )
+{
+    for( int32_t i = 0; i < 16; ++i )
+        f_[i] = mIn[i];
+}
+
+Mat4 Mat4::operator*( const Mat4& rhs ) const
+{
+    Mat4 ret;
+    ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+            + f_[12] * rhs.f_[3];
+    ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+            + f_[13] * rhs.f_[3];
+    ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+            + f_[14] * rhs.f_[3];
+    ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+            + f_[15] * rhs.f_[3];
+
+    ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+            + f_[12] * rhs.f_[7];
+    ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+            + f_[13] * rhs.f_[7];
+    ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+            + f_[14] * rhs.f_[7];
+    ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+            + f_[15] * rhs.f_[7];
+
+    ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+            + f_[12] * rhs.f_[11];
+    ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+            + f_[13] * rhs.f_[11];
+    ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+            + f_[14] * rhs.f_[11];
+    ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+            + f_[15] * rhs.f_[11];
+
+    ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+            + f_[12] * rhs.f_[15];
+    ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+            + f_[13] * rhs.f_[15];
+    ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+            + f_[14] * rhs.f_[15];
+    ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+            + f_[15] * rhs.f_[15];
+
+    return ret;
+}
+
+Vec4 Mat4::operator*( const Vec4& rhs ) const
+{
+    Vec4 ret;
+    ret.x_ = rhs.x_ * f_[0] + rhs.y_ * f_[4] + rhs.z_ * f_[8] + rhs.w_ * f_[12];
+    ret.y_ = rhs.x_ * f_[1] + rhs.y_ * f_[5] + rhs.z_ * f_[9] + rhs.w_ * f_[13];
+    ret.z_ = rhs.x_ * f_[2] + rhs.y_ * f_[6] + rhs.z_ * f_[10] + rhs.w_ * f_[14];
+    ret.w_ = rhs.x_ * f_[3] + rhs.y_ * f_[7] + rhs.z_ * f_[11] + rhs.w_ * f_[15];
+    return ret;
+}
+
+Mat4 Mat4::Inverse()
+{
+    Mat4 ret;
+    float det_1;
+    float pos = 0;
+    float neg = 0;
+    float temp;
+
+    temp = f_[0] * f_[5] * f_[10];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    temp = f_[4] * f_[9] * f_[2];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    temp = f_[8] * f_[1] * f_[6];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    temp = -f_[8] * f_[5] * f_[2];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    temp = -f_[4] * f_[1] * f_[10];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    temp = -f_[0] * f_[9] * f_[6];
+    if( temp >= 0 )
+        pos += temp;
+    else
+        neg += temp;
+    det_1 = pos + neg;
+
+    if( det_1 == 0.0 )
+    {
+        //Error
+    }
+    else
+    {
+        det_1 = 1.0f / det_1;
+        ret.f_[0] = (f_[5] * f_[10] - f_[9] * f_[6]) * det_1;
+        ret.f_[1] = -(f_[1] * f_[10] - f_[9] * f_[2]) * det_1;
+        ret.f_[2] = (f_[1] * f_[6] - f_[5] * f_[2]) * det_1;
+        ret.f_[4] = -(f_[4] * f_[10] - f_[8] * f_[6]) * det_1;
+        ret.f_[5] = (f_[0] * f_[10] - f_[8] * f_[2]) * det_1;
+        ret.f_[6] = -(f_[0] * f_[6] - f_[4] * f_[2]) * det_1;
+        ret.f_[8] = (f_[4] * f_[9] - f_[8] * f_[5]) * det_1;
+        ret.f_[9] = -(f_[0] * f_[9] - f_[8] * f_[1]) * det_1;
+        ret.f_[10] = (f_[0] * f_[5] - f_[4] * f_[1]) * det_1;
+
+        /* Calculate -C * inverse(A) */
+        ret.f_[12] = -(f_[12] * ret.f_[0] + f_[13] * ret.f_[4] + f_[14] * ret.f_[8]);
+        ret.f_[13] = -(f_[12] * ret.f_[1] + f_[13] * ret.f_[5] + f_[14] * ret.f_[9]);
+        ret.f_[14] = -(f_[12] * ret.f_[2] + f_[13] * ret.f_[6] + f_[14] * ret.f_[10]);
+
+        ret.f_[3] = 0.0f;
+        ret.f_[7] = 0.0f;
+        ret.f_[11] = 0.0f;
+        ret.f_[15] = 1.0f;
+    }
+
+    *this = ret;
+    return *this;
+}
+
+//--------------------------------------------------------------------------------
+// Misc
+//--------------------------------------------------------------------------------
+Mat4 Mat4::RotationX( const float fAngle )
+{
+    Mat4 ret;
+    float fCosine, fSine;
+
+    fCosine = cosf( fAngle );
+    fSine = sinf( fAngle );
+
+    ret.f_[0] = 1.0f;
+    ret.f_[4] = 0.0f;
+    ret.f_[8] = 0.0f;
+    ret.f_[12] = 0.0f;
+    ret.f_[1] = 0.0f;
+    ret.f_[5] = fCosine;
+    ret.f_[9] = fSine;
+    ret.f_[13] = 0.0f;
+    ret.f_[2] = 0.0f;
+    ret.f_[6] = -fSine;
+    ret.f_[10] = fCosine;
+    ret.f_[14] = 0.0f;
+    ret.f_[3] = 0.0f;
+    ret.f_[7] = 0.0f;
+    ret.f_[11] = 0.0f;
+    ret.f_[15] = 1.0f;
+    return ret;
+}
+
+Mat4 Mat4::RotationY( const float fAngle )
+{
+    Mat4 ret;
+    float fCosine, fSine;
+
+    fCosine = cosf( fAngle );
+    fSine = sinf( fAngle );
+
+    ret.f_[0] = fCosine;
+    ret.f_[4] = 0.0f;
+    ret.f_[8] = -fSine;
+    ret.f_[12] = 0.0f;
+    ret.f_[1] = 0.0f;
+    ret.f_[5] = 1.0f;
+    ret.f_[9] = 0.0f;
+    ret.f_[13] = 0.0f;
+    ret.f_[2] = fSine;
+    ret.f_[6] = 0.0f;
+    ret.f_[10] = fCosine;
+    ret.f_[14] = 0.0f;
+    ret.f_[3] = 0.0f;
+    ret.f_[7] = 0.0f;
+    ret.f_[11] = 0.0f;
+    ret.f_[15] = 1.0f;
+    return ret;
+
+}
+
+Mat4 Mat4::RotationZ( const float fAngle )
+{
+    Mat4 ret;
+    float fCosine, fSine;
+
+    fCosine = cosf( fAngle );
+    fSine = sinf( fAngle );
+
+    ret.f_[0] = fCosine;
+    ret.f_[4] = fSine;
+    ret.f_[8] = 0.0f;
+    ret.f_[12] = 0.0f;
+    ret.f_[1] = -fSine;
+    ret.f_[5] = fCosine;
+    ret.f_[9] = 0.0f;
+    ret.f_[13] = 0.0f;
+    ret.f_[2] = 0.0f;
+    ret.f_[6] = 0.0f;
+    ret.f_[10] = 1.0f;
+    ret.f_[14] = 0.0f;
+    ret.f_[3] = 0.0f;
+    ret.f_[7] = 0.0f;
+    ret.f_[11] = 0.0f;
+    ret.f_[15] = 1.0f;
+    return ret;
+}
+
+Mat4 Mat4::Translation( const float fX, const float fY, const float fZ )
+{
+    Mat4 ret;
+    ret.f_[0] = 1.0f;
+    ret.f_[4] = 0.0f;
+    ret.f_[8] = 0.0f;
+    ret.f_[12] = fX;
+    ret.f_[1] = 0.0f;
+    ret.f_[5] = 1.0f;
+    ret.f_[9] = 0.0f;
+    ret.f_[13] = fY;
+    ret.f_[2] = 0.0f;
+    ret.f_[6] = 0.0f;
+    ret.f_[10] = 1.0f;
+    ret.f_[14] = fZ;
+    ret.f_[3] = 0.0f;
+    ret.f_[7] = 0.0f;
+    ret.f_[11] = 0.0f;
+    ret.f_[15] = 1.0f;
+    return ret;
+}
+
+Mat4 Mat4::Translation( const Vec3 vec )
+{
+    Mat4 ret;
+    ret.f_[0] = 1.0f;
+    ret.f_[4] = 0.0f;
+    ret.f_[8] = 0.0f;
+    ret.f_[12] = vec.x_;
+    ret.f_[1] = 0.0f;
+    ret.f_[5] = 1.0f;
+    ret.f_[9] = 0.0f;
+    ret.f_[13] = vec.y_;
+    ret.f_[2] = 0.0f;
+    ret.f_[6] = 0.0f;
+    ret.f_[10] = 1.0f;
+    ret.f_[14] = vec.z_;
+    ret.f_[3] = 0.0f;
+    ret.f_[7] = 0.0f;
+    ret.f_[11] = 0.0f;
+    ret.f_[15] = 1.0f;
+    return ret;
+}
+
+Mat4 Mat4::Perspective( float width, float height, float nearPlane, float farPlane )
+{
+    float n2 = 2.0f * nearPlane;
+    float rcpnmf = 1.f / (nearPlane - farPlane);
+
+    Mat4 result;
+    result.f_[0] = n2 / width;
+    result.f_[4] = 0;
+    result.f_[8] = 0;
+    result.f_[12] = 0;
+    result.f_[1] = 0;
+    result.f_[5] = n2 / height;
+    result.f_[9] = 0;
+    result.f_[13] = 0;
+    result.f_[2] = 0;
+    result.f_[6] = 0;
+    result.f_[10] = (farPlane + nearPlane) * rcpnmf;
+    result.f_[14] = farPlane * rcpnmf * n2;
+    result.f_[3] = 0;
+    result.f_[7] = 0;
+    result.f_[11] = -1.0;
+    result.f_[15] = 0;
+
+    return result;
+}
+
+Mat4 Mat4::LookAt( const Vec3& vec_eye, const Vec3& vec_at, const Vec3& vec_up )
+{
+    Vec3 vec_forward, vec_up_norm, vec_side;
+    Mat4 result;
+
+    vec_forward.x_ = vec_eye.x_ - vec_at.x_;
+    vec_forward.y_ = vec_eye.y_ - vec_at.y_;
+    vec_forward.z_ = vec_eye.z_ - vec_at.z_;
+
+    vec_forward.Normalize();
+    vec_up_norm = vec_up;
+    vec_up_norm.Normalize();
+    vec_side = vec_up_norm.Cross( vec_forward );
+    vec_up_norm = vec_forward.Cross( vec_side );
+
+    result.f_[0] = vec_side.x_;
+    result.f_[4] = vec_side.y_;
+    result.f_[8] = vec_side.z_;
+    result.f_[12] = 0;
+    result.f_[1] = vec_up_norm.x_;
+    result.f_[5] = vec_up_norm.y_;
+    result.f_[9] = vec_up_norm.z_;
+    result.f_[13] = 0;
+    result.f_[2] = vec_forward.x_;
+    result.f_[6] = vec_forward.y_;
+    result.f_[10] = vec_forward.z_;
+    result.f_[14] = 0;
+    result.f_[3] = 0;
+    result.f_[7] = 0;
+    result.f_[11] = 0;
+    result.f_[15] = 1.0;
+
+    result.PostTranslate( -vec_eye.x_, -vec_eye.y_, -vec_eye.z_ );
+    return result;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/vecmath.h b/ndk/sources/android/ndk_helper/vecmath.h
new file mode 100644
index 0000000..0692e3d
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.h
@@ -0,0 +1,1116 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VECMATH_H_
+#define VECMATH_H_
+
+#include <math.h>
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper class for vector math operations
+ * Currently all implementations are in pure C++.
+ * Each class is an opaque class so caller does not have a direct access
+ * to each element. This is for an ease of future optimization to use vector operations.
+ *
+ */
+
+class Vec2;
+class Vec3;
+class Vec4;
+class Mat4;
+
+/******************************************************************
+ * 2 elements vector class
+ *
+ */
+class Vec2
+{
+private:
+    float x_;
+    float y_;
+
+public:
+    friend class Vec3;
+    friend class Vec4;
+    friend class Mat4;
+    friend class Quaternion;
+
+    Vec2()
+    {
+        x_ = y_ = 0.f;
+    }
+
+    Vec2( const float fX, const float fY )
+    {
+        x_ = fX;
+        y_ = fY;
+    }
+
+    Vec2( const Vec2& vec )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+    }
+
+    Vec2( const float* pVec )
+    {
+        x_ = (*pVec++);
+        y_ = (*pVec++);
+    }
+
+    //Operators
+    Vec2 operator*( const Vec2& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ * rhs.x_;
+        ret.y_ = y_ * rhs.y_;
+        return ret;
+    }
+
+    Vec2 operator/( const Vec2& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ / rhs.x_;
+        ret.y_ = y_ / rhs.y_;
+        return ret;
+    }
+
+    Vec2 operator+( const Vec2& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ + rhs.x_;
+        ret.y_ = y_ + rhs.y_;
+        return ret;
+    }
+
+    Vec2 operator-( const Vec2& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ - rhs.x_;
+        ret.y_ = y_ - rhs.y_;
+        return ret;
+    }
+
+    Vec2& operator+=( const Vec2& rhs )
+    {
+        x_ += rhs.x_;
+        y_ += rhs.y_;
+        return *this;
+    }
+
+    Vec2& operator-=( const Vec2& rhs )
+    {
+        x_ -= rhs.x_;
+        y_ -= rhs.y_;
+        return *this;
+    }
+
+    Vec2& operator*=( const Vec2& rhs )
+    {
+        x_ *= rhs.x_;
+        y_ *= rhs.y_;
+        return *this;
+    }
+
+    Vec2& operator/=( const Vec2& rhs )
+    {
+        x_ /= rhs.x_;
+        y_ /= rhs.y_;
+        return *this;
+    }
+
+    //External operators
+    friend Vec2 operator-( const Vec2& rhs )
+    {
+        return Vec2( rhs ) *= -1;
+    }
+
+    friend Vec2 operator*( const float lhs, const Vec2& rhs )
+    {
+        Vec2 ret;
+        ret.x_ = lhs * rhs.x_;
+        ret.y_ = lhs * rhs.y_;
+        return ret;
+    }
+
+    friend Vec2 operator/( const float lhs, const Vec2& rhs )
+    {
+        Vec2 ret;
+        ret.x_ = lhs / rhs.x_;
+        ret.y_ = lhs / rhs.y_;
+        return ret;
+    }
+
+    //Operators with float
+    Vec2 operator*( const float& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ * rhs;
+        ret.y_ = y_ * rhs;
+        return ret;
+    }
+
+    Vec2& operator*=( const float& rhs )
+    {
+        x_ = x_ * rhs;
+        y_ = y_ * rhs;
+        return *this;
+    }
+
+    Vec2 operator/( const float& rhs ) const
+    {
+        Vec2 ret;
+        ret.x_ = x_ / rhs;
+        ret.y_ = y_ / rhs;
+        return ret;
+    }
+
+    Vec2& operator/=( const float& rhs )
+    {
+        x_ = x_ / rhs;
+        y_ = y_ / rhs;
+        return *this;
+    }
+
+    //Compare
+    bool operator==( const Vec2& rhs ) const
+    {
+        if( x_ != rhs.x_ || y_ != rhs.y_ )
+            return false;
+        return true;
+    }
+
+    bool operator!=( const Vec2& rhs ) const
+    {
+        if( x_ == rhs.x_ )
+            return false;
+
+        return true;
+    }
+
+    float Length() const
+    {
+        return sqrtf( x_ * x_ + y_ * y_ );
+    }
+
+    Vec2 Normalize()
+    {
+        float len = Length();
+        x_ = x_ / len;
+        y_ = y_ / len;
+        return *this;
+    }
+
+    float Dot( const Vec2& rhs )
+    {
+        return x_ * rhs.x_ + y_ * rhs.y_;
+    }
+
+    bool Validate()
+    {
+        if( isnan( x_ ) || isnan( y_ ) )
+            return false;
+        return true;
+    }
+
+    void Value( float& fX, float& fY )
+    {
+        fX = x_;
+        fY = y_;
+    }
+
+    void Dump()
+    {
+        LOGI( "Vec2 %f %f", x_, y_ );
+    }
+};
+
+/******************************************************************
+ * 3 elements vector class
+ *
+ */
+class Vec3
+{
+private:
+    float x_, y_, z_;
+
+public:
+    friend class Vec4;
+    friend class Mat4;
+    friend class Quaternion;
+
+    Vec3()
+    {
+        x_ = y_ = z_ = 0.f;
+    }
+
+    Vec3( const float fX, const float fY, const float fZ )
+    {
+        x_ = fX;
+        y_ = fY;
+        z_ = fZ;
+    }
+
+    Vec3( const Vec3& vec )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+        z_ = vec.z_;
+    }
+
+    Vec3( const float* pVec )
+    {
+        x_ = (*pVec++);
+        y_ = (*pVec++);
+        z_ = *pVec;
+    }
+
+    Vec3( const Vec2& vec, float f )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+        z_ = f;
+    }
+
+    Vec3( const Vec4& vec );
+
+    //Operators
+    Vec3 operator*( const Vec3& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ * rhs.x_;
+        ret.y_ = y_ * rhs.y_;
+        ret.z_ = z_ * rhs.z_;
+        return ret;
+    }
+
+    Vec3 operator/( const Vec3& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ / rhs.x_;
+        ret.y_ = y_ / rhs.y_;
+        ret.z_ = z_ / rhs.z_;
+        return ret;
+    }
+
+    Vec3 operator+( const Vec3& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ + rhs.x_;
+        ret.y_ = y_ + rhs.y_;
+        ret.z_ = z_ + rhs.z_;
+        return ret;
+    }
+
+    Vec3 operator-( const Vec3& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ - rhs.x_;
+        ret.y_ = y_ - rhs.y_;
+        ret.z_ = z_ - rhs.z_;
+        return ret;
+    }
+
+    Vec3& operator+=( const Vec3& rhs )
+    {
+        x_ += rhs.x_;
+        y_ += rhs.y_;
+        z_ += rhs.z_;
+        return *this;
+    }
+
+    Vec3& operator-=( const Vec3& rhs )
+    {
+        x_ -= rhs.x_;
+        y_ -= rhs.y_;
+        z_ -= rhs.z_;
+        return *this;
+    }
+
+    Vec3& operator*=( const Vec3& rhs )
+    {
+        x_ *= rhs.x_;
+        y_ *= rhs.y_;
+        z_ *= rhs.z_;
+        return *this;
+    }
+
+    Vec3& operator/=( const Vec3& rhs )
+    {
+        x_ /= rhs.x_;
+        y_ /= rhs.y_;
+        z_ /= rhs.z_;
+        return *this;
+    }
+
+    //External operators
+    friend Vec3 operator-( const Vec3& rhs )
+    {
+        return Vec3( rhs ) *= -1;
+    }
+
+    friend Vec3 operator*( const float lhs, const Vec3& rhs )
+    {
+        Vec3 ret;
+        ret.x_ = lhs * rhs.x_;
+        ret.y_ = lhs * rhs.y_;
+        ret.z_ = lhs * rhs.z_;
+        return ret;
+    }
+
+    friend Vec3 operator/( const float lhs, const Vec3& rhs )
+    {
+        Vec3 ret;
+        ret.x_ = lhs / rhs.x_;
+        ret.y_ = lhs / rhs.y_;
+        ret.z_ = lhs / rhs.z_;
+        return ret;
+    }
+
+    //Operators with float
+    Vec3 operator*( const float& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ * rhs;
+        ret.y_ = y_ * rhs;
+        ret.z_ = z_ * rhs;
+        return ret;
+    }
+
+    Vec3& operator*=( const float& rhs )
+    {
+        x_ = x_ * rhs;
+        y_ = y_ * rhs;
+        z_ = z_ * rhs;
+        return *this;
+    }
+
+    Vec3 operator/( const float& rhs ) const
+    {
+        Vec3 ret;
+        ret.x_ = x_ / rhs;
+        ret.y_ = y_ / rhs;
+        ret.z_ = z_ / rhs;
+        return ret;
+    }
+
+    Vec3& operator/=( const float& rhs )
+    {
+        x_ = x_ / rhs;
+        y_ = y_ / rhs;
+        z_ = z_ / rhs;
+        return *this;
+    }
+
+    //Compare
+    bool operator==( const Vec3& rhs ) const
+    {
+        if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ )
+            return false;
+        return true;
+    }
+
+    bool operator!=( const Vec3& rhs ) const
+    {
+        if( x_ == rhs.x_ )
+            return false;
+
+        return true;
+    }
+
+    float Length() const
+    {
+        return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ );
+    }
+
+    Vec3 Normalize()
+    {
+        float len = Length();
+        x_ = x_ / len;
+        y_ = y_ / len;
+        z_ = z_ / len;
+        return *this;
+    }
+
+    float Dot( const Vec3& rhs )
+    {
+        return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+    }
+
+    Vec3 Cross( const Vec3& rhs )
+    {
+        Vec3 ret;
+        ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+        ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+        ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+        return ret;
+    }
+
+    bool Validate()
+    {
+        if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) )
+            return false;
+        return true;
+    }
+
+    void Value( float& fX, float& fY, float& fZ )
+    {
+        fX = x_;
+        fY = y_;
+        fZ = z_;
+    }
+
+    void Dump()
+    {
+        LOGI( "Vec3 %f %f %f", x_, y_, z_ );
+    }
+};
+
+/******************************************************************
+ * 4 elements vector class
+ *
+ */
+class Vec4
+{
+private:
+    float x_, y_, z_, w_;
+
+public:
+    friend class Vec3;
+    friend class Mat4;
+    friend class Quaternion;
+
+    Vec4()
+    {
+        x_ = y_ = z_ = w_ = 0.f;
+    }
+
+    Vec4( const float fX, const float fY, const float fZ, const float fW )
+    {
+        x_ = fX;
+        y_ = fY;
+        z_ = fZ;
+        w_ = fW;
+    }
+
+    Vec4( const Vec4& vec )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+        z_ = vec.z_;
+        w_ = vec.w_;
+    }
+
+    Vec4( const Vec3& vec, const float fW )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+        z_ = vec.z_;
+        w_ = fW;
+    }
+
+    Vec4( const float* pVec )
+    {
+        x_ = (*pVec++);
+        y_ = (*pVec++);
+        z_ = *pVec;
+        w_ = *pVec;
+    }
+
+    //Operators
+    Vec4 operator*( const Vec4& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ * rhs.x_;
+        ret.y_ = y_ * rhs.y_;
+        ret.z_ = z_ * rhs.z_;
+        ret.w_ = z_ * rhs.w_;
+        return ret;
+    }
+
+    Vec4 operator/( const Vec4& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ / rhs.x_;
+        ret.y_ = y_ / rhs.y_;
+        ret.z_ = z_ / rhs.z_;
+        ret.w_ = z_ / rhs.w_;
+        return ret;
+    }
+
+    Vec4 operator+( const Vec4& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ + rhs.x_;
+        ret.y_ = y_ + rhs.y_;
+        ret.z_ = z_ + rhs.z_;
+        ret.w_ = z_ + rhs.w_;
+        return ret;
+    }
+
+    Vec4 operator-( const Vec4& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ - rhs.x_;
+        ret.y_ = y_ - rhs.y_;
+        ret.z_ = z_ - rhs.z_;
+        ret.w_ = z_ - rhs.w_;
+        return ret;
+    }
+
+    Vec4& operator+=( const Vec4& rhs )
+    {
+        x_ += rhs.x_;
+        y_ += rhs.y_;
+        z_ += rhs.z_;
+        w_ += rhs.w_;
+        return *this;
+    }
+
+    Vec4& operator-=( const Vec4& rhs )
+    {
+        x_ -= rhs.x_;
+        y_ -= rhs.y_;
+        z_ -= rhs.z_;
+        w_ -= rhs.w_;
+        return *this;
+    }
+
+    Vec4& operator*=( const Vec4& rhs )
+    {
+        x_ *= rhs.x_;
+        y_ *= rhs.y_;
+        z_ *= rhs.z_;
+        w_ *= rhs.w_;
+        return *this;
+    }
+
+    Vec4& operator/=( const Vec4& rhs )
+    {
+        x_ /= rhs.x_;
+        y_ /= rhs.y_;
+        z_ /= rhs.z_;
+        w_ /= rhs.w_;
+        return *this;
+    }
+
+    //External operators
+    friend Vec4 operator-( const Vec4& rhs )
+    {
+        return Vec4( rhs ) *= -1;
+    }
+
+    friend Vec4 operator*( const float lhs, const Vec4& rhs )
+    {
+        Vec4 ret;
+        ret.x_ = lhs * rhs.x_;
+        ret.y_ = lhs * rhs.y_;
+        ret.z_ = lhs * rhs.z_;
+        ret.w_ = lhs * rhs.w_;
+        return ret;
+    }
+
+    friend Vec4 operator/( const float lhs, const Vec4& rhs )
+    {
+        Vec4 ret;
+        ret.x_ = lhs / rhs.x_;
+        ret.y_ = lhs / rhs.y_;
+        ret.z_ = lhs / rhs.z_;
+        ret.w_ = lhs / rhs.w_;
+        return ret;
+    }
+
+    //Operators with float
+    Vec4 operator*( const float& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ * rhs;
+        ret.y_ = y_ * rhs;
+        ret.z_ = z_ * rhs;
+        ret.w_ = w_ * rhs;
+        return ret;
+    }
+
+    Vec4& operator*=( const float& rhs )
+    {
+        x_ = x_ * rhs;
+        y_ = y_ * rhs;
+        z_ = z_ * rhs;
+        w_ = w_ * rhs;
+        return *this;
+    }
+
+    Vec4 operator/( const float& rhs ) const
+    {
+        Vec4 ret;
+        ret.x_ = x_ / rhs;
+        ret.y_ = y_ / rhs;
+        ret.z_ = z_ / rhs;
+        ret.w_ = w_ / rhs;
+        return ret;
+    }
+
+    Vec4& operator/=( const float& rhs )
+    {
+        x_ = x_ / rhs;
+        y_ = y_ / rhs;
+        z_ = z_ / rhs;
+        w_ = w_ / rhs;
+        return *this;
+    }
+
+    //Compare
+    bool operator==( const Vec4& rhs ) const
+    {
+        if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ || w_ != rhs.w_ )
+            return false;
+        return true;
+    }
+
+    bool operator!=( const Vec4& rhs ) const
+    {
+        if( x_ == rhs.x_ )
+            return false;
+
+        return true;
+    }
+
+    Vec4 operator*( const Mat4& rhs ) const;
+
+    float Length() const
+    {
+        return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_ );
+    }
+
+    Vec4 Normalize()
+    {
+        float len = Length();
+        x_ = x_ / len;
+        y_ = y_ / len;
+        z_ = z_ / len;
+        w_ = w_ / len;
+        return *this;
+    }
+
+    float Dot( const Vec3& rhs )
+    {
+        return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+    }
+
+    Vec3 Cross( const Vec3& rhs )
+    {
+        Vec3 ret;
+        ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+        ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+        ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+        return ret;
+    }
+
+    bool Validate()
+    {
+        if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) || isnan( w_ ) )
+            return false;
+        return true;
+    }
+
+    void Value( float& fX, float& fY, float& fZ, float& fW )
+    {
+        fX = x_;
+        fY = y_;
+        fZ = z_;
+        fW = w_;
+    }
+};
+
+/******************************************************************
+ * 4x4 matrix
+ *
+ */
+class Mat4
+{
+private:
+    float f_[16];
+
+public:
+    friend class Vec3;
+    friend class Vec4;
+    friend class Quaternion;
+
+    Mat4();
+    Mat4( const float* );
+
+    Mat4 operator*( const Mat4& rhs ) const;
+    Vec4 operator*( const Vec4& rhs ) const;
+
+    Mat4 operator+( const Mat4& rhs ) const
+    {
+        Mat4 ret;
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            ret.f_[i] = f_[i] + rhs.f_[i];
+        }
+        return ret;
+    }
+
+    Mat4 operator-( const Mat4& rhs ) const
+    {
+        Mat4 ret;
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            ret.f_[i] = f_[i] - rhs.f_[i];
+        }
+        return ret;
+    }
+
+    Mat4& operator+=( const Mat4& rhs )
+    {
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            f_[i] += rhs.f_[i];
+        }
+        return *this;
+    }
+
+    Mat4& operator-=( const Mat4& rhs )
+    {
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            f_[i] -= rhs.f_[i];
+        }
+        return *this;
+    }
+
+    Mat4& operator*=( const Mat4& rhs )
+    {
+        Mat4 ret;
+        ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+                + f_[12] * rhs.f_[3];
+        ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+                + f_[13] * rhs.f_[3];
+        ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+                + f_[14] * rhs.f_[3];
+        ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+                + f_[15] * rhs.f_[3];
+
+        ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+                + f_[12] * rhs.f_[7];
+        ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+                + f_[13] * rhs.f_[7];
+        ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+                + f_[14] * rhs.f_[7];
+        ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+                + f_[15] * rhs.f_[7];
+
+        ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+                + f_[12] * rhs.f_[11];
+        ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+                + f_[13] * rhs.f_[11];
+        ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+                + f_[14] * rhs.f_[11];
+        ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+                + f_[15] * rhs.f_[11];
+
+        ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+                + f_[12] * rhs.f_[15];
+        ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+                + f_[13] * rhs.f_[15];
+        ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+                + f_[14] * rhs.f_[15];
+        ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+                + f_[15] * rhs.f_[15];
+
+        *this = ret;
+        return *this;
+    }
+
+    Mat4 operator*( const float rhs )
+    {
+        Mat4 ret;
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            ret.f_[i] = f_[i] * rhs;
+        }
+        return ret;
+    }
+
+    Mat4& operator*=( const float rhs )
+    {
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            f_[i] *= rhs;
+        }
+        return *this;
+    }
+
+    Mat4& operator=( const Mat4& rhs )
+    {
+        for( int32_t i = 0; i < 16; ++i )
+        {
+            f_[i] = rhs.f_[i];
+        }
+        return *this;
+    }
+
+    Mat4 Inverse();
+
+    Mat4 Transpose()
+    {
+        Mat4 ret;
+        ret.f_[0] = f_[0];
+        ret.f_[1] = f_[4];
+        ret.f_[2] = f_[8];
+        ret.f_[3] = f_[12];
+        ret.f_[4] = f_[1];
+        ret.f_[5] = f_[5];
+        ret.f_[6] = f_[9];
+        ret.f_[7] = f_[13];
+        ret.f_[8] = f_[2];
+        ret.f_[9] = f_[6];
+        ret.f_[10] = f_[10];
+        ret.f_[11] = f_[14];
+        ret.f_[12] = f_[3];
+        ret.f_[13] = f_[7];
+        ret.f_[14] = f_[11];
+        ret.f_[15] = f_[15];
+        *this = ret;
+        return *this;
+    }
+
+    Mat4& PostTranslate( float tx, float ty, float tz )
+    {
+        f_[12] += (tx * f_[0]) + (ty * f_[4]) + (tz * f_[8]);
+        f_[13] += (tx * f_[1]) + (ty * f_[5]) + (tz * f_[9]);
+        f_[14] += (tx * f_[2]) + (ty * f_[6]) + (tz * f_[10]);
+        f_[15] += (tx * f_[3]) + (ty * f_[7]) + (tz * f_[11]);
+        return *this;
+    }
+
+    float* Ptr()
+    {
+        return f_;
+    }
+
+    //--------------------------------------------------------------------------------
+    // Misc
+    //--------------------------------------------------------------------------------
+    static Mat4 Perspective( float width, float height, float nearPlane, float farPlane );
+
+    static Mat4 LookAt( const Vec3& vEye, const Vec3& vAt, const Vec3& vUp );
+
+    static Mat4 Translation( const float fX, const float fY, const float fZ );
+    static Mat4 Translation( const Vec3 vec );
+
+    static Mat4 RotationX( const float angle );
+
+    static Mat4 RotationY( const float angle );
+
+    static Mat4 RotationZ( const float angle );
+
+    static Mat4 Identity()
+    {
+        Mat4 ret;
+        ret.f_[0] = 1.f;
+        ret.f_[1] = 0;
+        ret.f_[2] = 0;
+        ret.f_[3] = 0;
+        ret.f_[4] = 0;
+        ret.f_[5] = 1.f;
+        ret.f_[6] = 0;
+        ret.f_[7] = 0;
+        ret.f_[8] = 0;
+        ret.f_[9] = 0;
+        ret.f_[10] = 1.f;
+        ret.f_[11] = 0;
+        ret.f_[12] = 0;
+        ret.f_[13] = 0;
+        ret.f_[14] = 0;
+        ret.f_[15] = 1.f;
+        return ret;
+    }
+
+    void Dump()
+    {
+        LOGI( "%f %f %f %f", f_[0], f_[1], f_[2], f_[3] );
+        LOGI( "%f %f %f %f", f_[4], f_[5], f_[6], f_[7] );
+        LOGI( "%f %f %f %f", f_[8], f_[9], f_[10], f_[11] );
+        LOGI( "%f %f %f %f", f_[12], f_[13], f_[14], f_[15] );
+    }
+};
+
+/******************************************************************
+ * Quaternion class
+ *
+ */
+class Quaternion
+{
+private:
+    float x_, y_, z_, w_;
+
+public:
+    friend class Vec3;
+    friend class Vec4;
+    friend class Mat4;
+
+    Quaternion()
+    {
+        x_ = 0.f;
+        y_ = 0.f;
+        z_ = 0.f;
+        w_ = 1.f;
+    }
+
+    Quaternion( const float fX, const float fY, const float fZ, const float fW )
+    {
+        x_ = fX;
+        y_ = fY;
+        z_ = fZ;
+        w_ = fW;
+    }
+
+    Quaternion( const Vec3 vec, const float fW )
+    {
+        x_ = vec.x_;
+        y_ = vec.y_;
+        z_ = vec.z_;
+        w_ = fW;
+    }
+
+    Quaternion( const float* p )
+    {
+        x_ = *p++;
+        y_ = *p++;
+        z_ = *p++;
+        w_ = *p++;
+    }
+
+    Quaternion operator*( const Quaternion rhs )
+    {
+        Quaternion ret;
+        ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+        ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+        ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+        ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+        return ret;
+    }
+
+    Quaternion& operator*=( const Quaternion rhs )
+    {
+        Quaternion ret;
+        ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+        ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+        ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+        ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+        *this = ret;
+        return *this;
+    }
+
+    Quaternion Conjugate()
+    {
+        x_ = -x_;
+        y_ = -y_;
+        z_ = -z_;
+        return *this;
+    }
+
+    //Non destuctive version
+    Quaternion Conjugated()
+    {
+        Quaternion ret;
+        ret.x_ = -x_;
+        ret.y_ = -y_;
+        ret.z_ = -z_;
+        ret.w_ = w_;
+        return ret;
+    }
+
+    void ToMatrix( Mat4& mat )
+    {
+        float x2 = x_ * x_ * 2.0f;
+        float y2 = y_ * y_ * 2.0f;
+        float z2 = z_ * z_ * 2.0f;
+        float xy = x_ * y_ * 2.0f;
+        float yz = y_ * z_ * 2.0f;
+        float zx = z_ * x_ * 2.0f;
+        float xw = x_ * w_ * 2.0f;
+        float yw = y_ * w_ * 2.0f;
+        float zw = z_ * w_ * 2.0f;
+
+        mat.f_[0] = 1.0f - y2 - z2;
+        mat.f_[1] = xy + zw;
+        mat.f_[2] = zx - yw;
+        mat.f_[4] = xy - zw;
+        mat.f_[5] = 1.0f - z2 - x2;
+        mat.f_[6] = yz + xw;
+        mat.f_[8] = zx + yw;
+        mat.f_[9] = yz - xw;
+        mat.f_[10] = 1.0f - x2 - y2;
+
+        mat.f_[3] = mat.f_[7] = mat.f_[11] = mat.f_[12] = mat.f_[13] = mat.f_[14] = 0.0f;
+        mat.f_[15] = 1.0f;
+    }
+
+    void ToMatrixPreserveTranslate( Mat4& mat )
+    {
+        float x2 = x_ * x_ * 2.0f;
+        float y2 = y_ * y_ * 2.0f;
+        float z2 = z_ * z_ * 2.0f;
+        float xy = x_ * y_ * 2.0f;
+        float yz = y_ * z_ * 2.0f;
+        float zx = z_ * x_ * 2.0f;
+        float xw = x_ * w_ * 2.0f;
+        float yw = y_ * w_ * 2.0f;
+        float zw = z_ * w_ * 2.0f;
+
+        mat.f_[0] = 1.0f - y2 - z2;
+        mat.f_[1] = xy + zw;
+        mat.f_[2] = zx - yw;
+        mat.f_[4] = xy - zw;
+        mat.f_[5] = 1.0f - z2 - x2;
+        mat.f_[6] = yz + xw;
+        mat.f_[8] = zx + yw;
+        mat.f_[9] = yz - xw;
+        mat.f_[10] = 1.0f - x2 - y2;
+
+        mat.f_[3] = mat.f_[7] = mat.f_[11] = 0.0f;
+        mat.f_[15] = 1.0f;
+    }
+
+    static Quaternion RotationAxis( const Vec3 axis, const float angle )
+    {
+        Quaternion ret;
+        float s = sinf( angle / 2 );
+        ret.x_ = s * axis.x_;
+        ret.y_ = s * axis.y_;
+        ret.z_ = s * axis.z_;
+        ret.w_ = cosf( angle / 2 );
+        return ret;
+    }
+
+    void Value( float& fX, float& fY, float& fZ, float& fW )
+    {
+        fX = x_;
+        fY = y_;
+        fZ = z_;
+        fW = w_;
+    }
+};
+
+} //namespace ndk_helper
+#endif /* VECMATH_H_ */
diff --git a/ndk/tools/headers-diff-bionic-vs-ndk.py b/ndk/tools/headers-diff-bionic-vs-ndk.py
index 1f8a9e3..cb4157d 100755
--- a/ndk/tools/headers-diff-bionic-vs-ndk.py
+++ b/ndk/tools/headers-diff-bionic-vs-ndk.py
@@ -152,7 +152,8 @@
                 path_bionic = os.path.join(self.bionic_root, arch_root, 'include', root)
                 ## for every header that both in Bionic and sysroot ##
                 for include in pack[1]:
-                    if include in self.sysincludes[arch][root]:
+                    if (root in self.sysincludes[arch]) and \
+                    (include in self.sysincludes[arch][root]):
                         ## completing paths ##
                         platform = self.sysincludes[arch][root][include][0]
                         file_origin = os.path.join(path_bionic, include)
diff --git a/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java b/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
index c9e840f..f71cf9f 100644
--- a/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
+++ b/samples/AccelerometerPlay/src/com/example/android/accelerometerplay/AccelerometerPlayActivity.java
@@ -165,7 +165,7 @@
                 final float gy = -sy * m;
 
                 /*
-                 * ·F = mA <=> A = ·F / m We could simplify the code by
+                 * F = mA <=> A = F / m We could simplify the code by
                  * completely eliminating "m" (the mass) from all the equations,
                  * but it would hide the concepts from this sample code.
                  */
@@ -175,12 +175,12 @@
 
                 /*
                  * Time-corrected Verlet integration The position Verlet
-                 * integrator is defined as x(t+Æt) = x(t) + x(t) - x(t-Æt) +
-                 * a(t)Ætö2 However, the above equation doesn't handle variable
-                 * Æt very well, a time-corrected version is needed: x(t+Æt) =
-                 * x(t) + (x(t) - x(t-Æt)) * (Æt/Æt_prev) + a(t)Ætö2 We also add
-                 * a simple friction term (f) to the equation: x(t+Æt) = x(t) +
-                 * (1-f) * (x(t) - x(t-Æt)) * (Æt/Æt_prev) + a(t)Ætö2
+                 * integrator is defined as x(t+dt) = x(t) + x(t) - x(t-dt) +
+                 * a(t).t^2 However, the above equation doesn't handle variable
+                 * dt very well, a time-corrected version is needed: x(t+dt) =
+                 * x(t) + (x(t) - x(t-dt)) * (dt/dt_prev) + a(t).t^2 We also add
+                 * a simple friction term (f) to the equation: x(t+dt) = x(t) +
+                 * (1-f) * (x(t) - x(t-dt)) * (dt/dt_prev) + a(t)t^2
                  */
                 final float dTdT = dT * dT;
                 final float x = mPosX + mOneMinusFriction * dTC * (mPosX - mLastPosX) + mAccelX
diff --git a/samples/Support7Demos/Android.mk b/samples/Support7Demos/Android.mk
index 0e43e3d..ca8310f 100644
--- a/samples/Support7Demos/Android.mk
+++ b/samples/Support7Demos/Android.mk
@@ -26,7 +26,8 @@
         android-support-v4 \
         android-support-v7-appcompat \
         android-support-v7-gridlayout \
-        android-support-v7-mediarouter
+        android-support-v7-mediarouter \
+        android-support-v7-recyclerview
 LOCAL_RESOURCE_DIR = \
         $(LOCAL_PATH)/res \
         frameworks/support/v7/appcompat/res \
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
index 4735433..6f9b237 100644
--- a/samples/Support7Demos/AndroidManifest.xml
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -38,6 +38,7 @@
             android:compatibleWidthLimitDp="480" />
 
     <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
             android:icon="@drawable/app_sample_code"
             android:hardwareAccelerated="true">
 
@@ -172,5 +173,33 @@
             </intent-filter>
         </activity>
 
+        <!-- RecyclerView samples -->
+        <activity android:name=".widget.RecyclerViewActivity"
+                  android:label="@string/recycler_view"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AnimatedRecyclerView"
+                  android:label="@string/animated_recycler_view"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.LinearLayoutManagerActivity"
+                  android:label="@string/linear_layout_manager"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
     </application>
 </manifest>
diff --git a/samples/Support7Demos/res/layout/activity_linear_layout_manager.xml b/samples/Support7Demos/res/layout/activity_linear_layout_manager.xml
new file mode 100644
index 0000000..d671c73
--- /dev/null
+++ b/samples/Support7Demos/res/layout/activity_linear_layout_manager.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <LinearLayout
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+        <EditText
+                android:id="@+id/scroll_offset"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:inputType="numberSigned"
+                android:hint="offset"/>
+        <Spinner
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/spinner"/>
+        <CheckBox
+                android:id="@+id/enable_smooth_scroll"
+                android:text="smooth scroll"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+    <android.support.v7.widget.RecyclerView
+            android:layout_width="fill_parent"
+            android:layout_height="60dp"
+            android:scrollbars="horizontal"
+            android:id="@+id/config_recycler_view"/>
+    <android.support.v7.widget.RecyclerView
+            android:background="#ff0099cc"
+            android:scrollbarStyle="insideOverlay"
+            android:scrollbars="horizontal|vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:id="@+id/recycler_view"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/animated_recycler_view.xml b/samples/Support7Demos/res/layout/animated_recycler_view.xml
new file mode 100644
index 0000000..188a154
--- /dev/null
+++ b/samples/Support7Demos/res/layout/animated_recycler_view.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:id="@+id/container"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <CheckBox
+            android:id="@+id/enableAnimations"
+            android:checked="true"
+            android:text="@string/enableAnimations"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:orientation="horizontal"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content">
+
+        <Button
+                android:id="@+id/deleteButton"
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="deleteItem"
+                android:text="@string/delete_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="addItem"
+                android:text="@string/add_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="addDeleteItem"
+                android:text="@string/add_delete_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="deleteAddItem"
+                android:text="@string/delete_add_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="d1a2d3"
+                android:text="@string/d1a2d3"/>
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/selectable_item.xml b/samples/Support7Demos/res/layout/selectable_item.xml
new file mode 100644
index 0000000..65a23cc
--- /dev/null
+++ b/samples/Support7Demos/res/layout/selectable_item.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="horizontal"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <CheckBox
+            android:id="@+id/selected"
+            android:onClick="checkboxClicked"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    <TextView
+            android:id="@+id/text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
index 1b13623..7e4e03c 100644
--- a/samples/Support7Demos/res/values/strings.xml
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -95,4 +95,18 @@
     <string name="sample_media_route_activity_local">Local Playback</string>
     <string name="sample_media_route_activity_presentation">Local Playback on Presentation Display</string>
 
+    <string name="recycler_view">RecyclerView/RecyclerViewActivity</string>
+    <string name="animated_recycler_view">RecyclerView/AnimatedRecyclerView</string>
+    <string name="linear_layout_manager">Linear Layout Manager</string>
+    <string name="checkbox_orientation">Horz.</string>
+    <string name="checkbox_reverse">Rev.</string>
+    <string name="checkbox_layout_dir">Layout Dir</string>
+    <string name="checkbox_stack_from_end">Stack From End</string>
+    <string name="enableAnimations">Animate Changes</string>
+    <string name="add_item">Add</string>
+    <string name="delete_item">Delete</string>
+    <string name="add_delete_item">A+D</string>
+    <string name="delete_add_item">D+A</string>
+    <string name="d1a2d3">d1a2d3</string>
+
 </resources>
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java b/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java
new file mode 100644
index 0000000..a66b1d6
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7;
+
+public class Cheeses {
+
+    public static final String[] sCheeseStrings = {
+            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi",
+            "Acorn", "Adelost", "Affidelice au Chablis", "Afuega'l Pitu", "Airag", "Airedale",
+            "Aisy Cendre", "Allgauer Emmentaler", "Alverca", "Ambert", "American Cheese",
+            "Ami du Chambertin", "Anejo Enchilado", "Anneau du Vic-Bilh", "Anthoriro", "Appenzell",
+            "Aragon", "Ardi Gasna", "Ardrahan", "Armenian String", "Aromes au Gene de Marc",
+            "Asadero", "Asiago", "Aubisque Pyrenees", "Autun", "Avaxtskyr", "Baby Swiss",
+            "Babybel", "Baguette Laonnaise", "Bakers", "Baladi", "Balaton", "Bandal", "Banon",
+            "Barry's Bay Cheddar", "Basing", "Basket Cheese", "Bath Cheese", "Bavarian Bergkase",
+            "Baylough", "Beaufort", "Beauvoorde", "Beenleigh Blue", "Beer Cheese", "Bel Paese",
+            "Bergader", "Bergere Bleue", "Berkswell", "Beyaz Peynir", "Bierkase", "Bishop Kennedy",
+            "Blarney", "Bleu d'Auvergne", "Bleu de Gex", "Bleu de Laqueuille",
+            "Bleu de Septmoncel", "Bleu Des Causses", "Blue", "Blue Castello", "Blue Rathgore",
+            "Blue Vein (Australian)", "Blue Vein Cheeses", "Bocconcini", "Bocconcini (Australian)",
+            "Boeren Leidenkaas", "Bonchester", "Bosworth", "Bougon", "Boule Du Roves",
+            "Boulette d'Avesnes", "Boursault", "Boursin", "Bouyssou", "Bra", "Braudostur",
+            "Breakfast Cheese", "Brebis du Lavort", "Brebis du Lochois", "Brebis du Puyfaucon",
+            "Bresse Bleu", "Brick", "Brie", "Brie de Meaux", "Brie de Melun", "Brillat-Savarin",
+            "Brin", "Brin d' Amour", "Brin d'Amour", "Brinza (Burduf Brinza)",
+            "Briquette de Brebis", "Briquette du Forez", "Broccio", "Broccio Demi-Affine",
+            "Brousse du Rove", "Bruder Basil", "Brusselae Kaas (Fromage de Bruxelles)", "Bryndza",
+            "Buchette d'Anjou", "Buffalo", "Burgos", "Butte", "Butterkase", "Button (Innes)",
+            "Buxton Blue", "Cabecou", "Caboc", "Cabrales", "Cachaille", "Caciocavallo", "Caciotta",
+            "Caerphilly", "Cairnsmore", "Calenzana", "Cambazola", "Camembert de Normandie",
+            "Canadian Cheddar", "Canestrato", "Cantal", "Caprice des Dieux", "Capricorn Goat",
+            "Capriole Banon", "Carre de l'Est", "Casciotta di Urbino", "Cashel Blue", "Castellano",
+            "Castelleno", "Castelmagno", "Castelo Branco", "Castigliano", "Cathelain",
+            "Celtic Promise", "Cendre d'Olivet", "Cerney", "Chabichou", "Chabichou du Poitou",
+            "Chabis de Gatine", "Chaource", "Charolais", "Chaumes", "Cheddar",
+            "Cheddar Clothbound", "Cheshire", "Chevres", "Chevrotin des Aravis", "Chontaleno",
+            "Civray", "Coeur de Camembert au Calvados", "Coeur de Chevre", "Colby", "Cold Pack",
+            "Comte", "Coolea", "Cooleney", "Coquetdale", "Corleggy", "Cornish Pepper",
+            "Cotherstone", "Cotija", "Cottage Cheese", "Cottage Cheese (Australian)",
+            "Cougar Gold", "Coulommiers", "Coverdale", "Crayeux de Roncq", "Cream Cheese",
+            "Cream Havarti", "Crema Agria", "Crema Mexicana", "Creme Fraiche", "Crescenza",
+            "Croghan", "Crottin de Chavignol", "Crottin du Chavignol", "Crowdie", "Crowley",
+            "Cuajada", "Curd", "Cure Nantais", "Curworthy", "Cwmtawe Pecorino",
+            "Cypress Grove Chevre", "Danablu (Danish Blue)", "Danbo", "Danish Fontina",
+            "Daralagjazsky", "Dauphin", "Delice des Fiouves", "Denhany Dorset Drum", "Derby",
+            "Dessertnyj Belyj", "Devon Blue", "Devon Garland", "Dolcelatte", "Doolin",
+            "Doppelrhamstufel", "Dorset Blue Vinney", "Double Gloucester", "Double Worcester",
+            "Dreux a la Feuille", "Dry Jack", "Duddleswell", "Dunbarra", "Dunlop", "Dunsyre Blue",
+            "Duroblando", "Durrus", "Dutch Mimolette (Commissiekaas)", "Edam", "Edelpilz",
+            "Emental Grand Cru", "Emlett", "Emmental", "Epoisses de Bourgogne", "Esbareich",
+            "Esrom", "Etorki", "Evansdale Farmhouse Brie", "Evora De L'Alentejo", "Exmoor Blue",
+            "Explorateur", "Feta", "Feta (Australian)", "Figue", "Filetta", "Fin-de-Siecle",
+            "Finlandia Swiss", "Finn", "Fiore Sardo", "Fleur du Maquis", "Flor de Guia",
+            "Flower Marie", "Folded", "Folded cheese with mint", "Fondant de Brebis",
+            "Fontainebleau", "Fontal", "Fontina Val d'Aosta", "Formaggio di capra", "Fougerus",
+            "Four Herb Gouda", "Fourme d' Ambert", "Fourme de Haute Loire", "Fourme de Montbrison",
+            "Fresh Jack", "Fresh Mozzarella", "Fresh Ricotta", "Fresh Truffles", "Fribourgeois",
+            "Friesekaas", "Friesian", "Friesla", "Frinault", "Fromage a Raclette", "Fromage Corse",
+            "Fromage de Montagne de Savoie", "Fromage Frais", "Fruit Cream Cheese",
+            "Frying Cheese", "Fynbo", "Gabriel", "Galette du Paludier", "Galette Lyonnaise",
+            "Galloway Goat's Milk Gems", "Gammelost", "Gaperon a l'Ail", "Garrotxa", "Gastanberra",
+            "Geitost", "Gippsland Blue", "Gjetost", "Gloucester", "Golden Cross", "Gorgonzola",
+            "Gornyaltajski", "Gospel Green", "Gouda", "Goutu", "Gowrie", "Grabetto", "Graddost",
+            "Grafton Village Cheddar", "Grana", "Grana Padano", "Grand Vatel",
+            "Grataron d' Areches", "Gratte-Paille", "Graviera", "Greuilh", "Greve",
+            "Gris de Lille", "Gruyere", "Gubbeen", "Guerbigny", "Halloumi",
+            "Halloumy (Australian)", "Haloumi-Style Cheese", "Harbourne Blue", "Havarti",
+            "Heidi Gruyere", "Hereford Hop", "Herrgardsost", "Herriot Farmhouse", "Herve",
+            "Hipi Iti", "Hubbardston Blue Cow", "Hushallsost", "Iberico", "Idaho Goatster",
+            "Idiazabal", "Il Boschetto al Tartufo", "Ile d'Yeu", "Isle of Mull", "Jarlsberg",
+            "Jermi Tortes", "Jibneh Arabieh", "Jindi Brie", "Jubilee Blue", "Juustoleipa",
+            "Kadchgall", "Kaseri", "Kashta", "Kefalotyri", "Kenafa", "Kernhem", "Kervella Affine",
+            "Kikorangi", "King Island Cape Wickham Brie", "King River Gold", "Klosterkaese",
+            "Knockalara", "Kugelkase", "L'Aveyronnais", "L'Ecir de l'Aubrac", "La Taupiniere",
+            "La Vache Qui Rit", "Laguiole", "Lairobell", "Lajta", "Lanark Blue", "Lancashire",
+            "Langres", "Lappi", "Laruns", "Lavistown", "Le Brin", "Le Fium Orbo", "Le Lacandou",
+            "Le Roule", "Leafield", "Lebbene", "Leerdammer", "Leicester", "Leyden", "Limburger",
+            "Lincolnshire Poacher", "Lingot Saint Bousquet d'Orb", "Liptauer", "Little Rydings",
+            "Livarot", "Llanboidy", "Llanglofan Farmhouse", "Loch Arthur Farmhouse",
+            "Loddiswell Avondale", "Longhorn", "Lou Palou", "Lou Pevre", "Lyonnais", "Maasdam",
+            "Macconais", "Mahoe Aged Gouda", "Mahon", "Malvern", "Mamirolle", "Manchego",
+            "Manouri", "Manur", "Marble Cheddar", "Marbled Cheeses", "Maredsous", "Margotin",
+            "Maribo", "Maroilles", "Mascares", "Mascarpone", "Mascarpone (Australian)",
+            "Mascarpone Torta", "Matocq", "Maytag Blue", "Meira", "Menallack Farmhouse",
+            "Menonita", "Meredith Blue", "Mesost", "Metton (Cancoillotte)", "Meyer Vintage Gouda",
+            "Mihalic Peynir", "Milleens", "Mimolette", "Mine-Gabhar", "Mini Baby Bells", "Mixte",
+            "Molbo", "Monastery Cheeses", "Mondseer", "Mont D'or Lyonnais", "Montasio",
+            "Monterey Jack", "Monterey Jack Dry", "Morbier", "Morbier Cru de Montagne",
+            "Mothais a la Feuille", "Mozzarella", "Mozzarella (Australian)",
+            "Mozzarella di Bufala", "Mozzarella Fresh, in water", "Mozzarella Rolls", "Munster",
+            "Murol", "Mycella", "Myzithra", "Naboulsi", "Nantais", "Neufchatel",
+            "Neufchatel (Australian)", "Niolo", "Nokkelost", "Northumberland", "Oaxaca",
+            "Olde York", "Olivet au Foin", "Olivet Bleu", "Olivet Cendre",
+            "Orkney Extra Mature Cheddar", "Orla", "Oschtjepka", "Ossau Fermier", "Ossau-Iraty",
+            "Oszczypek", "Oxford Blue", "P'tit Berrichon", "Palet de Babligny", "Paneer", "Panela",
+            "Pannerone", "Pant ys Gawn", "Parmesan (Parmigiano)", "Parmigiano Reggiano",
+            "Pas de l'Escalette", "Passendale", "Pasteurized Processed", "Pate de Fromage",
+            "Patefine Fort", "Pave d'Affinois", "Pave d'Auge", "Pave de Chirac", "Pave du Berry",
+            "Pecorino", "Pecorino in Walnut Leaves", "Pecorino Romano", "Peekskill Pyramid",
+            "Pelardon des Cevennes", "Pelardon des Corbieres", "Penamellera", "Penbryn",
+            "Pencarreg", "Perail de Brebis", "Petit Morin", "Petit Pardou", "Petit-Suisse",
+            "Picodon de Chevre", "Picos de Europa", "Piora", "Pithtviers au Foin",
+            "Plateau de Herve", "Plymouth Cheese", "Podhalanski", "Poivre d'Ane", "Polkolbin",
+            "Pont l'Eveque", "Port Nicholson", "Port-Salut", "Postel", "Pouligny-Saint-Pierre",
+            "Pourly", "Prastost", "Pressato", "Prince-Jean", "Processed Cheddar", "Provolone",
+            "Provolone (Australian)", "Pyengana Cheddar", "Pyramide", "Quark",
+            "Quark (Australian)", "Quartirolo Lombardo", "Quatre-Vents", "Quercy Petit",
+            "Queso Blanco", "Queso Blanco con Frutas --Pina y Mango", "Queso de Murcia",
+            "Queso del Montsec", "Queso del Tietar", "Queso Fresco", "Queso Fresco (Adobera)",
+            "Queso Iberico", "Queso Jalapeno", "Queso Majorero", "Queso Media Luna",
+            "Queso Para Frier", "Queso Quesadilla", "Rabacal", "Raclette", "Ragusano", "Raschera",
+            "Reblochon", "Red Leicester", "Regal de la Dombes", "Reggianito", "Remedou",
+            "Requeson", "Richelieu", "Ricotta", "Ricotta (Australian)", "Ricotta Salata", "Ridder",
+            "Rigotte", "Rocamadour", "Rollot", "Romano", "Romans Part Dieu", "Roncal", "Roquefort",
+            "Roule", "Rouleau De Beaulieu", "Royalp Tilsit", "Rubens", "Rustinu", "Saaland Pfarr",
+            "Saanenkaese", "Saga", "Sage Derby", "Sainte Maure", "Saint-Marcellin",
+            "Saint-Nectaire", "Saint-Paulin", "Salers", "Samso", "San Simon", "Sancerre",
+            "Sap Sago", "Sardo", "Sardo Egyptian", "Sbrinz", "Scamorza", "Schabzieger", "Schloss",
+            "Selles sur Cher", "Selva", "Serat", "Seriously Strong Cheddar", "Serra da Estrela",
+            "Sharpam", "Shelburne Cheddar", "Shropshire Blue", "Siraz", "Sirene", "Smoked Gouda",
+            "Somerset Brie", "Sonoma Jack", "Sottocenare al Tartufo", "Soumaintrain",
+            "Sourire Lozerien", "Spenwood", "Sraffordshire Organic", "St. Agur Blue Cheese",
+            "Stilton", "Stinking Bishop", "String", "Sussex Slipcote", "Sveciaost", "Swaledale",
+            "Sweet Style Swiss", "Swiss", "Syrian (Armenian String)", "Tala", "Taleggio", "Tamie",
+            "Tasmania Highland Chevre Log", "Taupiniere", "Teifi", "Telemea", "Testouri",
+            "Tete de Moine", "Tetilla", "Texas Goat Cheese", "Tibet", "Tillamook Cheddar",
+            "Tilsit", "Timboon Brie", "Toma", "Tomme Brulee", "Tomme d'Abondance",
+            "Tomme de Chevre", "Tomme de Romans", "Tomme de Savoie", "Tomme des Chouans", "Tommes",
+            "Torta del Casar", "Toscanello", "Touree de L'Aubier", "Tourmalet",
+            "Trappe (Veritable)", "Trois Cornes De Vendee", "Tronchon", "Trou du Cru", "Truffe",
+            "Tupi", "Turunmaa", "Tymsboro", "Tyn Grug", "Tyning", "Ubriaco", "Ulloa",
+            "Vacherin-Fribourgeois", "Valencay", "Vasterbottenost", "Venaco", "Vendomois",
+            "Vieux Corse", "Vignotte", "Vulscombe", "Waimata Farmhouse Blue",
+            "Washed Rind Cheese (Australian)", "Waterloo", "Weichkaese", "Wellington",
+            "Wensleydale", "White Stilton", "Whitestone Farmhouse", "Wigmore", "Woodside Cabecou",
+            "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue",
+            "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano"
+    };
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
new file mode 100644
index 0000000..83cf4d3
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
@@ -0,0 +1,454 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.widget;
+
+import android.widget.CompoundButton;
+import com.example.android.supportv7.R;
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.RecyclerView;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class AnimatedRecyclerView extends Activity {
+
+    private static final int SCROLL_DISTANCE = 80; // dp
+
+    private RecyclerView mRecyclerView;
+
+    private int mNumItemsAdded = 0;
+    ArrayList<String> mItems = new ArrayList<String>();
+    MyAdapter mAdapter;
+
+    static final boolean USE_CUSTOM_ANIMATIONS = false;
+
+    boolean mAnimationsEnabled = true;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.animated_recycler_view);
+
+        ViewGroup container = (ViewGroup) findViewById(R.id.container);
+        mRecyclerView = new RecyclerView(this);
+        mRecyclerView.setLayoutManager(new MyLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT));
+        for (int i = 0; i < 6; ++i) {
+            mItems.add("Item #" + i);
+        }
+        mAdapter = new MyAdapter(mItems);
+        mRecyclerView.setAdapter(mAdapter);
+        container.addView(mRecyclerView);
+
+        CheckBox enableAnimations = (CheckBox) findViewById(R.id.enableAnimations);
+        enableAnimations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                mAnimationsEnabled = isChecked;
+            }
+        });
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        mRecyclerView.requestLayout();
+        return super.onOptionsItemSelected(item);
+    }
+
+    public void checkboxClicked(View view) {
+        ViewGroup parent = (ViewGroup) view.getParent();
+        boolean selected = ((CheckBox) view).isChecked();
+        MyViewHolder holder = (MyViewHolder) mRecyclerView.getChildViewHolder(parent);
+        mAdapter.selectItem(holder, selected);
+    }
+
+    public void deleteItem(View view) {
+        int numItems = mItems.size();
+        if (numItems > 0) {
+            for (int i = numItems - 1; i >= 0; --i) {
+                final String itemText = mItems.get(i);
+                boolean selected = mAdapter.mSelected.get(itemText);
+                if (selected) {
+                    removeAtPosition(i);
+                }
+            }
+        }
+    }
+
+    private String generateNewText() {
+        return "Added Item #" + mNumItemsAdded++;
+    }
+
+    public void d1a2d3(View view) {
+        removeAtPosition(1);
+        addAtPosition(2, "Added Item #" + mNumItemsAdded++);
+        removeAtPosition(3);
+    }
+
+    private void removeAtPosition(int position) {
+        mItems.remove(position);
+        mAdapter.notifyItemRemoved(position);
+    }
+
+    private void addAtPosition(int position, String text) {
+        mItems.add(position, text);
+        mAdapter.mSelected.put(text, Boolean.FALSE);
+        mAdapter.notifyItemInserted(position);
+    }
+
+    public void addDeleteItem(View view) {
+        addItem(view);
+        deleteItem(view);
+    }
+
+    public void deleteAddItem(View view) {
+        deleteItem(view);
+        addItem(view);
+    }
+
+    public void addItem(View view) {
+        addAtPosition(3, "Added Item #" + mNumItemsAdded++);
+    }
+
+    /**
+     * A basic ListView-style LayoutManager.
+     */
+    class MyLayoutManager extends RecyclerView.LayoutManager {
+        private static final String TAG = "MyLayoutManager";
+        private int mFirstPosition;
+        private final int mScrollDistance;
+
+        public MyLayoutManager(Context c) {
+            final DisplayMetrics dm = c.getResources().getDisplayMetrics();
+            mScrollDistance = (int) (SCROLL_DISTANCE * dm.density + 0.5f);
+        }
+
+        @Override
+        public boolean supportsItemAnimations() {
+            return mAnimationsEnabled;
+        }
+
+        @Override
+        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+            int parentBottom = getHeight() - getPaddingBottom();
+
+            final View oldTopView = getChildCount() > 0 ? getChildAt(0) : null;
+            int oldTop = getPaddingTop();
+            if (oldTopView != null) {
+                oldTop = Math.min(oldTopView.getTop(), oldTop);
+            }
+
+            // Note that we add everything to the scrap, but we do not clean it up;
+            // that is handled by the RecyclerView after this method returns
+            detachAndScrapAttachedViews(recycler);
+
+            int top = oldTop;
+            int bottom = top;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            int count = state.getItemCount();
+            for (int i = 0; mFirstPosition + i < count && top < parentBottom; i++, top = bottom) {
+                View v = recycler.getViewForPosition(mFirstPosition + i);
+
+                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams();
+                if (!params.isItemRemoved()) {
+                    addView(v);
+                }
+                measureChild(v, 0, 0);
+                bottom = top + v.getMeasuredHeight();
+                v.layout(left, top, right, bottom);
+                if (params.isItemRemoved()) {
+                    parentBottom += v.getHeight();
+                }
+            }
+
+            // Now that we've run a full layout, figure out which views were not used
+            // (cached in previousViews). For each of these views, position it where
+            // it would go, according to its position relative to the visible
+            // positions in the list. This information will be used by RecyclerView to
+            // record post-layout positions of these items for the purposes of animating them
+            // out of view
+
+            View lastVisibleView = getChildAt(getChildCount() - 1);
+            if (lastVisibleView != null) {
+                RecyclerView.LayoutParams lastParams =
+                        (RecyclerView.LayoutParams) lastVisibleView.getLayoutParams();
+                int lastPosition = lastParams.getViewPosition();
+                final List<RecyclerView.ViewHolder> previousViews = recycler.getScrapList();
+                count = previousViews.size();
+                for (int i = 0; i < count; ++i) {
+                    View view = previousViews.get(i).itemView;
+                    RecyclerView.LayoutParams params =
+                            (RecyclerView.LayoutParams) view.getLayoutParams();
+                    int position = params.getViewPosition();
+                    int newTop;
+                    if (position < mFirstPosition) {
+                        newTop = view.getHeight() * (position - mFirstPosition);
+                    } else {
+                        newTop = lastVisibleView.getTop() + view.getHeight() *
+                                (position - lastPosition);
+                    }
+                    view.offsetTopAndBottom(newTop - view.getTop());
+                }
+            }
+        }
+
+        @Override
+        public RecyclerView.LayoutParams generateDefaultLayoutParams() {
+            return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
+
+        @Override
+        public boolean canScrollVertically() {
+            return true;
+        }
+
+        @Override
+        public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+                RecyclerView.State state) {
+            if (getChildCount() == 0) {
+                return 0;
+            }
+
+            int scrolled = 0;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+            if (dy < 0) {
+                while (scrolled > dy) {
+                    final View topView = getChildAt(0);
+                    final int hangingTop = Math.max(-topView.getTop(), 0);
+                    final int scrollBy = Math.min(scrolled - dy, hangingTop);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (mFirstPosition > 0 && scrolled > dy) {
+                        mFirstPosition--;
+                        View v = recycler.getViewForPosition(mFirstPosition);
+                        addView(v, 0);
+                        measureChild(v, 0, 0);
+                        final int bottom = topView.getTop(); // TODO decorated top?
+                        final int top = bottom - v.getMeasuredHeight();
+                        v.layout(left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            } else if (dy > 0) {
+                final int parentHeight = getHeight();
+                while (scrolled < dy) {
+                    final View bottomView = getChildAt(getChildCount() - 1);
+                    final int hangingBottom = Math.max(bottomView.getBottom() - parentHeight, 0);
+                    final int scrollBy = -Math.min(dy - scrolled, hangingBottom);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (scrolled < dy && getItemCount() > mFirstPosition + getChildCount()) {
+                        View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                        final int top = getChildAt(getChildCount() - 1).getBottom();
+                        addView(v);
+                        measureChild(v, 0, 0);
+                        final int bottom = top + v.getMeasuredHeight();
+                        v.layout(left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            }
+            recycleViewsOutOfBounds(recycler);
+            return scrolled;
+        }
+
+        @Override
+        public View onFocusSearchFailed(View focused, int direction,
+                RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int oldCount = getChildCount();
+
+            if (oldCount == 0) {
+                return null;
+            }
+
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            View toFocus = null;
+            int newViewsHeight = 0;
+            if (direction == View.FOCUS_UP || direction == View.FOCUS_BACKWARD) {
+                while (mFirstPosition > 0 && newViewsHeight < mScrollDistance) {
+                    mFirstPosition--;
+                    View v = recycler.getViewForPosition(mFirstPosition);
+                    final int bottom = getChildAt(0).getTop(); // TODO decorated top?
+                    addView(v, 0);
+                    measureChild(v, 0, 0);
+                    final int top = bottom - v.getMeasuredHeight();
+                    v.layout(left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+            if (direction == View.FOCUS_DOWN || direction == View.FOCUS_FORWARD) {
+                while (mFirstPosition + getChildCount() < getItemCount() &&
+                        newViewsHeight < mScrollDistance) {
+                    View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                    final int top = getChildAt(getChildCount() - 1).getBottom();
+                    addView(v);
+                    measureChild(v, 0, 0);
+                    final int bottom = top + v.getMeasuredHeight();
+                    v.layout(left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+
+            return toFocus;
+        }
+
+        public void recycleViewsOutOfBounds(RecyclerView.Recycler recycler) {
+            final int childCount = getChildCount();
+            final int parentWidth = getWidth();
+            final int parentHeight = getHeight();
+            boolean foundFirst = false;
+            int first = 0;
+            int last = 0;
+            for (int i = 0; i < childCount; i++) {
+                final View v = getChildAt(i);
+                if (v.hasFocus() || (v.getRight() >= 0 && v.getLeft() <= parentWidth &&
+                        v.getBottom() >= 0 && v.getTop() <= parentHeight)) {
+                    if (!foundFirst) {
+                        first = i;
+                        foundFirst = true;
+                    }
+                    last = i;
+                }
+            }
+            for (int i = childCount - 1; i > last; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            for (int i = first - 1; i >= 0; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            if (getChildCount() == 0) {
+                mFirstPosition = 0;
+            } else {
+                mFirstPosition += first;
+            }
+        }
+
+        @Override
+        public void onItemsAdded(RecyclerView recyclerView, int positionStart, int itemCount) {
+            if (positionStart < mFirstPosition) {
+                mFirstPosition += itemCount;
+            }
+        }
+
+        @Override
+        public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) {
+            if (positionStart < mFirstPosition) {
+                mFirstPosition -= itemCount;
+            }
+        }
+    }
+
+    class MyAdapter extends RecyclerView.Adapter {
+        private int mBackground;
+        List<String> mData;
+        HashMap<String, Boolean> mSelected = new HashMap<String, Boolean>();
+
+        public MyAdapter(List<String> data) {
+            TypedValue val = new TypedValue();
+            AnimatedRecyclerView.this.getTheme().resolveAttribute(
+                    R.attr.selectableItemBackground, val, true);
+            mBackground = val.resourceId;
+            mData = data;
+            for (String itemText : mData) {
+                mSelected.put(itemText, Boolean.FALSE);
+            }
+        }
+
+        @Override
+        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            MyViewHolder h = new MyViewHolder(getLayoutInflater().inflate(R.layout.selectable_item,
+                    null));
+            h.textView.setMinimumHeight(128);
+            h.textView.setFocusable(true);
+            h.textView.setBackgroundResource(mBackground);
+            return h;
+        }
+
+        @Override
+        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            String itemText = mData.get(position);
+            ((MyViewHolder) holder).textView.setText(itemText);
+            boolean selected = false;
+            if (mSelected.get(itemText) != null) {
+                selected = mSelected.get(itemText);
+            }
+            ((MyViewHolder) holder).checkBox.setChecked(selected);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mData.size();
+        }
+
+        public void selectItem(String itemText, boolean selected) {
+            mSelected.put(itemText, selected);
+        }
+
+        public void selectItem(MyViewHolder holder, boolean selected) {
+            mSelected.put((String) holder.textView.getText(), selected);
+        }
+    }
+
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+        public TextView textView;
+        public CheckBox checkBox;
+
+        public MyViewHolder(View v) {
+            super(v);
+            textView = (TextView) v.findViewById(R.id.text);
+            checkBox = (CheckBox) v.findViewById(R.id.selected);
+        }
+
+        @Override
+        public String toString() {
+            return super.toString() + " \"" + textView.getText() + "\"";
+        }
+    }}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
new file mode 100644
index 0000000..8c2caa9
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.android.supportv7.widget.decorator.DividerItemDecoration;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.example.android.supportv7.R;
+
+/**
+ * A sample activity that uses {@link android.support.v7.widget.LinearLayoutManager}.
+ */
+public class LinearLayoutManagerActivity extends Activity {
+
+    private RecyclerView.LayoutManager mListLayoutManager;
+
+    private ListWrapper mListWrapper;
+
+    private RecyclerView mRecyclerView;
+
+    private DividerItemDecoration mDividerItemDecoration;
+
+    private ConfigToggle[] mConfigToggles;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_linear_layout_manager);
+        initConfig();
+        initRecyclerView();
+        initSpinner();
+    }
+
+    private void initRecyclerView() {
+        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView.setHasFixedSize(true);
+        mListLayoutManager = new LinearLayoutManager(this);
+        mRecyclerView.setLayoutManager(mListLayoutManager);
+        mRecyclerView.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
+            @Override
+            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                final SimpleStringAdapter.ViewHolder vh = super
+                        .onCreateViewHolder(parent, viewType);
+                vh.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        final int pos = vh.getPosition();
+                        if (pos + 1 < getItemCount()) {
+                            swap(pos, pos + 1);
+                        }
+                        notifyItemChanged(pos);
+                    }
+                });
+                return vh;
+            }
+        });
+        initListForLayoutManager();
+    }
+
+    private void initListForLayoutManager() {
+        mListWrapper = new ListWrapper() {
+            @Override
+            public int getOrientation() {
+                return lm().getOrientation();
+            }
+
+            @Override
+            public void setOrientation(int orientation) {
+                lm().setOrientation(orientation);
+            }
+
+            @Override
+            public boolean getReverseLayout() {
+                return lm().getReverseLayout();
+            }
+
+            @Override
+            public void setReverseLayout(boolean newValue) {
+                lm().setReverseLayout(newValue);
+            }
+
+            @Override
+            public boolean getStackFromEnd() {
+                return lm().getStackFromEnd();
+            }
+
+            @Override
+            public void setStackFromEnd(boolean newValue) {
+                lm().setStackFromEnd(newValue);
+            }
+
+            private LinearLayoutManager lm() {
+                return (LinearLayoutManager) mListLayoutManager;
+            }
+        };
+        if (mDividerItemDecoration != null) {
+            mRecyclerView.removeItemDecoration(mDividerItemDecoration);
+        }
+        mDividerItemDecoration = new DividerItemDecoration(this, mListWrapper.getOrientation());
+        mRecyclerView.addItemDecoration(mDividerItemDecoration);
+    }
+
+    private void initConfig() {
+        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
+        initToggles();
+        configView.setAdapter(mConfigAdapter);
+        configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
+                false));
+        configView.setHasFixedSize(true);
+    }
+
+    private void initSpinner() {
+        final CheckBox checkBox = (CheckBox)
+                findViewById(R.id.enable_smooth_scroll);
+
+        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
+        final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset);
+        spinner.setAdapter(new BaseAdapter() {
+            @Override
+            public int getCount() {
+                return mRecyclerView.getAdapter().getItemCount();
+            }
+
+            @Override
+            public Integer getItem(int position) {
+                return position;
+            }
+
+            @Override
+            public long getItemId(int position) {
+                return position;
+            }
+
+            @Override
+            public View getView(int position, View convertView, ViewGroup parent) {
+                if (convertView == null) {
+                    convertView = new TextView(parent.getContext());
+                }
+                ((TextView) convertView).setText("" + position);
+                return convertView;
+            }
+        });
+        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                int offset = Integer.MIN_VALUE;
+                String offsetString = scrollOffset.getText().toString();
+                try {
+                    offset = Integer.parseInt(offsetString);
+                } catch (NumberFormatException ex) {
+
+                }
+
+                if (offset == Integer.MIN_VALUE) {
+                    if (checkBox.isChecked()) {
+                        mRecyclerView.smoothScrollToPosition(position);
+                    } else {
+                        mRecyclerView.scrollToPosition(position);
+                    }
+                } else {
+                    // ignore offset until we add recycling list view with smooth scroll to offset
+                    mRecyclerView.smoothScrollToPosition(position);
+                }
+
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+
+            }
+        });
+    }
+
+    private void initToggles() {
+        mConfigToggles = new ConfigToggle[]{
+                new ConfigToggle(R.string.checkbox_orientation) {
+                    @Override
+                    public boolean isChecked() {
+                        return mListWrapper.getOrientation() == LinearLayoutManager.HORIZONTAL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mListWrapper.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
+                                : LinearLayoutManager.VERTICAL);
+                        if (mDividerItemDecoration != null) {
+                            mDividerItemDecoration.setOrientation(mListWrapper.getOrientation());
+                        }
+
+                    }
+                },
+                new ConfigToggle(R.string.checkbox_reverse) {
+                    @Override
+                    public boolean isChecked() {
+                        return mListWrapper.getReverseLayout();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mListWrapper.setReverseLayout(newValue);
+                    }
+                },
+                new ConfigToggle(R.string.checkbox_layout_dir) {
+                    @Override
+                    public boolean isChecked() {
+                        return ViewCompat.getLayoutDirection(mRecyclerView) ==
+                                ViewCompat.LAYOUT_DIRECTION_RTL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
+                                ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
+                    }
+                },
+                new ConfigToggle(R.string.checkbox_stack_from_end) {
+                    @Override
+                    public boolean isChecked() {
+                        return mListWrapper.getStackFromEnd();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mListWrapper.setStackFromEnd(newValue);
+                    }
+                }
+        };
+    }
+
+    private class ConfigViewHolder extends RecyclerView.ViewHolder
+            implements CompoundButton.OnCheckedChangeListener {
+
+        private CheckBox mCheckBox;
+
+        private ConfigToggle mConfigToggle;
+
+        public ConfigViewHolder(View itemView) {
+            super(itemView);
+            mCheckBox = (CheckBox) itemView;
+            mCheckBox.setOnCheckedChangeListener(this);
+        }
+
+        public void render(ConfigToggle toggle) {
+            mConfigToggle = toggle;
+            mCheckBox.setText(toggle.getText());
+            mCheckBox.setChecked(toggle.isChecked());
+        }
+
+        @Override
+        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+            if (mConfigToggle != null) {
+                mConfigToggle.onChange(isChecked);
+            }
+        }
+    }
+
+
+    private abstract class ConfigToggle {
+
+        private String mLabel;
+
+        protected ConfigToggle(int labelId) {
+            mLabel = getResources().getString(labelId);
+        }
+
+        public String getText() {
+            return mLabel;
+        }
+
+        abstract public boolean isChecked();
+
+        abstract public void onChange(boolean newValue);
+    }
+
+
+    private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
+        @Override
+        public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new ConfigViewHolder(new CheckBox(parent.getContext()));
+        }
+
+        @Override
+        public void onBindViewHolder(ConfigViewHolder holder, int position) {
+            ConfigToggle toggle = mConfigToggles[position];
+            holder.render(toggle);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mConfigToggles.length;
+        }
+    };
+
+
+    /**
+     * To avoid adding interfaces to LayoutManager for the demo, we use this wrapper class to
+     * call different LayoutManagers
+     */
+    private static interface ListWrapper {
+
+        int getOrientation();
+
+        void setOrientation(int orientation);
+
+        boolean getReverseLayout();
+
+        void setReverseLayout(boolean newValue);
+
+        boolean getStackFromEnd();
+
+        void setStackFromEnd(boolean newValue);
+    }
+
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java
new file mode 100644
index 0000000..baecf86
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.android.supportv7.widget.decorator.DividerItemDecoration;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.RecyclerView;
+import android.util.DisplayMetrics;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class RecyclerViewActivity extends Activity {
+
+    private static final String TAG = "RecyclerViewActivity";
+
+    private RecyclerView mRecyclerView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final RecyclerView rv = new RecyclerView(this);
+        rv.setLayoutManager(new MyLayoutManager(this));
+        rv.setHasFixedSize(true);
+        rv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT));
+        rv.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
+            @Override
+            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                final SimpleStringAdapter.ViewHolder vh = super
+                        .onCreateViewHolder(parent, viewType);
+                vh.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        final int pos = vh.getPosition();
+                        if (pos + 1 < getItemCount()) {
+                            swap(pos, pos + 1);
+                        }
+                    }
+                });
+                return vh;
+            }
+        });
+        rv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
+        setContentView(rv);
+        mRecyclerView = rv;
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        mRecyclerView.requestLayout();
+        return super.onOptionsItemSelected(item);
+    }
+
+    private static final int SCROLL_DISTANCE = 80; // dp
+
+    /**
+     * A basic ListView-style LayoutManager.
+     */
+    class MyLayoutManager extends RecyclerView.LayoutManager {
+
+        private static final String TAG = "MyLayoutManager";
+
+        private int mFirstPosition;
+
+        private final int mScrollDistance;
+
+        public MyLayoutManager(Context c) {
+            final DisplayMetrics dm = c.getResources().getDisplayMetrics();
+            mScrollDistance = (int) (SCROLL_DISTANCE * dm.density + 0.5f);
+        }
+
+        @Override
+        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int parentBottom = getHeight() - getPaddingBottom();
+            final View oldTopView = getChildCount() > 0 ? getChildAt(0) : null;
+            int oldTop = getPaddingTop();
+            if (oldTopView != null) {
+                oldTop = oldTopView.getTop();
+            }
+
+            detachAndScrapAttachedViews(recycler);
+
+            int top = oldTop;
+            int bottom;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            final int count = state.getItemCount();
+            for (int i = 0; mFirstPosition + i < count && top < parentBottom; i++, top = bottom) {
+                View v = recycler.getViewForPosition(mFirstPosition + i);
+                addView(v, i);
+                measureChildWithMargins(v, 0, 0);
+                bottom = top + getDecoratedMeasuredHeight(v);
+                layoutDecorated(v, left, top, right, bottom);
+            }
+        }
+
+        @Override
+        public RecyclerView.LayoutParams generateDefaultLayoutParams() {
+            return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
+
+        @Override
+        public boolean canScrollVertically() {
+            return true;
+        }
+
+        @Override
+        public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+                RecyclerView.State state) {
+            if (getChildCount() == 0) {
+                return 0;
+            }
+
+            int scrolled = 0;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+            if (dy < 0) {
+                while (scrolled > dy) {
+                    final View topView = getChildAt(0);
+                    final int hangingTop = Math.max(-getDecoratedTop(topView), 0);
+                    final int scrollBy = Math.min(scrolled - dy, hangingTop);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (mFirstPosition > 0 && scrolled > dy) {
+                        mFirstPosition--;
+                        View v = recycler.getViewForPosition(mFirstPosition);
+                        addView(v, 0);
+                        measureChildWithMargins(v, 0, 0);
+                        final int bottom = getDecoratedTop(topView);
+                        final int top = bottom - getDecoratedMeasuredHeight(v);
+                        layoutDecorated(v, left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            } else if (dy > 0) {
+                final int parentHeight = getHeight();
+                while (scrolled < dy) {
+                    final View bottomView = getChildAt(getChildCount() - 1);
+                    final int hangingBottom =
+                            Math.max(getDecoratedBottom(bottomView) - parentHeight, 0);
+                    final int scrollBy = -Math.min(dy - scrolled, hangingBottom);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (scrolled < dy && getItemCount() > mFirstPosition + getChildCount()) {
+                        View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                        final int top = getDecoratedBottom(getChildAt(getChildCount() - 1));
+                        addView(v);
+                        measureChildWithMargins(v, 0, 0);
+                        final int bottom = top + getDecoratedMeasuredHeight(v);
+                        layoutDecorated(v, left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            }
+            recycleViewsOutOfBounds(recycler);
+            return scrolled;
+        }
+
+        @Override
+        public View onFocusSearchFailed(View focused, int direction,
+                RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int oldCount = getChildCount();
+
+            if (oldCount == 0) {
+                return null;
+            }
+
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            View toFocus = null;
+            int newViewsHeight = 0;
+            if (direction == View.FOCUS_UP || direction == View.FOCUS_BACKWARD) {
+                while (mFirstPosition > 0 && newViewsHeight < mScrollDistance) {
+                    mFirstPosition--;
+                    View v = recycler.getViewForPosition(mFirstPosition);
+                    final int bottom = getDecoratedTop(getChildAt(0));
+                    addView(v, 0);
+                    measureChildWithMargins(v, 0, 0);
+                    final int top = bottom - getDecoratedMeasuredHeight(v);
+                    layoutDecorated(v, left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+            if (direction == View.FOCUS_DOWN || direction == View.FOCUS_FORWARD) {
+                while (mFirstPosition + getChildCount() < getItemCount() &&
+                        newViewsHeight < mScrollDistance) {
+                    View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                    final int top = getDecoratedBottom(getChildAt(getChildCount() - 1));
+                    addView(v);
+                    measureChildWithMargins(v, 0, 0);
+                    final int bottom = top + getDecoratedMeasuredHeight(v);
+                    layoutDecorated(v, left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+
+            return toFocus;
+        }
+
+        public void recycleViewsOutOfBounds(RecyclerView.Recycler recycler) {
+            final int childCount = getChildCount();
+            final int parentWidth = getWidth();
+            final int parentHeight = getHeight();
+            boolean foundFirst = false;
+            int first = 0;
+            int last = 0;
+            for (int i = 0; i < childCount; i++) {
+                final View v = getChildAt(i);
+                if (v.hasFocus() || (getDecoratedRight(v) >= 0 &&
+                        getDecoratedLeft(v) <= parentWidth &&
+                        getDecoratedBottom(v) >= 0 &&
+                        getDecoratedTop(v) <= parentHeight)) {
+                    if (!foundFirst) {
+                        first = i;
+                        foundFirst = true;
+                    }
+                    last = i;
+                }
+            }
+            for (int i = childCount - 1; i > last; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            for (int i = first - 1; i >= 0; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            if (getChildCount() == 0) {
+                mFirstPosition = 0;
+            } else {
+                mFirstPosition += first;
+            }
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
new file mode 100644
index 0000000..a12e79d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v7.widget.RecyclerView;
+import android.util.TypedValue;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapter.ViewHolder> {
+
+    private int mBackground;
+
+    private ArrayList<String> mValues;
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+
+        public TextView mTextView;
+
+        public ViewHolder(TextView v) {
+            super(v);
+            mTextView = v;
+        }
+
+        @Override
+        public String toString() {
+            return super.toString() + " '" + mTextView.getText();
+        }
+    }
+
+    public SimpleStringAdapter(Context context, String[] strings) {
+        TypedValue val = new TypedValue();
+        if (context.getTheme() != null) {
+            context.getTheme().resolveAttribute(
+                    android.R.attr.selectableItemBackground, val, true);
+        }
+        mBackground = val.resourceId;
+        mValues = new ArrayList<String>();
+        Collections.addAll(mValues, strings);
+    }
+
+    public void swap(int pos1, int pos2) {
+        String tmp = mValues.get(pos1);
+        mValues.set(pos1, mValues.get(pos2));
+        mValues.set(pos2, tmp);
+        notifyItemRemoved(pos1);
+        notifyItemInserted(pos2);
+    }
+
+    @Override
+    public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        final ViewHolder h = new ViewHolder(new TextView(parent.getContext()));
+        h.mTextView.setMinimumHeight(128);
+        h.mTextView.setPadding(20, 0, 20, 0);
+        h.mTextView.setFocusable(true);
+        h.mTextView.setBackgroundResource(mBackground);
+        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        lp.leftMargin = 10;
+        lp.rightMargin = 5;
+        lp.topMargin = 20;
+        lp.bottomMargin = 15;
+        h.mTextView.setLayoutParams(lp);
+        return h;
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        holder.mTextView.setText(position + ":" + mValues.get(position));
+        holder.mTextView.setMinHeight((200 + mValues.get(position).length() * 10));
+        holder.mTextView.setBackgroundColor(getBackgroundColor(position));
+    }
+
+    private int getBackgroundColor(int position) {
+        switch (position % 4) {
+            case 0: return Color.BLACK;
+            case 1: return Color.RED;
+            case 2: return Color.GREEN;
+            case 3: return Color.BLUE;
+        }
+        return Color.TRANSPARENT;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mValues.size();
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java
new file mode 100644
index 0000000..4d5d208
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.decorator;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+    private static final int[] ATTRS = new int[]{
+            android.R.attr.listDivider
+    };
+
+    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
+
+    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
+
+    private Drawable mDivider;
+
+    private int mOrientation;
+
+    public DividerItemDecoration(Context context, int orientation) {
+        final TypedArray a = context.obtainStyledAttributes(ATTRS);
+        mDivider = a.getDrawable(0);
+        a.recycle();
+        setOrientation(orientation);
+    }
+
+    public void setOrientation(int orientation) {
+        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
+            throw new IllegalArgumentException("invalid orientation");
+        }
+        mOrientation = orientation;
+    }
+
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent) {
+        if (mOrientation == VERTICAL_LIST) {
+            drawVertical(c, parent);
+        } else {
+            drawHorizontal(c, parent);
+        }
+    }
+
+    public void drawVertical(Canvas c, RecyclerView parent) {
+        final int left = parent.getPaddingLeft();
+        final int right = parent.getWidth() - parent.getPaddingRight();
+
+        final int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+                    .getLayoutParams();
+            final int top = child.getBottom() + params.bottomMargin;
+            final int bottom = top + mDivider.getIntrinsicHeight();
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+
+    public void drawHorizontal(Canvas c, RecyclerView parent) {
+        final int top = parent.getPaddingTop();
+        final int bottom = parent.getHeight() - parent.getPaddingBottom();
+
+        final int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+                    .getLayoutParams();
+            final int left = child.getRight() + params.rightMargin;
+            final int right = left + mDivider.getIntrinsicHeight();
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
+        if (mOrientation == VERTICAL_LIST) {
+            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
+        } else {
+            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/Android.mk b/samples/SupportLeanbackDemos/Android.mk
new file mode 100644
index 0000000..41424a7
--- /dev/null
+++ b/samples/SupportLeanbackDemos/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportLeanbackDemos
+LOCAL_MODULE_TAGS := samples tests
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-recyclerview \
+        android-support-v17-leanback
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v17/leanback/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v17.leanback
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml
new file mode 100644
index 0000000..ee0707d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.leanback"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="19" />
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/ic_launcher"
+        android:theme="@style/Theme.Leanback">
+
+        <activity android:name="MainActivity"
+            android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="DetailsActivity"
+            android:exported="true" />
+
+        <activity android:name="VerticalGridActivity"
+            android:exported="true" />
+
+        <activity android:name="SearchActivity"
+            android:exported="true" />
+
+    </application>
+</manifest>
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/grid_bg.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/grid_bg.png
new file mode 100644
index 0000000..476c698
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/grid_bg.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/details_img.png b/samples/SupportLeanbackDemos/res/drawable/details_img.png
new file mode 100644
index 0000000..7ea688b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/details_img.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png b/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png
new file mode 100644
index 0000000..3d555ef
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_title.png b/samples/SupportLeanbackDemos/res/drawable/ic_title.png
new file mode 100644
index 0000000..1c62b2e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_title.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/text_bg.xml b/samples/SupportLeanbackDemos/res/drawable/text_bg.xml
new file mode 100644
index 0000000..c67924c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/text_bg.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <gradient
+        android:startColor="#FFFF0000"
+        android:endColor="#80FF00FF"
+        android:angle="45" />
+    <padding
+        android:left="7dp"
+        android:top="7dp"
+        android:right="7dp"
+        android:bottom="7dp" />
+</shape>
diff --git a/samples/SupportLeanbackDemos/res/layout/details.xml b/samples/SupportLeanbackDemos/res/layout/details.xml
new file mode 100644
index 0000000..4af4e6a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/details.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.DetailsFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/main.xml b/samples/SupportLeanbackDemos/res/layout/main.xml
new file mode 100644
index 0000000..b6b08b3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/main.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.BrowseFragment"
+    android:id="@+id/main_browse_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/search.xml b/samples/SupportLeanbackDemos/res/layout/search.xml
new file mode 100644
index 0000000..b65600c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/search.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+          android:name="com.example.android.leanback.SearchFragment"
+          android:id="@+id/search_fragment"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+        />
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml b/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml
new file mode 100644
index 0000000..1007042
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.VerticalGridFragment"
+    android:id="@+id/vertical_grid_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/values/strings.xml b/samples/SupportLeanbackDemos/res/values/strings.xml
new file mode 100644
index 0000000..e884043
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <string name="app_name">MainActivity</string>
+</resources>
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
new file mode 100644
index 0000000..2345ed0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemClickedListener;
+import android.support.v17.leanback.widget.Row;
+import android.util.Log;
+import android.view.View;
+
+public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment {
+    private static final String TAG = "leanback.BrowseFragment";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        Params p = new Params();
+        p.setBadgeImage(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        p.setTitle("Leanback Sample App");
+        p.setHeadersState(HEADERS_ENABLED);
+        setBrowseParams(p);
+
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        setupRows();
+        setOnItemClickedListener(new ItemClickedListener());
+    }
+
+    private void setupRows() {
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
+            listRowAdapter.add("Hello world");
+            listRowAdapter.add("This is a test");
+            HeaderItem header = new HeaderItem(i, "Row " + i, null);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+
+        setAdapter(mRowsAdapter);
+    }
+
+    private final class ItemClickedListener implements OnItemClickedListener {
+        public void onItemClicked(Object item, Row row) {
+            // TODO: use a fragment transaction instead of launching a new
+            // activity
+            Intent intent = new Intent(getActivity(), DetailsActivity.class);
+            startActivity(intent);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java
new file mode 100644
index 0000000..502c77a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.Presenter;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class CardPresenter extends Presenter {
+    private static final String TAG = "CardPresenter";
+
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        Log.d(TAG, "onCreateViewHolder");
+        ImageCardView v = new ImageCardView(parent.getContext());
+        v.setFocusable(true);
+        v.setFocusableInTouchMode(true);
+        v.setMainImage(
+                parent.getContext().getResources().getDrawable(R.drawable.text_bg));
+        return new ViewHolder(v);
+    }
+
+    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        Log.d(TAG, "onBindViewHolder for " + item.toString());
+        ((ImageCardView) viewHolder.view).setTitleText(item.toString());
+    }
+
+    public void onUnbindViewHolder(ViewHolder viewHolder) {
+        Log.d(TAG, "onUnbindViewHolder");
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java
new file mode 100644
index 0000000..082b134
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class DetailsActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.details);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java
new file mode 100644
index 0000000..6d376f0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+
+public class DetailsDescriptionPresenter extends AbstractDetailsDescriptionPresenter {
+
+    @Override
+    protected void onBindDescription(ViewHolder vh, Object item) {
+        vh.getTitle().setText(item.toString());
+        vh.getSubtitle().setText("2013 - 2014   Drama   TV-14");
+        vh.getBody().setText("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
+                + "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
+                + "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+                + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+                + "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non "
+                + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
new file mode 100644
index 0000000..c9a85f3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.util.Log;
+import android.widget.Toast;
+
+public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
+    private static final String TAG = "leanback.BrowseFragment";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setupRows();
+    }
+
+    private void setupRows() {
+        ClassPresenterSelector ps = new ClassPresenterSelector();
+        DetailsOverviewRowPresenter dorPresenter =
+            new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
+            public void onActionClicked(Action action) {
+                Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+            }
+        });
+
+        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
+        ps.addClassPresenter(ListRow.class,
+                new ListRowPresenter());
+        mRowsAdapter = new ArrayObjectAdapter(ps);
+
+        Resources res = getActivity().getResources();
+        DetailsOverviewRow dor = new DetailsOverviewRow("Details Overview");
+        dor.setImageDrawable(res.getDrawable(R.drawable.details_img));
+        dor.addAction(new Action(1, "Buy $9.99"));
+        dor.addAction(new Action(2, "Rent", "$3.99", res.getDrawable(R.drawable.ic_action_a)));
+        mRowsAdapter.add(dor);
+
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
+            listRowAdapter.add("Hello world");
+            listRowAdapter.add("This is a test");
+            HeaderItem header = new HeaderItem(i, "Row " + i, null);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+
+        setAdapter(mRowsAdapter);
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
new file mode 100644
index 0000000..74e7fb2
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class MainActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
new file mode 100644
index 0000000..437bd72
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SearchActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.search);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
new file mode 100644
index 0000000..0489196
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
@@ -0,0 +1,85 @@
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.OnItemClickedListener;
+import android.support.v17.leanback.widget.Row;
+import android.text.TextUtils;
+import android.util.Log;
+
+public class SearchFragment extends android.support.v17.leanback.app.SearchFragment
+    implements android.support.v17.leanback.app.SearchFragment.SearchResultProvider {
+    private static final String TAG = "leanback.SearchFragment";
+    private static final int NUM_ROWS = 3;
+    private static final int SEARCH_DELAY_MS = 300;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private Handler mHandler = new Handler();
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        setSearchResultProvider(this);
+        setOnItemClickedListener(new ItemClickedListener());
+    }
+
+    @Override
+    public ObjectAdapter getResultsAdapter() {
+        return mRowsAdapter;
+    }
+
+    @Override
+    public boolean onQueryTextChange(String newQuery) {
+        Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
+        mRowsAdapter.clear();
+        if (!TextUtils.isEmpty(newQuery)) {
+            mHandler.removeCallbacks(mDelayedLoad);
+            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        Log.i(TAG, String.format("Search Query Text Submit %s", query));
+        mRowsAdapter.clear();
+        if (!TextUtils.isEmpty(query)) {
+            mHandler.removeCallbacks(mDelayedLoad);
+            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
+        }
+        return true;
+    }
+
+    private void loadRows() {
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
+            listRowAdapter.add("Hello world");
+            listRowAdapter.add("This is a test");
+            HeaderItem header = new HeaderItem(i, "Row " + i, null);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+    }
+
+    private Runnable mDelayedLoad = new Runnable() {
+        @Override
+        public void run() {
+            loadRows();
+        }
+    };
+    private final class ItemClickedListener implements OnItemClickedListener {
+        public void onItemClicked(Object item, Row row) {
+            // TODO: use a fragment transaction instead of launching a new
+            // activity
+            Intent intent = new Intent(getActivity(), DetailsActivity.class);
+            startActivity(intent);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java
new file mode 100644
index 0000000..5c80e0b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v17.leanback.widget.Presenter;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class StringPresenter extends Presenter {
+    private static final String TAG = "StringPresenter";
+
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        Log.d(TAG, "onCreateViewHolder");
+        TextView tv = new TextView(parent.getContext());
+        tv.setFocusable(true);
+        tv.setFocusableInTouchMode(true);
+        tv.setBackground(
+                parent.getContext().getResources().getDrawable(R.drawable.text_bg));
+        return new ViewHolder(tv);
+    }
+
+    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        Log.d(TAG, "onBindViewHolder for " + item.toString());
+        ((TextView) viewHolder.view).setText(item.toString());
+    }
+
+    public void onUnbindViewHolder(ViewHolder viewHolder) {
+        Log.d(TAG, "onUnbindViewHolder"); 
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java
new file mode 100644
index 0000000..c5262b9
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class VerticalGridActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.vertical_grid);
+        getWindow().setBackgroundDrawableResource(R.drawable.grid_bg);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java
new file mode 100644
index 0000000..495bebe
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.OnItemClickedListener;
+import android.support.v17.leanback.widget.OnItemSelectedListener;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.Random;
+
+public class VerticalGridFragment extends android.support.v17.leanback.app.VerticalGridFragment {
+    private static final String TAG = "leanback.VerticalGridFragment";
+
+    private static final int NUM_COLUMNS = 3;
+    private static final int NUM_ITEMS = 50;
+    private static final int HEIGHT = 200;
+
+    private ArrayObjectAdapter mAdapter;
+    private Random mRandom;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        mRandom = new Random();
+
+        Params p = new Params();
+        p.setBadgeImage(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        p.setTitle("Leanback Vertical Grid Demo");
+        setParams(p);
+
+        setupFragment();
+    }
+
+    private void setupFragment() {
+        VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
+        gridPresenter.setNumberOfColumns(NUM_COLUMNS);
+        setGridPresenter(gridPresenter);
+
+        mAdapter = new ArrayObjectAdapter(new GridItemPresenter());
+        for (int i = 0; i < NUM_ITEMS; i++) {
+            mAdapter.add(new MyItem(i));
+        }
+        setAdapter(mAdapter);
+
+        setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(Object item, Row row) {
+                Log.i(TAG, "item selected: " + ((MyItem) item).id);
+            }
+        });
+
+        setOnItemClickedListener(new OnItemClickedListener() {
+            @Override
+            public void onItemClicked(Object item, Row row) {
+                Log.i(TAG, "item clicked: " + ((MyItem) item).id);
+            }
+        });
+    }
+
+    private class GridItemPresenter extends Presenter {
+        public ViewHolder onCreateViewHolder(ViewGroup parent) {
+            TextView view = new TextView(parent.getContext());
+            // Choose a random height between HEIGHT and 1.5 * HEIGHT to
+            // demonstrate the staggered nature of the grid.
+            final int height = HEIGHT + mRandom.nextInt(HEIGHT / 2);
+            view.setLayoutParams(new ViewGroup.LayoutParams(200, height));
+            view.setFocusable(true);
+            view.setFocusableInTouchMode(true);
+            view.setBackgroundColor(Color.DKGRAY);
+            view.setGravity(Gravity.CENTER);
+            return new ViewHolder(view);
+        }
+
+        public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+            ((TextView) viewHolder.view).setText(Integer.toString(((MyItem) item).id));
+        }
+
+        public void onUnbindViewHolder(ViewHolder viewHolder) {}
+    }
+
+    static class MyItem {
+        int id;
+        MyItem(int id) {
+            this.id = id;
+        }
+    }
+}
diff --git a/samples/browseable/ActivityInstrumentation/_index.jd b/samples/browseable/ActivityInstrumentation/_index.jd
index fa62724..369ff7e 100644
--- a/samples/browseable/ActivityInstrumentation/_index.jd
+++ b/samples/browseable/ActivityInstrumentation/_index.jd
@@ -5,8 +5,8 @@
 sample.group=Testing
 @jd:body
 
-<p>This sample demonstrates how to use an
-{@link android.test.InstrumentationTestCase} to test the internal state of an
+<p>This sample demonstrates how to use an 
+{@link android.test.InstrumentationTestCase} to test the internal state of an 
 {@link android.app.Activity}.</p>
 <p>To learn more about using Android's custom testing framework, see
 <a href="{@docRoot}training/activity-testing/index.html">Testing Your
diff --git a/samples/browseable/TextLinkify/_index.jd b/samples/browseable/TextLinkify/_index.jd
index 9f31930..36aa075 100644
--- a/samples/browseable/TextLinkify/_index.jd
+++ b/samples/browseable/TextLinkify/_index.jd
@@ -8,7 +8,7 @@
 <p>This sample demonstrates how to add clickable links to a
 {@link android.widget.TextView}, by using these techniques:
 <ul>
-<li>Setting the {@link android.R.styleable#TextView_autoLink} property
+<li>Setting the {@link android.R.styleable#TextView_autoLink} property 
 to automatically convert the text to a link.</li>
 <li>Parsing a String as HTML</li>
 <li>Manually by constructing a {@link android.text.SpannableString}.</li>
diff --git a/samples/samples_source.prop_template b/samples/samples_source.prop_template
index 1524e33..d3cdfd5 100644
--- a/samples/samples_source.prop_template
+++ b/samples/samples_source.prop_template
@@ -1,4 +1,4 @@
 Pkg.UserSrc=false
-Pkg.Revision=5
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
diff --git a/scripts/app_engine_server/redirects.yaml b/scripts/app_engine_server/redirects.yaml
index b7a90a5..c37ac00 100644
--- a/scripts/app_engine_server/redirects.yaml
+++ b/scripts/app_engine_server/redirects.yaml
@@ -77,6 +77,14 @@
   type: permanent
   comment: Redirect sdk reference to new location
 
+- src: /sdk/exploring.html
+  dst: /sdk/tools/help/sdk-manager.html
+  type: permanent
+
+- src: /sdk/installing/bundle.html
+  dst: /sdk/installing/index.html?pkg=adt
+  type: permanent
+
 - src: /sdk/compatibility-library.html
   dst: /tools/support-library/index.html
   type: permanent
diff --git a/sdk/build_tools_source.prop_template b/sdk/build_tools_source.prop_template
index c9bfc2f..5d62307 100644
--- a/sdk/build_tools_source.prop_template
+++ b/sdk/build_tools_source.prop_template
@@ -1,3 +1,3 @@
 Pkg.UserSrc=false
-Pkg.Revision=${PLATFORM_SDK_VERSION}.0.2
+Pkg.Revision=${PLATFORM_SDK_VERSION}.0.0
 
diff --git a/sdk/doc_source.prop_template b/sdk/doc_source.prop_template
index 523d6bd..d3cdfd5 100644
--- a/sdk/doc_source.prop_template
+++ b/sdk/doc_source.prop_template
@@ -1,4 +1,4 @@
 Pkg.UserSrc=false
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
diff --git a/sdk/images_armeabi-v7a_source.prop_template b/sdk/images_armeabi-v7a_source.prop_template
index 4f2daac..86fc2a0 100644
--- a/sdk/images_armeabi-v7a_source.prop_template
+++ b/sdk/images_armeabi-v7a_source.prop_template
@@ -1,6 +1,6 @@
 Pkg.Desc=Android SDK Platform ${PLATFORM_VERSION}
 Pkg.UserSrc=false
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
 SystemImage.Abi=armeabi-v7a
diff --git a/sdk/images_armeabi_source.prop_template b/sdk/images_armeabi_source.prop_template
index 906e378..8644d10 100644
--- a/sdk/images_armeabi_source.prop_template
+++ b/sdk/images_armeabi_source.prop_template
@@ -1,6 +1,6 @@
 Pkg.Desc=Android SDK Platform ${PLATFORM_VERSION}
 Pkg.UserSrc=false
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
 SystemImage.Abi=armeabi
diff --git a/sdk/images_x86_source.prop_template b/sdk/images_x86_source.prop_template
index 90024ea..a587cd1 100644
--- a/sdk/images_x86_source.prop_template
+++ b/sdk/images_x86_source.prop_template
@@ -1,6 +1,6 @@
 Pkg.Desc=Android SDK Platform ${PLATFORM_VERSION}
 Pkg.UserSrc=false
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
 SystemImage.Abi=x86
diff --git a/sdk/plat_tools_source.prop_template b/sdk/plat_tools_source.prop_template
index b83af7f..5d62307 100644
--- a/sdk/plat_tools_source.prop_template
+++ b/sdk/plat_tools_source.prop_template
@@ -1,3 +1,3 @@
 Pkg.UserSrc=false
-Pkg.Revision=${PLATFORM_SDK_VERSION}.0.1
+Pkg.Revision=${PLATFORM_SDK_VERSION}.0.0
 
diff --git a/sdk/platform_source.prop_template b/sdk/platform_source.prop_template
index 09a2d81..7ecb1e2 100644
--- a/sdk/platform_source.prop_template
+++ b/sdk/platform_source.prop_template
@@ -2,7 +2,7 @@
 Pkg.UserSrc=false
 Platform.Version=${PLATFORM_VERSION}
 Platform.CodeName=KitKat
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
 Layoutlib.Api=10
diff --git a/sdk/source_source.prop_template b/sdk/source_source.prop_template
index 523d6bd..d3cdfd5 100644
--- a/sdk/source_source.prop_template
+++ b/sdk/source_source.prop_template
@@ -1,4 +1,4 @@
 Pkg.UserSrc=false
-Pkg.Revision=2
+Pkg.Revision=1
 AndroidVersion.ApiLevel=${PLATFORM_SDK_VERSION}
 AndroidVersion.CodeName=${PLATFORM_VERSION_CODENAME}
diff --git a/sdk/support_source.prop_template b/sdk/support_source.prop_template
index 20022d2..f5b217e 100644
--- a/sdk/support_source.prop_template
+++ b/sdk/support_source.prop_template
@@ -1,5 +1,5 @@
 Pkg.UserSrc=false
-Pkg.Revision=${PLATFORM_SDK_VERSION}.2.0
+Pkg.Revision=${PLATFORM_SDK_VERSION}.0.0
 Extra.Vendor=android
 Extra.VendorId=android
 Extra.VendorDisplay=Android
diff --git a/tools/elftree/Android.mk b/tools/elftree/Android.mk
index 6327273..b1c1eb7 100644
--- a/tools/elftree/Android.mk
+++ b/tools/elftree/Android.mk
@@ -14,7 +14,7 @@
 
 LOCAL_PATH := $(call my-dir)
 
-supported_platforms := linux-x86 darwin-x86
+supported_platforms := linux-x86
 cur_platform := $(filter $(HOST_OS)-$(HOST_ARCH),$(supported_platforms))
 
 ifdef cur_platform
@@ -37,10 +37,10 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE := elftree
 LOCAL_SRC_FILES := elftree.c
-LOCAL_C_INCLUDES := external/elfutils/libelf
+LOCAL_C_INCLUDES := external/elfutils/0.153/libelf
 # to fix compatibility issues in elf headers across different platforms
 LOCAL_CFLAGS += \
-	-include external/elfutils/host-$(HOST_OS)-fixup/AndroidFixup.h
+	-include external/elfutils/0.153/host-$(HOST_OS)-fixup/AndroidFixup.h
 LOCAL_STATIC_LIBRARIES := libelf
 include $(BUILD_HOST_EXECUTABLE)
 
diff --git a/tools/make_key b/tools/make_key
index 209d824..a101817 100755
--- a/tools/make_key
+++ b/tools/make_key
@@ -17,12 +17,12 @@
 # Generates a public/private key pair suitable for use in signing
 # android .apks and OTA update packages.
 
-if [ "$#" -ne 2 ]; then
+if [ "$#" -lt 2 -o "$#" -gt 3 ]; then
   cat <<EOF
-Usage: $0 <name> <subject>
+Usage: $0 <name> <subject> [<keytype>]
 
 Creates <name>.pk8 key and <name>.x509.pem cert.  Cert contains the
-given <subject>.
+given <subject>. A keytype of "rsa" or "ec" is accepted.
 EOF
   exit 2
 fi
@@ -49,9 +49,18 @@
 read -p "Enter password for '$1' (blank for none; password will be visible): " \
   password
 
-( openssl genrsa -f4 2048 | tee ${one} > ${two} ) &
+if [ "${3}" = "rsa" -o "$#" -eq 2 ]; then
+  ( openssl genrsa -f4 2048 | tee ${one} > ${two} ) &
+  hash="-sha1"
+elif [ "${3}" = "ec" ]; then
+  ( openssl ecparam -name prime256v1 -genkey -noout | tee ${one} > ${two} ) &
+  hash="-sha256"
+else
+  echo "Only accepts RSA or EC keytypes."
+  exit 1
+fi
 
-openssl req -new -x509 -sha1 -key ${two} -out $1.x509.pem \
+openssl req -new -x509 ${hash} -key ${two} -out $1.x509.pem \
   -days 10000 -subj "$2" &
 
 if [ "${password}" == "" ]; then