From c0473b3a2433ad47959094dc04fcfde8a130a06d Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Tue, 12 Apr 2011 10:57:22 +0100 Subject: [PATCH 001/502] Allow a device to generically define its own headers We have a few cases of devices including specific versions of projects just because of modified headers (msm_mdp.h comes to mind), and I just had enough of ifdeffing header files for specific cases (the P990 needs a lot of these). Now... if a target defines a TARGET_SPECIFIC_HEADER_PATH, any headers in there will take precedence over the standard ones; for example, on the p990, I have TARGET_SPECIFIC_HEADER_PATH := device/lge/p990/include which makes, for example, the device/lge/p990/include/hardware_legacy/AudioHardwareInterface.h be used instead of hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h whenever a source file uses Change-Id: I41b62668b60e3f62a6ebd3738d8d2675103a81e6a build: fix target header overlay LOCAL_C_INCLUDES as defined by the makefile should be put AFTER the overlay includes so the overlay always takes precedence. Change-Id: I489b2aab6dbacd9122d834f85e07b63ed1271f07 --- core/binary.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/binary.mk b/core/binary.mk index 918a28dbd8a..f3077f3af00 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1232,6 +1232,11 @@ my_tracked_gen_files := $(foreach f,$(my_tracked_src_files),$(eval my_src_file_obj_$(s):=)) my_tracked_src_files := +## Allow a device's own headers to take precedence over global ones +ifneq ($(TARGET_SPECIFIC_HEADER_PATH),) +my_c_includes := $(TOPDIR)$(TARGET_SPECIFIC_HEADER_PATH) $(my_c_includes) +endif + my_c_includes += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(generated_sources_dir) ifndef LOCAL_SDK_VERSION From 5e9adde3a3d310d5a5be4e88ed9ba3d7e30a5060 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 11 Apr 2012 11:21:23 +0100 Subject: [PATCH 002/502] build: Inline kernel building as a buildtime task Kernel image integration is now done in the build system. The "one true way" of doing this is to download the kernel source into kernel/TARGET_BOOTLOADER_NAME (by usage of the cm.dependencies mechanism or otherwise), and defining the TARGET_KERNEL_CONFIG variable in the device's BoardConfig makefile If the kernel's location doesn't match the automagic location (multi-device kernel source, for instance), TARGET_KERNEL_SOURCE can be used to specify a kernel path (i.e., "TARGET_KERNEL_SOURCE := kernel/shared-whatever") If the device requires out-of-kernel-tree modules to be built, the TARGET_KERNEL_MODULES variable can be used, pointing to a _make target_ that will build and install such modules. Definition of such a target is the device author's responsibility, the only restriction is that it is a normal makefile recipe (example below) Optionally (or as an alternative), a prebuilt binary can also be defined at BoardConfig, by usage of the TARGET_PREBUILT_KERNEL variable. This binary will be used if the kernel source is absent (or undefined). A minimal BoardConfig.mk should look something like this: TARGET_KERNEL_CONFIG := cyanogenmod__defconfig TARGET_PREBUILT_KERNEL := device///kernel To include, for example, the TI WLAN modules, this can be used: ----------------------------- TIWLAN_MODULES: make -C hardware/ti/wlan/wl1283/platforms/os/linux/ KERNEL_DIR=$(KERNEL_OUT) ARCH="arm" CROSS_COMPILE="arm-eabi-" TNETW=1273 RANDOM_MAC=n REPORT_LOG=n mv hardware/ti/wlan/wl1283/platforms/os/linux/tiwlan_drv.ko $(KERNEL_MODULES_OUT) make -C hardware/ti/wlan/wl1283_softAP/platforms/os/linux/ KERNEL_DIR=$(KERNEL_OUT) ARCH="arm" CROSS_COMPILE="arm-eabi-" TNETW=1273 REPORT_LOG=n mv hardware/ti/wlan/wl1283_softAP/platforms/os/linux/tiap_drv.ko $(KERNEL_MODULES_OUT) TARGET_KERNEL_MODULES := TIWLAN_MODULES --------------------------- Change-Id: I8634fa4c788a42dc6f62e62ca170825b66db126a build: Fix kernel module building on Darwin/OSX Darwin/OSX build host does not have module-init-tools which is required to generated modules.dep file. Switch to modules.order file marker which is always generated instead. Change-Id: I20c0fccd905fa668202c3e7284a8778db3728a65 kernel: Change path to kernel// Derive the kernel path from the device's own path (just replace "device" with "kernel") Change-Id: Idd44a0489e1ce280adf5ec4d9cfe2385c75dd115 kernel: Improve support for non-arm architectures Remove hardwired references to the ARM arch and toolchains, and replace them with the respective android build variables Change-Id: Iae3eb548ca1d58ac808b5fa430d415283a809106 kernel: Fix ARM building The default android ARM compiler, arm-androideabi-, does NOT work for the Linux kernel. Special-case the ARM architecture to target the ARM_EABI_TOOLCHAIN path directly Change-Id: Ib672c99f114cb89d5fda3343d4dc68810d042d35 kernel: allow TARGET_KERNEL_MODULES to overwrite kernel modules This is necessary to use compat-wireless since it needs to build a newer version of cfg80211 (and sometimes mac80211) than the kernel sources version. There are probably other instances of this type of need. Change-Id: Ib5bf818286bc20987d8b9f9480a43f3e7690e239 kernel.mk: make use of ccache when requested Change-Id: I9b6e28711bd5f590a76ac2b62a50b1d2de014e3e kernel: Fix ccache inclusion logic Builds were broken when CCACHE was missing from the environment Change-Id: Ie8d6048f4600f1dc9c298593a50e37af04b96438 build: show accurate information on inline kernel warnings/errors Having the variables on AndroidBoard as suggested causes errors with mm/mmm, whereas having them on BoardConfig doesn't. Adjust the warnings to reflect this. Change-Id: I554c1f1073df678d36521f73bc236a1f4b02212e This is causing generic_armv5-userdebug builds to fail. Commenting out for now to fix recovery build servers. Will fix properly later. Change-Id: Ibe1cda8cd2b4c1914dfa3b8a29724c9069e047a6 kernel.mk: Also search PRODUCT_COPY_FILES for the kernel copy, as that is how AOSP does it now. Change-Id: Id2d1cf079694d1996d4a85d8435c2e4562e5d444 kernel.mk: fix compiled kernel copy Change-Id: Ifb2a3d4968e56eed236eaa2db9258cd0b8865fda kernel.mk: workaround to fix kernel builds on darwin until the prebuilts/gcc is checked in by upstream. Change-Id: I6321fb7f6814b207c821d974766d945351b3f546 build: fix ccache usage when building kernels Change-Id: Id4edd4d85d9ba3ef42575f5fdebf22ed14957a99 kernel.mk: set KERNEL_OUT properly It was hardcoded to $(ANDROID_BUILD_TOP)/$(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ which wouldn't exist if OUT_DIR_COMMON_BASE was set to use another dir (e.g. ramdisk) Fix it so that it now points to $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ if OUT_DIR is not out Change-Id: I1bf767d86548e41270d9cbb8f0c00512708501c5 build: add support for uncompressed kernels build: kernel: remove hard coded darwin toolchain. * Use latest kernel toolchain from $(ARM_EABI_TOOLCHAIN) variable. Change-Id: I3b43408937dd5f193fcba19c034f868272de8963 envsetup: set OUT_DIR to an absolute path always OUT_DIR was set to $(TOPDIR)out previously, but $(TOPDIR) was null, so it was a relative path. This broke releasetools, inline kernel building, etc since they require absolute paths. Fix it so that it is set to $(shell readlink -f .)/out if $(TOPDIR) is null. Also remove hacks which checked if (OUT_DIR) was out and changed it to $(ANDROID_BUILD_TOP)/out to workaround the aforementioned problem. Change-Id: I459a3b1325a1bbea0565cd73f6acf160d4ed9b39 build: add strip on kernel modules kernel modules are huge for prima wlan and we need to strip them unstriped size 40mb striped size 2mb Change-Id: Iefd572732cad0a6f608439618673068a3586fcd5 kernel: Ignore errors with module building Let kernel fully disable loadable modules Change-Id: Ia37ec927b092c041ee4c68bf9fd0f28b7339c8ca build: Add support for extra kernel build variables * This allows specifying a variant defconfig, and an selinux defconfig which are simply configuration fragments. Change-Id: I97882ae3b8c2e16ff6a7dce8dd3a70d70f8aa866 s/cyanogenmod.com/cyanogenmod.org/ * And fixup a wiki link while I'm at it. Change-Id: I0355b9a47eac1becc07e81659fbb2d11b14ece36 Fixes for Xcode 5 and OSX 10.9. kernel.mk: Put elf.h into the include path on Darwin builds. Change-Id: I7069b956965d27caac3b2e4c3cc2e8b4c1da7a82 Make the kernel image format parametric instead of a chain of if/elses Change-Id: I54bfcdecb8647f7bcf744e72b2de19fcf4e4e7ac build: Add "dtbs" target when building the kernel * This is needed for 3.10 Change-Id: I4044ea9e67017452efc25097a3327141a6627c24 Allow specifying kernel toolchain and prefix Change-Id: Ib75cfe772e073f2196455f3e3dfba247f6b3feff Fix libelf path Fixes kernel build Change-Id: Ic6cdb1734d7b865491e8e61403d32db4acafe514 Signed-off-by: Alvin Francis core: More flexible kernel configuration * Allow various combinations of kernel vs. userspace architectures * Get rid of various assumptions about everything being ARM or 32-bit * This adds the following target flags: TARGET_KERNEL_ARCH TARGET_KERNEL_HEADER_ARCH KERNEL_HEADER_DEFCONFIG TARGET_KERNEL_CROSS_COMPILE_PREFIX Change-Id: If0bc202abd35c216ba3ea5707ffdb602526d8ed3 Fix kernel.mk if SELINUX or VARIANT_DEFCONFIG is defined KERNEL_HEADER_DEFCONFIG was ignoring SELINUX_DEFCONFIG thus breaking all selinux support Change-Id: Idc3367d6b4b85343078e63e87dca6d6d052e7f53 build: kernel: Fix stray "@" Nested "$(hide)"s (makefile @) don't work. There was one at the beginning of the script, remove the inner one to prevent it from being interpreted as a shell command Change-Id: I08a829ee56b212366a0f5a3812f7a614667a9c2b build: Add support for additional kernel config snippet * Add support for TARGET_KERNEL_ADDITIONAL_CONFIG which will append a config snippet from arch/$ARCH/configs/ to the main defconfig. * This can be used for various things, such as including DIAG support into debuggable builds. Change-Id: Ifa48688a3f951dd8ecc9a13a27de3a476e7bf633 kernel: Fix kernelconfig build * Copy the generated defconfig to the correct directory Change-Id: Ia8e259946d67501675dd5a3433165d54df6c13c5 build: kernel: arm64 uses Image.gz as the target Change-Id: Icc194d2a16f9ffcf5803226fc1f2a5b091b4d861 kernel: use merge-config.sh for integrating KERNEL_ADDITIONAL_CONFIG Using 'cat' to combine defconfig fragments is not, in general, safe. Overriding options is not correctly handled, and it's possible to produce illegal configurations which violate Kconfig dependency constraints. Instead, use the merge-config.sh script from the kernel tree which more intelligently combines defconfig fragments. An 'alldefconfig' make target is also introduced, as merge-config.sh depends on it. Change-Id: I91a8c5e4bcf7072a3f95651dffe17380174134e4 kernel: Don't update defconfig with KERNEL_ADDITIONAL_CONFIG options If 'make kernelconfig' is run in an environment where KERNEL_ADDITIONAL_CONFIG is set, the options in the additional defconfig will be saved back to the defconfig when savedefconfig is performed. While not really a bug, this increases the likelihood of someone accidentally committing these changes or getting confused by unexpected deltas added to their defconfigs. Fix this by skipping the merge-config.sh step for the 'kernelconfig' make target. As a side-effect, options in KERNEL_ADDITIONAL_CONFIG will also not be displayed in menuconfig. This is not easily avoidable, and arguably not wrong anyway. Change-Id: I920be0338bb8afc87f6061c55aafb27ba658974d kernel: add `make kernelxconfig' target kernelxconfig is identical to kernelconfig except that it launches xconfig instead of menuconfig. xconfig easier to use if you need to search the Kconfig tree. Change-Id: I6d91c7e3efbc9f172b040425f2ec545e3f03b44d (cherry picked from commit 60ca2b7897b552ce5dee2633fc84906222579763) kernel: don't build modules or dtbs unless enabled Build modules and dtbs only if enabled. The make commands were allowed to fail silently to support builds that did not have these options enabled. This had a side effect of allowing builds to complete even if modules failed to build. Don't suppress these error anymore. Change-Id: I842124b465d9e14edd6a09ffe54f09da32f10632 kernel: prevent targets from being rebuilt needlessly Fix some rules that listed directories as their dependencies. Directories are always out-of-date because the rules that depend on them touch file under the directories they depend on them. Replace the directory dependencies with stamp file rules that handle directory creation. Change-Id: I2b36c846b6565b7f9aba5bb7583576ad300983b8 kernel: Fix usage of KERNEL_ARCH * x86_64 defconfigs live in arch/x86/configs * Use KERNEL_ARCH instead of TARGET_KERNEL_ARCH Change-Id: Idc191ea658fc4100bc7ad40958023c5f936daf44 build: force .config update if additional kernel config changes This patch forces a regeneration of the .config if either the contents of TARGET_KERNEL_ADDITIONAL_CONFIG changes or the value of TARGET_KERNEL_ADDITIONAL_CONFIG changes. OPO-360 Change-Id: Ide28be3fab01b9f9ad72aa9d8706131e2b9ac0c7 build: add build module from root Zenfone 5 have copies module to root , we use it Change-Id: I734e45a09d445e97f2b3834c5941db27e537b803 kernel: Don't use override config in kernel(x)config * It defeats the whole purpose of using KERNEL_CONFIG_OVERRIDE Change-Id: Ia405562a0dcf623ae2bfca2803c2d3427d84bf0a kernel: remove support for unused MTK Kernel Remove unused MTK kernel build support. Change-Id: I4f4df078ae03b1bd5edc7000e5b942bfc05c02bd kernel: add docs for config vars Add a header with documentation for the config vars currently in use by the Kernel build. Change-Id: I6930b41d716baabbb16c2f407b6b9fe6e5f2b4c8 kernel: allow toolchain prefix to be overridden Allow the toolchain prefix defined in BoardConfig.mk to be overridden via by setting KERNEL_TOOLCHAIN_PREFIX (alongside KERNEL_TOOLCHAIN) to compile with an alternate toolchain. Change-Id: If6f4f0dba9bd0b0056f76e380070cca74ea0a4df kernel: add banner for defconfig and header install steps Change-Id: Iddf9e1e206823573ebc38a8956a029d08dee83de build: Add dt.img and kernel target Change-Id: I4a266d8bd2b01ec4ec696f10f0cc7e912f25a38a Fix libelf path for mm Fixes kernel build on darwin Updated for cm-13.0 Change-Id: Ic6cdb1734d7b865491e8e61403d32db4acafe514 Signed-off-by: Alvin Francis --- core/tasks/kernel.mk | 367 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 core/tasks/kernel.mk diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk new file mode 100644 index 00000000000..eedf6ca194b --- /dev/null +++ b/core/tasks/kernel.mk @@ -0,0 +1,367 @@ +# Copyright (C) 2012 The CyanogenMod 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. + + +# Android makefile to build kernel as a part of Android Build +# +# Configuration +# ============= +# +# These config vars are usually set in BoardConfig.mk: +# +# TARGET_KERNEL_SOURCE = Kernel source dir, optional, defaults +# to kernel/$(TARGET_DEVICE_DIR) +# TARGET_KERNEL_CONFIG = Kernel defconfig +# TARGET_KERNEL_VARIANT_CONFIG = Variant defconfig, optional +# TARGET_KERNEL_SELINUX_CONFIG = SELinux defconfig, optional +# TARGET_KERNEL_ADDITIONAL_CONFIG = Additional defconfig, optional +# TARGET_KERNEL_ARCH = Kernel Arch +# TARGET_KERNEL_HEADER_ARCH = Optional Arch for kernel headers if +# different from TARGET_KERNEL_ARCH +# TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, +# optional, defaults to false +# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. aarch64-linux-android-) +# defaults to arm-eabi- +# +# BOARD_KERNEL_IMAGE_NAME = Built image name, optional, +# defaults to Image.gz on arm64 +# defaults to Image if TARGET_USES_UNCOMPRESSED_KERNEL +# defaults to zImage otherwise +# +# KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, +# Set this var in shell to override +# toolchain specified in BoardConfig.mk +# KERNEL_TOOLCHAIN = Path to toolchain, if unset, assumes +# TARGET_KERNEL_CROSS_COMPILE_PREFIX +# is in PATH +# USE_CCACHE = Enable ccache (global Android flag) +# +# NEED_KERNEL_MODULE_ROOT = Optional, if true, install kernel +# modules in root instead of system + + +TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g') + +## Externally influenced variables +# kernel location - optional, defaults to kernel// +TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR) +KERNEL_SRC := $(TARGET_KERNEL_SOURCE) +# kernel configuration - mandatory +KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) +VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) +SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) + +## Internal variables +KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ +KERNEL_CONFIG := $(KERNEL_OUT)/.config +KERNEL_OUT_STAMP := $(KERNEL_OUT)/.mkdir_stamp + +TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH)) +ifeq ($(TARGET_KERNEL_ARCH),) +KERNEL_ARCH := $(TARGET_ARCH) +else +KERNEL_ARCH := $(TARGET_KERNEL_ARCH) +endif + +ifeq ($(KERNEL_ARCH),x86_64) +KERNEL_DEFCONFIG_ARCH := x86 +else +KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) +endif +KERNEL_DEFCONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_DEFCONFIG_ARCH)/configs/$(KERNEL_DEFCONFIG) + +TARGET_KERNEL_HEADER_ARCH := $(strip $(TARGET_KERNEL_HEADER_ARCH)) +ifeq ($(TARGET_KERNEL_HEADER_ARCH),) +KERNEL_HEADER_ARCH := $(KERNEL_ARCH) +else +KERNEL_HEADER_ARCH := $(TARGET_KERNEL_HEADER_ARCH) +endif + +KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG)) +ifeq ($(KERNEL_HEADER_DEFCONFIG),) +KERNEL_HEADER_DEFCONFIG := $(KERNEL_DEFCONFIG) +endif + + +ifneq ($(BOARD_KERNEL_IMAGE_NAME),) + TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME) +else + ifeq ($(TARGET_USES_UNCOMPRESSED_KERNEL),true) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image + else + ifeq ($(KERNEL_ARCH),arm64) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image.gz + else + TARGET_PREBUILT_INT_KERNEL_TYPE := zImage + endif + endif +endif + +TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE) + +# Clear this first to prevent accidental poisoning from env +MAKE_FLAGS := + +ifeq ($(KERNEL_ARCH),arm64) + # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) + MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + ifeq ($(TARGET_ARCH),arm) + KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y + endif +endif + +ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),) +KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG) +KERNEL_ADDITIONAL_CONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG) + ifeq ("$(wildcard $(KERNEL_ADDITIONAL_CONFIG_SRC))","") + $(warning TARGET_KERNEL_ADDITIONAL_CONFIG '$(TARGET_KERNEL_ADDITIONAL_CONFIG)' doesn't exist) + KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null + endif +else + KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null +endif + +## Do be discontinued in a future version. Notify builder about target +## kernel format requirement +ifeq ($(BOARD_KERNEL_IMAGE_NAME),) +ifeq ($(BOARD_USES_UBOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage") +else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image") +endif +endif + +ifeq "$(wildcard $(KERNEL_SRC) )" "" + ifneq ($(TARGET_PREBUILT_KERNEL),) + HAS_PREBUILT_KERNEL := true + NEEDS_KERNEL_COPY := true + else + $(foreach cf,$(PRODUCT_COPY_FILES), \ + $(eval _src := $(call word-colon,1,$(cf))) \ + $(eval _dest := $(call word-colon,2,$(cf))) \ + $(ifeq kernel,$(_dest), \ + $(eval HAS_PREBUILT_KERNEL := true))) + endif + + ifneq ($(HAS_PREBUILT_KERNEL),) + $(warning ***************************************************************) + $(warning * Using prebuilt kernel binary instead of source *) + $(warning * THIS IS DEPRECATED, AND WILL BE DISCONTINUED *) + $(warning * Please configure your device to download the kernel *) + $(warning * source repository to $(KERNEL_SRC)) + $(warning * See http://wiki.cyanogenmod.org/w/Doc:_integrated_kernel_building) + $(warning * for more information *) + $(warning ***************************************************************) + FULL_KERNEL_BUILD := false + KERNEL_BIN := $(TARGET_PREBUILT_KERNEL) + else + $(warning ***************************************************************) + $(warning * *) + $(warning * No kernel source found, and no fallback prebuilt defined. *) + $(warning * Please make sure your device is properly configured to *) + $(warning * download the kernel repository to $(KERNEL_SRC)) + $(warning * and add the TARGET_KERNEL_CONFIG variable to BoardConfig.mk *) + $(warning * *) + $(warning * As an alternative, define the TARGET_PREBUILT_KERNEL *) + $(warning * variable with the path to the prebuilt binary kernel image *) + $(warning * in your BoardConfig.mk file *) + $(warning * *) + $(warning ***************************************************************) + $(error "NO KERNEL") + endif +else + NEEDS_KERNEL_COPY := true + ifeq ($(TARGET_KERNEL_CONFIG),) + $(warning **********************************************************) + $(warning * Kernel source found, but no configuration was defined *) + $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *) + $(warning * BoardConfig.mk file *) + $(warning **********************************************************) + # $(error "NO KERNEL CONFIG") + else + #$(info Kernel source found, building it) + FULL_KERNEL_BUILD := true + KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) + endif +endif + +ifeq ($(FULL_KERNEL_BUILD),true) + +KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr +KERNEL_HEADERS_INSTALL_STAMP := $(KERNEL_OUT)/.headers_install_stamp + +ifeq ($(NEED_KERNEL_MODULE_ROOT),true) +KERNEL_MODULES_INSTALL := root +KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT)/lib/modules +else +KERNEL_MODULES_INSTALL := system +KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules +endif + +TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) +ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) +KERNEL_TOOLCHAIN_PREFIX ?= arm-eabi- +else +KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) +endif + +ifeq ($(KERNEL_TOOLCHAIN),) +KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) +else +ifneq ($(KERNEL_TOOLCHAIN_PREFIX),) +KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) +endif +endif + +ifneq ($(USE_CCACHE),) + ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache + # Check that the executable is here. + ccache := $(strip $(wildcard $(ccache))) +endif + +KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)" +ccache = + +define mv-modules + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`;\ + ko=`find $$mpath/kernel -type f -name *.ko`;\ + for i in $$ko; do $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$i;\ + mv $$i $(KERNEL_MODULES_OUT)/; done;\ + fi +endef + +define clean-module-folder + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`; rm -rf $$mpath;\ + fi +endef + +ifeq ($(HOST_OS),darwin) + MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/src/libelf/ +endif + +ifeq ($(TARGET_KERNEL_MODULES),) + TARGET_KERNEL_MODULES := no-external-modules +endif + +$(KERNEL_OUT_STAMP): + $(hide) mkdir -p $(KERNEL_OUT) + $(hide) rm -rf $(KERNEL_MODULES_OUT) + $(hide) mkdir -p $(KERNEL_MODULES_OUT) + $(hide) touch $@ + +KERNEL_ADDITIONAL_CONFIG_OUT := $(KERNEL_OUT)/.additional_config + +.PHONY: force_additional_config +$(KERNEL_ADDITIONAL_CONFIG_OUT): force_additional_config + $(hide) cmp -s $(KERNEL_ADDITIONAL_CONFIG_SRC) $@ || cp $(KERNEL_ADDITIONAL_CONFIG_SRC) $@; + +$(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) + @echo -e ${CL_GRN}"Building Kernel Config"${CL_RST} + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG) + $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi + $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ + echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ + $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi + +TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL_STAMP) + @echo -e ${CL_GRN}"Building Kernel"${CL_RST} + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) + $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \ + then \ + echo -e ${CL_GRN}"Building DTBs"${CL_RST} ; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \ + else \ + echo "DTBs not enabled" ; \ + fi ; + $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \ + then \ + echo -e ${CL_GRN}"Building Kernel Modules"${CL_RST} ; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \ + $(mv-modules) && \ + $(clean-module-folder) ; \ + else \ + echo "Kernel Modules not enabled" ; \ + fi ; + + +$(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES + +$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES) + $(mv-modules) + $(clean-module-folder) + +$(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) + @echo -e ${CL_GRN}"Building Kernel Headers"${CL_RST} + $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \ + rm -f ../$(KERNEL_CONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi + $(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \ + echo "Used a different defconfig for header generation"; \ + rm -f ../$(KERNEL_CONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi + $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi + $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ + echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ + $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi + $(hide) touch $@ + +# provide this rule because there are dependencies on this throughout the repo +$(KERNEL_HEADERS_INSTALL): $(KERNEL_HEADERS_INSTALL_STAMP) + +kerneltags: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) tags + +kernelconfig: KERNELCONFIG_MODE := menuconfig +kernelxconfig: KERNELCONFIG_MODE := xconfig +kernelxconfig kernelconfig: $(KERNEL_OUT_STAMP) + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNELCONFIG_MODE) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig + cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC) + +alldefconfig: $(KERNEL_OUT_STAMP) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) alldefconfig + +endif # FULL_KERNEL_BUILD + +## Install it + +ifeq ($(NEEDS_KERNEL_COPY),true) +file := $(INSTALLED_KERNEL_TARGET) +ALL_PREBUILT += $(file) +$(file) : $(KERNEL_BIN) | $(ACP) + $(transform-prebuilt-to-target) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) +endif + +.PHONY: kernel +kernel: $(INSTALLED_KERNEL_TARGET) From 7bee7d4b76a28c9bb556a54bf677c80e7da6ee18 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 16 Nov 2011 23:14:27 +0000 Subject: [PATCH 003/502] ota: Remove cruft we don't care about Skip the date check (downgrade to your content), and don't include recovery in otapackages. 5.0.0 update: We want the recovery patchstuff back --- tools/releasetools/ota_from_target_files.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index b69ddaceea5..6a5c49f3ce7 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -561,10 +561,10 @@ def WriteFullOTAPackage(input_zip, output_zip): metadata["ota-type"] = "BLOCK" if block_based else "FILE" - if not OPTIONS.omit_prereq: - ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict) - ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict) - script.AssertOlderBuild(ts, ts_text) + #if not OPTIONS.omit_prereq: + # ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict) + # ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict) + # script.AssertOlderBuild(ts, ts_text) AppendAssertions(script, OPTIONS.info_dict, oem_dict) device_specific.FullOTA_Assertions() From 7845efdd9e8c4f3cbc854478abdc503782220d83 Mon Sep 17 00:00:00 2001 From: Andrew Sutherland Date: Fri, 18 Nov 2011 00:45:55 -0600 Subject: [PATCH 004/502] envsetup: cmremote,cmgerrit,cmrebase,mka,reposync Add the cm specific functions (cmremote, cmgerrit, cmrebase, mka, reposync) that are present in the gingerbread branch Change-Id: If28a5a206b8bb9ead5242c60f6c1e6af27141b57 --- envsetup.sh | 324 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 324 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 35df2d5f3e1..6f01326e207 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -20,6 +20,11 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - sepgrep: Greps on all local sepolicy files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file. +- cmremote: Add git remote for CM Gerrit Review +- cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review +- cmrebase: Rebase a Gerrit change and push it again +- mka: Builds using SCHED_BATCH on all processors +- reposync: Parallel repo sync using ionice and SCHED_BATCH Environment options: - SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that @@ -1484,6 +1489,325 @@ function godir () { \cd $T/$pathname } +function cmremote() +{ + git remote rm cmremote 2> /dev/null + if [ ! -d .git ] + then + echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + fi + GERRIT_REMOTE=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) + if [ -z "$GERRIT_REMOTE" ] + then + echo Unable to set up the git remote, are you in the root of the repo? + return 0 + fi + CMUSER=`git config --get review.review.cyanogenmod.com.username` + if [ -z "$CMUSER" ] + then + git remote add cmremote ssh://review.cyanogenmod.com:29418/$GERRIT_REMOTE + else + git remote add cmremote ssh://$CMUSER@review.cyanogenmod.com:29418/$GERRIT_REMOTE + fi + echo You can now push to "cmremote". +} + +function cmgerrit() { + if [ $# -eq 0 ]; then + $FUNCNAME help + return 1 + fi + local user=`git config --get review.review.cyanogenmod.com.username` + local review=`git config --get remote.github.review` + local project=`git config --get remote.github.projectname` + local command=$1 + shift + case $command in + help) + if [ $# -eq 0 ]; then + cat <&2 "Gerrit username not found." + return 1 + fi + local local_branch remote_branch + case $1 in + *:*) + local_branch=${1%:*} + remote_branch=${1##*:} + ;; + *) + local_branch=HEAD + remote_branch=$1 + ;; + esac + shift + git push $@ ssh://$user@$review:29418/$project \ + $local_branch:refs/for/$remote_branch || return 1 + ;; + changes|for) + if [ "$FUNCNAME" = "cmgerrit" ]; then + echo >&2 "'$FUNCNAME $command' is deprecated." + fi + ;; + __cmg_err_no_arg) + if [ $# -lt 2 ]; then + echo >&2 "'$FUNCNAME $command' missing argument." + elif [ $2 -eq 0 ]; then + if [ -n "$3" ]; then + $FUNCNAME help $1 + else + echo >&2 "'$FUNCNAME $1' missing argument." + fi + else + return 1 + fi + ;; + __cmg_err_not_repo) + if [ -z "$review" -o -z "$project" ]; then + echo >&2 "Not currently in any reviewable repository." + else + return 1 + fi + ;; + __cmg_err_not_supported) + $FUNCNAME __cmg_err_no_arg $command $# && return + case $1 in + #TODO: filter more git commands that don't use refname + init|add|rm|mv|status|clone|remote|bisect|config|stash) + echo >&2 "'$FUNCNAME $1' is not supported." + ;; + *) return 1 ;; + esac + ;; + #TODO: other special cases? + *) + $FUNCNAME __cmg_err_not_supported $command && return 1 + $FUNCNAME __cmg_err_no_arg $command $# help && return 1 + $FUNCNAME __cmg_err_not_repo && return 1 + local args="$@" + local change pre_args refs_arg post_args + case "$args" in + *--\ *) + pre_args=${args%%-- *} + post_args="-- ${args#*-- }" + ;; + *) pre_args="$args" ;; + esac + args=($pre_args) + pre_args= + if [ ${#args[@]} -gt 0 ]; then + change=${args[${#args[@]}-1]} + fi + if [ ${#args[@]} -gt 1 ]; then + pre_args=${args[0]} + for ((i=1; i<${#args[@]}-1; i++)); do + pre_args="$pre_args ${args[$i]}" + done + fi + while ((1)); do + case $change in + ""|--) + $FUNCNAME help $command + return 1 + ;; + *@*) + if [ -z "$refs_arg" ]; then + refs_arg="@${change#*@}" + change=${change%%@*} + fi + ;; + *~*) + if [ -z "$refs_arg" ]; then + refs_arg="~${change#*~}" + change=${change%%~*} + fi + ;; + *^*) + if [ -z "$refs_arg" ]; then + refs_arg="^${change#*^}" + change=${change%%^*} + fi + ;; + *:*) + if [ -z "$refs_arg" ]; then + refs_arg=":${change#*:}" + change=${change%%:*} + fi + ;; + *) break ;; + esac + done + $FUNCNAME fetch $change \ + && git $command $pre_args FETCH_HEAD$refs_arg $post_args \ + || return 1 + ;; + esac +} + +function cmrebase() { + local repo=$1 + local refs=$2 + local pwd="$(pwd)" + local dir="$(gettop)/$repo" + + if [ -z $repo ] || [ -z $refs ]; then + echo "CyanogenMod Gerrit Rebase Usage: " + echo " cmrebase " + echo " The patch IDs appear on the Gerrit commands that are offered." + echo " They consist on a series of numbers and slashes, after the text" + echo " refs/changes. For example, the ID in the following command is 26/8126/2" + echo "" + echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD" + echo "" + return + fi + + if [ ! -d $dir ]; then + echo "Directory $dir doesn't exist in tree." + return + fi + cd $dir + repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) + echo "Starting branch..." + repo start tmprebase . + echo "Bringing it up to date..." + repo sync . + echo "Fetching change..." + git fetch "http://review.cyanogenmod.com/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD + if [ "$?" != "0" ]; then + echo "Error cherry-picking. Not uploading!" + return + fi + echo "Uploading..." + repo upload . + echo "Cleaning up..." + repo abandon tmprebase . + cd $pwd +} + +function mka() { + case `uname -s` in + Darwin) + make -j `sysctl hw.ncpu|cut -d" " -f2` "$@" + ;; + *) + schedtool -B -n 1 -e ionice -n 1 make -j `cat /proc/cpuinfo | grep "^processor" | wc -l` "$@" + ;; + esac +} + +function reposync() { + case `uname -s` in + Darwin) + repo sync -j 4 "$@" + ;; + *) + schedtool -B -n 1 -e ionice -n 1 repo sync -j 4 "$@" + ;; + esac +} + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that From d5b00058ff6658d64bb31ff175224396b2f41342 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sat, 19 Nov 2011 01:34:12 +0100 Subject: [PATCH 005/502] make bacon Change-Id: I4f61b6a6b9b8bab8582fa5423c4134c07af17606 --- core/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index d804c37673f..10dee3d88ae 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1849,8 +1849,9 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ -.PHONY: otapackage +.PHONY: otapackage bacon otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) +bacon: otapackage endif # build_ota_package From 86e9fa03ea49cbc116068da8a9f2d7b7dd440be1 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sat, 26 Jun 2010 22:53:55 -0700 Subject: [PATCH 006/502] add support for overriding build.prop settings. Change-Id: Ie4224d608b7bcb0c2087bd77bc954f8f5f9b6495 --- core/Makefile | 1 + core/product.mk | 1 + core/product_config.mk | 3 +++ 3 files changed, 5 insertions(+) diff --git a/core/Makefile b/core/Makefile index 10dee3d88ae..1adfd3a6c8c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -247,6 +247,7 @@ endif TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \ TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ + $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ if [ -f "$(file)" ]; then \ diff --git a/core/product.mk b/core/product.mk index 94cc2e390a2..adf56004cc2 100644 --- a/core/product.mk +++ b/core/product.mk @@ -73,6 +73,7 @@ endef # _product_var_list := \ + PRODUCT_BUILD_PROP_OVERRIDES \ PRODUCT_NAME \ PRODUCT_MODEL \ PRODUCT_LOCALES \ diff --git a/core/product_config.mk b/core/product_config.mk index ed38bc8fbfb..a8b63b40617 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -363,6 +363,9 @@ endif PRODUCT_DEFAULT_PROPERTY_OVERRIDES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)) +PRODUCT_BUILD_PROP_OVERRIDES := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BUILD_PROP_OVERRIDES)) + # Should we use the default resources or add any product specific overlays PRODUCT_PACKAGE_OVERLAYS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGE_OVERLAYS)) From 471b905ae02874c6ce6bcdf277f9d36a4829a92e Mon Sep 17 00:00:00 2001 From: codeworkx Date: Thu, 17 Nov 2011 17:33:44 +0100 Subject: [PATCH 007/502] add support for custom releasetools --- core/Makefile | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index 1adfd3a6c8c..824bb010e9c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1840,10 +1840,16 @@ INTERNAL_OTA_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_OTA_PACKAGE_TARGET): KEY_CERT_PAIR := $(DEFAULT_KEY_CERT_PAIR) +ifeq ($(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT),) + OTA_FROM_TARGET_SCRIPT := ./build/tools/releasetools/ota_from_target_files +else + OTA_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT) +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "Package OTA: $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/ota_from_target_files -v \ + $(OTA_FROM_TARGET_SCRIPT) -v \ --block \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ @@ -1867,10 +1873,16 @@ name := $(name)-img-$(FILE_NAME_TAG) INTERNAL_UPDATE_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip +ifeq ($(TARGET_RELEASETOOL_IMG_FROM_TARGET_SCRIPT),) + IMG_FROM_TARGET_SCRIPT := ./build/tools/releasetools/img_from_target_files +else + IMG_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_IMG_FROM_TARGET_SCRIPT) +endif + $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "Package: $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/img_from_target_files -v \ + $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ $(BUILT_TARGET_FILES_PACKAGE) $@ From f408edfeed29c94a927db4509e9aa065f8ecf0a7 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 25 Nov 2011 15:30:36 +0000 Subject: [PATCH 008/502] build: Preliminary support for CM product builds If building a cm_* product, skip crawling the filesystem for AndroidProduct makefiles (and, of course, parsing their contents) and aim directly for the device/cm/ device configuration Change-Id: I2a5e70dda973a6fcdbba0d5e26b35b99d3f1aea2 Change how we search for CM makefiles. build: Fix fastpath code for CM_BUILD * We need to adjust to the new validations Change-Id: I9066d4f437beb9597027ee6bbb52504b5e7e84c5 build: Fix cm builds the setup variable wasn't exported, and was being missed by part of the scripts --- core/product_config.mk | 16 +++++++++++++--- envsetup.sh | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/product_config.mk b/core/product_config.mk index a8b63b40617..d14a24a0dd2 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -184,11 +184,16 @@ ifneq ($(strip $(TARGET_BUILD_APPS)),) all_product_configs := $(call get-product-makefiles,\ $(SRC_TARGET_DIR)/product/AndroidProducts.mk) else -# Read in all of the product definitions specified by the AndroidProducts.mk -# files in the tree. -all_product_configs := $(get-all-product-makefiles) + ifneq ($(CM_BUILD),) + all_product_configs := $(shell ls device/*/$(CM_BUILD)/cm.mk) + else + # Read in all of the product definitions specified by the AndroidProducts.mk + # files in the tree. + all_product_configs := $(get-all-product-makefiles) + endif endif +ifeq ($(CM_BUILD),) # Find the product config makefile for the current product. # all_product_configs consists items like: # : @@ -207,9 +212,14 @@ $(foreach f, $(all_product_configs),\ $(eval all_product_makefiles += $(f))\ $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),\ $(eval current_product_makefile += $(f)),))) + _cpm_words := _cpm_word1 := _cpm_word2 := +else + current_product_makefile := $(strip $(all_product_configs)) + all_product_makefiles := $(strip $(all_product_configs)) +endif current_product_makefile := $(strip $(current_product_makefile)) all_product_makefiles := $(strip $(all_product_makefiles)) diff --git a/envsetup.sh b/envsetup.sh index 6f01326e207..9ddf869c0bd 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -133,6 +133,14 @@ function check_product() echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi + + if (echo -n $1 | grep -q -e "^cm_") ; then + CM_BUILD=$(echo -n $1 | sed -e 's/^cm_//g') + else + CM_BUILD= + fi + export CM_BUILD + TARGET_PRODUCT=$1 \ TARGET_BUILD_VARIANT= \ TARGET_BUILD_TYPE= \ From 926882ede99ac8356d79bb193ede4be5d90358e8 Mon Sep 17 00:00:00 2001 From: Chris Soyars Date: Thu, 23 Dec 2010 00:44:33 +0100 Subject: [PATCH 009/502] Add otapackage support for backuptool Change-Id: I512554c579d444067cd3ccbb0e6946a5eb6bc964a --- core/Makefile | 7 +++++++ core/config.mk | 1 + tools/releasetools/edify_generator.py | 5 +++++ tools/releasetools/ota_from_target_files.py | 16 ++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/core/Makefile b/core/Makefile index 824bb010e9c..05e903afa08 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1846,6 +1846,12 @@ else OTA_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT) endif +ifneq ($(CM_BUILD),) + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := true +else + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "Package OTA: $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ @@ -1853,6 +1859,7 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) --block \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ + --backup=$(backuptool) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ diff --git a/core/config.mk b/core/config.mk index 94c880f7a41..96d1eab2bee 100644 --- a/core/config.mk +++ b/core/config.mk @@ -529,6 +529,7 @@ else MKBOOTIMG := $(BOARD_CUSTOM_MKBOOTIMG) endif APICHECK := $(HOST_OUT_EXECUTABLES)/apicheck$(HOST_EXECUTABLE_SUFFIX) +MKIMAGE := $(HOST_OUT_EXECUTABLES)/mkimage$(HOST_EXECUTABLE_SUFFIX) FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX) MAKE_EXT4FS := $(HOST_OUT_EXECUTABLES)/make_ext4fs$(HOST_EXECUTABLE_SUFFIX) BLK_ALLOC_TO_BASE_FS := $(HOST_OUT_EXECUTABLES)/blk_alloc_to_base_fs$(HOST_EXECUTABLE_SUFFIX) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 2ecc5cbb86d..a1af2a154ee 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -146,6 +146,11 @@ def AssertSomeBootloader(self, *bootloaders): ");") self.script.append(self.WordWrap(cmd)) + def RunBackup(self, command): + self.script.append('package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");') + self.script.append('set_perm(0, 0, 0777, "/tmp/backuptool.sh");') + self.script.append(('run_program("/tmp/backuptool.sh", "%s");' % command)) + def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next 'dur' seconds. 'dur' may be zero to advance it via SetProgress diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 6a5c49f3ce7..802a0e18f59 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -113,6 +113,11 @@ Generate a log file that shows the differences in the source and target builds for an incremental package. This option is only meaningful when -i is specified. + + --backup + Enable or disable the execution of backuptool.sh. + Disabled by default. + """ import sys @@ -160,6 +165,7 @@ OPTIONS.stash_threshold = 0.8 OPTIONS.gen_verify = False OPTIONS.log_diff = None +OPTIONS.backuptool = False def MostPopularKey(d, default): """Given a dict, return the key corresponding to the largest @@ -615,6 +621,9 @@ def WriteFullOTAPackage(input_zip, output_zip): device_specific.FullOTA_InstallBegin() + if OPTIONS.backuptool: + script.RunBackup("backup") + system_progress = 0.75 if OPTIONS.wipe_user_data: @@ -688,6 +697,10 @@ def output_sink(fn, data): common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict) common.ZipWriteStr(output_zip, "boot.img", boot_img.data) + if OPTIONS.backuptool: + script.ShowProgress(0.02, 10) + script.RunBackup("restore") + script.ShowProgress(0.05, 5) script.WriteRawImage("/boot", "boot.img") @@ -1900,6 +1913,8 @@ def option_handler(o, a): OPTIONS.gen_verify = True elif o == "--log_diff": OPTIONS.log_diff = a + elif o in ("--backup"): + OPTIONS.backuptool = bool(a.lower() == 'true') else: return False return True @@ -1929,6 +1944,7 @@ def option_handler(o, a): "stash_threshold=", "gen_verify", "log_diff=", + "backup=", ], extra_option_handler=option_handler) if len(args) != 2: From d0419da633382089a5cce0fa508468810bb3188f Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sat, 26 Nov 2011 18:51:42 -0800 Subject: [PATCH 010/502] roomservice delivers you lunch combos from the CyanogenMod github. fix roomservice formatting support product names with _ in them fix roomservice to handle pagination Change-Id: I4923c2f768094dbad8e06a72d9f27d46414030ab roomservice: Add lightweight dependencies to repositories Roomservice can already fetch your cm_ without the need for a manifest entry. However, when working with common repositories, there is no way of actually fetching them without adding to the manifest. This patch introduces a lightweight dependency system. Each repository can have a cm.dependencies in the following json format: [ { "repository": "repository_name_on_cm_organization" "target_path": "target/path" }, ... ] For instance, for cm_anzu I need android_device_semc_msm7x30-common and android_device_semc_mogami-common. I would add both to cm.dependencies as follows: [ { "repository": "android_device_semc_msm7x30-common", "target_path": "device/semc/msm7x30-common" }, { "repository": "android_device_semc_mogami-common", "target_path": "device/semc/mogami-common" } ] Roomservice would then fetch the anzu repository, parse the dependency files and add/fetch/sync these additional repositories if they don't exist already. This also adds pretty printing to the output xml. Change-Id: I9cc847adfc717a06439bc6094213ed6492343158 roomservice: Add branch support to cm.dependencies Allow the cm.dependencies entries to provide an optional "branch" for the repository dependencies. Added to fully support http://wiki.cyanogenmod.com/wiki/Integrated_kernel_building Change-Id: I35b51920d296afa329411af6172c7bd9aeef4af8 roomservice: Fill in dependencies for already-deployed repositories Change-Id: I01fd408c9c4bfa78097c7f848b2556d2b2b180f3 roomservice: Extend dependency-checks to devices in main manifest CM currently keeps devices inherited from AOSP in the main manifest, so take that into account as well when checking device paths Change-Id: I9663f283617f237428b4eaa0cd60b5de2b86a7b9 make compatible with github v3 api Change-Id: Iff6f1f9099cdc5d2b49e04000b5fe3d04aa5d7e4 Fixed build for full-eng Previously Traceback (most recent call last): File "build/tools/roomservice.py", line 153, in repo_path = get_from_manifest(device) NameError: name 'device' is not defined ** Don't have a product spec for: 'full' ** Do you have the right repo manifest? Now ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.0.4 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=IMM76L ============================================ Change-Id: Ib513705aba9a7a52a971ab64102ecbe9fddfb97a roomservice: Bump github request per_page to 100 Change the number of repos per page from the default 30 to 100. We seem to be hitting the rate limit on the jenkins server. Change-Id: Ie733feaa0414cbfebb7efcfc1e24d94e1e466d1b roomservice: Add support for netrc Change-Id: I1f5e11e40125abd0c4e4c8d8294d4fc09bfdc30a roomservice: Handle missing netrc file Change-Id: If981fe79dc3e2191434301239b0cd585be8b4730 roomservice.py: Verbose error when a branch is missing. Also add ROOMSERVICE_BRANCHES environment variable to use fallback branches. Change-Id: I3c2b1d79fc185c1f1e1d658e5ca4f78e688780e2 roomservice.py: Fixups around fallback branches not being used by dependencies when ROOMSERVICE_BRANCHES is defined. Change-Id: Ifb42a023cae5f62ac8f9cf7832125b91b431169c roomservice: Allow following up tag references This is now needed for release builds Change-Id: I8c5f87341059b3b15ee853312b71df73790ad0d8 build: local_manifest.xml deprecated, use local_manifests Patch Set 2:- Use roomservice.xml instead of cm.xml. Change-Id: I3d8a6ef3907b92808662cbba912cea5ed38d0bde Fix fallback branch search in roomservice If you provided a fallback branch to roomservice via the ROOMSERVICE_BRANCHES environment var the branch search would fail if the device repo had any tags. Fixed this by appending the tag search results to the branch search results instead of overwriting them Change-Id: I73a11af1500bd04e346f08ec3f83454502f3a169 roomservice: Fix wrong assumption about path of active manifest Change-Id: Id740ff4b848e6ccbfd658be4846197b8ca519237 roomservice: When validating the presence of a repo, check main manifest too Change-Id: If680536484074b473458723d93e783d074d7f669 roomservice: Bump devices per page to 200 Limit was reached again when attempting to lunch various projects, such as steelhead. Change-Id: I2f3b9705e07e1e47b86857aeb383cf7c99fcdbdc Signed-off-by: William Roberts roomservice: Fix assumptions about the branch naming We can't just split from the last slash anymore, since we're using those to distinguish the stabilization branches Change-Id: Ia175dd317f508e99b275b56e9c83bd4729a75ddb roomservice: Add recursive dependencies Dependency repositories can now have dependencies themselves Change-Id: I33a28709170da52bc98f4a62387927e3a11b2450 roomservice: python3 support Change-Id: I7621818ba7ed997676728fe865f37a25b3a5b8b5 Signed-off-by: Chirayu Desai roomservice: Improve new device retrieval Without credentials, GitHub's search API limits requests to 60/hr. The existing method to add a new device is to fetch JSON-formatted info for ALL CM repositories and then search for the device. In doing so, more than 10 pages of results are returned (i.e. more than 10 requests per device). This is clumsy, slow, and limits use of roomservice to only ~5 devices per hour. Instead, only return search results for repositories that have the device name in the repository name. Then, one device = one request. It's faster and allows closer to 60 device setups / hr. Additional bailouts are included to stop the script earlier than later if a device is not found. Change-Id: I7f914d7ede82da0f100d9fd6cf8b603177962e48 roomservice: Fix search of devices forked to CM Commit "roomservice: Improve new device retrieval" introduced a regression where repositories that were forked to CM were omitted from search results. This fixes that issue. Change-Id: I7bf54129b5da1749abe5b2b9a492cb93e6ee41a6 roomservice: Improve error handling on search Use the relevant forms of 'except' for urllib and parsing instead of a general except which was performed too late anyways. Change-Id: Ia1fc89dd5a8a703fc0175aef7b6dd013a44a2c8e roomservice: use force-sync when adding projects with roomservice This works around the error GitError: --force-sync not enabled; cannot overwrite a local work tree when using roomservice. Since this should only trigger when the device repos haven't been checked out yet, we can use force-sync to overwrite any roomservice device paths in the .repo directory. Change-Id: Iac54a8a2f2913f82f8ca6497b8785a9d5769640b Ticket: CYNGNOS-735 roomservice: check uniqueness by path, not name For repos such as hardware/qcom/media-caf we are using the same name with different branches for different paths. for eg. CyanogenMod/hardware_qcom_media-caf(branch:8994) - fetch to : /hardware/qcom/media-caf/8994 CyanogenMod/hardware_qcom_media-caf(branch:8960) - fetch to : /hardware/qcom/media-caf/8960 For such cases roomservice won't pick up a new path if one already exists. We should check for unique by target path instead. Change-Id: I89e561ca9a2d57ede8cf782f431a8e829ea47ee5 Signed-off-by: Arnav Gupta --- envsetup.sh | 11 ++ tools/roomservice.py | 296 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+) create mode 100755 tools/roomservice.py diff --git a/envsetup.sh b/envsetup.sh index 9ddf869c0bd..ff7312d2c9c 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -605,6 +605,17 @@ function lunch() TARGET_BUILD_VARIANT=$variant \ build_build_var_cache if [ $? -ne 0 ] + then + # if we can't find a product, try to grab it off the CM github + T=$(gettop) + pushd $T > /dev/null + build/tools/roomservice.py $product + popd > /dev/null + check_product $product + else + build/tools/roomservice.py $product true + fi + if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" diff --git a/tools/roomservice.py b/tools/roomservice.py new file mode 100755 index 00000000000..9f73f02a749 --- /dev/null +++ b/tools/roomservice.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python +# Copyright (C) 2012-2013, The CyanogenMod 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. + +from __future__ import print_function + +import base64 +import json +import netrc +import os +import re +import sys +try: + # For python3 + import urllib.error + import urllib.parse + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + import urlparse + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.parse = urlparse + urllib.request = urllib2 + +from xml.etree import ElementTree + +product = sys.argv[1]; + +if len(sys.argv) > 2: + depsonly = sys.argv[2] +else: + depsonly = None + +try: + device = product[product.index("_") + 1:] +except: + device = product + +if not depsonly: + print("Device %s not found. Attempting to retrieve device repository from CyanogenMod Github (http://github.com/CyanogenMod)." % device) + +repositories = [] + +try: + authtuple = netrc.netrc().authenticators("api.github.com") + + if authtuple: + githubauth = base64.encodestring('%s:%s' % (authtuple[0], authtuple[2])).replace('\n', '') + else: + githubauth = None +except: + githubauth = None + +def add_auth(githubreq): + if githubauth: + githubreq.add_header("Authorization","Basic %s" % githubauth) + +if not depsonly: + githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:CyanogenMod+in:name+fork:true" % device) + add_auth(githubreq) + try: + result = json.loads(urllib.request.urlopen(githubreq).read().decode()) + except urllib.error.URLError: + print("Failed to search GitHub") + sys.exit() + except ValueError: + print("Failed to parse return data from GitHub") + sys.exit() + for res in result.get('items', []): + repositories.append(res) + +local_manifests = r'.repo/local_manifests' +if not os.path.exists(local_manifests): os.makedirs(local_manifests) + +def exists_in_tree(lm, path): + for child in lm.getchildren(): + if child.attrib['path'] == path: + return True + return False + +# in-place prettyprint formatter +def indent(elem, level=0): + i = "\n" + level*" " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + indent(elem, level+1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + +def get_default_revision(): + m = ElementTree.parse(".repo/manifest.xml") + d = m.findall('default')[0] + r = d.get('revision') + return r.replace('refs/heads/', '').replace('refs/tags/', '') + +def get_from_manifest(devicename): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if re.search("android_device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + # Devices originally from AOSP are in the main manifest... + try: + mm = ElementTree.parse(".repo/manifest.xml") + mm = mm.getroot() + except: + mm = ElementTree.Element("manifest") + + for localpath in mm.findall("project"): + if re.search("android_device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + return None + +def is_in_manifest(projectpath): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if localpath.get("path") == projectpath: + return True + + ## Search in main manifest, too + try: + lm = ElementTree.parse(".repo/manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if localpath.get("path") == projectpath: + return True + + return False + +def add_to_manifest(repositories, fallback_branch = None): + try: + lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for repository in repositories: + repo_name = repository['repository'] + repo_target = repository['target_path'] + print('Checking if %s is fetched from %s' % (repo_target, repo_name)) + if is_in_manifest(repo_target): + print('CyanogenMod/%s already fetched to %s' % (repo_name, repo_target)) + continue + + print('Adding dependency: CyanogenMod/%s -> %s' % (repo_name, repo_target)) + project = ElementTree.Element("project", attrib = { "path": repo_target, + "remote": "github", "name": "CyanogenMod/%s" % repo_name }) + + if 'branch' in repository: + project.set('revision',repository['branch']) + elif fallback_branch: + print("Using fallback branch %s for %s" % (fallback_branch, repo_name)) + project.set('revision', fallback_branch) + else: + print("Using default branch for %s" % repo_name) + + lm.append(project) + + indent(lm, 0) + raw_xml = ElementTree.tostring(lm).decode() + raw_xml = '\n' + raw_xml + + f = open('.repo/local_manifests/roomservice.xml', 'w') + f.write(raw_xml) + f.close() + +def fetch_dependencies(repo_path, fallback_branch = None): + print('Looking for dependencies') + dependencies_path = repo_path + '/cm.dependencies' + syncable_repos = [] + + if os.path.exists(dependencies_path): + dependencies_file = open(dependencies_path, 'r') + dependencies = json.loads(dependencies_file.read()) + fetch_list = [] + + for dependency in dependencies: + if not is_in_manifest(dependency['target_path']): + fetch_list.append(dependency) + syncable_repos.append(dependency['target_path']) + + dependencies_file.close() + + if len(fetch_list) > 0: + print('Adding dependencies to manifest') + add_to_manifest(fetch_list, fallback_branch) + else: + print('Dependencies file not found, bailing out.') + + if len(syncable_repos) > 0: + print('Syncing dependencies') + os.system('repo sync --force-sync %s' % ' '.join(syncable_repos)) + + for deprepo in syncable_repos: + fetch_dependencies(deprepo) + +def has_branch(branches, revision): + return revision in [branch['name'] for branch in branches] + +if depsonly: + repo_path = get_from_manifest(device) + if repo_path: + fetch_dependencies(repo_path) + else: + print("Trying dependencies-only mode on a non-existing device tree?") + + sys.exit() + +else: + for repository in repositories: + repo_name = repository['name'] + if repo_name.startswith("android_device_") and repo_name.endswith("_" + device): + print("Found repository: %s" % repository['name']) + + manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "") + + default_revision = get_default_revision() + print("Default revision: %s" % default_revision) + print("Checking branch info") + githubreq = urllib.request.Request(repository['branches_url'].replace('{/branch}', '')) + add_auth(githubreq) + result = json.loads(urllib.request.urlopen(githubreq).read().decode()) + + ## Try tags, too, since that's what releases use + if not has_branch(result, default_revision): + githubreq = urllib.request.Request(repository['tags_url'].replace('{/tag}', '')) + add_auth(githubreq) + result.extend (json.loads(urllib.request.urlopen(githubreq).read().decode())) + + repo_path = "device/%s/%s" % (manufacturer, device) + adding = {'repository':repo_name,'target_path':repo_path} + + fallback_branch = None + if not has_branch(result, default_revision): + if os.getenv('ROOMSERVICE_BRANCHES'): + fallbacks = list(filter(bool, os.getenv('ROOMSERVICE_BRANCHES').split(' '))) + for fallback in fallbacks: + if has_branch(result, fallback): + print("Using fallback branch: %s" % fallback) + fallback_branch = fallback + break + + if not fallback_branch: + print("Default revision %s not found in %s. Bailing." % (default_revision, repo_name)) + print("Branches found:") + for branch in [branch['name'] for branch in result]: + print(branch) + print("Use the ROOMSERVICE_BRANCHES environment variable to specify a list of fallback branches.") + sys.exit() + + add_to_manifest([adding], fallback_branch) + + print("Syncing repository to retrieve project.") + os.system('repo sync --force-sync %s' % repo_path) + print("Repository synced!") + + fetch_dependencies(repo_path, fallback_branch) + print("Done") + sys.exit() + +print("Repository for %s not found in the CyanogenMod Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) From e7eff528004437a2f31b2fcff687419129e7911d Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 31 Jan 2011 00:49:49 +0000 Subject: [PATCH 011/502] Squashed commit of breakfast/brunch commands Add a CM-specific breakfast menu We usually don't wan't all the devices in the lunch menu, so we can now choose to pick up breakfast or brunch and get a smaller selection of devices (i.e., those we support) Make brunch more nutritious * "breakfast device-name" will set up the environment, just like lunch. * "brunch device-name" will actually do the whole setup and build :) brunch: add a lazier mode Since all of CM's targets have a predictable PRODUCT_NAME and BUILD_VARIANT (i.e., "cyanogen_$(PRODUCT_DEVICE)-eng"), brunch can now be invoked passing just the PRODUCT_DEVICE ("brunch passion" for the N1 setup+build, for example). The "classic" long form of $(PRODUCT_NAME)-$(BUILD_VARIANT) can still be used if desired ("brunch cyanogen_passion-eng" still works). breakfast in bed breakfast in bed (aliased to "bib") is the baconless friend of lazy brunch. You can now use "breakfast passion", or "bib passion", to setup the corresponding CM build without actually building it Fix breakfast for the undecided The menu presentation (i.e., giving no arguments to breakfast or brunch) was broken, so if you didn't know the name of your target you weren't given a list to choose from, just an error. Change-Id: I85b8217daa2d511c16a1e82c700e1b0fadbb36ac CyanogenNom: Now moar helpful! --- envsetup.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index ff7312d2c9c..d61eac0014f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -539,8 +539,15 @@ function print_lunch_menu() local uname=$(uname) echo echo "You're building on" $uname + if [ "$(uname)" = "Darwin" ] ; then + echo " (ohai, koush!)" + fi echo - echo "Lunch menu... pick a combo:" + if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + echo "Breakfast menu... pick a combo:" + else + echo "Lunch menu... pick a combo:" + fi local i=1 local choice @@ -550,9 +557,56 @@ function print_lunch_menu() i=$(($i+1)) done + if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + echo "... and don't forget the bacon!" + fi + echo } +function brunch() +{ + breakfast $* + if [ $? -eq 0 ]; then + mka bacon + else + echo "No such item in brunch menu. Try 'breakfast'" + return 1 + fi + return $? +} + +function breakfast() +{ + target=$1 + CM_DEVICES_ONLY="true" + unset LUNCH_MENU_CHOICES + add_lunch_combo full-eng + for f in `/bin/ls vendor/cm/vendorsetup.sh 2> /dev/null` + do + echo "including $f" + . $f + done + unset f + + if [ $# -eq 0 ]; then + # No arguments, so let's have the full menu + lunch + else + echo "z$target" | grep -q "-" + if [ $? -eq 0 ]; then + # A buildtype was specified, assume a full device name + lunch $target + else + # This is probably just the CM model name + lunch cm_$target-userdebug + fi + fi + return $? +} + +alias bib=breakfast + function lunch() { local answer From 99e6e834edbe237c347558f224939cc4be710ab0 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Wed, 21 Apr 2010 11:39:48 -0400 Subject: [PATCH 012/502] Allow override of device asserts, including multi-device support. Set in board file with TARGET_OTA_ASSERT_DEVICE. (cherry-picked from commit 0f452f21fc9323b9d1fe746161761cf40aaa5030) Change-Id: I3d06bdc0e3e26bde0c0e646accd050364f9713b9 --- core/Makefile | 7 +++++++ tools/releasetools/edify_generator.py | 10 ++++++---- tools/releasetools/ota_from_target_files.py | 12 +++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/core/Makefile b/core/Makefile index 05e903afa08..232ac87d641 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1852,6 +1852,12 @@ else $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false endif +ifeq ($(TARGET_OTA_ASSERT_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := auto +else + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_OTA_ASSERT_DEVICE) +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "Package OTA: $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ @@ -1860,6 +1866,7 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ --backup=$(backuptool) \ + --override_device=$(override_device) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index a1af2a154ee..41c97255bc3 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -132,10 +132,12 @@ def AssertOlderBuild(self, timestamp, timestamp_text): def AssertDevice(self, device): """Assert that the device identifier is the given string.""" - cmd = ('getprop("ro.product.device") == "%s" || ' - 'abort("E%d: This package is for \\"%s\\" devices; ' - 'this is a \\"" + getprop("ro.product.device") + "\\".");') % ( - device, common.ErrorCode.DEVICE_MISMATCH, device) + cmd = ('assert(' + + ' || \0'.join(['getprop("ro.product.device") == "%s"' % i + for i in device.split(",")]) + + ' || abort("E%d: This package is for device: %s; ' + + 'this device is " + getprop("ro.product.device") + ".");' + + ');') % (common.ErrorCode.DEVICE_MISMATCH, device) self.script.append(cmd) def AssertSomeBootloader(self, *bootloaders): diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 802a0e18f59..699cbcc6ff0 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -118,6 +118,9 @@ Enable or disable the execution of backuptool.sh. Disabled by default. + --override_device + Override device-specific asserts. Can be a comma-separated list. + """ import sys @@ -166,6 +169,7 @@ OPTIONS.gen_verify = False OPTIONS.log_diff = None OPTIONS.backuptool = False +OPTIONS.override_device = 'auto' def MostPopularKey(d, default): """Given a dict, return the key corresponding to the largest @@ -446,7 +450,10 @@ def SignOutput(temp_zip_name, output_zip_name): def AppendAssertions(script, info_dict, oem_dict=None): oem_props = info_dict.get("oem_fingerprint_properties") if oem_props is None or len(oem_props) == 0: - device = GetBuildProp("ro.product.device", info_dict) + if OPTIONS.override_device == "auto": + device = GetBuildProp("ro.product.device", info_dict) + else: + device = OPTIONS.override_device script.AssertDevice(device) else: if oem_dict is None: @@ -1915,6 +1922,8 @@ def option_handler(o, a): OPTIONS.log_diff = a elif o in ("--backup"): OPTIONS.backuptool = bool(a.lower() == 'true') + elif o in ("--override_device"): + OPTIONS.override_device = a else: return False return True @@ -1945,6 +1954,7 @@ def option_handler(o, a): "gen_verify", "log_diff=", "backup=", + "override_device=" ], extra_option_handler=option_handler) if len(args) != 2: From f3db8194b8147795324a686a0a09647f4dbc0c8e Mon Sep 17 00:00:00 2001 From: Robert Burns Date: Wed, 4 Jan 2012 20:14:36 -0500 Subject: [PATCH 013/502] Add ro.cm.device to build.prop As requested by Ricardo Cerqueira: http://r.cyanogenmod.com/#change,11423,patchset=1 Change-Id: If08cc13c0f0e92e0dd262a2f71610070a54aaead --- core/Makefile | 1 + tools/buildinfo.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/core/Makefile b/core/Makefile index 232ac87d641..02af5129104 100644 --- a/core/Makefile +++ b/core/Makefile @@ -216,6 +216,7 @@ endif $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \ TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \ TARGET_DEVICE="$(TARGET_DEVICE)" \ + CM_DEVICE="$(TARGET_DEVICE)" \ PRODUCT_NAME="$(TARGET_PRODUCT)" \ PRODUCT_BRAND="$(PRODUCT_BRAND)" \ PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \ diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index dcb66bf2bb0..43c8e9d4108 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -62,4 +62,6 @@ if [ -n "$BUILD_THUMBPRINT" ] ; then fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" +echo "ro.cm.device=$CM_DEVICE" + echo "# end build properties" From 9357e8ffcedb0a091456430ed618b3a8b8bde96b Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Mon, 9 Jan 2012 15:42:26 +0100 Subject: [PATCH 014/502] build in colors: Install outputs in blue/yellow [basic ics version] "target prefix:" in yellow "Install: file" in cyan should be in a single command line else there are sync problems in multithread (-j X) These colors can be tuned in core/Makefile if you use a white terminal. can be disabled with "export BUILD_WITH_COLORS=0" Only the most important output is colored to reduce ics merge problems Change-Id: I0e585079fde6900799ef209367a523d94a51cda5 Colors: add more colors to final build steps also fix releasetool echo and visible recovery echos Change-Id: Icf5d88468572f935610c544bf1d5d356ec9870d3 build in colors: host C/C++ Change-Id: Ic415cab53a2efa104c9d4b31ddbe8c8eb74e493d --- core/Makefile | 28 +++++++++++++++++++++------- core/base_rules.mk | 4 ++-- core/definitions.mk | 16 ++++++++-------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/core/Makefile b/core/Makefile index 02af5129104..647dade6a7e 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1,5 +1,16 @@ # Put some miscellaneous rules here +# Build system colors +# +# PFX: Prefix "target C++:" in yellow +# INS: Module "Install:" output color (cyan for ics) + +ifneq ($(BUILD_WITH_COLORS),0) + CL_PFX="\033[33m" + CL_INS="\033[36m" + CL_RST="\033[0m" +endif + # HACK: clear LOCAL_PATH from including last build target before calling # intermedites-dir-for LOCAL_PATH := $(BUILD_SYSTEM) @@ -540,6 +551,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_S $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) @@ -569,12 +581,14 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) @echo "make $@: ignoring dependencies" $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} endif # TARGET_BOOTIMAGE_USE_EXT2 endif # BOARD_USES_RECOVERY_AS_BOOT @@ -981,7 +995,7 @@ define build-recoveryimage-target $(if $(filter true,BOARD_USES_RECOVERY_AS_BOOT), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))) - @echo ----- Made recovery image: $(1) -------- + @echo -e ${CL_INS}"Made recovery image: $@"${CL_RST} endef ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) @@ -1149,7 +1163,7 @@ endif $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) - @echo "Install system fs image: $@" + @echo -e ${CL_INS}"Install system fs image: $@"${CL_RST} $(copy-file-to-target) $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) @@ -1634,7 +1648,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(APKCERTS_FILE) \ $(HOST_OUT_EXECUTABLES)/fs_config \ | $(ACP) - @echo "Package target files: $@" + @echo -e ${CL_PFX}"Package target files:"${CL_RST}" $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) @@ -1860,7 +1874,7 @@ else endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) - @echo "Package OTA: $@" + @echo -e ${CL_PFX}"Package OTA:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ --block \ @@ -1895,7 +1909,7 @@ else endif $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) - @echo "Package: $@" + @echo -e ${CL_PFX}"Package:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ @@ -1937,7 +1951,7 @@ name := $(name)-apps-$(FILE_NAME_TAG) APPS_ZIP := $(PRODUCT_OUT)/$(name).zip $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) - @echo "Package apps: $@" + @echo -e ${CL_PFX}"Package apps:"${CL_RST}" $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) $(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \ @@ -2004,7 +2018,7 @@ name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG) INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) - @echo "Package: $@" + @echo -e ${CL_PFX}"Package:"${CL_RST}" $@" $(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) endif diff --git a/core/base_rules.mk b/core/base_rules.mk index 6722af4f27a..bd09279d356 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -313,12 +313,12 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) | $(ACP) - @echo "Install: $@" + @echo -e ${CL_INS}"Install: $@"${CL_RST} $(copy-file-to-new-target) $(PRIVATE_POST_INSTALL_CMD) else $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) - @echo "Install: $@" + @echo -e ${CL_INS}"Install: $@"${CL_RST} $(copy-file-to-target-with-cp) endif diff --git a/core/definitions.mk b/core/definitions.mk index b9ef4d57f1a..ab4acedf8f8 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1202,7 +1202,7 @@ endef ########################################################### define transform-cpp-to-o -@echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_PFX}"target $(PRIVATE_ARM_MODE) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1255,7 +1255,7 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-c-to-o-no-deps -@echo "target $(PRIVATE_ARM_MODE) C: $(PRIVATE_MODULE) <= $<" +@echo ${CL_PFX}"target $(PRIVATE_ARM_MODE) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CONLYFLAGS) \ @@ -1264,7 +1264,7 @@ $(call transform-c-or-s-to-o-no-deps, \ endef define transform-s-to-o-no-deps -@echo "target asm: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_PFX}"target asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1295,7 +1295,7 @@ endef ########################################################### define transform-m-to-o-no-deps -@echo "target ObjC: $(PRIVATE_MODULE) <= $<" +@echo ${CL_PFX}"target ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1309,7 +1309,7 @@ endef ########################################################### define transform-host-cpp-to-o -@echo "$($(PRIVATE_PREFIX)DISPLAY) C++: $(PRIVATE_MODULE) <= $<" +@echo ${CL_PFX}"$($(PRIVATE_PREFIX)DISPLAY) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1360,7 +1360,7 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-host-c-to-o-no-deps -@echo "$($(PRIVATE_PREFIX)DISPLAY) C: $(PRIVATE_MODULE) <= $<" +@echo ${CL_PFX}"$($(PRIVATE_PREFIX)DISPLAY) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -2079,7 +2079,7 @@ $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) endef define transform-java-to-classes.jar -@echo "target Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_PFX}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -2673,7 +2673,7 @@ endef ########################################################### define transform-generated-source -@echo "target Generated: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_PFX}"target Generated:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(PRIVATE_CUSTOM_TOOL) endef From a0a02459922f268dfbd64fecdbc0b76e42536977 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sat, 13 Oct 2012 13:05:29 +0530 Subject: [PATCH 015/502] build-with-colors: moar colors - rename CL_PFX and CL_INS to better match the colors they show. - add more colors. Output of: - most host stuff is yellow - most target stuff is green - installing/copying files is cyan - import/export includes and notice files is cyan - bootimage/recoveryimage is cyan - and some more colors in many places ;) Change-Id: I5532afa4ba608e0a7c408516dc9f912f9ca389f7 --- core/Makefile | 35 ++++++++++---------- core/base_rules.mk | 6 ++-- core/binary.mk | 4 +-- core/cleanbuild.mk | 4 +-- core/definitions.mk | 54 +++++++++++++++---------------- core/distdir.mk | 2 +- core/droiddoc.mk | 6 ++-- core/dynamic_binary.mk | 6 ++-- core/host_java_library.mk | 2 +- core/java.mk | 10 +++--- core/java_library.mk | 6 ++-- core/main.mk | 6 ++-- core/notice_files.mk | 2 +- core/pdk_config.mk | 2 +- core/product-graph.mk | 2 +- core/static_java_library.mk | 2 +- core/tasks/apicheck.mk | 4 +-- core/tasks/collect_gpl_sources.mk | 2 +- core/tasks/sdk-addon.mk | 2 +- 19 files changed, 79 insertions(+), 78 deletions(-) diff --git a/core/Makefile b/core/Makefile index 647dade6a7e..d31dd3b9440 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1,13 +1,14 @@ # Put some miscellaneous rules here # Build system colors -# -# PFX: Prefix "target C++:" in yellow -# INS: Module "Install:" output color (cyan for ics) ifneq ($(BUILD_WITH_COLORS),0) - CL_PFX="\033[33m" - CL_INS="\033[36m" + CL_RED="\033[31m" + CL_GRN="\033[32m" + CL_YLW="\033[33m" + CL_BLU="\033[34m" + CL_MAG="\033[35m" + CL_CYN="\033[36m" CL_RST="\033[0m" endif @@ -551,7 +552,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_S $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) @@ -581,7 +582,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) @@ -695,7 +696,7 @@ endif # TARGET_BUILD_APPS $(kernel_notice_file): \ $(BUILD_SYSTEM)/LINUX_KERNEL_COPYING \ | $(ACP) - @echo Copying: $@ + @echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" $(hide) mkdir -p $(dir $@) $(hide) $(ACP) $< $@ @@ -958,7 +959,7 @@ $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id # $(1): output file define build-recoveryimage-target - @echo ----- Making recovery image ------ + @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp @echo Copying baseline ramdisk... @@ -995,7 +996,7 @@ define build-recoveryimage-target $(if $(filter true,BOARD_USES_RECOVERY_AS_BOOT), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))) - @echo -e ${CL_INS}"Made recovery image: $@"${CL_RST} + @echo -e ${CL_CYN}"Made recovery image: $@"${CL_RST} endef ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) @@ -1153,7 +1154,7 @@ $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(HOST_OUT_EXECUTABLES)/imgdiff \ $(HOST_OUT_EXECUTABLES)/bsdiff - @echo "Construct recovery from boot" + @echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST} mkdir -p $(dir $@) PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true @@ -1163,7 +1164,7 @@ endif $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) - @echo -e ${CL_INS}"Install system fs image: $@"${CL_RST} + @echo -e ${CL_CYN}"Install system fs image: $@"${CL_RST} $(copy-file-to-target) $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) @@ -1648,7 +1649,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(APKCERTS_FILE) \ $(HOST_OUT_EXECUTABLES)/fs_config \ | $(ACP) - @echo -e ${CL_PFX}"Package target files:"${CL_RST}" $@" + @echo -e ${CL_YLW}"Package target files:"${CL_RST}" $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) @@ -1874,7 +1875,7 @@ else endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) - @echo -e ${CL_PFX}"Package OTA:"${CL_RST}" $@" + @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ --block \ @@ -1909,7 +1910,7 @@ else endif $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) - @echo -e ${CL_PFX}"Package:"${CL_RST}" $@" + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ @@ -1951,7 +1952,7 @@ name := $(name)-apps-$(FILE_NAME_TAG) APPS_ZIP := $(PRODUCT_OUT)/$(name).zip $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) - @echo -e ${CL_PFX}"Package apps:"${CL_RST}" $@" + @echo -e ${CL_YLW}"Package apps:"${CL_RST}" $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) $(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \ @@ -2018,7 +2019,7 @@ name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG) INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) - @echo -e ${CL_PFX}"Package:"${CL_RST}" $@" + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" $(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) endif diff --git a/core/base_rules.mk b/core/base_rules.mk index bd09279d356..5ef2b765c9e 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -265,7 +265,7 @@ $(cleantarget) : PRIVATE_CLEAN_FILES := \ $(LOCAL_INSTALLED_MODULE) \ $(intermediates) $(cleantarget):: - @echo "Clean: $(PRIVATE_MODULE)" + @echo -e ${CL_GRN}"Clean:"${CL_RST}" $(PRIVATE_MODULE)" $(hide) rm -rf $(PRIVATE_CLEAN_FILES) ########################################################### @@ -313,12 +313,12 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) | $(ACP) - @echo -e ${CL_INS}"Install: $@"${CL_RST} + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-new-target) $(PRIVATE_POST_INSTALL_CMD) else $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) - @echo -e ${CL_INS}"Install: $@"${CL_RST} + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-target-with-cp) endif diff --git a/core/binary.mk b/core/binary.mk index f3077f3af00..a842f366b78 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1177,7 +1177,7 @@ import_includes_deps := $(strip \ $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes)) $(import_includes): PRIVATE_IMPORT_EXPORT_INCLUDES := $(import_includes_deps) $(import_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(import_includes_deps) - @echo Import includes file: $@ + @echo -e ${CL_CYN}Import includes file:${CL_RST} $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef import_includes_deps $(hide) for f in $(PRIVATE_IMPORT_EXPORT_INCLUDES); do \ @@ -1430,7 +1430,7 @@ $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs) # People are not going to consume the aidl generated cpp file, but the cpp file is # generated after the headers, so this is a convenient way to ensure the headers exist. $(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) $(vts_gen_cpp) - @echo Export includes file: $< -- $@ + @echo -e ${CL_CYN}Export includes file:${CL_RST} $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@.tmp ifdef my_export_c_include_dirs $(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \ diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index 0d6a406ceaa..430801f5dcd 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -280,13 +280,13 @@ endif dataclean: FILES := $(dataclean_files) dataclean: $(hide) rm -rf $(FILES) - @echo "Deleted emulator userdata images." + @echo -e ${CL_GRN}"Deleted emulator userdata images."${CL_RST} .PHONY: installclean installclean: FILES := $(installclean_files) installclean: dataclean $(hide) rm -rf $(FILES) - @echo "Deleted images and staging directories." + @echo -e ${CL_GRN}"Deleted images and staging directories."${CL_RST} .PHONY: objclean objclean: FILES := $(objclean_files) diff --git a/core/definitions.mk b/core/definitions.mk index ab4acedf8f8..2d594639124 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1202,7 +1202,7 @@ endef ########################################################### define transform-cpp-to-o -@echo -e ${CL_PFX}"target $(PRIVATE_ARM_MODE) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1255,7 +1255,7 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-c-to-o-no-deps -@echo ${CL_PFX}"target $(PRIVATE_ARM_MODE) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CONLYFLAGS) \ @@ -1264,7 +1264,7 @@ $(call transform-c-or-s-to-o-no-deps, \ endef define transform-s-to-o-no-deps -@echo -e ${CL_PFX}"target asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1295,7 +1295,7 @@ endef ########################################################### define transform-m-to-o-no-deps -@echo ${CL_PFX}"target ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1309,7 +1309,7 @@ endef ########################################################### define transform-host-cpp-to-o -@echo ${CL_PFX}"$($(PRIVATE_PREFIX)DISPLAY) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1360,12 +1360,12 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-host-c-to-o-no-deps -@echo ${CL_PFX}"$($(PRIVATE_PREFIX)DISPLAY) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef define transform-host-s-to-o-no-deps -@echo "$($(PRIVATE_PREFIX)DISPLAY) asm: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1384,7 +1384,7 @@ endef ########################################################### define transform-host-m-to-o-no-deps -@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC: $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1524,7 +1524,7 @@ endef # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-o-to-static-lib -@echo "target StaticLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-target-whole-static-libs) @@ -1572,7 +1572,7 @@ endef # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-host-o-to-static-lib -@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-host-whole-static-libs) @@ -1616,13 +1616,13 @@ endef endif define transform-host-o-to-shared-lib -@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-shared-lib-inner) endef define transform-host-o-to-package -@echo "$($(PRIVATE_PREFIX)DISPLAY) Package: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Package:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-shared-lib-inner) endef @@ -1658,7 +1658,7 @@ $(hide) $(PRIVATE_CXX) \ endef define transform-o-to-shared-lib -@echo "target SharedLib: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-shared-lib-inner) endef @@ -1673,14 +1673,14 @@ ifneq ($(TARGET_BUILD_VARIANT),user) endif define transform-to-stripped -@echo "target Strip: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Strip:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ \ $(if $(PRIVATE_NO_DEBUGLINK),,$(TARGET_STRIP_EXTRA)) endef define transform-to-stripped-keep-symbols -@echo "target Strip (keep symbols): $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Strip (keep symbols):"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(hide) $(PRIVATE_OBJCOPY) \ `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \ @@ -1729,7 +1729,7 @@ $(hide) $(PRIVATE_CXX) -pie \ endef define transform-o-to-executable -@echo "target Executable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-executable-inner) endef @@ -1772,7 +1772,7 @@ $(hide) $(PRIVATE_CXX) \ endef define transform-o-to-static-executable -@echo "target StaticExecutable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_GRN}"target StaticExecutable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-static-executable-inner) endef @@ -1818,7 +1818,7 @@ endef endif define transform-host-o-to-executable -@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable: $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-executable-inner) endef @@ -2079,7 +2079,7 @@ $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) endef define transform-java-to-classes.jar -@echo -e ${CL_PFX}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_GRN}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -2530,7 +2530,7 @@ endef # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR # in transform-java-to-classes for the sake of vm-tests. define transform-host-java-to-package -@echo "$($(PRIVATE_PREFIX)DISPLAY) Java: $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(HOST_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -2543,7 +2543,7 @@ endef # $(2): destination header define copy-one-header $(2): $(1) - @echo "Header: $$@" + @echo -e ${CL_YLW}"Header:"${CL_RST}" $$@" $$(copy-file-to-new-target-with-cp) endef @@ -2552,7 +2552,7 @@ endef # $(2): destination file define copy-one-file $(2): $(1) | $(ACP) - @echo "Copy: $$@" + @echo -e ${CL_YLW}"Copy:"${CL_RST}" $$@" $$(copy-file-to-target) endef @@ -2573,7 +2573,7 @@ endef # $(2): destination file, must end with .xml. define copy-xml-file-checked $(2): $(1) | $(ACP) - @echo "Copy xml: $$@" + @echo -e ${CL_YLW}"Copy xml:"${CL_RST}" $$@" $(hide) xmllint $$< >/dev/null # Don't print the xml file to stdout. $$(copy-file-to-target) endef @@ -2631,19 +2631,19 @@ endef # Copy a prebuilt file to a target location. define transform-prebuilt-to-target -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)" +@echo -e "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) endef # Copy a prebuilt file to a target location, using zipalign on it. define transform-prebuilt-to-target-with-zipalign -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK: $(PRIVATE_MODULE) ($@)" +@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt APK:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-zipalign) endef # Copy a prebuilt file to a target location, stripping "# comment" comments. define transform-prebuilt-to-target-strip-comments -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)" +@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-strip-comments) endef @@ -2673,7 +2673,7 @@ endef ########################################################### define transform-generated-source -@echo -e ${CL_PFX}"target Generated:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo -e ${CL_GRN}"target Generated:"${CL_RST}" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(PRIVATE_CUSTOM_TOOL) endef diff --git a/core/distdir.mk b/core/distdir.mk index 51ec46efeff..829951e8d79 100644 --- a/core/distdir.mk +++ b/core/distdir.mk @@ -37,7 +37,7 @@ ifdef dist_goal define copy-one-dist-file $(3): $(2) $(2): $(1) - @echo "Dist: $$@" + @echo -e ${CL_YLW}"Dist:"${CL_RST}" $$@" $$(copy-file-to-new-target-with-cp) endef diff --git a/core/droiddoc.mk b/core/droiddoc.mk index f1435790f21..77a54aa2a34 100644 --- a/core/droiddoc.mk +++ b/core/droiddoc.mk @@ -167,7 +167,7 @@ $(full_target): \ $(full_java_lib_deps) \ $(LOCAL_MODULE_MAKEFILE_DEP) \ $(LOCAL_ADDITIONAL_DEPENDENCIES) - @echo Docs droiddoc: $(PRIVATE_OUT_DIR) + @echo -e ${CL_YLW}"Docs droiddoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" $(hide) mkdir -p $(dir $@) $(addprefix $(hide) rm -rf ,$(PRIVATE_STUB_OUT_DIR)) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ @@ -204,7 +204,7 @@ else ## ## $(full_target): $(full_src_files) $(full_java_lib_deps) - @echo Docs javadoc: $(PRIVATE_OUT_DIR) + @echo -e ${CL_YLW}"Docs javadoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" @mkdir -p $(dir $@) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ $(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR)) @@ -245,7 +245,7 @@ ifeq ($(strip $(LOCAL_UNINSTALLABLE_MODULE)),) out_zip := $(OUT_DOCS)/$(LOCAL_MODULE)-docs.zip $(out_zip): PRIVATE_DOCS_DIR := $(out_dir) $(out_zip): $(full_target) - @echo Package docs: $@ + @echo -e ${CL_YLW}"Package docs:"${CL_RST}" $@" @rm -f $@ @mkdir -p $(dir $@) $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_DOCS_DIR) && zip -rqX $$F * ) diff --git a/core/dynamic_binary.mk b/core/dynamic_binary.mk index 91fd27131f1..5bae75a3d83 100644 --- a/core/dynamic_binary.mk +++ b/core/dynamic_binary.mk @@ -88,7 +88,7 @@ endif symbolic_input := $(relocation_packer_output) symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem) $(symbolic_output) : $(symbolic_input) | $(ACP) - @echo "target Symbolic: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Symbolic:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) ########################################################### @@ -153,11 +153,11 @@ else # use cp(1) instead. ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(strip_output): $(strip_input) | $(ACP) - @echo "target Unstripped: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) else $(strip_output): $(strip_input) - @echo "target Unstripped: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-cp) endif endif # my_strip_module diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 97079fd3784..70e49032937 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -98,7 +98,7 @@ $(full_classes_emma_jar) : $(full_classes_jarjar_jar) | $(EMMA_JAR) $(transform-classes.jar-to-emma) $(built_javalib_jar) : $(full_classes_emma_jar) - @echo Copying: $@ + @echo -e ${CL_YLW}"Copying:"${CL_RST}" $@" $(hide) $(ACP) -fp $< $@ else # LOCAL_EMMA_INSTRUMENT diff --git a/core/java.mk b/core/java.mk index 2602daf53ac..0beebc6412d 100644 --- a/core/java.mk +++ b/core/java.mk @@ -412,7 +412,7 @@ ifdef full_classes_jar # PRIVATE_ vars to be preserved. $(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar) $(full_classes_stubs_jar) : $(full_classes_jar) | $(ACP) - @echo Copying $(PRIVATE_SOURCE_FILE) + @echo -e ${CL_GRN}"Copying"${CL_RST}" $(PRIVATE_SOURCE_FILE)" $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) @@ -451,11 +451,11 @@ $(full_classes_compiled_jar): \ ifneq ($(strip $(LOCAL_JARJAR_RULES)),) $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) $(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR) - @echo JarJar: $@ + @echo -e ${CL_GRN}"JarJar:"${CL_RST}" $@" $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ else $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP) - @echo Copying: $@ + @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" $(hide) $(ACP) -fp $< $@ endif @@ -483,7 +483,7 @@ endif # Keep a copy of the jar just before proguard processing. $(full_classes_jar): $(full_classes_jar_source) | $(ACP) - @echo Copying: $@ + @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" $(hide) $(ACP) -fp $< $@ $(call define-jar-to-toc-rule, $(full_classes_jar)) @@ -619,7 +619,7 @@ endif endif # LOCAL_JACK_ENABLED is disabled $(built_dex): $(built_dex_intermediate) | $(ACP) - @echo Copying: $@ + @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" $(hide) mkdir -p $(dir $@) $(hide) rm -f $(dir $@)/classes*.dex $(hide) $(ACP) -fp $(dir $<)/classes*.dex $(dir $@) diff --git a/core/java_library.mk b/core/java_library.mk index 81a4a6a30ee..d62c605730d 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -71,7 +71,7 @@ $(common_javalib.jar) : $(full_classes_proguard_jar) else $(common_javalib.jar) : $(full_classes_jar) endif - @echo "target Static Jar: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Static Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) ifdef LOCAL_JACK_ENABLED @@ -87,7 +87,7 @@ $(common_javalib.jar): PRIVATE_DEX_FILE := $(built_dex) $(common_javalib.jar): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) $(common_javalib.jar): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) $(common_javalib.jar) : $(built_dex) $(java_resource_sources) | $(ZIPTIME) - @echo "target Jar: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"target Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" ifdef LOCAL_JACK_ENABLED $(create-empty-package) else @@ -111,7 +111,7 @@ else # ! boot jar $(built_odex): PRIVATE_MODULE := $(LOCAL_MODULE) # Use pattern rule - we may have multiple built odex files. $(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(common_javalib.jar) - @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_GRN}"Dexpreopt Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(call dexpreopt-one-file,$<,$@) $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) diff --git a/core/main.mk b/core/main.mk index 651ba98de4f..28699ea41ac 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1095,7 +1095,7 @@ $(foreach module,$(sample_MODULES),$(eval $(call \ sample_ADDITIONAL_INSTALLED := \ $(filter-out $(modules_to_install) $(modules_to_check) $(ALL_PREBUILT),$(sample_MODULES)) samplecode: $(sample_APKS_COLLECTION) - @echo "Collect sample code apks: $^" + @echo -e ${CL_GRN}"Collect sample code apks:"${CL_RST}" $^" # remove apks that are not intended to be installed. rm -f $(sample_ADDITIONAL_INSTALLED) endif # samplecode in $(MAKECMDGOALS) @@ -1106,7 +1106,7 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET) .PHONY: clean clean: @rm -rf $(OUT_DIR)/* - @echo "Entire build directory removed." + @echo -e ${CL_GRN}"Entire build directory removed."${CL_RST} .PHONY: clobber clobber: clean @@ -1116,7 +1116,7 @@ clobber: clean #xxx scrape this from ALL_MODULE_NAME_TAGS .PHONY: modules modules: - @echo "Available sub-modules:" + @echo -e ${CL_GRN}"Available sub-modules:"${CL_RST} @echo "$(call module-names-for-tag-list,$(ALL_MODULE_TAGS))" | \ tr -s ' ' '\n' | sort -u | $(COLUMN) diff --git a/core/notice_files.mk b/core/notice_files.mk index e7f89745b79..ea59d4a65f8 100644 --- a/core/notice_files.mk +++ b/core/notice_files.mk @@ -68,7 +68,7 @@ installed_notice_file := $($(my_prefix)OUT_NOTICE_FILES)/src/$(module_installed_ $(installed_notice_file): PRIVATE_INSTALLED_MODULE := $(module_installed_filename) $(installed_notice_file): $(notice_file) - @echo Notice file: $< -- $@ + @echo -e ${CL_CYN}Notice file:${CL_RST} $< -- $@ $(hide) mkdir -p $(dir $@) $(hide) cat $< > $@ diff --git a/core/pdk_config.mk b/core/pdk_config.mk index c0aaacd9285..e1ecc080eb3 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -71,7 +71,7 @@ endif endif $(_pdk_fusion_stamp) : $(PDK_FUSION_PLATFORM_ZIP) - @echo "Unzip $(dir $@) <- $<" + @echo -e ${CL_YLW}"Unzip"${CL_RST}" $(dir $@) <- $<" $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) unzip -qo $< -d $(dir $@) $(call split-long-arguments,-touch,$(_pdk_fusion_files)) diff --git a/core/product-graph.mk b/core/product-graph.mk index 36e903723aa..27502b210b4 100644 --- a/core/product-graph.mk +++ b/core/product-graph.mk @@ -134,7 +134,7 @@ $(foreach p,$(really_all_products), \ ) $(products_pdf): $(products_graph) - @echo Product graph PDF: $@ + @echo -e ${CL_GRN}"Product graph PDF:"${CL_RST}" $@" dot -Tpdf -Nshape=box -o $@ $< $(products_svg): $(products_graph) $(product_debug_files) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 1279878b592..9a2cd6e719f 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -160,7 +160,7 @@ include $(BUILD_SYSTEM)/aapt2.mk $(my_res_package) : $(framework_res_package_export_deps) else $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export_deps) - @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" + @echo -e ${CL_YLW}"target R.java/Manifest.java:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(create-resource-java-files) $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ endif # LOCAL_USE_AAPT2 diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk index 3975d2071e1..67995d9f0a6 100644 --- a/core/tasks/apicheck.mk +++ b/core/tasks/apicheck.mk @@ -76,9 +76,9 @@ $(eval $(call check-api, \ .PHONY: update-public-api update-public-api: $(INTERNAL_PLATFORM_API_FILE) | $(ACP) - @echo Copying current.txt + @echo -e ${CL_GRN}"Copying current.txt"${CL_RST} $(hide) $(ACP) $(INTERNAL_PLATFORM_API_FILE) frameworks/base/api/current.txt - @echo Copying removed.txt + @echo -e ${CL_GRN}"Copying removed.txt"${CL_RST} $(hide) $(ACP) $(INTERNAL_PLATFORM_REMOVED_API_FILE) frameworks/base/api/removed.txt update-api : update-public-api diff --git a/core/tasks/collect_gpl_sources.mk b/core/tasks/collect_gpl_sources.mk index 30ba62b6091..fc03f48b77e 100644 --- a/core/tasks/collect_gpl_sources.mk +++ b/core/tasks/collect_gpl_sources.mk @@ -17,7 +17,7 @@ gpl_source_tgz := $(call intermediates-dir-for,PACKAGING,gpl_source,HOST,COMMON) # FORCE since we can't know whether any of the sources changed $(gpl_source_tgz): PRIVATE_PATHS := $(sort $(patsubst %/, %, $(dir $(ALL_GPL_MODULE_LICENSE_FILES)))) $(gpl_source_tgz) : $(ALL_GPL_MODULE_LICENSE_FILES) FORCE - @echo Package gpl sources: $@ + @echo -e ${CL_GRN}"Package gpl sources:"${CL_RST}" $@" @rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) tar cfz $@ --exclude ".git*" $(PRIVATE_PATHS) diff --git a/core/tasks/sdk-addon.mk b/core/tasks/sdk-addon.mk index 362b2293514..ab950a27af8 100644 --- a/core/tasks/sdk-addon.mk +++ b/core/tasks/sdk-addon.mk @@ -105,7 +105,7 @@ $(full_target): PRIVATE_DOCS_DIRS := $(addprefix $(OUT_DOCS)/, $(doc_modules)) $(full_target): PRIVATE_STAGING_DIR := $(call append-path,$(staging),$(addon_dir_leaf)) $(full_target): $(sdk_addon_deps) | $(ACP) - @echo Packaging SDK Addon: $@ + @echo -e ${CL_GRN}"Packaging SDK Addon:"${CL_RST}" $@" $(hide) mkdir -p $(PRIVATE_STAGING_DIR)/docs $(hide) for d in $(PRIVATE_DOCS_DIRS); do \ $(ACP) -r $$d $(PRIVATE_STAGING_DIR)/docs ;\ From 3e0131d90c9967d770976dfbcd5cfaa70d09c6af Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Sat, 28 Jan 2012 09:05:16 +0700 Subject: [PATCH 016/502] Disable dataroaming by default The property is removed so that the property in vendor/cm can take effect Change-Id: Iefadc1a6e71cbf92ecb7363c953f4b5a82064446 --- target/product/full_base_telephony.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/target/product/full_base_telephony.mk b/target/product/full_base_telephony.mk index 9a2c63a8d0a..4aa44153689 100644 --- a/target/product/full_base_telephony.mk +++ b/target/product/full_base_telephony.mk @@ -20,8 +20,7 @@ # entirely appropriate to inherit from for on-device configurations. PRODUCT_PROPERTY_OVERRIDES := \ - keyguard.no_require_sim=true \ - ro.com.android.dataroaming=true + keyguard.no_require_sim=true PRODUCT_COPY_FILES := \ device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ From 1555d599ce8593dd140f8bd6991d5b8b2eed9be7 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 19 Aug 2011 20:37:12 +0100 Subject: [PATCH 017/502] eat: Automated install of fresh builds Needs: 1 - a build 2 - a connected device Change-Id: I24820b984e79430b7af7ccedc171fc69269c0a32 envsetup: eat safely Change-Id: I2d8b52206213d8f4d8dcce3518cadb2be59e78d8 eat more safely, if there is something to eat Check for zip file presence before trying to eat Change-Id: I7913be619d189bbd723263edad878d6d05b8a5a7 Fixed eat not waiting for device if adb server was not started $(adb get-state) returned unexpected starting server message causing the if statement to fail. Calling "adb start-server" beforehand remedies that. Patch Set 2: $(adb get-state) returns 'unknown' if Clockwork recovery is running on the device look for /sbin/recovery and 'pass' the state test also adb wait-for-device will result in endless loop, replace with until loop using with get-state OR 'recovery' tests Patch Set 3: fix the initial adb state test, use AND instead of OR Patch Set 4: Rebased and prevent "device not found" message from spamming the screen by redirecting error output to null Change-Id: I2d41b8853567cde80bf7fc08b5e4f0ad5ba1fdf5 Signed-off-by: Firerat Updated for CM9 variables eat: Adapt to new file naming scheme Change-Id: I101e333918bc215bebcc594c97bdd68307c90aaa eat: Adapt to new storage paths Change-Id: Ic060304275c2d19858636c84740b3f60dfdc6193 envsetup: Make eat restart adbd as root before pushing the recovery command Without adbd running as root we can't write to /cache/recovery and eat fails with a permission denied. Change-Id: I015b50f29c001605cdc1a0088f68296b62809b56 Eat: Option to specify directory of zip in recovery mode It pushes to /mnt/sdcard0, which may be /emmc/ in recovery. Now the user can specify another path other than /sdcard/ where the zip is Change-Id: Ie39615132ae39d9f6b304a3049b2395b2a2af182 fix "eat" Assume user 0 is the active one when flashing... Change-Id: Ibdc28ef49f8023e786ee82c9e42c221409dfd6bb eat: Use /cache if possible * Check the size of /cache and use it if possible. Change-Id: I72fecf3f8d2311c04e63fe81a7ca9a8a6a40419d --- envsetup.sh | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index d61eac0014f..37c98b91766 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -760,6 +760,58 @@ function tapas() destroy_build_var_cache } +function eat() +{ + if [ "$OUT" ] ; then + MODVERSION=`sed -n -e'/ro\.cm\.version/s/.*=//p' $OUT/system/build.prop` + ZIPFILE=cm-$MODVERSION.zip + ZIPPATH=$OUT/$ZIPFILE + if [ ! -f $ZIPPATH ] ; then + echo "Nothing to eat" + return 1 + fi + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found.." + fi + # if adbd isn't root we can't write to /cache/recovery/ + adb root + sleep 1 + adb wait-for-device + SZ=`stat -c %s $ZIPPATH` + CACHESIZE=`adb shell busybox df -PB1 /cache | grep /cache | tr -s ' ' | cut -d ' ' -f 4` + if [ $CACHESIZE -gt $SZ ]; + then + PUSHDIR=/cache/ + DIR=cache + else + PUSHDIR=/storage/sdcard0/ + # Optional path for sdcard0 in recovery + [ -z "$1" ] && DIR=sdcard/0 || DIR=$1 + fi + echo "Pushing $ZIPFILE to $PUSHDIR" + if adb push $ZIPPATH $PUSHDIR ; then + cat << EOF > /tmp/command +--update_package=/$DIR/$ZIPFILE +EOF + if adb push /tmp/command /cache/recovery/ ; then + echo "Rebooting into recovery for installation" + adb reboot recovery + fi + rm /tmp/command + fi + else + echo "Nothing to eat" + return 1 + fi + return $? +} + function gettop { local TOPFILE=build/core/envsetup.mk From abf1331a1e4023021ef8cf1efd0724bfbf4e3eb8 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sat, 25 Feb 2012 14:24:20 -0800 Subject: [PATCH 018/502] Note that update-api is a lie. Change-Id: Idc2d92630e94ccbd60b5d5447c3762db8e5096f8 --- core/apicheck_msg_current.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/apicheck_msg_current.txt b/core/apicheck_msg_current.txt index 440e7f8862e..2e065aeffaf 100644 --- a/core/apicheck_msg_current.txt +++ b/core/apicheck_msg_current.txt @@ -9,6 +9,10 @@ To make these errors go away, you have two choices: 2) You can update current.txt by executing the following command: make update-api + ^^^^^^^^^^^^^^^^^^ + NO. NO. STOP BEING LAZY. SERIOUSLY. + DO NOT DO THIS in CM. THIS IS A LIE. IT WILL BREAK THINGS. + To submit the revised current.txt to the main Android repository, you will need approval. ****************************** From 9d458810d034914df42976a73fabf1e11ccf818f Mon Sep 17 00:00:00 2001 From: Warren Togami Date: Sat, 3 Mar 2012 23:10:09 -1000 Subject: [PATCH 019/502] Modular backuptool.sh. Executes backup and restore methods defined in arbitrary /system/addon.d/*.sh scripts. * Copy backuptool.functions alongside backuptool.sh. * Delete both from /system/bin as they are not useful there. Patch Series ============ http://review.cyanogenmod.com/#change,13265 CyanogenMod/android_build * edify generator http://review.cyanogenmod.com/#change,13266 CyanogenMod/android_system_core * permissions on /system/addon.d http://review.cyanogenmod.com/#change,13267 CyanogenMod/android_vendor_cm * 50-cm.sh reference backup script * modular backuptool.sh * support backuptool.functions used by /system/addon.d/*.sh scripts Change-Id: I26b4907d28f49c69627699d2accd2f0fa2d1b112 --- tools/releasetools/edify_generator.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 41c97255bc3..8004a90ecb4 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -150,8 +150,13 @@ def AssertSomeBootloader(self, *bootloaders): def RunBackup(self, command): self.script.append('package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");') + self.script.append('package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");') self.script.append('set_perm(0, 0, 0777, "/tmp/backuptool.sh");') + self.script.append('set_perm(0, 0, 0644, "/tmp/backuptool.functions");') self.script.append(('run_program("/tmp/backuptool.sh", "%s");' % command)) + if command == "restore": + self.script.append('delete("/system/bin/backuptool.sh");') + self.script.append('delete("/system/bin/backuptool.functions");') def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next From 6e90cb566548079c094abf29049d159d6fd276af Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Mon, 14 May 2012 16:14:36 -0700 Subject: [PATCH 020/502] makerecipe: WIP to generate manifest branches for releases Change-Id: I1804c180844043692f788275c8998307e348001b --- envsetup.sh | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 37c98b91766..730d0cc500b 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1624,8 +1624,12 @@ function cmremote() GERRIT_REMOTE=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) if [ -z "$GERRIT_REMOTE" ] then - echo Unable to set up the git remote, are you in the root of the repo? - return 0 + GERRIT_REMOTE=$(cat .git/config | grep http://github.com | awk '{ print $NF }' | sed s#http://github.com/##g) + if [ -z "$GERRIT_REMOTE" ] + then + echo Unable to set up the git remote, are you in the root of the repo? + return 0 + fi fi CMUSER=`git config --get review.review.cyanogenmod.com.username` if [ -z "$CMUSER" ] @@ -1636,6 +1640,29 @@ function cmremote() fi echo You can now push to "cmremote". } +export -f cmremote + +function makerecipe() { + if [ -z "$1" ] + then + echo "No branch name provided." + return 1 + fi + cd android + sed -i s/'default revision=.*'/'default revision="refs\/heads\/'$1'"'/ default.xml + git commit -a -m "$1" + cd .. + + repo forall -c ' + + if [ "$REPO_REMOTE" == "github" ] + then + pwd + cmremote + git push cmremote HEAD:refs/heads/'$1' + fi + ' +} function cmgerrit() { if [ $# -eq 0 ]; then From 9f08b1315bfde776923f9ef4bfcad464bf3da948 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 20 May 2012 22:10:30 -0700 Subject: [PATCH 021/502] build: Stop installing the sample APN list * Sample APN list is always being installed, we don't want this in CM. Change-Id: I74b97f3af545c4a7568d3001e1435c63cfbc7de8 --- target/product/full_base_telephony.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/target/product/full_base_telephony.mk b/target/product/full_base_telephony.mk index 4aa44153689..4d6fce7a63a 100644 --- a/target/product/full_base_telephony.mk +++ b/target/product/full_base_telephony.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ keyguard.no_require_sim=true PRODUCT_COPY_FILES := \ - device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base.mk) From 57d4c557c855b7d0a89f16c9eb3164b7ddba1610 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Wed, 6 Jun 2012 21:39:23 +0200 Subject: [PATCH 022/502] env: implement the repodiff command sample usage: repodiff ics repodiff github/ics --numstat repodiff android-4.0.4_r1.2 android-4.0.4_r2 Change-Id: Id1c1e504c75676707e59f051fd5ff9ce748d4297 Signed-off-by: Tanguy Pruvot build: Add repodiff to list of commands --- envsetup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 730d0cc500b..b8264a43a68 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -25,6 +25,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors - reposync: Parallel repo sync using ionice and SCHED_BATCH +- repodiff: Diff 2 different branches or tags within the same repo Environment options: - SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that @@ -1960,6 +1961,15 @@ function reposync() { esac } +function repodiff() { + if [ -z "$*" ]; then + echo "Usage: repodiff [[ref-to] [--numstat]]" + return + fi + diffopts=$* repo forall -c \ + 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' +} + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that From b5ebc1baf9ac510188d2718bc55fa5429d78b8b0 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Sun, 20 Nov 2011 21:14:29 -0800 Subject: [PATCH 023/502] Add recoveryzip target. Import recovery building/porting tools. echo args Change-Id: Ib346a27d94ccab3e992fe3bc3be9e0010e7b89a0 mkvendor.sh: fixes for Android 4.2. Change-Id: Id7ff9ef03700d595734811ccf868371ffb024384 mkvendor: fix echoed build commands cm.mk.template uses PRODUCT_NAME := cm___DEVICE__ Change-Id: I063fc4b93d90ebb034637bf3e92d83c77aa439ca add cm.mk.template file for mkvendor.sh Change-Id: Iba150a5350a7a7dbc9e3444d71d4ff293d51f3d7 fix template for mkvendor.sh Change-Id: I2c78ed013053efa0c399e022502fd9ec4a1de8e6 mkvendor.sh: force armeabi-v7a Change-Id: I9f29eec73a13144b47ff7b1db1d59cb1e5a4ef64 mkvendor.sh: typo Change-Id: I8cc2303fde7c815384e09f65b6d4a1116ac29ee4 mkvendor.sh: more fixes Change-Id: I0c641d42a96e44bb9170475d5de21cb8644e4d3d BoardConfig.mk.template: Add TARGET_CPU_VARIANT Change-Id: I8cd74a794e0d1a6818b5479cf7f5264e87d565f3 BoardConfig.mk.template: Add TARGET_CPU_SMP This one is easy forget if not in the template Change-Id: If65e557a661ecc81c6bfc434525b3c9937ff988e tools/device: Remove deprecated line gsm.mk no longer exist in vendor/cm Change-Id: I0b6d50b424b3d24065e7287e1a03b64348014817 Signed-off-by: Jackeagle build: Do not make recoveries or recoveryzip Change-Id: I5a599eb3ba3f3450d9dfeab390c527a586bcaa68 --- core/Makefile | 9 +- tools/device/AndroidBoard.mk.template | 8 ++ tools/device/AndroidProducts.mk.template | 2 + tools/device/BoardConfig.mk.template | 31 +++++++ tools/device/cm.mk.template | 15 +++ tools/device/device.mk.template | 24 +++++ tools/device/mkvendor.sh | 113 +++++++++++++++++++++++ tools/device/recovery.fstab.template | 10 ++ tools/device/system.prop.template | 3 + 9 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 tools/device/AndroidBoard.mk.template create mode 100644 tools/device/AndroidProducts.mk.template create mode 100644 tools/device/BoardConfig.mk.template create mode 100644 tools/device/cm.mk.template create mode 100644 tools/device/device.mk.template create mode 100755 tools/device/mkvendor.sh create mode 100644 tools/device/recovery.fstab.template create mode 100644 tools/device/system.prop.template diff --git a/core/Makefile b/core/Makefile index d31dd3b9440..320310d5197 100644 --- a/core/Makefile +++ b/core/Makefile @@ -46,7 +46,6 @@ unique_product_copy_files_destinations := $(foreach cf,$(unique_product_copy_files_pairs), \ $(eval _src := $(call word-colon,1,$(cf))) \ $(eval _dest := $(call word-colon,2,$(cf))) \ - $(call check-product-copy-files,$(cf)) \ $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \ $(info PRODUCT_COPY_FILES $(cf) ignored.), \ $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \ @@ -1048,6 +1047,14 @@ endif .PHONY: recoveryimage recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_RESOURCE_ZIP) +INSTALLED_RECOVERYZIP_TARGET := $(PRODUCT_OUT)/utilities/update.zip +$(INSTALLED_RECOVERYZIP_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(TARGET_OUT)/bin/updater + @echo ----- Making recovery zip ----- + ./build/tools/device/mkrecoveryzip.sh $(PRODUCT_OUT) $(HOST_OUT_JAVA_LIBRARIES)/signapk.jar + +.PHONY: recoveryzip +recoveryzip: $(INSTALLED_RECOVERYZIP_TARGET) + ifeq ($(BOARD_NAND_PAGE_SIZE),) BOARD_NAND_PAGE_SIZE := 2048 endif diff --git a/tools/device/AndroidBoard.mk.template b/tools/device/AndroidBoard.mk.template new file mode 100644 index 00000000000..55a36d52357 --- /dev/null +++ b/tools/device/AndroidBoard.mk.template @@ -0,0 +1,8 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) + +# include the non-open-source counterpart to this file +-include vendor/__MANUFACTURER__/__DEVICE__/AndroidBoardVendor.mk diff --git a/tools/device/AndroidProducts.mk.template b/tools/device/AndroidProducts.mk.template new file mode 100644 index 00000000000..f31c5bf7999 --- /dev/null +++ b/tools/device/AndroidProducts.mk.template @@ -0,0 +1,2 @@ +PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/device___DEVICE__.mk diff --git a/tools/device/BoardConfig.mk.template b/tools/device/BoardConfig.mk.template new file mode 100644 index 00000000000..617673f9807 --- /dev/null +++ b/tools/device/BoardConfig.mk.template @@ -0,0 +1,31 @@ +USE_CAMERA_STUB := true + +# inherit from the proprietary version +-include vendor/__MANUFACTURER__/__DEVICE__/BoardConfigVendor.mk + +TARGET_ARCH := arm +TARGET_NO_BOOTLOADER := true +TARGET_BOARD_PLATFORM := unknown +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_CPU_VARIANT := cortex-a7 +TARGET_CPU_SMP := true +ARCH_ARM_HAVE_TLS_REGISTER := true + +TARGET_BOOTLOADER_BOARD_NAME := __DEVICE__ + +BOARD_KERNEL_CMDLINE := __CMDLINE__ +BOARD_KERNEL_BASE := 0x__BASE__ +BOARD_KERNEL_PAGESIZE := __PAGE_SIZE__ + +# fix this up by examining /proc/mtd on a running device +BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00380000 +BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00480000 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x08c60000 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 0x105c0000 +BOARD_FLASH_BLOCK_SIZE := 131072 + +TARGET_PREBUILT_KERNEL := device/__MANUFACTURER__/__DEVICE__/kernel + +BOARD_HAS_NO_SELECT_BUTTON := true diff --git a/tools/device/cm.mk.template b/tools/device/cm.mk.template new file mode 100644 index 00000000000..e07898a411c --- /dev/null +++ b/tools/device/cm.mk.template @@ -0,0 +1,15 @@ +# Release name +PRODUCT_RELEASE_NAME := __DEVICE__ + +# Inherit some common CM stuff. +$(call inherit-product, vendor/cm/config/common_full_phone.mk) + +# Inherit device configuration +$(call inherit-product, device/__MANUFACTURER__/__DEVICE__/device___DEVICE__.mk) + +## Device identifier. This must come after all inclusions +PRODUCT_DEVICE := __DEVICE__ +PRODUCT_NAME := cm___DEVICE__ +PRODUCT_BRAND := __MANUFACTURER__ +PRODUCT_MODEL := __DEVICE__ +PRODUCT_MANUFACTURER := __MANUFACTURER__ diff --git a/tools/device/device.mk.template b/tools/device/device.mk.template new file mode 100644 index 00000000000..91ffdc951cc --- /dev/null +++ b/tools/device/device.mk.template @@ -0,0 +1,24 @@ +$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk) + +# The gps config appropriate for this device +$(call inherit-product, device/common/gps/gps_us_supl.mk) + +$(call inherit-product-if-exists, vendor/__MANUFACTURER__/__DEVICE__/__DEVICE__-vendor.mk) + +DEVICE_PACKAGE_OVERLAYS += device/__MANUFACTURER__/__DEVICE__/overlay + + +ifeq ($(TARGET_PREBUILT_KERNEL),) + LOCAL_KERNEL := device/__MANUFACTURER__/__DEVICE__/kernel +else + LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL) +endif + +PRODUCT_COPY_FILES += \ + $(LOCAL_KERNEL):kernel + +$(call inherit-product, build/target/product/full.mk) + +PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 +PRODUCT_NAME := full___DEVICE__ +PRODUCT_DEVICE := __DEVICE__ diff --git a/tools/device/mkvendor.sh b/tools/device/mkvendor.sh new file mode 100755 index 00000000000..18671c0dc87 --- /dev/null +++ b/tools/device/mkvendor.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +function usage +{ + echo Usage: + echo " $(basename $0) manufacturer device [boot.img]" + echo " The boot.img argument is the extracted recovery or boot image." + echo " The boot.img argument should not be provided for devices" + echo " that have non standard boot images (ie, Samsung)." + echo + echo Example: + echo " $(basename $0) motorola sholes ~/Downloads/recovery-sholes.img" + exit 0 +} + +MANUFACTURER=$1 +DEVICE=$2 +BOOTIMAGE=$3 + +UNPACKBOOTIMG=$(which unpackbootimg) + +echo Arguments: $@ + +if [ -z "$MANUFACTURER" ] +then + usage +fi + +if [ -z "$DEVICE" ] +then + usage +fi + +ANDROID_TOP=$(dirname $0)/../../../ +pushd $ANDROID_TOP > /dev/null +ANDROID_TOP=$(pwd) +popd > /dev/null + +TEMPLATE_DIR=$(dirname $0) +pushd $TEMPLATE_DIR > /dev/null +TEMPLATE_DIR=$(pwd) +popd > /dev/null + +DEVICE_DIR=$ANDROID_TOP/device/$MANUFACTURER/$DEVICE + +if [ ! -z "$BOOTIMAGE" ] +then + if [ -z "$UNPACKBOOTIMG" ] + then + echo unpackbootimg not found. Is your android build environment set up and have the host tools been built? + exit 0 + fi + + BOOTIMAGEFILE=$(basename $BOOTIMAGE) + + echo Output will be in $DEVICE_DIR + mkdir -p $DEVICE_DIR + + TMPDIR=/tmp/$(whoami)/bootimg + rm -rf $TMPDIR + mkdir -p $TMPDIR + cp $BOOTIMAGE $TMPDIR + pushd $TMPDIR > /dev/null + unpackbootimg -i $BOOTIMAGEFILE > /dev/null + mkdir ramdisk + pushd ramdisk > /dev/null + gunzip -c ../$BOOTIMAGEFILE-ramdisk.gz | cpio -i + popd > /dev/null + BASE=$(cat $TMPDIR/$BOOTIMAGEFILE-base) + CMDLINE=$(cat $TMPDIR/$BOOTIMAGEFILE-cmdline) + PAGESIZE=$(cat $TMPDIR/$BOOTIMAGEFILE-pagesize) + export SEDCMD="s#__CMDLINE__#$CMDLINE#g" + echo $SEDCMD > $TMPDIR/sedcommand + cp $TMPDIR/$BOOTIMAGEFILE-zImage $DEVICE_DIR/kernel + popd > /dev/null +else + mkdir -p $DEVICE_DIR + touch $DEVICE_DIR/kernel + BASE=10000000 + CMDLINE=no_console_suspend + PAGESIZE=00000800 + export SEDCMD="s#__CMDLINE__#$CMDLINE#g" + echo $SEDCMD > $TMPDIR/sedcommand +fi + +for file in $(find $TEMPLATE_DIR -name '*.template') +do + OUTPUT_FILE=$DEVICE_DIR/$(basename $(echo $file | sed s/\\.template//g)) + cat $file | sed s/__DEVICE__/$DEVICE/g | sed s/__MANUFACTURER__/$MANUFACTURER/g | sed -f $TMPDIR/sedcommand | sed s/__BASE__/$BASE/g | sed s/__PAGE_SIZE__/$PAGESIZE/g > $OUTPUT_FILE +done + +if [ ! -z "$TMPDIR" ] +then + RECOVERY_FSTAB=$TMPDIR/ramdisk/etc/recovery.fstab + if [ -f "$RECOVERY_FSTAB" ] + then + cp $RECOVERY_FSTAB $DEVICE_DIR/recovery.fstab + fi +fi + + +mv $DEVICE_DIR/device.mk $DEVICE_DIR/device_$DEVICE.mk + +echo Creating initial git repository. +pushd $DEVICE_DIR +git init +git add . +git commit -a -m "mkvendor.sh: Initial commit of $DEVICE" +popd + +echo Done! +echo Use the following command to set up your build environment: +echo ' 'lunch cm_$DEVICE-eng diff --git a/tools/device/recovery.fstab.template b/tools/device/recovery.fstab.template new file mode 100644 index 00000000000..41fb92e8bd3 --- /dev/null +++ b/tools/device/recovery.fstab.template @@ -0,0 +1,10 @@ +# mount point fstype device [device2] + +/boot mtd boot +/cache yaffs2 cache +/data yaffs2 userdata +/misc mtd misc +/recovery mtd recovery +/sdcard vfat /dev/block/mmcblk0p1 /dev/block/mmcblk0 +/system yaffs2 system +/sd-ext ext4 /dev/block/mmcblk0p2 diff --git a/tools/device/system.prop.template b/tools/device/system.prop.template new file mode 100644 index 00000000000..4113929395e --- /dev/null +++ b/tools/device/system.prop.template @@ -0,0 +1,3 @@ +# +# system.prop for __DEVICE__ +# From b19aa7f93477618ce5c3bcd958da3465fc4d38b1 Mon Sep 17 00:00:00 2001 From: Austen Dicken Date: Sun, 15 Jul 2012 16:28:05 -0500 Subject: [PATCH 024/502] update ota_from_target_files to handle mounting/unmounting for backupscript backupscript should not be mounting/unmounting itself as it makes other scripts have unexpected results (such as modelid_cfg, which expects /system to be mounted) instead have the ota script handle the mounting/unmounting Change-Id: I94511f4147c624d975cb3ecbeaa8b0e98f63437c --- tools/releasetools/edify_generator.py | 6 ++++++ tools/releasetools/ota_from_target_files.py | 2 ++ 2 files changed, 8 insertions(+) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 8004a90ecb4..52a9956ba8d 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -229,6 +229,12 @@ def Mount(self, mount_point, mount_options_by_format=""): p.mount_point, mount_flags)) self.mounts.add(p.mount_point) + def Unmount(self, mount_point): + """Unmount the partition with the given mount_point.""" + if mount_point in self.mounts: + self.mounts.remove(mount_point) + self.script.append('unmount("%s");' % (mount_point,)) + def UnpackPackageDir(self, src, dst): """Unpack a given directory from the OTA package into the given destination directory.""" diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 699cbcc6ff0..dc22eb8615b 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -629,7 +629,9 @@ def WriteFullOTAPackage(input_zip, output_zip): device_specific.FullOTA_InstallBegin() if OPTIONS.backuptool: + script.Mount("/system") script.RunBackup("backup") + script.Unmount("/system") system_progress = 0.75 From d85be754c1059a23d36841ee086190346f121827 Mon Sep 17 00:00:00 2001 From: Daniel Bateman Date: Sat, 4 Aug 2012 03:48:09 -0500 Subject: [PATCH 025/502] envsetup: Add some more commands * mmp: Like mm but pushes the built files afterward. * mmmp: Like mmm but pushes the built files afterward. These may be useful when doing debugging on a individual library, since it builds the library and pushes the new library to the device. Examples: mmmp -B device/samsung/vibrantmtd/libgps mmmp -B packages/apps/Torch Thanks: tpruvot for revisions Change-Id: Ia6bdd2b63797ea86e164af69496b70ea6d7c5156 --- envsetup.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index b8264a43a68..27db3b8ec24 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -10,6 +10,8 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. +- mmp: Builds all of the modules in the current directory and pushes them to the device. +- mmmp: Builds all of the modules in the supplied directories and pushes them to the device. - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. @@ -813,6 +815,59 @@ EOF return $? } +# Credit for color strip sed: http://goo.gl/BoIcm +function mmmp() +{ + if [[ $# < 1 || $1 == "--help" || $1 == "-h" ]]; then + echo "mmmp [make arguments] " + return 1 + fi + + # Get product name from cm_ + PRODUCT=`echo $TARGET_PRODUCT | tr "_" "\n" | tail -n 1` + + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found.." + fi + + adb root &> /dev/null + sleep 0.3 + adb wait-for-device &> /dev/null + sleep 0.3 + adb remount &> /dev/null + + mmm $* | tee .log + + # Install: + LOC=$(cat .log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Install' | cut -d ':' -f 2) + + # Copy: + LOC=$LOC $(cat .log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Copy' | cut -d ':' -f 2) + + for FILE in $LOC; do + # Get target file name (i.e. system/bin/adb) + TARGET=$(echo $FILE | sed "s/\/$PRODUCT\//\n/" | tail -n 1) + + # Don't send files that are not in /system. + if ! echo $TARGET | egrep '^system\/' > /dev/null ; then + continue + else + echo "Pushing: $TARGET" + adb push $FILE $TARGET + fi + done + rm -f .log + return 0 +} + +alias mmp='mmmp .' + function gettop { local TOPFILE=build/core/envsetup.mk From 5330366cc312b6d156db183f8cdf9f51b1235f7a Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Mon, 20 Aug 2012 11:00:51 -0700 Subject: [PATCH 026/502] build: Add Qualcomm's helper macros * This is used everywhere in Qualcomm's code. There's no reason we need to constantly replace it with uglier stuff in our Makefiles. Change-Id: I0183a338470ec96a38f356a47bae65a0d3fb2c95 --- core/main.mk | 3 + core/qcom_utils.mk | 191 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100755 core/qcom_utils.mk diff --git a/core/main.mk b/core/main.mk index 28699ea41ac..049cf21a2f1 100644 --- a/core/main.mk +++ b/core/main.mk @@ -294,6 +294,9 @@ endif # Bring in standard build system definitions. include $(BUILD_SYSTEM)/definitions.mk +# Bring in Qualcomm helper macros +include $(BUILD_SYSTEM)/qcom_utils.mk + # Bring in dex_preopt.mk include $(BUILD_SYSTEM)/dex_preopt.mk diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk new file mode 100755 index 00000000000..76cff81aded --- /dev/null +++ b/core/qcom_utils.mk @@ -0,0 +1,191 @@ +# vars for use by utils +empty := +space := $(empty) $(empty) +colon := $(empty):$(empty) +underscore := $(empty)_$(empty) + +# $(call match-word,w1,w2) +# checks if w1 == w2 +# How it works +# if (w1-w2 not empty or w2-w1 not empty) then not_match else match +# +# returns true or empty +#$(warning :$(1): :$(2): :$(subst $(1),,$(2)):) \ +#$(warning :$(2): :$(1): :$(subst $(2),,$(1)):) \ +# +define match-word +$(strip \ + $(if $(or $(subst $(1),$(empty),$(2)),$(subst $(2),$(empty),$(1))),,true) \ +) +endef + +# $(call find-word-in-list,w,wlist) +# finds an exact match of word w in word list wlist +# +# How it works +# fill wlist spaces with colon +# wrap w with colon +# search word w in list wl, if found match m, return stripped word w +# +# returns stripped word or empty +define find-word-in-list +$(strip \ + $(eval wl:= $(colon)$(subst $(space),$(colon),$(strip $(2)))$(colon)) \ + $(eval w:= $(colon)$(strip $(1))$(colon)) \ + $(eval m:= $(findstring $(w),$(wl))) \ + $(if $(m),$(1),) \ +) +endef + +# $(call match-word-in-list,w,wlist) +# does an exact match of word w in word list wlist +# How it works +# if the input word is not empty +# return output of an exact match of word w in wordlist wlist +# else +# return empty +# returns true or empty +define match-word-in-list +$(strip \ + $(if $(strip $(1)), \ + $(call match-word,$(call find-word-in-list,$(1),$(2)),$(strip $(1))), \ + ) \ +) +endef + +# $(call match-prefix,p,delim,w/wlist) +# matches prefix p in wlist using delimiter delim +# +# How it works +# trim the words in wlist w +# if find-word-in-list returns not empty +# return true +# else +# return empty +# +define match-prefix +$(strip \ + $(eval w := $(strip $(1)$(strip $(2)))) \ + $(eval text := $(patsubst $(w)%,$(1),$(3))) \ + $(if $(call match-word-in-list,$(1),$(text)),true,) \ +) +endef + +# ---- +# The following utilities are meant for board platform specific +# featurisation + +# $(call get-vendor-board-platforms,v) +# returns list of board platforms for vendor v +define get-vendor-board-platforms +$($(1)_BOARD_PLATFORMS) +endef + +# $(call is-board-platform,bp) +# returns true or empty +define is-board-platform +$(call match-word,$(1),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-not-board-platform,bp) +# returns true or empty +define is-not-board-platform +$(if $(call match-word,$(1),$(TARGET_BOARD_PLATFORM)),,true) +endef + +# $(call is-board-platform-in-list,bpl) +# returns true or empty +define is-board-platform-in-list +$(call match-word-in-list,$(TARGET_BOARD_PLATFORM),$(1)) +endef + +# $(call is-vendor-board-platform,vendor) +# returns true or empty +define is-vendor-board-platform +$(strip \ + $(call match-word-in-list,$(TARGET_BOARD_PLATFORM),\ + $(call get-vendor-board-platforms,$(1)) \ + ) \ +) +endef + +# $(call is-chipset-in-board-platform,chipset) +# does a prefix match of chipset in TARGET_BOARD_PLATFORM +# uses underscore as a delimiter +# +# returns true or empty +define is-chipset-in-board-platform +$(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-chipset-prefix-in-board-platform,prefix) +# does a chipset prefix match in TARGET_BOARD_PLATFORM +# assumes '_' and 'a' as the delimiter to the chipset prefix +# +# How it works +# if ($(prefix)_ or $(prefix)a match in board platform) +# return true +# else +# return empty +# +define is-chipset-prefix-in-board-platform +$(strip \ + $(eval delim_a := $(empty)a$(empty)) \ + $(if \ + $(or \ + $(call match-prefix,$(1),$(delim_a),$(TARGET_BOARD_PLATFORM)), \ + $(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)), \ + ), \ + true, \ + ) \ +) +endef + +#---- +# The following utilities are meant for Android Code Name +# specific featurisation +# +# refer http://source.android.com/source/build-numbers.html +# for code names and associated sdk versions +CUPCAKE_SDK_VERSIONS := 3 +DONUT_SDK_VERSIONS := 4 +ECLAIR_SDK_VERSIONS := 5 6 7 +FROYO_SDK_VERSIONS := 8 +GINGERBREAD_SDK_VERSIONS := 9 10 +HONEYCOMB_SDK_VERSIONS := 11 12 13 +ICECREAM_SANDWICH_SDK_VERSIONS := 14 15 +JELLY_BEAN_SDK_VERSIONS := 16 + +# $(call is-android-codename,codename) +# codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream +# please refer the $(codename)_SDK_VERSIONS declared above +define is-android-codename +$(strip \ + $(if \ + $(call match-word-in-list,$(PLATFORM_SDK_VERSION),$($(1)_SDK_VERSIONS)), \ + true, \ + ) \ +) +endef + +# $(call is-android-codename-in-list,cnlist) +# cnlist is combination/list of android codenames +define is-android-codename-in-list +$(strip \ + $(eval acn := $(empty)) \ + $(foreach \ + i,$(1),\ + $(eval acn += \ + $(if \ + $(call \ + match-word-in-list,\ + $(PLATFORM_SDK_VERSION),\ + $($(i)_SDK_VERSIONS)\ + ),\ + true,\ + )\ + )\ + ) \ + $(if $(strip $(acn)),true,) \ +) +endef From 259d45e9cfd791cd96613e7a721ad92ee6483602 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 31 Aug 2012 22:45:52 +0200 Subject: [PATCH 027/502] build: Remove wallpapers from full_base. They are already in the cm common config for the full phone. Change-Id: I02fc0ea73e92ae8b19931d05e6783e3cfa166af2 --- target/product/full_base.mk | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/target/product/full_base.mk b/target/product/full_base.mk index 65bdf0f1b4e..7d19685f1b3 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -27,16 +27,6 @@ PRODUCT_PACKAGES := \ libwnndict \ WAPPushManager -PRODUCT_PACKAGES += \ - Galaxy4 \ - HoloSpiralWallpaper \ - LiveWallpapers \ - LiveWallpapersPicker \ - MagicSmokeWallpapers \ - NoiseField \ - PhaseBeam \ - PhotoTable - # Additional settings used in all AOSP builds PRODUCT_PROPERTY_OVERRIDES := \ ro.config.ringtone=Ring_Synth_04.ogg \ From 1aece0331b1e98ace9579edae74a0b0fcd636d0d Mon Sep 17 00:00:00 2001 From: Alan Orth Date: Fri, 7 Sep 2012 11:44:27 +0300 Subject: [PATCH 028/502] envsetup.sh: Fix the `reposync` function It seems ionice can't find `repo` if it's in ~/bin, even if ~/bin is in the user's $PATH. Placing repo into /usr/bin or /usr/local/ bin works, but is undesirable (build instructions from both AOSP and CM tell users to put repo into ~/bin, and repo likes to update itself from time to time). This forces the reposync function to use the full path to the repo binary. Change-Id: I9dc4a3d4ec3f39563e3a84de7321189700079c2e --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 27db3b8ec24..3efe972dd98 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2011,7 +2011,7 @@ function reposync() { repo sync -j 4 "$@" ;; *) - schedtool -B -n 1 -e ionice -n 1 repo sync -j 4 "$@" + schedtool -B -n 1 -e ionice -n 1 `which repo` sync -j 4 "$@" ;; esac } From bb9275350cd01043bc3eb24d499851aea3e970bf Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Mon, 17 Sep 2012 11:33:18 -0700 Subject: [PATCH 029/502] build: Add "aospremote" command * Adds the git remote for the matching AOSP repository. Change-Id: Iad03fb95874ff39a39083218aec0d834e82b4480 --- envsetup.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 3efe972dd98..62224c09bf0 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -24,6 +24,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - godir: Go to the directory containing a file. - cmremote: Add git remote for CM Gerrit Review - cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review +- aospremote: Add git remote for matching AOSP repository - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors - reposync: Parallel repo sync using ionice and SCHED_BATCH @@ -1698,6 +1699,23 @@ function cmremote() } export -f cmremote +function aospremote() +{ + git remote rm aosp 2> /dev/null + if [ ! -d .git ] + then + echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + fi + PROJECT=`pwd | sed s#$ANDROID_BUILD_TOP/##g` + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add aosp https://android.googlesource.com/$PFX$PROJECT + echo "Remote 'aosp' created" +} +export -f aospremote + function makerecipe() { if [ -z "$1" ] then From 157d96fae7fd7e17ed7995181ca9c9679a7e8157 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 23 Sep 2012 23:46:55 -0700 Subject: [PATCH 030/502] build: Add "installboot" command to install boot images * For devices that lack fastboot, this command will copy the boot image to a running device, write it out to the correct partition with dd, copy the modules and set the correct permissions. * Field surveys have discovered that a specific CM device maintainer is handling two devices, one with boot partition p7 and one at p8. * Extensive research has unveiled the fact that mixing up these partitions across these two specific devices will cause corruption of the TZ firmware, which cannot be restored and results in an unrecoverable brick. * Automate the process so this idiot (me) stops breaking shit. Change-Id: I0dc5449daf128181e2e349ea26ad5741cc87bfe7 --- envsetup.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 62224c09bf0..d068265a5e4 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1716,6 +1716,46 @@ function aospremote() } export -f aospremote +function installboot() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/boot.img" ]; + then + echo "No boot.img found. Run make bootimage first." + return 1 + fi + PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine boot partition." + return 1 + fi + adb start-server + adb root + sleep 1 + adb wait-for-device + adb remount + adb wait-for-device + if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + then + adb push $OUT/boot.img /cache/ + for i in $OUT/system/lib/modules/*; + do + adb push $i /system/lib/modules/ + done + adb shell dd if=/cache/boot.img of=$PARTITION + adb shell chmod 644 /system/lib/modules/* + echo "Installation complete." + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} + + function makerecipe() { if [ -z "$1" ] then From b02eb7755b1b3c30f095d41aed158d98f6046af1 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Thu, 27 Sep 2012 18:11:25 +0530 Subject: [PATCH 031/502] envsetup: set OUT_DIR to an absolute path always OUT_DIR was set to $(TOPDIR)out previously, but $(TOPDIR) was null, so it was a relative path. This broke releasetools, inline kernel building, etc since they require absolute paths. Fix it so that it is set to $(shell readlink -f .)/out if $(TOPDIR) is null. Also remove hacks which checked if (OUT_DIR) was out and changed it to $(ANDROID_BUILD_TOP)/out to workaround the aforementioned problem. Change-Id: I459a3b1325a1bbea0565cd73f6acf160d4ed9b39 --- core/envsetup.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/envsetup.mk b/core/envsetup.mk index 0a726033725..5b67e3ec181 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -197,8 +197,12 @@ endif ifeq (,$(strip $(OUT_DIR))) ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) +ifneq ($(TOPDIR),) OUT_DIR := $(TOPDIR)out else +OUT_DIR := $(shell readlink -f .)/out +endif +else OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) endif endif From 959fe90f29c27437d240d5c2e89be38fa7f0801a Mon Sep 17 00:00:00 2001 From: David Ferguson Date: Thu, 4 Oct 2012 10:15:58 -0400 Subject: [PATCH 032/502] build: work around missing readlink -f on Mac Change-Id: I5d56366cf33a2b02f1886c87815d00cff279779d --- core/envsetup.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/envsetup.mk b/core/envsetup.mk index 5b67e3ec181..0d78ea73870 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -200,7 +200,7 @@ ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) ifneq ($(TOPDIR),) OUT_DIR := $(TOPDIR)out else -OUT_DIR := $(shell readlink -f .)/out +OUT_DIR := $(shell python -c 'import os,sys; print os.path.realpath(sys.argv[1])' .)/out endif else OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) From 34d153485a458f70673e01f08a84e80f5c9ecd8b Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 16 Oct 2012 19:40:18 +0530 Subject: [PATCH 033/502] dopush: improvements - use $OUT instead of replacing device name with a new line and then "tail"ing it. - adb shell stop/start if file is SystemUI.apk or framework/* - and some cleanup. Change-Id: I49278406dc53285b4919f7d41116ad849ec38250 --- envsetup.sh | 114 ++++++++++++++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index d068265a5e4..d9239a8bdd7 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -816,59 +816,6 @@ EOF return $? } -# Credit for color strip sed: http://goo.gl/BoIcm -function mmmp() -{ - if [[ $# < 1 || $1 == "--help" || $1 == "-h" ]]; then - echo "mmmp [make arguments] " - return 1 - fi - - # Get product name from cm_ - PRODUCT=`echo $TARGET_PRODUCT | tr "_" "\n" | tail -n 1` - - adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then - echo "No device is online. Waiting for one..." - echo "Please connect USB and/or enable USB debugging" - until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do - sleep 1 - done - echo "Device Found.." - fi - - adb root &> /dev/null - sleep 0.3 - adb wait-for-device &> /dev/null - sleep 0.3 - adb remount &> /dev/null - - mmm $* | tee .log - - # Install: - LOC=$(cat .log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Install' | cut -d ':' -f 2) - - # Copy: - LOC=$LOC $(cat .log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Copy' | cut -d ':' -f 2) - - for FILE in $LOC; do - # Get target file name (i.e. system/bin/adb) - TARGET=$(echo $FILE | sed "s/\/$PRODUCT\//\n/" | tail -n 1) - - # Don't send files that are not in /system. - if ! echo $TARGET | egrep '^system\/' > /dev/null ; then - continue - else - echo "Pushing: $TARGET" - adb push $FILE $TARGET - fi - done - rm -f .log - return 0 -} - -alias mmp='mmmp .' - function gettop { local TOPFILE=build/core/envsetup.mk @@ -2083,6 +2030,67 @@ function repodiff() { 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' } +# Credit for color strip sed: http://goo.gl/BoIcm +function dopush() +{ + local func=$1 + shift + + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found." + fi + + adb root &> /dev/null + sleep 0.3 + adb wait-for-device &> /dev/null + sleep 0.3 + adb remount &> /dev/null + + $func $* | tee $OUT/.log + + # Install: + LOC=$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Install' | cut -d ':' -f 2) + + # Copy: + LOC=$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Copy' | cut -d ':' -f 2) + + for FILE in $LOC; do + # Get target file name (i.e. system/bin/adb) + TARGET=$(echo $FILE | sed "s#$OUT/##") + + # Don't send files that are not in /system. + if ! echo $TARGET | egrep '^system\/' > /dev/null ; then + continue + else + case $TARGET in + system/app/SystemUI.apk|system/framework/*) + stop_n_start=true + ;; + *) + stop_n_start=false + ;; + esac + if $stop_n_start ; then adb shell stop ; fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + if $stop_n_start ; then adb shell start ; fi + fi + done + rm -f $OUT/.log + return 0 +} + +alias mmp='dopush mm' +alias mmmp='dopush mmm' +alias mkap='dopush mka' +alias cmkap='dopush cmka' + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that From be3a366740eac464e41b3f7d7685b19fe89a36ee Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Thu, 1 Nov 2012 12:58:45 +0530 Subject: [PATCH 034/502] cleanbuild: add *.zip.md5sum to installclean_files Change-Id: I4b68bb9a8d421a54b008c5318fa82ed230bd6441 --- core/cleanbuild.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index 430801f5dcd..034584a7981 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -234,6 +234,7 @@ installclean_files := \ $(PRODUCT_OUT)/*.xlb \ $(PRODUCT_OUT)/*.zip \ $(PRODUCT_OUT)/kernel \ + $(PRODUCT_OUT)/*.zip.md5sum \ $(PRODUCT_OUT)/data \ $(PRODUCT_OUT)/skin \ $(PRODUCT_OUT)/obj/APPS \ From 4af9585bd324f1d50349b041dc882581e840bb0b Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Wed, 24 Oct 2012 16:40:42 -0700 Subject: [PATCH 035/502] build: Add "installrecovery" command * Similar to "installboot", add an "installrecovery" command which writes the recovery image to the correct partition of a running device. Change-Id: I1dcca44fd0d8afa08ece9e99cd914547acb99c83 --- envsetup.sh | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index d9239a8bdd7..eee7b1e8035 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -28,6 +28,8 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors - reposync: Parallel repo sync using ionice and SCHED_BATCH +- installboot: Installs a boot.img to the connected device. +- installrecovery: Installs a recovery.img to the connected device. - repodiff: Diff 2 different branches or tags within the same repo Environment options: @@ -1702,6 +1704,39 @@ function installboot() fi } +function installrecovery() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/recovery.img" ]; + then + echo "No recovery.img found. Run make recoveryimage first." + return 1 + fi + PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine recovery partition." + return 1 + fi + adb start-server + adb root + sleep 1 + adb wait-for-device + adb remount + adb wait-for-device + if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + then + adb push $OUT/recovery.img /cache/ + adb shell dd if=/cache/recovery.img of=$PARTITION + echo "Installation complete." + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi +} function makerecipe() { if [ -z "$1" ] From f6619772d3b9cd01fe55ea2c6daaf29427f1da1f Mon Sep 17 00:00:00 2001 From: Nebojsa Cvetkovic Date: Fri, 9 Nov 2012 23:02:54 +0000 Subject: [PATCH 036/502] omnom (brunch + eat) command Change-Id: I524e5a1450de7ea9c93512eebcb10f320e68fa82 --- envsetup.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index eee7b1e8035..5b2f365097b 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -818,6 +818,12 @@ EOF return $? } +function omnom +{ + brunch $* + eat +} + function gettop { local TOPFILE=build/core/envsetup.mk From a9b8dc6fba267cc174133a92b4468e3f66f40462 Mon Sep 17 00:00:00 2001 From: Arnav Gupta Date: Fri, 23 Nov 2012 10:47:44 -0700 Subject: [PATCH 037/502] mka: change how make is called in some environments make -j N xxx results in compiling target 'N' instead of 'xxx' make -jN xxx will always make 'xxx' with N number of threads Signed-off-by: Arnav Gupta Change-Id: I77f17c9286a5ef1d61163d8f978900fb4c24e2e7 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 5b2f365097b..fcbe8d5cdb6 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2046,7 +2046,7 @@ function mka() { make -j `sysctl hw.ncpu|cut -d" " -f2` "$@" ;; *) - schedtool -B -n 1 -e ionice -n 1 make -j `cat /proc/cpuinfo | grep "^processor" | wc -l` "$@" + schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" ;; esac } From acb0395af43b21855d3df4ad6a258569306ccaad Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 7 Dec 2012 00:21:36 -0800 Subject: [PATCH 038/502] build: Add board platforms to qcom_utils Change-Id: I85458167bf2b9c04b029d09b87bf791ff4cfd04d build: Use common name for QCOM 7K boards. This is needed to build QCOM HAL without external modifications. The device would now have to specify msm7x27 or msm7x30 instead of specifying the full name. Patch Set 2: Add msm7x27a into the list. Change-Id: I25018e397b5aad27fab5244731a574ae86752e17 Add new version to qcom_utils.mk Change-Id: I1ca1532fd4968450715ecd0cca7729e0e6d507ef Build: update qcom_utils.mk Add build macro to determine Android Release Adding platform sdk version 18 for JB MR2. Change-Id: I79aa831ddd335bd14bd777506c210acc5d9960f1 qcom_utils: Update list of QCOM_BOARD_PLATFORMS Add msm8226 (Moto G) and other upcoming platforms Change-Id: Icf895cbcf86791ca800636a1c0893b3a905a27a0 qcom_utils: Add msm8992 and msm8994 * The Snapdragon 808 will be releasing as the msm8992 so reference it as such. * The Snapdragon 810 is already released and used, so build the qcom utilities for devices using msm8994. Change-Id: I564cb68295099a73fefd24d43e19ca371968ef44 Adding msm8909 as a QCOM board platform Change-Id: I01c35348b463a769454d7b64e6710a647cabe4f7 build: add msm8996 to QCOM targets Change-Id: I4d19bc681d64f56c4e64ac87943058012f76a4ef build: Add msm8952 as a QCOM board platform Change-Id: I738db8dc479676d7dfa74c89218c0dad21973ade qcom: Support 8937/8953 Change-Id: I84b1807e88d5be1230eab64bd1275a0677ce510f build: Readd msm7x27a to QCOM Targets Change-Id: I87db6ee43059c256d338babbdfe414030a06b53e Signed-off-by: Caio Oliveira --- core/qcom_utils.mk | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk index 76cff81aded..7f13ccf0769 100755 --- a/core/qcom_utils.mk +++ b/core/qcom_utils.mk @@ -1,3 +1,32 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +QCOM_BOARD_PLATFORMS += msm7x27a +QCOM_BOARD_PLATFORMS += msm7x30 +QCOM_BOARD_PLATFORMS += msm8226 +QCOM_BOARD_PLATFORMS += msm8610 +QCOM_BOARD_PLATFORMS += msm8660 +QCOM_BOARD_PLATFORMS += msm8909 +QCOM_BOARD_PLATFORMS += msm8916 +QCOM_BOARD_PLATFORMS += msm8960 +QCOM_BOARD_PLATFORMS += msm8974 +QCOM_BOARD_PLATFORMS += mpq8092 +QCOM_BOARD_PLATFORMS += msm8937 +QCOM_BOARD_PLATFORMS += msm8952 +QCOM_BOARD_PLATFORMS += msm8953 +QCOM_BOARD_PLATFORMS += msm8992 +QCOM_BOARD_PLATFORMS += msm8994 +QCOM_BOARD_PLATFORMS += msm8996 +QCOM_BOARD_PLATFORMS += msm_bronze +QCOM_BOARD_PLATFORMS += apq8084 + +MSM7K_BOARD_PLATFORMS := msm7x30 +MSM7K_BOARD_PLATFORMS += msm7x27 +MSM7K_BOARD_PLATFORMS += msm7x27a +MSM7K_BOARD_PLATFORMS += msm7k + +QSD8K_BOARD_PLATFORMS := qsd8k + + # vars for use by utils empty := space := $(empty) $(empty) @@ -154,7 +183,17 @@ FROYO_SDK_VERSIONS := 8 GINGERBREAD_SDK_VERSIONS := 9 10 HONEYCOMB_SDK_VERSIONS := 11 12 13 ICECREAM_SANDWICH_SDK_VERSIONS := 14 15 -JELLY_BEAN_SDK_VERSIONS := 16 +JELLY_BEAN_SDK_VERSIONS := 16 17 18 + +# $(call is-platform-sdk-version-at-least,version) +# version is a numeric SDK_VERSION defined above +define is-platform-sdk-version-at-least +$(strip \ + $(if $(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= $(1) ))" )), \ + true, \ + ) \ +) +endef # $(call is-android-codename,codename) # codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream From aa5e8cbd58b9dba27c83ec9f6c4abeb6f810b70e Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Tue, 11 Dec 2012 16:41:07 +0700 Subject: [PATCH 039/502] build: Update domain name cyanogenmod.com -> cyanogenmod.org Change-Id: Icae50c103d94e2018027c971bf1a77f01e2602c6 --- envsetup.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index fcbe8d5cdb6..c818fd80b71 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1643,12 +1643,12 @@ function cmremote() return 0 fi fi - CMUSER=`git config --get review.review.cyanogenmod.com.username` + CMUSER=`git config --get review.review.cyanogenmod.org.username` if [ -z "$CMUSER" ] then - git remote add cmremote ssh://review.cyanogenmod.com:29418/$GERRIT_REMOTE + git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE else - git remote add cmremote ssh://$CMUSER@review.cyanogenmod.com:29418/$GERRIT_REMOTE + git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE fi echo You can now push to "cmremote". } @@ -1771,7 +1771,7 @@ function cmgerrit() { $FUNCNAME help return 1 fi - local user=`git config --get review.review.cyanogenmod.com.username` + local user=`git config --get review.review.cyanogenmod.org.username` local review=`git config --get remote.github.review` local project=`git config --get remote.github.projectname` local command=$1 @@ -2028,7 +2028,7 @@ function cmrebase() { echo "Bringing it up to date..." repo sync . echo "Fetching change..." - git fetch "http://review.cyanogenmod.com/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD + git fetch "http://review.cyanogenmod.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD if [ "$?" != "0" ]; then echo "Error cherry-picking. Not uploading!" return From ec0613e2dee2d5b9c45935bc9871d3629179e2e7 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Wed, 26 Dec 2012 10:53:58 +0530 Subject: [PATCH 040/502] envsetup: push to connected device only if it is $CM_BUILD Change-Id: Icce057cb31d6fbc9abb0292311c88c32fea3540c --- envsetup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index c818fd80b71..1562dfa3beb 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -785,6 +785,8 @@ function eat() done echo "Device Found.." fi + if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + then # if adbd isn't root we can't write to /cache/recovery/ adb root sleep 1 @@ -816,6 +818,9 @@ EOF return 1 fi return $? + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi } function omnom @@ -2087,6 +2092,8 @@ function dopush() echo "Device Found." fi + if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + then adb root &> /dev/null sleep 0.3 adb wait-for-device &> /dev/null @@ -2125,6 +2132,9 @@ function dopush() done rm -f $OUT/.log return 0 + else + echo "The connected device does not appear to be $CM_BUILD, run away!" + fi } alias mmp='dopush mm' From 6c694aa306d844b918d984cde5c448124fcb83f0 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Thu, 27 Dec 2012 15:28:34 -0800 Subject: [PATCH 041/502] envsetup: Don't tread on my $PROMPT_COMMAND * I want my own PROMPT_COMMAND to coexist with Android's, so stash it in the environment and add it to the new command. Change-Id: I200902f135d0c5c620a8eb3ce9cefdba318cf9d3 envsetup: Fix $PROMPT_COMMAND Change I200902f135d0c5c620a8eb3ce9cefdba318cf9d3 broke the android PROMPT_COMMAND on scenarios where the existing prompt already had a hardstatus adjustment, since appending it to Android's just clobbered Android's in favor of the original. So instead of appending them, inject android's at the beggining of the existing one (and create a default if none exists) Change-Id: I1fbcbfdb6220d886dda3662da498d1759a4c195b envsetup: Really fix PROMPT_COMMAND handling * Add ANDROID_NO_PROMPT_COMMAND to not change it at all. * Export ANDROID_PROMPT_PREFIX so it can be used elsewhere. Change-Id: Ib2a487404d3b8a367a21582e8a0ce69c2d212a9a envsetup: More PROMPT_COMMAND * Get rid of ANDROID_NO_PROMPT_COMMAND, the pre-existing STAY_OFF_MY_LAWN does the same thing * Remove any pre-existing android prefixes to avoid accumulation scenarios in consecutive builds (i.e., multiple build identification strings in hardstatus) Change-Id: I86661e066e18ea6ad0c742fa1dc6555780fa5441 envsetup: add quotes around PROMPT_COMMAND Better compatibility for zsh. Change-Id: Ie010c30580e67e3b5357e3cc869114a525762677 --- envsetup.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 1562dfa3beb..015a9c385cc 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -319,11 +319,26 @@ function settitle() local product=$TARGET_PRODUCT local variant=$TARGET_BUILD_VARIANT local apps=$TARGET_BUILD_APPS + if [ -z "$PROMPT_COMMAND" ]; then + # No prompts + PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\"" + elif [ -z "$(echo $PROMPT_COMMAND | grep '033]0;')" ]; then + # Prompts exist, but no hardstatus + PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\";${PROMPT_COMMAND}" + fi + if [ ! -z "$ANDROID_PROMPT_PREFIX" ]; then + PROMPT_COMMAND=$(echo $PROMPT_COMMAND | sed -e 's/$ANDROID_PROMPT_PREFIX //g') + fi + if [ -z "$apps" ]; then - export PROMPT_COMMAND="echo -ne \"\033]0;[${arch}-${product}-${variant}] ${USER}@${HOSTNAME}: ${PWD}\007\"" + ANDROID_PROMPT_PREFIX="[${arch}-${product}-${variant}]" else - export PROMPT_COMMAND="echo -ne \"\033]0;[$arch $apps $variant] ${USER}@${HOSTNAME}: ${PWD}\007\"" + ANDROID_PROMPT_PREFIX="[$arch $apps $variant]" fi + export ANDROID_PROMPT_PREFIX + + # Inject build data into hardstatus + export PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/\\033]0;\(.*\)\\007/\\033]0;$ANDROID_PROMPT_PREFIX \1\\007/g')" fi } From 2e4f3ac9bc03a0a35ea5808fc476cebec2739cf6 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sun, 23 Dec 2012 09:21:46 +0530 Subject: [PATCH 042/502] bacon: generate cm package Change-Id: I3cece868e56f85bfa0b31a62a51e6eab2070ab06 --- core/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/Makefile b/core/Makefile index 320310d5197..3d2b5bd9c59 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1893,9 +1893,14 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ +CM_TARGET_PACKAGE := $(PRODUCT_OUT)/cm-$(CM_VERSION).zip + .PHONY: otapackage bacon otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) bacon: otapackage + $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(CM_TARGET_PACKAGE) + $(hide) $(MD5SUM) $(CM_TARGET_PACKAGE) > $(CM_TARGET_PACKAGE).md5sum + @echo -e ${CL_CYN}"Package Complete: $(CM_TARGET_PACKAGE)"${CL_RST} endif # build_ota_package From 73d13ee9a72480d86fd8749dc83f9d4b704f606c Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sat, 16 Mar 2013 20:00:17 +0530 Subject: [PATCH 043/502] envsetup: include bash completion script from vendor/cm Change-Id: Id90d84748df41d6626dfd46befabe0054c6d14e7 --- envsetup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 015a9c385cc..53a3608f4b0 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -356,13 +356,15 @@ function addcompletions() return fi - dir="sdk/bash_completion" + dirs="sdk/bash_completion vendor/cm/bash_completion" + for dir in $dirs; do if [ -d ${dir} ]; then for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do echo "including $f" . $f done fi + done } function choosetype() From 1834bca7914480c0e85c02f14242c9c00a82e075 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Mon, 25 Mar 2013 12:02:12 +0530 Subject: [PATCH 044/502] print CM_VERSION in build config Change-Id: Iead654e30798a11e636ec743683f3431d14a858c --- core/dumpvar.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 1bd477765d4..9b0b27a3787 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -3,6 +3,7 @@ print_build_config_vars := \ PLATFORM_VERSION_CODENAME \ PLATFORM_VERSION \ + CM_VERSION \ TARGET_PRODUCT \ TARGET_BUILD_VARIANT \ TARGET_BUILD_TYPE \ From 363fd8d69bfaaef15b2c64ac25609de6ece3dcea Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 13 Apr 2013 07:19:52 -0700 Subject: [PATCH 045/502] eat: Eat using adb sideload * Requires new recovery and updated adbd Change-Id: I65990822ab63313701d74783d95611d128d90f94 --- envsetup.sh | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 53a3608f4b0..3dcc156a09f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -808,28 +808,16 @@ function eat() adb root sleep 1 adb wait-for-device - SZ=`stat -c %s $ZIPPATH` - CACHESIZE=`adb shell busybox df -PB1 /cache | grep /cache | tr -s ' ' | cut -d ' ' -f 4` - if [ $CACHESIZE -gt $SZ ]; - then - PUSHDIR=/cache/ - DIR=cache - else - PUSHDIR=/storage/sdcard0/ - # Optional path for sdcard0 in recovery - [ -z "$1" ] && DIR=sdcard/0 || DIR=$1 - fi - echo "Pushing $ZIPFILE to $PUSHDIR" - if adb push $ZIPPATH $PUSHDIR ; then - cat << EOF > /tmp/command ---update_package=/$DIR/$ZIPFILE + cat << EOF > /tmp/command +--sideload EOF - if adb push /tmp/command /cache/recovery/ ; then - echo "Rebooting into recovery for installation" - adb reboot recovery - fi - rm /tmp/command + if adb push /tmp/command /cache/recovery/ ; then + echo "Rebooting into recovery for sideload installation" + adb reboot recovery + adb wait-for-sideload + adb sideload $ZIPPATH fi + rm /tmp/command else echo "Nothing to eat" return 1 From 4efa6c64ae84e5baaad03b8f423a035194d93a02 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 13 Apr 2013 13:23:35 -0700 Subject: [PATCH 046/502] envsetup: Make installboot work in recovery mode too * Needs a change to adb to allow waiting for recovery Change-Id: Ia90645513f46bcb5f20b7c74c55ef15842710d3d --- envsetup.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 3dcc156a09f..8df62f7d07a 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1702,9 +1702,8 @@ function installboot() adb start-server adb root sleep 1 - adb wait-for-device - adb remount - adb wait-for-device + adb wait-for-online shell mount /system 2>&1 > /dev/null + adb wait-for-online remount if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); then adb push $OUT/boot.img /cache/ @@ -1741,9 +1740,8 @@ function installrecovery() adb start-server adb root sleep 1 - adb wait-for-device - adb remount - adb wait-for-device + adb wait-for-online shell mount /system 2>&1 >> /dev/null + adb wait-for-online remount if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); then adb push $OUT/recovery.img /cache/ From 2e3f16a31fc1d5814a2eff180baa97cf0305e6c5 Mon Sep 17 00:00:00 2001 From: nebkat Date: Fri, 28 Dec 2012 10:40:45 +0000 Subject: [PATCH 047/502] cout: move to $out Change-Id: I3b5bf8a5f62dcdf267662bb97a2073150152cfa6 --- envsetup.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 8df62f7d07a..f360b573aac 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -4,6 +4,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - lunch: lunch - - tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree. +- cout: Changes directory to out. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. @@ -1067,6 +1068,15 @@ function croot() fi } +function cout() +{ + if [ "$OUT" ]; then + cd $OUT + else + echo "Couldn't locate out directory. Try setting OUT." + fi +} + function cproj() { TOPFILE=build/core/envsetup.mk From 5583b6dae84caf2d15e6a371bb8cd1bc519dfd95 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sat, 4 May 2013 17:59:18 +0530 Subject: [PATCH 048/502] eat: get the proper MODVERSION * The version in system/build.prop might be different than what the zip is named on incremental builds. * Use CM_VERSION from the build system instead. Change-Id: If4508921d8fd05219a2f358a2397a13b247065bd Signed-off-by: Chirayu Desai --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index f360b573aac..29d26fd1020 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -787,7 +787,7 @@ function tapas() function eat() { if [ "$OUT" ] ; then - MODVERSION=`sed -n -e'/ro\.cm\.version/s/.*=//p' $OUT/system/build.prop` + MODVERSION=$(get_build_var CM_VERSION) ZIPFILE=cm-$MODVERSION.zip ZIPPATH=$OUT/$ZIPFILE if [ ! -f $ZIPPATH ] ; then From 30f3896f567020335c151038e05f0bfc90ba9660 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Wed, 1 May 2013 15:48:08 +0530 Subject: [PATCH 049/502] envsetup: use $(CURDIR) for getting current directory Change-Id: I5f00faf64ec31d86dd2e48ec038748ce8499380b --- core/envsetup.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/envsetup.mk b/core/envsetup.mk index 0d78ea73870..aadaa5637cd 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -200,7 +200,7 @@ ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) ifneq ($(TOPDIR),) OUT_DIR := $(TOPDIR)out else -OUT_DIR := $(shell python -c 'import os,sys; print os.path.realpath(sys.argv[1])' .)/out +OUT_DIR := $(CURDIR)/out endif else OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) From d2e0ef09d972c4d0e3ef8c2196281cae4faea909 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Wed, 5 Jun 2013 20:14:33 +0530 Subject: [PATCH 050/502] repopick: initial commit Change-Id: Ie42c11d335da07f6d164a0fcb887011e5fd6dcf4 repopick: add -b shortcut option * useful for people like me who want to pick into temp branch so that the picks survive a repo sync * shortcut to "--start-branch auto --abandon-first --ignore-missing" Change-Id: Ia4d4309d27e46a15ff4b74525668d974f4251dcb repopick: handle additional error cases around subprocesses * gracefully error if the project path cannot be found * poll() was not a reliable determination of EOF on my Darwin-Python 2.7 system. Change-Id: I203c2a75820f8acc079a5c9751d1c04daf6f3a16 repopick: allow running from a subdir of ANDROID_BUILD_TOP Change-Id: I6dfcd5dfe700174ed87dc8627b23519c62b4cb27 envsetup: hmm repopick Change-Id: I483cb36721f31dbf1f67e46cbe8a306b2a9e2c15 repopick: decode the result as UTF-8 Change-Id: I51f2defa861c86b51baa7bad1df1d9666b952160 repopick: gracefully handle empty/non-JSON server responses Change-Id: Idbabdbfb4a910de0ad405f02b2a84cf2bc9ef3dc repopick: remove the superfluous information from date * '2011-11-17 06:54:52.000000000' -> '2011-11-17 06:54:52' Change-Id: I73d37c9aba13d4be6b4d2d2fc0f2f83971a3e77b repopick: let's be nice to our servers :) * Prefer fetching changes from GitHub, and if that fails, silently fall-back to Gerrit. Change-Id: Ibf68d4b69a7e8dbee2adb8f7f4250340b8be629c repopick: skip a cherry pick if its already been merged * override this behavior with the -f argument Change-Id: I280b4945344e7483a192d1c9769c42b8fd2a2aef RepoPick : Add support for git pull Allow user to git pull patchsets and dependencies. Change-Id: If5520b45fe79836eac628b3caf0526f11f8953d9 (cherry picked from commit df646304bdcef329e3fe7c12b68107de1f4cd42a) repopick: allow specifying a topic to pick all commits from Change-Id: I4fb60120794a77986bf641de063a8d41f4f45a23 repopick: support specifying a range of commits to pick * for example: repopick 12345-12350 Change-Id: I21dd0ef5f19d7b3899fa40ec4c28a0e9dba8a4df repopick: handle variant hal branching Change-Id: Ib0dee19abc13a7fb8d8e42c09b73c1b4f35ca938 Allow repopick to cherry-pick a specific patch set Use 'repopick 123456/9' where '123456' is the change number and '9' is the desired patchset. Change-Id: I2d9f6939fbde50b2a6057b75d2e7f722be5a3e21 repopick: Catch errors on url load failure Exit gracefully if server cannot be reached or if it reports an error. Change-Id: I86a1a45d3a1f8dfdb49a0400cb728c965dbad8df repopick: Allow using a custom query Change-Id: I87e92d3cbfa35367d87f55c92a6d12a6d4282232 repopick: Allow the github fetch to fail * This is optional and done to save gerrit server bandwidth, however it may fail in cases where the 'github' remote is a mirror which doesn't sync the changes. * Let it try fetching from gerrit if fetching from github fails. Change-Id: I6d183ff83572d817d78633280d8b20e3efdaf8f0 Support custom gerrit servers via HTTP or SSH Please test/provide feedback. Change-Id: Id7043dc009c1fe5614f73a5da2aa021c0d784a4b Ticket: RM-14 repopick: skip abandoned commits Change-Id: I7f203fc4f790bf26acce1112c5c24c703acd9326 repopick: handle hardware_ril/ril-caf Change-Id: Ib72255d899529effb0d6121034f42a7532d4a02b Fix custom URL error. Merged from cm_build_config Change-Id: Iffe7766f137889f113bc5a94254058dc4dbf0ea3 (cherry picked from commit 04d470c5efa7510cc86e614cb401a9b6a41947f0) repopick: open changes are either NEW or OPEN, not just OPEN Gerrit's API is terrible. I believe it was written by monkeys. Change-Id: Idb39a357c241ce7923549a3d217f7ee632326e92 repopick: print the status of a skipped cherry pick Change-Id: I5181910dc80fe4cf2d69cc22089e191b36a80c9e repopick: Update script with some fixes Make quiet actually be quiet. Allow overriding the path for a repopick. Sort query and topic results to have a better chance of them applying cleanly. Don't try to pull from github when using a custom gerrit address. Catch git command failures and properly return failure codes. Change-Id: I7ff010fbfbf1026c6fe03cb27649f677637e1bb5 repopick: support projects which get checked out multiple times see: caf branches for multimedia, where different branches get checked out under different paths. Change removes hacks needed for -caf branches, as this data is taken directly out of 'repo manifest' Change-Id: Id7aa24709c3dc6bc874899ef605e58271fec082c repopick: Actually try to fetch from Gerrit if fetching from GitHub fails * Exit on failure only if fetching didn't fail. Change-Id: Iae75dfcff590ed72afd93f58772440e4f3b0ca27 repopick: Allow commits to be excluded from a topic importation * Add the ability to 'repopick -t TOPIC -e 120586,120587' Change-Id: Ib99c095174a0987f68cb8261b7af3f59272b05b5 Signed-off-by: AdrianDC py3: repopick Change-Id: I65e6bb295bd475cc391579023940642b5747f521 py3: update all the things Change-Id: I5e11b46b7c2f7f8760d6c0e713ca99c1e88b7cd3 repopick: Don't crash if change not found If change is not located, skip it. Resolves the following: Traceback (most recent call last): File "(omitted)/build/tools/repopick.py", line 258, in review = [x for x in reviews if x['number'] == change][0] IndexError: list index out of range Change-Id: I96423ddc809ac1c7994998db4e1929ca813f20ca repopick: support specifying a range of commits to pick * for example: repopick 12345-12350 Change-Id: I3b8f2c331a6ac5488032432e133bd4b44d0bf007 --- envsetup.sh | 6 + tools/repopick.py | 377 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 383 insertions(+) create mode 100755 tools/repopick.py diff --git a/envsetup.sh b/envsetup.sh index 29d26fd1020..38181628b6b 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -29,6 +29,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors - reposync: Parallel repo sync using ionice and SCHED_BATCH +- repopick: Utility to fetch changes from Gerrit. - installboot: Installs a boot.img to the connected device. - installrecovery: Installs a recovery.img to the connected device. - repodiff: Diff 2 different branches or tags within the same repo @@ -2155,6 +2156,11 @@ alias mmmp='dopush mmm' alias mkap='dopush mka' alias cmkap='dopush cmka' +function repopick() { + T=$(gettop) + $T/build/tools/repopick.py $@ +} + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that diff --git a/tools/repopick.py b/tools/repopick.py new file mode 100755 index 00000000000..a53c04329b9 --- /dev/null +++ b/tools/repopick.py @@ -0,0 +1,377 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013-15 The CyanogenMod 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. +# + +# +# Run repopick.py -h for a description of this utility. +# + +from __future__ import print_function + +import sys +import json +import os +import subprocess +import re +import argparse +import textwrap +from xml.etree import ElementTree + +try: + # For python3 + import urllib.error + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.request = urllib2 + + +# Verifies whether pathA is a subdirectory (or the same) as pathB +def is_subdir(a, b): + a = os.path.realpath(a) + '/' + b = os.path.realpath(b) + '/' + return b == a[:len(b)] + + +def fetch_query_via_ssh(remote_url, query): + """Given a remote_url and a query, return the list of changes that fit it + This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API + We have to get the data, then transform it to match what we're expecting from the HTTP RESET API""" + if remote_url.count(':') == 2: + (uri, userhost, port) = remote_url.split(':') + userhost = userhost[2:] + elif remote_url.count(':') == 1: + (uri, userhost) = remote_url.split(':') + userhost = userhost[2:] + port = 29418 + else: + raise Exception('Malformed URI: Expecting ssh://[user@]host[:port]') + + + out = subprocess.check_output(['ssh', '-x', '-p{0}'.format(port), userhost, 'gerrit', 'query', '--format=JSON --patch-sets --current-patch-set', query]) + if not hasattr(out, 'encode'): + out = out.decode() + reviews = [] + for line in out.split('\n'): + try: + data = json.loads(line) + # make our data look like the http rest api data + review = { + 'branch': data['branch'], + 'change_id': data['id'], + 'current_revision': data['currentPatchSet']['revision'], + 'number': int(data['number']), + 'revisions': {patch_set['revision']: { + 'number': int(patch_set['number']), + 'fetch': { + 'ssh': { + 'ref': patch_set['ref'], + 'url': 'ssh://{0}:{1}/{2}'.format(userhost, port, data['project']) + } + } + } for patch_set in data['patchSets']}, + 'subject': data['subject'], + 'project': data['project'], + 'status': data['status'] + } + reviews.append(review) + except: + pass + args.quiet or print('Found {0} reviews'.format(len(reviews))) + return reviews + + +def fetch_query_via_http(remote_url, query): + + """Given a query, fetch the change numbers via http""" + url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query) + data = urllib.request.urlopen(url).read().decode('utf-8') + reviews = json.loads(data[5:]) + + for review in reviews: + review['number'] = review.pop('_number') + + return reviews + + +def fetch_query(remote_url, query): + """Wrapper for fetch_query_via_proto functions""" + if remote_url[0:3] == 'ssh': + return fetch_query_via_ssh(remote_url, query) + elif remote_url[0:4] == 'http': + return fetch_query_via_http(remote_url, query.replace(' ', '+')) + else: + raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]') + +if __name__ == '__main__': + # Default to CyanogenMod Gerrit + default_gerrit = 'http://review.cyanogenmod.org' + + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ + repopick.py is a utility to simplify the process of cherry picking + patches from CyanogenMod's Gerrit instance (or any gerrit instance of your choosing) + + Given a list of change numbers, repopick will cd into the project path + and cherry pick the latest patch available. + + With the --start-branch argument, the user can specify that a branch + should be created before cherry picking. This is useful for + cherry-picking many patches into a common branch which can be easily + abandoned later (good for testing other's changes.) + + The --abandon-first argument, when used in conjunction with the + --start-branch option, will cause repopick to abandon the specified + branch in all repos first before performing any cherry picks.''')) + parser.add_argument('change_number', nargs='*', help='change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.') + parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory') + parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking') + parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch') + parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"') + parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible') + parser.add_argument('-v', '--verbose', action='store_true', help='print extra information to aid in debug') + parser.add_argument('-f', '--force', action='store_true', help='force cherry pick even if change is closed') + parser.add_argument('-p', '--pull', action='store_true', help='execute pull instead of cherry-pick') + parser.add_argument('-P', '--path', help='use the specified path for the change') + parser.add_argument('-t', '--topic', help='pick all commits from a specified topic') + parser.add_argument('-Q', '--query', help='pick all commits using the specified query') + parser.add_argument('-g', '--gerrit', default=default_gerrit, help='Gerrit Instance to use. Form proto://[user@]host[:port]') + parser.add_argument('-e', '--exclude', nargs=1, help='exclude a list of commit numbers separated by a ,') + args = parser.parse_args() + if not args.start_branch and args.abandon_first: + parser.error('if --abandon-first is set, you must also give the branch name with --start-branch') + if args.auto_branch: + args.abandon_first = True + args.ignore_missing = True + if not args.start_branch: + args.start_branch = ['auto'] + if args.quiet and args.verbose: + parser.error('--quiet and --verbose cannot be specified together') + + if (1 << bool(args.change_number) << bool(args.topic) << bool(args.query)) != 2: + parser.error('One (and only one) of change_number, topic, and query are allowed') + + # Change current directory to the top of the tree + if 'ANDROID_BUILD_TOP' in os.environ: + top = os.environ['ANDROID_BUILD_TOP'] + + if not is_subdir(os.getcwd(), top): + sys.stderr.write('ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n') + sys.exit(1) + os.chdir(os.environ['ANDROID_BUILD_TOP']) + + # Sanity check that we are being run from the top level of the tree + if not os.path.isdir('.repo'): + sys.stderr.write('ERROR: No .repo directory found. Please run this from the top of your tree.\n') + sys.exit(1) + + # If --abandon-first is given, abandon the branch before starting + if args.abandon_first: + # Determine if the branch already exists; skip the abandon if it does not + plist = subprocess.check_output(['repo', 'info']) + if not hasattr(plist, 'encode'): + plist = plist.decode() + needs_abandon = False + for pline in plist.splitlines(): + matchObj = re.match(r'Local Branches.*\[(.*)\]', pline) + if matchObj: + local_branches = re.split('\s*,\s*', matchObj.group(1)) + if any(args.start_branch[0] in s for s in local_branches): + needs_abandon = True + + if needs_abandon: + # Perform the abandon only if the branch already exists + if not args.quiet: + print('Abandoning branch: %s' % args.start_branch[0]) + subprocess.check_output(['repo', 'abandon', args.start_branch[0]]) + if not args.quiet: + print('') + + # Get the master manifest from repo + # - convert project name and revision to a path + project_name_to_data = {} + manifest = subprocess.check_output(['repo', 'manifest']) + xml_root = ElementTree.fromstring(manifest) + projects = xml_root.findall('project') + default_revision = xml_root.findall('default')[0].get('revision').split('/')[-1] + + #dump project data into the a list of dicts with the following data: + #{project: {path, revision}} + + for project in projects: + name = project.get('name') + path = project.get('path') + revision = project.get('revision') + if revision is None: + revision = default_revision + + if not name in project_name_to_data: + project_name_to_data[name] = {} + project_name_to_data[name][revision] = path + + # get data on requested changes + reviews = [] + change_numbers = [] + if args.topic: + reviews = fetch_query(args.gerrit, 'topic:{0}'.format(args.topic)) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.query: + reviews = fetch_query(args.gerrit, args.query) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.change_number: + for c in args.change_number: + if '-' in c: + templist = c.split('-') + for i in range(int(templist[0]), int(templist[1]) + 1): + change_numbers.append(str(i)) + else: + change_numbers.append(c) + reviews = fetch_query(args.gerrit, ' OR '.join('change:{0}'.format(x.split('/')[0]) for x in change_numbers)) + + # make list of things to actually merge + mergables = [] + + # If --exclude is given, create the list of commits to ignore + exclude = [] + if args.exclude: + exclude = args.exclude[0].split(',') + + for change in change_numbers: + patchset = None + if '/' in change: + (change, patchset) = change.split('/') + + if change in exclude: + continue + + change = int(change) + review = next((x for x in reviews if x['number'] == change), None) + if review is None: + print('Change %d not found, skipping' % change) + continue + + mergables.append({ + 'subject': review['subject'], + 'project': review['project'], + 'branch': review['branch'], + 'change_number': review['number'], + 'status': review['status'], + 'fetch': None + }) + mergables[-1]['fetch'] = review['revisions'][review['current_revision']]['fetch'] + mergables[-1]['id'] = change + if patchset: + try: + mergables[-1]['fetch'] = [x['fetch'] for x in review['revisions'] if x['_number'] == patchset][0] + mergables[-1]['id'] = '{0}/{1}'.format(change, patchset) + except (IndexError, ValueError): + args.quiet or print('ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.'.format(change, patchset)) + + for item in mergables: + args.quiet or print('Applying change number {0}...'.format(item['id'])) + # Check if change is open and exit if it's not, unless -f is specified + if (item['status'] != 'OPEN' and item['status'] != 'NEW') and not args.query: + if args.force: + print('!! Force-picking a closed change !!\n') + else: + print('Change status is ' + item['status'] + '. Skipping the cherry pick.\nUse -f to force this pick.') + continue + + # Convert the project name to a project path + # - check that the project path exists + project_path = None + + if item['project'] in project_name_to_data and item['branch'] in project_name_to_data[item['project']]: + project_path = project_name_to_data[item['project']][item['branch']] + elif args.path: + project_path = args.path + elif args.ignore_missing: + print('WARNING: Skipping {0} since there is no project directory for: {1}\n'.format(item['id'], item['project'])) + continue + else: + sys.stderr.write('ERROR: For {0}, could not determine the project path for project {1}\n'.format(item['id'], item['project'])) + sys.exit(1) + + # If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully) + if args.start_branch: + subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) + + # Print out some useful info + if not args.quiet: + print('--> Subject: "{0}"'.format(item['subject'])) + print('--> Project path: {0}'.format(project_path)) + print('--> Change number: {0} (Patch Set {0})'.format(item['id'])) + + if 'anonymous http' in item['fetch']: + method = 'anonymous http' + else: + method = 'ssh' + + # Try fetching from GitHub first if using default gerrit + if args.gerrit == default_gerrit: + if args.verbose: + print('Trying to fetch the change from GitHub') + + if args.pull: + cmd = ['git pull --no-edit github', item['fetch'][method]['ref']] + else: + cmd = ['git fetch github', item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + FETCH_HEAD = '{0}/.git/FETCH_HEAD'.format(project_path) + if result != 0 and os.stat(FETCH_HEAD).st_size != 0: + print('ERROR: git command failed') + sys.exit(result) + # Check if it worked + if args.gerrit != default_gerrit or os.stat(FETCH_HEAD).st_size == 0: + # If not using the default gerrit or github failed, fetch from gerrit. + if args.verbose: + if args.gerrit == default_gerrit: + print('Fetching from GitHub didn\'t work, trying to fetch the change from Gerrit') + else: + print('Fetching from {0}'.format(args.gerrit)) + + if args.pull: + cmd = ['git pull --no-edit', item['fetch'][method]['url'], item['fetch'][method]['ref']] + else: + cmd = ['git fetch', item['fetch'][method]['url'], item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + # Perform the cherry-pick + if not args.pull: + cmd = ['git cherry-pick FETCH_HEAD'] + if args.quiet: + cmd_out = open(os.devnull, 'wb') + else: + cmd_out = None + result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + if not args.quiet: + print('') From 62be577d45399f4425fc9dcecfd2052510937695 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Tue, 18 Jun 2013 14:17:21 -0700 Subject: [PATCH 051/502] add adb to the disttools Change-Id: I898fa5c9396606144e57dba8453f476b9e9440ab --- core/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/core/Makefile b/core/Makefile index 3d2b5bd9c59..495628510cd 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1502,6 +1502,7 @@ endif ifeq ($(build_ota_package),true) OTATOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ $(HOST_OUT_EXECUTABLES)/aapt \ + $(HOST_OUT_EXECUTABLES)/adb \ $(HOST_OUT_EXECUTABLES)/mkbootfs \ $(HOST_OUT_EXECUTABLES)/mkbootimg \ $(HOST_OUT_EXECUTABLES)/fs_config \ From a0f10adc44a3ebed13b38d7cc1635bc3d6f75fd1 Mon Sep 17 00:00:00 2001 From: cybojenix Date: Fri, 28 Jun 2013 20:30:00 +0100 Subject: [PATCH 052/502] lets make the lunch list look a little neater It's very simple, but with more and more devices coming in, a long list won't cut it There are probably better ways of doing this, feel free to comment Change-Id: I9bd1fef920f985a133c882df9987b6be29dbc7b8 --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 38181628b6b..11b9b55397f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -578,9 +578,9 @@ function print_lunch_menu() local choice for choice in ${LUNCH_MENU_CHOICES[@]} do - echo " $i. $choice" + echo " $i. $choice " i=$(($i+1)) - done + done | column if [ "z${CM_DEVICES_ONLY}" != "z" ]; then echo "... and don't forget the bacon!" From 78380ab090e158783726b75de48493f9b9993c62 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 1 Jul 2013 23:35:26 +0100 Subject: [PATCH 053/502] Sign final packages with a different key if requested ...and throw it into recovery builds as well Change-Id: Ic96d4d49d821cb03d5318e3e9ad93d02fb92573e --- core/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/Makefile b/core/Makefile index 495628510cd..5c25f743f0d 100644 --- a/core/Makefile +++ b/core/Makefile @@ -406,6 +406,9 @@ endif # exist with the suffixes ".x509.pem" and ".pk8". DEFAULT_KEY_CERT_PAIR := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +ifneq ($(OTA_PACKAGE_SIGNING_KEY),) + DEFAULT_KEY_CERT_PAIR := $(OTA_PACKAGE_SIGNING_KEY) +endif # Rules that need to be present for the all targets, even # if they don't do anything. @@ -942,6 +945,11 @@ endif # substitute other keys for this one. OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem +ifneq ($(OTA_PACKAGE_SIGNING_KEY),) + OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem + PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +endif + # Generate a file containing the keys that will be read by the # recovery binary. RECOVERY_INSTALL_OTA_KEYS := \ From 0971a3d18554958f3b8f3f9fa3fd10deb87a3531 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sun, 19 May 2013 19:54:32 +0530 Subject: [PATCH 054/502] dopush: push files to /data too Change-Id: I85e24575a04955ae17b978f038edc46e1e6bfa2c --- envsetup.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 11b9b55397f..f205327c7e0 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2126,8 +2126,9 @@ function dopush() # Get target file name (i.e. system/bin/adb) TARGET=$(echo $FILE | sed "s#$OUT/##") - # Don't send files that are not in /system. - if ! echo $TARGET | egrep '^system\/' > /dev/null ; then + # Don't send files that are not under /system or /data + if [ ! "echo $TARGET | egrep '^system\/' > /dev/null" -o \ + "echo $TARGET | egrep '^data\/' > /dev/null" ] ; then continue else case $TARGET in From 1394eb372e1060f87a4e7a4e2935fe29e89bf49a Mon Sep 17 00:00:00 2001 From: Christopher Lais Date: Mon, 3 Jun 2013 15:15:39 -0500 Subject: [PATCH 055/502] envsetup.sh: add missing dquotes Change-Id: Ic86a5dd36b0f32cd7dc4d2f9c187566398796ed6 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index f205327c7e0..12cd1f7fdc3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -329,7 +329,7 @@ function settitle() PROMPT_COMMAND="echo -ne \"\033]0;${USER}@${HOSTNAME}: ${PWD}\007\";${PROMPT_COMMAND}" fi if [ ! -z "$ANDROID_PROMPT_PREFIX" ]; then - PROMPT_COMMAND=$(echo $PROMPT_COMMAND | sed -e 's/$ANDROID_PROMPT_PREFIX //g') + PROMPT_COMMAND="$(echo $PROMPT_COMMAND | sed -e 's/$ANDROID_PROMPT_PREFIX //g')" fi if [ -z "$apps" ]; then From 0085a7a797c67ecf89f89f9907beda16a9cc955d Mon Sep 17 00:00:00 2001 From: Shareef Ali Date: Tue, 28 May 2013 22:44:31 -0500 Subject: [PATCH 056/502] build: get rid of the sparse expand stuff * i don't see a reason why we are doing this because we never deal with flashing system img rawly * This will put useless write on ssd.. * we don't have space on ssd Change-Id: Icd53d161b8515f5eca238b98ad68515d69caa34f --- tools/releasetools/build_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index d78896a22cc..2e802424372 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -366,7 +366,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): build_command = ["mkuserimg.sh"] if "extfs_sparse_flag" in prop_dict: build_command.append(prop_dict["extfs_sparse_flag"]) - run_fsck = True + #run_fsck = True build_command.extend([in_dir, out_file, fs_type, prop_dict["mount_point"]]) build_command.append(prop_dict["partition_size"]) From 1d891d52f3e9bfc845813051b77626af4d98fb93 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Sun, 30 Jun 2013 10:04:25 +0530 Subject: [PATCH 057/502] envsetup: add a helper to fix "out/target/common" not being really common * out/target/common isn't really common, and if you do back to back builds for multiple devices, that is noticable. * Use out/target/common-$device instead, and link the appropriate dir to out/target/common every time lunch() is run, if CM_FIXUP_COMMON_OUT is set. * Refer https://groups.google.com/forum/#!topic/android-building/ispbOgzoyg8 for more info. Change-Id: I11e7df0e68e2a60ce32576f06397d60fc9465b60 --- envsetup.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 12cd1f7fdc3..ab2598996c8 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -714,6 +714,8 @@ function lunch() echo + fixup_common_out_dir + set_stuff_for_environment printconfig destroy_build_var_cache @@ -2162,6 +2164,24 @@ function repopick() { $T/build/tools/repopick.py $@ } +function fixup_common_out_dir() { + common_out_dir=$(get_build_var OUT_DIR)/target/common + target_device=$(get_build_var TARGET_DEVICE) + if [ ! -z $CM_FIXUP_COMMON_OUT ]; then + if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then + mv ${common_out_dir} ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + fi + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir} + fi +} + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that From d4bfce78831580e4f28b68c73bc8282e17b8287d Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sat, 27 Jul 2013 13:51:56 +0100 Subject: [PATCH 058/502] eat: Support v2 fstabs Change-Id: I5220d7e9232174e2acbdc2d6c931827af959f212 --- envsetup.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index ab2598996c8..13164f0323f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1709,8 +1709,14 @@ function installboot() PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` if [ -z "$PARTITION" ]; then - echo "Unable to determine boot partition." - return 1 + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine boot partition." + return 1 + fi fi adb start-server adb root From 9fb1241b613a460dde7a20eb48ebcfc45468e976 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 9 Aug 2013 21:03:42 -0700 Subject: [PATCH 059/502] envsetup: Fix installrecovery for new fstab format Change-Id: I26ab441c28350cce70bb976b249b16c6b83ab8da envsetup: Fix giant derp Change-Id: I490556f18c40c3614e4e554d7db3306a16ff99d8 --- envsetup.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 13164f0323f..b62371bb3ae 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1753,8 +1753,14 @@ function installrecovery() PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` if [ -z "$PARTITION" ]; then - echo "Unable to determine recovery partition." - return 1 + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine recovery partition." + return 1 + fi fi adb start-server adb root From 8252bf9abf098f0e0d0f07e5e1f0a19600d77295 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 3 Jul 2013 23:06:02 +0100 Subject: [PATCH 060/502] recovery: Always allow the CM release key Avoid the "Untrusted" warning in recovery when flashing a CM-signed build Change-Id: I13900bd7e2539fdc7442477a844391b8c5d87dda --- core/Makefile | 2 ++ target/product/security/cm.x509.pem | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 target/product/security/cm.x509.pem diff --git a/core/Makefile b/core/Makefile index 5c25f743f0d..25079327fee 100644 --- a/core/Makefile +++ b/core/Makefile @@ -950,6 +950,8 @@ ifneq ($(OTA_PACKAGE_SIGNING_KEY),) PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) endif +PRODUCT_EXTRA_RECOVERY_KEYS += build/target/product/security/cm + # Generate a file containing the keys that will be read by the # recovery binary. RECOVERY_INSTALL_OTA_KEYS := \ diff --git a/target/product/security/cm.x509.pem b/target/product/security/cm.x509.pem new file mode 100644 index 00000000000..5ff19db7213 --- /dev/null +++ b/target/product/security/cm.x509.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZDCCAkygAwIBAgIEUfbexjANBgkqhkiG9w0BAQUFADB0MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoTDUN5YW5v +Z2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMTDUN5YW5v +Z2VuIEluYy4wHhcNMTMwNzI5MjEyOTQyWhcNNDAxMjE0MjEyOTQyWjB0MQswCQYD +VQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoT +DUN5YW5vZ2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMT +DUN5YW5vZ2VuIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCP ++K2NPqdZ6UmexXQ8tsc2TkLXYhiuEsifO66qlpwsTTw1522HcbKPVoPRr/JBXqOv +E3K0HuZ/IsYYGsP/wJWWvpaWs+5xC+YkLkittK2uUzTqndpLFiDRAeICKpvDJI57 +Z0DkzVYXBPn+yw+x8ttjT/vWcJ3PEVYuew8MYPUOgKpdZlQtUBeoEBDSL8JPGViq +e6jWOlSAWekhlgb+wb9RoXhu/v2HYzp89GG0sIrAgj7vZCior5XuFmm8eWhqUhTp +TUBv/nNI/ORYt3G8IQyI2pJN1GNPAAv1uA5i4y/deX1x4GCWyN9feiD9fOj2oc3z +Hwf5Frs9BjOb9XMXecbNAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGudhFe9VnES +fWynTYO4kWNlMC++yB6qD3pHW6HtBiaANj9wxrLCTFzf+boHNPeZ8HDkW01zAaQK +fd9/fnGmHf4q/QvxrvGbnb3Fqhw+2hknbbMUoAa+Qp+2ouf9oJaNRquZ+rHEHX8g +Rx8wGyvjaWYfQrwyZRgXj/Jrc/NXxQCmSJeexHVNXgQD6aOLHJYrJ+s+U/hwVNiM +5L+psOh89itwt8DGGSLW16HjQKmPPbWbqxgnfRbOlxWrLDq3agcrskYpDP2aGGBA +5STq/bvh9yZkrNYvMGzrXDhcJ44QRS8e1Jw/ZtfFvJD192e7KKVdy7CJWmOckCNK +gl0KCQ3MBx4= +-----END CERTIFICATE----- From 21028783699652b4071edfaecb35080fd040fd66 Mon Sep 17 00:00:00 2001 From: Sam Mortimer Date: Sat, 10 Aug 2013 22:57:08 -0700 Subject: [PATCH 061/502] build: allow dopush to work properly with network adb Change-Id: I9efe60814d66dc8eb17544e6c2b94473dc903133 --- envsetup.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index b62371bb3ae..9a78af7c640 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2122,8 +2122,17 @@ function dopush() if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); then + # retrieve IP and PORT info if we're using a TCP connection + TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ + | head -1 | awk '{print $1}') adb root &> /dev/null sleep 0.3 + if [ -n "$TCPIPPORT" ] + then + # adb root just killed our connection + # so reconnect... + adb connect "$TCPIPPORT" + fi adb wait-for-device &> /dev/null sleep 0.3 adb remount &> /dev/null From bc8c0483cd02522e5f56f45439aa55e76a718a54 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 30 Aug 2013 17:34:37 -0700 Subject: [PATCH 062/502] envsetup: Wait for device in installboot/installrecovery * Useful when you're racing against a bug that causes a kernel panic shortly after USB turns on :( Change-Id: I2a503e4b195e632ed5b67a77b942e80c47d0ff45 envsetup: Use wait-for-online so these cmds work in recovery Change-Id: I7a85e7068f373b1d726aa6b27a51862fa9b7c6fd --- envsetup.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 9a78af7c640..adcad452924 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1719,6 +1719,7 @@ function installboot() fi fi adb start-server + adb wait-for-online adb root sleep 1 adb wait-for-online shell mount /system 2>&1 > /dev/null @@ -1763,6 +1764,7 @@ function installrecovery() fi fi adb start-server + adb wait-for-online adb root sleep 1 adb wait-for-online shell mount /system 2>&1 >> /dev/null From ffddd1090821fa53a2f898b92a9e6c01415e9914 Mon Sep 17 00:00:00 2001 From: William Roberts Date: Tue, 20 Aug 2013 16:02:53 -0700 Subject: [PATCH 063/502] Add PRODUCT_BOOTANIMATION Just add PRODUCT_BOOTANIMATION in your product makefiles and point it to the zip file you would like to have used as the boot animation. The coresponsing build system handles picking the last one, which is the last product to set this. Change-Id: I8c95a515a8fbb92d363141eb79e254712dccc162 Signed-off-by: William Roberts Fix for build break when PRODUCT_BOOTANIMATION is unset Change-Id: I236c2dd35ba0e632ed327ed6dc36324c9e59587a Restore original behavior when PRODUCT_BOOTANIMATION is undefined Change-Id: I3ee7141f7c26cee033b8a30824caf38fcacec5a8 --- core/product.mk | 1 + core/product_config.mk | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/core/product.mk b/core/product.mk index adf56004cc2..da5c75489b1 100644 --- a/core/product.mk +++ b/core/product.mk @@ -73,6 +73,7 @@ endef # _product_var_list := \ + PRODUCT_BOOTANIMATION \ PRODUCT_BUILD_PROP_OVERRIDES \ PRODUCT_NAME \ PRODUCT_MODEL \ diff --git a/core/product_config.mk b/core/product_config.mk index d14a24a0dd2..9f38676259e 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -355,6 +355,12 @@ endif # The optional : is used to indicate the owner of a vendor file. PRODUCT_COPY_FILES := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES)) +_boot_animation := $(strip $(lastword $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BOOTANIMATION))) +ifneq ($(_boot_animation),) +PRODUCT_COPY_FILES += \ + $(_boot_animation):system/media/bootanimation.zip +endif +_boot_animation := # A list of property assignments, like "key = value", with zero or more # whitespace characters on either side of the '='. From e6a9637100ed47008f0387eebf9dd664819b7f04 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Thu, 26 Sep 2013 00:10:20 +0100 Subject: [PATCH 064/502] Add a unique build number to every build SDK-readable via android.os.Build.INCREMENTAL Change-Id: If9885adebe12a56b2b2e353285721be695bc411b Fix exporting the unique build identifier Change-Id: Ie58e981b7e83a4351d137dfd8995dce7d365d950 Fix incremental build number on Darwin Darwin does not include sha1sum, but it should have openssl. Change-Id: If2b685c1478f9486bed21dfba0c655d9e02db72b Use openssl instead of sha1sum Change-Id: Iab8a74d4af6646104cb23312853f811a38bdec0d --- envsetup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/envsetup.sh b/envsetup.sh index adcad452924..feb70c7a7e1 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -144,6 +144,7 @@ function check_product() if (echo -n $1 | grep -q -e "^cm_") ; then CM_BUILD=$(echo -n $1 | sed -e 's/^cm_//g') + export BUILD_NUMBER=$((date +%s%N ; echo $CM_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10) else CM_BUILD= fi From a282c0f85745ff0303bf03770754a51f18ca47a9 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Mon, 7 Oct 2013 02:34:47 -0700 Subject: [PATCH 065/502] build: Don't run backuptool on GMS builds Change-Id: I5dde27f9d16b88049171db9805221d92e67f3e5d --- core/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/Makefile b/core/Makefile index 25079327fee..c1f228b85bd 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1880,11 +1880,15 @@ else OTA_FROM_TARGET_SCRIPT := $(TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT) endif +ifeq ($(WITH_GMS),true) + $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false +else ifneq ($(CM_BUILD),) $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := true else $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false endif +endif ifeq ($(TARGET_OTA_ASSERT_DEVICE),) $(INTERNAL_OTA_PACKAGE_TARGET): override_device := auto From 2290834866831638b7cf2298b44a99cf1ca61717 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 18 Oct 2013 21:48:46 +0100 Subject: [PATCH 066/502] Store the path to the ota file generator where it can be reused Change-Id: I8896713c79a751b79fbbcc75f6ba30dad4ea9fac --- core/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/core/Makefile b/core/Makefile index c1f228b85bd..df47e1b9624 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1897,6 +1897,7 @@ else endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) + @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ From c1a6a2ca076330e544c22a90d7fd57cd9e1e6c9e Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 26 Oct 2013 12:58:57 -0700 Subject: [PATCH 067/502] build: Add support for vendor product and device name * CM's build system assumes some convention-over-configuration which we might need to override in order to conform to vendor requirements. * Allow overriding of target and product names using these new variables. This allows for CM conventions to work, while generating the correct fingerprint dynamically without post processing the strings. Change-Id: Ic5913e587400dd38c04aa05de3a7becced77a59e --- core/Makefile | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/core/Makefile b/core/Makefile index df47e1b9624..bdaec8392fb 100644 --- a/core/Makefile +++ b/core/Makefile @@ -138,8 +138,18 @@ endif BUILD_VERSION_TAGS += $(BUILD_KEYS) BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS))) +# If the final fingerprint should be different than what was used by the build system, +# we can allow that too. +ifeq ($(TARGET_VENDOR_PRODUCT_NAME),) +TARGET_VENDOR_PRODUCT_NAME := $(TARGET_PRODUCT) +endif + +ifeq ($(TARGET_VENDOR_DEVICE_NAME),) +TARGET_VENDOR_DEVICE_NAME := $(TARGET_DEVICE) +endif + # A human-readable string that descibes this build in detail. -build_desc := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER_FROM_FILE) $(BUILD_VERSION_TAGS) +build_desc := $(TARGET_VENDOR_PRODUCT_NAME)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER_FROM_FILE) $(BUILD_VERSION_TAGS) $(intermediate_system_build_prop): PRIVATE_BUILD_DESC := $(build_desc) # The string used to uniquely identify the combined build and product; used by the OTA server. @@ -151,7 +161,7 @@ ifeq (,$(strip $(BUILD_FINGERPRINT))) else BF_BUILD_NUMBER := $(BUILD_NUMBER) endif - BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_PRODUCT)/$(TARGET_DEVICE):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) + BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_VENDOR_PRODUCT_NAME)/$(TARGET_VENDOR_DEVICE_NAME):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) endif ifneq ($(words $(BUILD_FINGERPRINT)),1) $(error BUILD_FINGERPRINT cannot contain spaces: "$(BUILD_FINGERPRINT)") @@ -226,9 +236,9 @@ ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_OEM_PROPERTIES),) endif $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \ TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \ - TARGET_DEVICE="$(TARGET_DEVICE)" \ + TARGET_DEVICE="$(TARGET_VENDOR_DEVICE_NAME)" \ CM_DEVICE="$(TARGET_DEVICE)" \ - PRODUCT_NAME="$(TARGET_PRODUCT)" \ + PRODUCT_NAME="$(TARGET_VENDOR_PRODUCT_NAME)" \ PRODUCT_BRAND="$(PRODUCT_BRAND)" \ PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \ PRODUCT_DEFAULT_WIFI_CHANNELS="$(PRODUCT_DEFAULT_WIFI_CHANNELS)" \ From 244ef9e2bd208a5c6fe33195f869559abb63ddfb Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Tue, 22 Oct 2013 22:23:27 -0700 Subject: [PATCH 068/502] build: Add script to generate extra images Change-Id: I53081c7a2b4f18bc8c8a27b04d311a6b078b2022 Use CM standard qcom naming Change-Id: I360b3dcf1fe82140a7993189e881f9d77b571bef generate_extra_images: Remove deprecated image generation * Remove msm7x27a/msm7x30 nand images * Remove msm8930 1G userdata Change-Id: I81b93d34893d504a53f2aadb9c3ac2089c06860c generate_extra_images: Rename targets and add 'sec' prefix Change-Id: Ie7debfb33349d16d9a457ff817072af2f3a10c0f --- core/generate_extra_images.mk | 116 ++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 core/generate_extra_images.mk diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk new file mode 100644 index 00000000000..2e59339ef71 --- /dev/null +++ b/core/generate_extra_images.mk @@ -0,0 +1,116 @@ +# This makefile is used to generate extra images for QCOM targets +# persist, device tree & NAND images required for different QCOM targets. + +# These variables are required to make sure that the required +# files/targets are available before generating NAND images. +# This file is included from device/qcom//AndroidBoard.mk +# and gets parsed before build/core/Makefile, which has these +# variables defined. build/core/Makefile will overwrite these +# variables again. +INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img +INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img + +#---------------------------------------------------------------------- +# Generate secure boot & recovery image +#---------------------------------------------------------------------- +ifeq ($(TARGET_BOOTIMG_SIGNED),true) +INSTALLED_SEC_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img.secure +INSTALLED_SEC_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img.secure + +ifneq ($(BUILD_TINY_ANDROID),true) +intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p +endif + +ifndef TARGET_SHA_TYPE + TARGET_SHA_TYPE := sha256 +endif + +define build-sec-image + $(hide) mv -f $(1) $(1).nonsecure + $(hide) openssl dgst -$(TARGET_SHA_TYPE) -binary $(1).nonsecure > $(1).$(TARGET_SHA_TYPE) + $(hide) openssl rsautl -sign -in $(1).$(TARGET_SHA_TYPE) -inkey $(PRODUCT_PRIVATE_KEY) -out $(1).sig + $(hide) dd if=/dev/zero of=$(1).sig.padded bs=$(BOARD_KERNEL_PAGESIZE) count=1 + $(hide) dd if=$(1).sig of=$(1).sig.padded conv=notrunc + $(hide) cat $(1).nonsecure $(1).sig.padded > $(1).secure + $(hide) rm -rf $(1).$(TARGET_SHA_TYPE) $(1).sig $(1).sig.padded + $(hide) mv -f $(1).secure $(1) +endef + +$(INSTALLED_SEC_BOOTIMAGE_TARGET): $(INSTALLED_BOOTIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH) + $(hide) $(call build-sec-image,$(INSTALLED_BOOTIMAGE_TARGET)) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_BOOTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_BOOTIMAGE_TARGET) + +$(INSTALLED_SEC_RECOVERYIMAGE_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH) + $(hide) $(call build-sec-image,$(INSTALLED_RECOVERYIMAGE_TARGET)) + +ifneq ($(BUILD_TINY_ANDROID),true) +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) +endif # !BUILD_TINY_ANDROID +endif # TARGET_BOOTIMG_SIGNED + +#---------------------------------------------------------------------- +# Generate persist image (persist.img) +#---------------------------------------------------------------------- +TARGET_OUT_PERSIST := $(PRODUCT_OUT)/persist + +INTERNAL_PERSISTIMAGE_FILES := \ + $(filter $(TARGET_OUT_PERSIST)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +INSTALLED_PERSISTIMAGE_TARGET := $(PRODUCT_OUT)/persist.img + +define build-persistimage-target + $(call pretty,"Target persist fs image: $(INSTALLED_PERSISTIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_PERSIST) + $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_PERSIST) $@ ext4 persist $(BOARD_PERSISTIMAGE_PARTITION_SIZE) + $(hide) chmod a+r $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_PERSISTIMAGE_PARTITION_SIZE),yaffs) +endef + +$(INSTALLED_PERSISTIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(INTERNAL_PERSISTIMAGE_FILES) + $(build-persistimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PERSISTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_PERSISTIMAGE_TARGET) + + +#---------------------------------------------------------------------- +# Generate device tree image (dt.img) +#---------------------------------------------------------------------- +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) +ifeq ($(strip $(BUILD_TINY_ANDROID)),true) +include device/qcom/common/dtbtool/Android.mk +endif + +DTBTOOL := $(HOST_OUT_EXECUTABLES)/dtbTool$(HOST_EXECUTABLE_SUFFIX) + +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + +define build-dtimage-target + $(call pretty,"Target dt image: $(INSTALLED_DTIMAGE_TARGET)") + $(hide) $(DTBTOOL) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(KERNEL_OUT)/arch/arm/boot/ + $(hide) chmod a+r $@ +endef + +$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) + $(build-dtimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) +endif + + +.PHONY: aboot +aboot: $(INSTALLED_BOOTLOADER_MODULE) + +.PHONY: sec_bootimage +sec_bootimage: $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_SEC_BOOTIMAGE_TARGET) + +.PHONY: sec_recoveryimage +sec_recoveryimage: $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_SEC_RECOVERYIMAGE_TARGET) + +.PHONY: persistimage +persistimage: $(INSTALLED_PERSISTIMAGE_TARGET) From fed6330ab6cfb13877bf14524b53ba11cc4c62bb Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Tue, 5 Nov 2013 22:17:59 +0000 Subject: [PATCH 069/502] cm: Fix global selinux policy inclusion We're adding CM-specific policies to an overlay instead of patching external/sepolicy, so we need to make sure it's included to prevent misbehaving systems Change-Id: I7989a1093f9abc8360d492e73a860eb4afad10ad --- core/config.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/config.mk b/core/config.mk index 96d1eab2bee..e6809d389f3 100644 --- a/core/config.mk +++ b/core/config.mk @@ -868,4 +868,10 @@ endif RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20 RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 +ifneq ($(CM_BUILD),) +## We need to be sure the global selinux policies are included +## last, to avoid accidental resetting by device configs +$(eval include vendor/cm/sepolicy/sepolicy.mk) +endif + include $(BUILD_SYSTEM)/dumpvar.mk From 91bd4b1860fbe6e8906b09ef52b14671df273e8d Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 1 Nov 2013 00:47:32 +0000 Subject: [PATCH 070/502] Don't make assumptions about the formats of build descriptions Change-Id: Id83a7594e9e1b9b4ffbdbaba695506d8d0d21a46 --- tools/releasetools/sign_target_files_apks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py index f758ae04b73..8b8375ba1e0 100755 --- a/tools/releasetools/sign_target_files_apks.py +++ b/tools/releasetools/sign_target_files_apks.py @@ -347,7 +347,7 @@ def RewriteProps(data, misc_info): value = "/".join(pieces) elif key == "ro.build.description": pieces = value.split(" ") - assert len(pieces) == 5 + #assert len(pieces) == 5 pieces[-1] = EditTags(pieces[-1]) value = " ".join(pieces) elif key == "ro.build.tags": From 5ed2f8cbb5f38691b8d38642154204cefa6f1c04 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 11 Nov 2013 00:51:48 +0000 Subject: [PATCH 071/502] For user builds, use a release build id in the description if one exists Companion change to Ic5913e587400dd38c04aa05de3a7becced77a59e Change-Id: If5edbf56d567701f96f0ba46af9a90ffa8310c24 --- core/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index bdaec8392fb..9c8dbe6f1b7 100644 --- a/core/Makefile +++ b/core/Makefile @@ -148,8 +148,12 @@ ifeq ($(TARGET_VENDOR_DEVICE_NAME),) TARGET_VENDOR_DEVICE_NAME := $(TARGET_DEVICE) endif +ifeq ($(TARGET_VENDOR_RELEASE_BUILD_ID),) +TARGET_VENDOR_RELEASE_BUILD_ID := $(BUILD_NUMBER_FROM_FILE) +endif + # A human-readable string that descibes this build in detail. -build_desc := $(TARGET_VENDOR_PRODUCT_NAME)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER_FROM_FILE) $(BUILD_VERSION_TAGS) +build_desc := $(TARGET_VENDOR_PRODUCT_NAME)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(TARGET_VENDOR_RELEASE_BUILD_ID) $(BUILD_VERSION_TAGS) $(intermediate_system_build_prop): PRIVATE_BUILD_DESC := $(build_desc) # The string used to uniquely identify the combined build and product; used by the OTA server. @@ -161,6 +165,9 @@ ifeq (,$(strip $(BUILD_FINGERPRINT))) else BF_BUILD_NUMBER := $(BUILD_NUMBER) endif + ifneq ($(TARGET_VENDOR_RELEASE_BUILD_ID),) + BF_BUILD_NUMBER := $(TARGET_VENDOR_RELEASE_BUILD_ID) + endif BUILD_FINGERPRINT := $(PRODUCT_BRAND)/$(TARGET_VENDOR_PRODUCT_NAME)/$(TARGET_VENDOR_DEVICE_NAME):$(PLATFORM_VERSION)/$(BUILD_ID)/$(BF_BUILD_NUMBER):$(TARGET_BUILD_VARIANT)/$(BUILD_VERSION_TAGS) endif ifneq ($(words $(BUILD_FINGERPRINT)),1) From f2b41f8ce2452da2c8892487db57e2f81705e1ed Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 27 Oct 2013 13:34:36 -0700 Subject: [PATCH 072/502] build: Add cafremote command to envsetup * So lazy! Change-Id: I99a988180abb4fb486d4ebbb842bb9eda03bf1bc --- envsetup.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index feb70c7a7e1..f33d0eec10c 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -26,6 +26,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cmremote: Add git remote for CM Gerrit Review - cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review - aospremote: Add git remote for matching AOSP repository +- cafremote: Add git remote for matching CodeAurora repository. - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors - reposync: Parallel repo sync using ionice and SCHED_BATCH @@ -1695,6 +1696,24 @@ function aospremote() } export -f aospremote +function cafremote() +{ + git remote rm caf 2> /dev/null + if [ ! -d .git ] + then + echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + fi + PROJECT=`pwd | sed s#$ANDROID_BUILD_TOP/##g` + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add caf git://codeaurora.org/$PFX$PROJECT + echo "Remote 'caf' created" +} +export -f cafremote + + function installboot() { if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; From 61294bbc061a035e605503adcb48c8486f460528 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 16 Nov 2013 03:48:30 -0800 Subject: [PATCH 073/502] envsetup: Fix remote functions to deal with symlinks Change-Id: I6f35dc30dda22149b2c37e1c6c7d41ea7239d3bb --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index f33d0eec10c..a94c728fb0a 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1686,7 +1686,7 @@ function aospremote() then echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. fi - PROJECT=`pwd | sed s#$ANDROID_BUILD_TOP/##g` + PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` if (echo $PROJECT | grep -qv "^device") then PFX="platform/" @@ -1703,7 +1703,7 @@ function cafremote() then echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. fi - PROJECT=`pwd | sed s#$ANDROID_BUILD_TOP/##g` + PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` if (echo $PROJECT | grep -qv "^device") then PFX="platform/" From 6eed53f083c4aa0abe3af11f238497617e5e493e Mon Sep 17 00:00:00 2001 From: cybojenix Date: Sat, 2 Nov 2013 17:18:36 +0400 Subject: [PATCH 074/502] core: main: remove all the spam about including make files Change-Id: Ifd2ef0e239d16b169c572472416c2c31df62a367 --- core/main.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/main.mk b/core/main.mk index 049cf21a2f1..1be40783269 100644 --- a/core/main.mk +++ b/core/main.mk @@ -554,7 +554,7 @@ ifeq ($(USE_SOONG),true) subdir_makefiles := $(SOONG_ANDROID_MK) $(call filter-soong-makefiles,$(subdir_makefiles)) endif -$(foreach mk, $(subdir_makefiles),$(info including $(mk) ...)$(eval include $(mk))) +$(foreach mk, $(subdir_makefiles), $(eval include $(mk))) ifdef PDK_FUSION_PLATFORM_ZIP # Bring in the PDK platform.zip modules. From c144ce0f9127375ff12450297cb0faf3285d3aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 3 Nov 2013 13:02:13 -0300 Subject: [PATCH 075/502] envsetup: do not print an error if complete fails complete is a bashism; so it will fail on other shells. Avoid printing an error if that is the case. Change-Id: Id6d6311792f409cc3a697c7a2bb003863f1afe60 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index a94c728fb0a..22f8c2fbfec 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -734,7 +734,7 @@ function _lunch() COMPREPLY=( $(compgen -W "${LUNCH_MENU_CHOICES[*]}" -- ${cur}) ) return 0 } -complete -F _lunch lunch +complete -F _lunch lunch 2>/dev/null # Configures the build to build unbundled apps. # Run tapas with one or more app names (from LOCAL_PACKAGE_NAME) From 4529d11abddf301b66353115e95a3591ae4c55dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 3 Nov 2013 13:04:27 -0300 Subject: [PATCH 076/502] envsetup: drop unnecesary exports export -f is a bashism and we don't actually need it, so lets remove it. Change-Id: I9228cef0c4a9543b3d34fdc39a368ad0238431e2 --- envsetup.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 22f8c2fbfec..3758035bf4b 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1677,7 +1677,6 @@ function cmremote() fi echo You can now push to "cmremote". } -export -f cmremote function aospremote() { @@ -1694,7 +1693,6 @@ function aospremote() git remote add aosp https://android.googlesource.com/$PFX$PROJECT echo "Remote 'aosp' created" } -export -f aospremote function cafremote() { @@ -1711,8 +1709,6 @@ function cafremote() git remote add caf git://codeaurora.org/$PFX$PROJECT echo "Remote 'caf' created" } -export -f cafremote - function installboot() { From 116140287f68b1b0bd0733f66d056daeb708210c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= Date: Sun, 3 Nov 2013 13:05:43 -0300 Subject: [PATCH 077/502] envsetup: Mark zsh as compatible Basic functionality has been tested on zsh 5.0.2 and has been found to work correctly. Change-Id: I02e5e3bedf56b43104c280d9737ae7b334357643 --- envsetup.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 3758035bf4b..97dc3577367 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2350,8 +2350,10 @@ if [ "x$SHELL" != "x/bin/bash" ]; then case `ps -o command -p $$` in *bash*) ;; + *zsh*) + ;; *) - echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results" + echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results" ;; esac fi From 44077ec79ce56f18ad989ac3f3d1538884431037 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 13 Dec 2013 12:47:42 -0500 Subject: [PATCH 078/502] build: Add support for PRODUCT_COPY_FILES_OVERRIDES * We may have a case where prebuilts need to be built from source instead based on an externalized config. * New directive takes a list of destination files to remove from PRODUCT_COPY_FILES so that other instructions can be supplied. Change-Id: I7feff16440e54d1676ffddbbd96d5947efa43ede --- core/product-graph.mk | 1 + core/product.mk | 1 + core/product_config.mk | 16 ++++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/core/product-graph.mk b/core/product-graph.mk index 27502b210b4..2138dae2602 100644 --- a/core/product-graph.mk +++ b/core/product-graph.mk @@ -105,6 +105,7 @@ $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) $(hide) echo 'PRODUCT_DEFAULT_PROPERTY_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_DEFAULT_PROPERTY_OVERRIDES)' >> $$@ $(hide) echo 'PRODUCT_CHARACTERISTICS=$$(PRODUCTS.$(strip $(1)).PRODUCT_CHARACTERISTICS)' >> $$@ $(hide) echo 'PRODUCT_COPY_FILES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES)' >> $$@ + $(hide) echo 'PRODUCT_COPY_FILES_OVERRIDES=$$(PRODUCTS.$(strip $(1)).PRODUCT_COPY_FILES_OVERRIDES)' >> $$@ $(hide) echo 'PRODUCT_OTA_PUBLIC_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_OTA_PUBLIC_KEYS)' >> $$@ $(hide) echo 'PRODUCT_EXTRA_RECOVERY_KEYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_EXTRA_RECOVERY_KEYS)' >> $$@ $(hide) echo 'PRODUCT_PACKAGE_OVERLAYS=$$(PRODUCTS.$(strip $(1)).PRODUCT_PACKAGE_OVERLAYS)' >> $$@ diff --git a/core/product.mk b/core/product.mk index da5c75489b1..e2a5c3a8309 100644 --- a/core/product.mk +++ b/core/product.mk @@ -92,6 +92,7 @@ _product_var_list := \ PRODUCT_DEFAULT_PROPERTY_OVERRIDES \ PRODUCT_CHARACTERISTICS \ PRODUCT_COPY_FILES \ + PRODUCT_COPY_FILES_OVERRIDES \ PRODUCT_OTA_PUBLIC_KEYS \ PRODUCT_EXTRA_RECOVERY_KEYS \ PRODUCT_PACKAGE_OVERLAYS \ diff --git a/core/product_config.mk b/core/product_config.mk index 9f38676259e..be0c6193f02 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -362,6 +362,22 @@ PRODUCT_COPY_FILES += \ endif _boot_animation := +# We might want to skip items listed in PRODUCT_COPY_FILES for +# various reasons. This is useful for replacing a binary module with one +# built from source. This should be a list of destination files under $OUT +PRODUCT_COPY_FILES_OVERRIDES := \ + $(addprefix %:, $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_COPY_FILES_OVERRIDES))) + +ifneq ($(PRODUCT_COPY_FILES_OVERRIDES),) + PRODUCT_COPY_FILES := $(filter-out $(PRODUCT_COPY_FILES_OVERRIDES), $(PRODUCT_COPY_FILES)) +endif + +.PHONY: listcopies +listcopies: + @echo "Copy files: $(PRODUCT_COPY_FILES)" + @echo "Overrides: $(PRODUCT_COPY_FILES_OVERRIDES)" + + # A list of property assignments, like "key = value", with zero or more # whitespace characters on either side of the '='. PRODUCT_PROPERTY_OVERRIDES := \ From 6c35c7f2bf70182dc1b62f8e706e24d5c832a843 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sat, 28 Dec 2013 15:48:20 -0800 Subject: [PATCH 079/502] build: Add QCOM target-specific config * Needed to support global DirectTract config on legacy targets * Let's also eliminate some boilerplate Change-Id: I736c10a5e7e1f3d1e0de9e60f29b60add276f151 build: Fix cflags for QC targets Change-Id: I2281bec3afb4d80e80845718d880dc24ef7baf32 build: qcom: Set QCOM_*_PATH variables for hardware/qcom-* projects This consolidates a bunch of one-off logic scattered throughout the code base. Usage in Android.mk files is trivial: At top level, use e.g. "ifeq ($(call my-dir),$(QCOM_AUDIO_PATH))". This works for all variants, including non-variants (i.e. AOSP). Within subdirs, use e.g. hardware/qcom/audio => $(QCOM_AUDIO_PATH) Change-Id: Iee2497ea9a7efeb4ae9e861b84c532b19da7b69d build: Introduce project pathmap and use it for qcom variants The project pathmap tracks the path to the top level of a project. The following functions are provided: * project-set-path adds an entry. * project-set-path-variant adds a "variant" entry. * project-path-for retrieves an entry. To use as a guard in Android.mk: ifeq ($(call my-dir),$(call project-path-for,projectname)) To use for include paths in Android.mk: LOCAL_C_INCLUDES += $(call project-path-for,projectname)/... Set project pathmap for qcom project variants. Change-Id: I8dceca72a1ba80fc7b1830c5ab285d444f530457 build: Set QCOM variants for non-QCOM_HARDWARE defined targets * Nexus devices and others typically do not define the QCOM_HARDWARE flag, so the variant path should always default to the AOSP variant. * Unconditionally set the variant to the AOSP HAL by default. Change-Id: I714170897128f92718af266366cfcbf3136e8981 build: Automatically set QCOM audio, display, media variants * Device platform should determing the HAL that ought to be used. This commit forces QCOM_HARDWARE to select the -caf HAL variants, which are then broken down by platform within the variant path. Change-Id: I6fc7a3def7b93112f034a3b89552f302727cdbf8 build: Enable QCOM_BSP, QC_AV with QCOM_HARDWARE Change-Id: Ibf9dd35272521109fea52e46bacf6e1e3074ed6a pathmap: Point QC HAL pathmaps directly to the source Directly map to the actual HAL directory, including the board platform. This lets project-path-for point directly to the respective HALs. Change-Id: Ic4ed61bbdea9d0b5683502bf84a8410e76858527 Enable QCOM_BSP_LEGACY flag for pre-8974 targets Change-Id: I895f1b1cbad0d260e1bca87ccb61e6194de023fd build: Fix QCOM_BSP_LEGACY cflags Change-Id: I880f32892d9e082e3ba92878414f3cb3c6f08066 Fix QCOM_BSP_LEGACY Checks in the Android.mk files do not enable the cflags for .h files, causing a build that crashes constantly. Change-Id: I315c760488445629fda860ba70066417c7d68b8b build: Clean up QCOM flag definitions Change-Id: I66bca2db83260ccd65b82e540ee9f7961f00b030 build: Add QCOM flags to Clang CFLAGS Change-Id: I56f0d4106f5d3d27c1ace744d30c1c81f0052bbd build: Remove unused qcom CFLAG Change-Id: I6ead3e57899bcb007d4d284901f918a65a9e6926 build: Set QCOM global cflags for secondary arch Change-Id: I637d94f9b0ddee2c8d6057de44355e482163dd36 build: Fix copypasta in 2nd target clang flags Change-Id: Ieedce8754b145e53d72a5d6a4b41fbe5cdf6473f build: Allow devices to specify a RIL variant Change-Id: Ia5d35d916be358fb7be7ead6bd05cc3628b35a37 build: qcom: Set the correct project path for device-specific cameras Change-Id: I37696dae2c05c4e9f4fc824fbba63af47483ea17 build: Allow QC platforms to share/customize HAL variants * Allow devices to override HAL variant using QCOM_HARDWARE_VARIANT * 8909 and 8916 share HALs by default * 8610, 8226, 8974 share HALs by default * 8992, 8994 share HALs by default Change-Id: Idfbdc405a35c5ba518fc71c8b691fc177ddf9068 (cherry picked from commit 338b399a2976993f0758c2f4e61620e987f4cb19) build: Add a couple more custom pathmap variables Change-Id: Ie44b9844c6d82dd73d1ea1f16b565f8bb06652c1 qcom: Enable TARGET_COMPILE_WITH_MSM_KERNEL In the 6.0 HALs, CAF added the TARGET_COMPILE_WITH_MSM_KERNEL which is enabled when building AOSP with an in-line kernel. Since we only use in-line kernel builds, go ahead and enable it across the board for all Qualcomm devices Change-Id: I36bba34b7f1009b0776256cf0e0ce57e6c7377f4 qcom: Add QTI_BSP Change-Id: Id99fb17044e453af050e6e3ff59cd3f5a47da268 qcom: Remove QCOM_DIRECTTRACK * DirectTrack/LPA/tunnel for 8960 only works with AwesomePlayer, which has been deprecated. Don't bother allowing this to compile. Change-Id: I4d3e6dd9f1e3047a379fd76af4f6b45d791210de build: Allow devices to specify a WLAN variant Change-Id: I59616fa641c4ccddea7eb5fb77e9aeb0423ef234 build: Add bt-vendor variant and fix wlan variant Change-Id: Ie3c433420504f0f14783f99e2d5fcdd46f1a3f37 build: Adjust for device-specific HAL paths * QCOM variant HALs are pretty much deprecated, long live device-specific HALs! Change-Id: I636d1e851519aba31ea3744b369aea06d6db6f68 build: qcom: Define legacy ALSA audio flag Change-Id: I83cf184f56e1293f6abaaac7849505260499c9af build: End this nightmare. * Disable QC AV enhancements across the board. It brings no value for CyanogenMod now. We are unable and unwilling to make this shit work for commercial products- for aftermarket it would be a complete waste of time to even try. Change-Id: Id6f0086c107c24178410e726738e666341fdbfe1 qcom: Select Sony display/media variants for Sony devices Sony's msm8226 and msm8974 devices use HALs that match the 3.10 kernel they use. Select a custom variant here. Change-Id: Iecfb6bdf0e989ba5231bce6e650b6926417f7f90 qcom: Fix non-QC target pathmappings * The actual key for camera, gps, loc-api is qcom-$(name), not $(NAME). Change-Id: Id0f2ed760cae3b5627983ef5a2206775bc880637 qcom: Add dataservices to project pathmap * Set vendor/qcom/opensource/dataservices as the default dataservices provider. * Devices can override this choice by setting USE_DEVICE_SPECIFIC_DATASERVICES and providing dataservices in the $(TARGET_DEVICE_DIR)/dataservices directory. * Set $(TARGET_DEVICE_DIR)/dataservices as the default dataservices provider for non-QC hardware (Nexus devices). Change-Id: Ie003110d7b745367947b4b728bc83800c0351068 qcom: Add support for custom device specific paths * There are many supported devices with common trees, and they may wish to put their hals there. * Allow setting the path to the hal by using DEVICE_SPECIFIC__PATH when USE_DEVICE_SPECIFIC_ is true. Change-Id: I1335d322cd43440b028b51cff6023dd05e1d1024 qcom: Explicitly build the custom audio policy for legacy alsa Change-Id: Ib0efba23e20ff156c032fe0ad428c5fa08b15f8d qcom: Allow usage of default QC HAL paths Change-Id: Icbeaa995047289b5e10cdebf805f8bd8cb7978b1 qcom: Use correct path for BT vendor Change-Id: I81971e65a7f75ad5755bfdbed229c30d447c7d55 qcom: Support 8937/8953 Change-Id: I84b1807e88d5be1230eab64bd1275a0677ce510f build: Readd msm7x27a to QCOM Targets Change-Id: I87db6ee43059c256d338babbdfe414030a06b53e Signed-off-by: Caio Oliveira --- core/config.mk | 3 ++ core/pathmap.mk | 30 +++++++++++ core/qcom_target.mk | 128 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 core/qcom_target.mk diff --git a/core/config.mk b/core/config.mk index e6809d389f3..fb61d2483f0 100644 --- a/core/config.mk +++ b/core/config.mk @@ -868,6 +868,9 @@ endif RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20 RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 +# Rules for QCOM targets +include $(BUILD_SYSTEM)/qcom_target.mk + ifneq ($(CM_BUILD),) ## We need to be sure the global selinux policies are included ## last, to avoid accidental resetting by device configs diff --git a/core/pathmap.mk b/core/pathmap.mk index 9b5a7db2171..9e48c7cdd70 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -63,6 +63,36 @@ define include-path-for $(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_INCL)))) endef +# Enter project path into pathmap +# +# $(1): name +# $(2): path +# +define project-set-path +$(eval pathmap_PROJ += $(1):$(2)) +endef + +# Enter variant project path into pathmap +# +# $(1): name +# $(2): variable to check +# $(3): base path +# +define project-set-path-variant + $(call project-set-path,$(1),$(strip \ + $(if $($(2)), \ + $(3)-$($(2)), \ + $(3)))) +endef + +# Returns the path to the requested module's include directory, +# relative to the root of the source tree. +# +# $(1): a list of modules (or other named entities) to find the projects for +define project-path-for +$(foreach n,$(1),$(patsubst $(n):%,%,$(filter $(n):%,$(pathmap_PROJ)))) +endef + # # Many modules expect to be able to say "#include ", # so make it easy for them to find the correct path. diff --git a/core/qcom_target.mk b/core/qcom_target.mk new file mode 100644 index 00000000000..2dde2d9e36a --- /dev/null +++ b/core/qcom_target.mk @@ -0,0 +1,128 @@ +# Target-specific configuration + +# Populate the qcom hardware variants in the project pathmap. +define ril-set-path-variant +$(call project-set-path-variant,ril,TARGET_RIL_VARIANT,hardware/$(1)) +endef +define wlan-set-path-variant +$(call project-set-path-variant,wlan,TARGET_WLAN_VARIANT,hardware/qcom/$(1)) +endef +define bt-vendor-set-path-variant +$(call project-set-path-variant,bt-vendor,TARGET_BT_VENDOR_VARIANT,hardware/qcom/$(1)) +endef + +# Set device-specific HALs into project pathmap +define set-device-specific-path +$(if $(USE_DEVICE_SPECIFIC_$(1)), \ + $(if $(DEVICE_SPECIFIC_$(1)_PATH), \ + $(eval path := $(DEVICE_SPECIFIC_$(1)_PATH)), \ + $(eval path := $(TARGET_DEVICE_DIR)/$(2))), \ + $(eval path := $(3))) \ +$(call project-set-path,qcom-$(2),$(strip $(path))) +endef + +ifeq ($(BOARD_USES_QCOM_HARDWARE),true) + + qcom_flags := -DQCOM_HARDWARE + qcom_flags += -DQCOM_BSP + qcom_flags += -DQTI_BSP + + TARGET_USES_QCOM_BSP := true + + # Tell HALs that we're compiling an AOSP build with an in-line kernel + TARGET_COMPILE_WITH_MSM_KERNEL := true + + ifneq ($(filter msm7x27a msm7x30 msm8660 msm8960,$(TARGET_BOARD_PLATFORM)),) + # Enable legacy graphics functions + qcom_flags += -DQCOM_BSP_LEGACY + # Enable legacy audio functions + ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true) + USE_CUSTOM_AUDIO_POLICY := 1 + qcom_flags += -DLEGACY_ALSA_AUDIO + endif + endif + + TARGET_GLOBAL_CFLAGS += $(qcom_flags) + TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + # Multiarch needs these too.. + 2ND_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + ifeq ($(QCOM_HARDWARE_VARIANT),) + ifneq ($(filter msm8610 msm8226 msm8974,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8974 + else + ifneq ($(filter msm8909 msm8916,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8916 + else + ifneq ($(filter msm8953 msm8937,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8937 + else + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8994 + else + QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM) + endif + endif + endif + endif + endif + +# HACK: check to see if build uses standard QC HAL paths by checking for CM path structure +AOSP_VARIANT_MAKEFILE := $(wildcard hardware/qcom/audio/default/Android.mk) +ifeq ("$(AOSP_VARIANT_MAKEFILE)","") +$(call project-set-path,qcom-audio,hardware/qcom/audio) +$(call project-set-path,qcom-display,hardware/qcom/display) +$(call project-set-path,qcom-media,hardware/qcom/media) +$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) +$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) +$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) +$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) +$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) +$(call project-set-path,ril,hardware/ril) +$(call project-set-path,wlan,hardware/qcom/wlan) +$(call project-set-path,bt-vendor,hardware/qcom/bt) +else +$(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT)) + +ifeq ($(SONY_BF64_KERNEL_VARIANT),true) +$(call project-set-path,qcom-display,hardware/qcom/display-caf/sony) +$(call project-set-path,qcom-media,hardware/qcom/media-caf/sony) +else +$(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT)) +$(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT)) +endif + +$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) +$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) +$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) +$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) +$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) + +$(call ril-set-path-variant,ril) +$(call wlan-set-path-variant,wlan-caf) +$(call bt-vendor-set-path-variant,bt-caf) +endif # AOSP_VARIANT_MAKEFILE + +else + +$(call project-set-path,qcom-audio,hardware/qcom/audio/default) +$(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) +$(call project-set-path,qcom-media,hardware/qcom/media/default) + +$(call project-set-path,qcom-camera,hardware/qcom/camera) +$(call project-set-path,qcom-gps,hardware/qcom/gps) +$(call project-set-path,qcom-sensors,hardware/qcom/sensors) +$(call project-set-path,qcom-loc-api,vendor/qcom/opensource/location) +$(call project-set-path,qcom-dataservices,$(TARGET_DEVICE_DIR)/dataservices) + +$(call ril-set-path-variant,ril) +$(call wlan-set-path-variant,wlan) +$(call bt-vendor-set-path-variant,bt) + +endif From e5bce03927cd1026475d29e162ccd88d6c6842cc Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 3 Jan 2014 02:46:15 +0000 Subject: [PATCH 080/502] Allow individual projects to enforce a property's value Some projects require system properties to be set to a specific value (for example, a shared library needing a property pointing to its own path) in order to work correctly, but some device configurations are mistakenly setting those properties with the wrong value (usually inherited from the original OEM build). "PRODUCT_PROPERTY_UBER_OVERRIDES += property=value" can (and should) be used in that project's makefile to ensure the value is the correct one. This variable is intended for software projects, and should never be used in product makefiles (BoardConfig, cm.mk, AndroidProduct) Change-Id: I1986e7c444e51cce8b198e43fdc793fad16d6276 --- core/Makefile | 2 +- tools/post_process_props.py | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core/Makefile b/core/Makefile index 9c8dbe6f1b7..b9286e4637f 100644 --- a/core/Makefile +++ b/core/Makefile @@ -294,7 +294,7 @@ endif $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \ echo "$(line)" >> $@;) $(hide) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@ - $(hide) build/tools/post_process_props.py $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) + $(hide) build/tools/post_process_props.py $@ "$(PRODUCT_PROPERTY_UBER_OVERRIDES)" $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST) build_desc := diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 9dcaadfd0d3..0ba7464dc91 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys +import os, sys # Usage: post_process_props.py file.prop [blacklist_key, ...] # Blacklisted keys are removed from the property file, if present @@ -27,7 +27,14 @@ # Put the modifications that you need to make into the /system/build.prop into this # function. The prop object has get(name) and put(name,value) methods. -def mangle_build_prop(prop): +def mangle_build_prop(prop, overrides): + if len(overrides) == 0: + return + overridelist = overrides.replace(" ",",").split(",") + for proppair in overridelist: + values = proppair.split("=") + prop.put(values[0], values[1]) + pass # Put the modifications that you need to make into the /default.prop into this @@ -111,6 +118,10 @@ def write(self, f): def main(argv): filename = argv[1] + if (len(argv) > 2): + extraargs = argv[2] + else: + extraargs = "" f = open(filename) lines = f.readlines() f.close() @@ -118,7 +129,7 @@ def main(argv): properties = PropFile(lines) if filename.endswith("/build.prop"): - mangle_build_prop(properties) + mangle_build_prop(properties, extraargs) elif filename.endswith("/default.prop"): mangle_default_prop(properties) else: @@ -129,7 +140,7 @@ def main(argv): sys.exit(1) # Drop any blacklisted keys - for key in argv[2:]: + for key in argv[3:]: properties.delete(key) f = open(filename, 'w+') From 33c5925386dccc9e69739127e1985f190826166d Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Wed, 22 Jan 2014 15:51:46 -0800 Subject: [PATCH 081/502] Store the value from TARGET_OTA_ASSERT_DEVICE to a file This is needed so it can be read in when re-signing a package to allow for the proper device asserts. Change-Id: I8f3bb491bbbaa4d2b827a45ef83f12c6c83e6712 --- core/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/core/Makefile b/core/Makefile index b9286e4637f..19296ab4228 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1915,6 +1915,7 @@ endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path + @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ From d649eb23ad356188557b124b4f48257c0bfda978 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Wed, 9 Apr 2014 16:14:07 -0700 Subject: [PATCH 082/502] build: edify: use set_metadata for backuptool Also use saner permissions on backuptool.sh Change-Id: I50742b51867aa358f5924b8dc208833092a35bd9 --- tools/releasetools/edify_generator.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 52a9956ba8d..7442d6580b0 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -151,8 +151,12 @@ def AssertSomeBootloader(self, *bootloaders): def RunBackup(self, command): self.script.append('package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");') self.script.append('package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");') - self.script.append('set_perm(0, 0, 0777, "/tmp/backuptool.sh");') - self.script.append('set_perm(0, 0, 0644, "/tmp/backuptool.functions");') + if not self.info.get("use_set_metadata", False): + self.script.append('set_perm(0, 0, 0755, "/tmp/backuptool.sh");') + self.script.append('set_perm(0, 0, 0644, "/tmp/backuptool.functions");') + else: + self.script.append('set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);') + self.script.append('set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);') self.script.append(('run_program("/tmp/backuptool.sh", "%s");' % command)) if command == "restore": self.script.append('delete("/system/bin/backuptool.sh");') From 7d20005c52c8f26b99d28f7ab451467f096195f4 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Tue, 1 Oct 2013 20:42:45 +0100 Subject: [PATCH 083/502] tools: getb64key - print the base64 version of a PEM public key file Change-Id: Ia94ff560c88dfe85c3fa55db5c8219aa0d3419ee --- tools/getb64key.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 tools/getb64key.py diff --git a/tools/getb64key.py b/tools/getb64key.py new file mode 100755 index 00000000000..0bb63e1a88d --- /dev/null +++ b/tools/getb64key.py @@ -0,0 +1,17 @@ +#!/usr/bin/python + +import base64 +import sys +import os + +pkFile = open(sys.argv[1], 'rb').readlines() +base64Key = "" +inCert = False +for line in pkFile: + if line.startswith("-"): + inCert = not inCert + continue + + base64Key += line.strip() + +print base64.b16encode(base64.b64decode(base64Key)).lower() From 9688a2603855ac43ac75e87a38509042f06dcfd2 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 7 May 2014 17:28:49 +0100 Subject: [PATCH 084/502] Store the base64 release key in the OTA zips This can be directly grepped in pre-existing package.xml tables to make sure we're not trying to update to a differently signed build Change-Id: I7528a8e7c484ea9209cd665b9263328ae834586a --- core/Makefile | 5 +++++ tools/releasetools/ota_from_target_files.py | 2 ++ tools/releasetools/sign_target_files_apks.py | 8 ++++++++ 3 files changed, 15 insertions(+) diff --git a/core/Makefile b/core/Makefile index 19296ab4228..e48f4aa86ea 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1849,6 +1849,11 @@ endif ifeq ($(BREAKPAD_GENERATE_SYMBOLS),true) @# If breakpad symbols have been generated, add them to the zip. $(hide) $(ACP) -r $(TARGET_OUT_BREAKPAD) $(zip_root)/BREAKPAD +endif +ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE + $(hide) build/tools/getb64key.py $(PRODUCT_DEFAULT_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +else + $(hide) build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt endif @# Zip everything up, preserving symlinks and placing META/ files first to @# help early validation of the .zip file while uploading it. diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index dc22eb8615b..623453c8801 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -743,6 +743,8 @@ def output_sink(fn, data): metadata["ota-required-cache"] = str(script.required_cache) WriteMetadata(metadata, output_zip) + common.ZipWriteStr(output_zip, "META-INF/org/cyanogenmod/releasekey", + ""+input_zip.read("META/releasekey.txt")) def WritePolicyConfig(file_name, output_zip): common.ZipWrite(output_zip, file_name, os.path.basename(file_name)) diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py index 8b8375ba1e0..7aea86b283a 100755 --- a/tools/releasetools/sign_target_files_apks.py +++ b/tools/releasetools/sign_target_files_apks.py @@ -414,6 +414,14 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): common.ZipWriteStr(output_tf_zip, "RECOVERY/RAMDISK/res/keys", new_recovery_keys) + # Save the base64 key representation in the update for key-change + # validations + p = common.Run(["python", "build/tools/getb64key.py", mapped_keys[0]], + stdout=subprocess.PIPE) + data, _ = p.communicate() + if p.returncode == 0: + common.ZipWriteStr(output_tf_zip, "META/releasekey.txt", data) + # SystemUpdateActivity uses the x509.pem version of the keys, but # put into a zipfile system/etc/security/otacerts.zip. # We DO NOT include the extra_recovery_keys (if any) here. From 4a85bfb1269392f54cdf59e7157dbead50e31b74 Mon Sep 17 00:00:00 2001 From: Andrew Bartholomew Date: Sat, 10 May 2014 10:58:07 -0400 Subject: [PATCH 085/502] build: use /usr/bin/env to call python Hardcoding the path to python instead of env is not recommended. This can break the build in some Linux environments that link /usr/bin/python to python3. Change-Id: I4c62eb391acc6d468ce24ac8640834e965e76e78 --- core/checktree | 2 +- tools/getb64key.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/checktree b/core/checktree index b0b9cfab6d2..287268328b2 100755 --- a/core/checktree +++ b/core/checktree @@ -1,4 +1,4 @@ -#!/usr/bin/python -E +#!/usr/bin/env python -E import sys, os, re diff --git a/tools/getb64key.py b/tools/getb64key.py index 0bb63e1a88d..a0cd1c3ec34 100755 --- a/tools/getb64key.py +++ b/tools/getb64key.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import base64 import sys From f28b90203532f0a9a7e32b4a2d9971881828bcf5 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Fri, 16 May 2014 13:46:24 -0700 Subject: [PATCH 086/502] build: Set ccache base to build top This enables ccache sharing between different build tree paths. Change-Id: I99636bdd2779a6ccf0649f027e35cf67df44b6ae --- core/ccache.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ccache.mk b/core/ccache.mk index 5c2ae23da6f..da2c1aeeedd 100644 --- a/core/ccache.mk +++ b/core/ccache.mk @@ -30,7 +30,7 @@ ifneq ($(filter-out false,$(USE_CCACHE)),) # We don't really use system headers much so the rootdir is # fine; ensures these paths are relative for all Android trees # on a workstation. - export CCACHE_BASEDIR := / + export CCACHE_BASEDIR := $(ANDROID_BUILD_TOP) # Workaround for ccache with clang. # See http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html From 83e26772986b42a21f6765e4d32a50c62eed71b9 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 15 May 2014 12:30:37 -0700 Subject: [PATCH 087/502] build: Add new public keys to recovery Change-Id: I11dea464297813be36e60c23728dde8893535c46 build: Move bacon public key to device tree Change-Id: I50c780203f7ecdd3008ac07146b7c9db91f9a443 --- core/Makefile | 6 ++++-- target/product/security/cm-devkey.x509.pem | 23 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 target/product/security/cm-devkey.x509.pem diff --git a/core/Makefile b/core/Makefile index e48f4aa86ea..cabd8adc6e2 100644 --- a/core/Makefile +++ b/core/Makefile @@ -965,10 +965,12 @@ OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem ifneq ($(OTA_PACKAGE_SIGNING_KEY),) OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +else + PRODUCT_EXTRA_RECOVERY_KEYS += \ + build/target/product/security/cm \ + build/target/product/security/cm-devkey endif -PRODUCT_EXTRA_RECOVERY_KEYS += build/target/product/security/cm - # Generate a file containing the keys that will be read by the # recovery binary. RECOVERY_INSTALL_OTA_KEYS := \ diff --git a/target/product/security/cm-devkey.x509.pem b/target/product/security/cm-devkey.x509.pem new file mode 100644 index 00000000000..b7a6ae404b0 --- /dev/null +++ b/target/product/security/cm-devkey.x509.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIJANO67t8hIti6MA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD +VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEX +MBUGA1UECgwOQ3lhbm9nZW4sIEluYy4xGzAZBgNVBAsMElJlbGVhc2UgTWFuYWdl +bWVudDEUMBIGA1UEAwwLRGV2ZWxvcG1lbnQwHhcNMTQwNDI4MjAyODM3WhcNNDEw +OTEzMjAyODM3WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x +EDAOBgNVBAcMB1NlYXR0bGUxFzAVBgNVBAoMDkN5YW5vZ2VuLCBJbmMuMRswGQYD +VQQLDBJSZWxlYXNlIE1hbmFnZW1lbnQxFDASBgNVBAMMC0RldmVsb3BtZW50MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz/V9RvYnr18fraPWNeQEZNeg +Kc0A3QskImQyGY22EGBZ63KUxa6zAfAug0OYSjofVJRaTtdvBXjO/C71XZRh4wun +xhOUAJt8zIJ0lRx8GMC0GHzePEnEVvoiu3zSAPHCNf5lmdhyhccMOtC18J+evPf4 +EVBb3cis+F1m6ZoZKPgSFBR5A9CV5Tai8iiZluGGg15Wt12Rp2vmbmQxiOJZxBs4 +Ps40XR5gjO1q4R3HiGnFyql9qeecwaTUWXAd76lhNiLUr7K8IRs+96i+t5vSKajB +M8O99BtYyBtf8ItMnHSZJxtsMw+TFXNLmMtaQarpsjp0LLGuHb/vsrjgBPvzsQID +AQABo1AwTjAdBgNVHQ4EFgQUTpNgXBqV7j+33bi8B80YLQq6EL8wHwYDVR0jBBgw +FoAUTpNgXBqV7j+33bi8B80YLQq6EL8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B +AQUFAAOCAQEAVlVBNksK+1C3J8uQ9kVemYMozfbboV9c4PLbtVzNSO8vwZ3X5E4T +2zfQPcFsfSMIa51a1tETBcDA6k+72xHZ+xEQJQNrX+o1F1RIIrXp0OKAz/k5cXyk +OS0+nd0EXP/A1EW0m8N/X6E9wpRkIhfqtEsqeCf8GH7O9Ua2qHZ9zkTBpbAVH0oe +ZWorHBdo3GdMJ5vcjFqnDdRs8F0BnZmjS+NrgXRLhLb6ZARS/bkUQyr5TX82dgG6 +vzvKsdKyX34gsKAsjxwLWo7XXgehFfjY+SGjjilJtardr+y/KlHNEw9s9aLe+Xny +Qoa9j9Ut6/KwRaC6lSEQ7HZk6SdzFsdugA== +-----END CERTIFICATE----- From c93d9d7d2d3581d90169f783bcb02c6c4371823b Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 18 May 2014 15:34:30 -0700 Subject: [PATCH 088/502] build: Include an extra device.mk Change-Id: I4373f78f57c81e46affc2f6a6bc854bf4c3d00db build: Clean up use of vendor/extra * extra_config.mk is not needed anymore * Include BoardConfigExtra.mk if available Change-Id: Icd0db0852ceee5cb5c701c9a40b829e1f3ebd69e --- core/config.mk | 2 ++ core/dumpvar.mk | 6 ++++++ core/main.mk | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/config.mk b/core/config.mk index fb61d2483f0..d2d4f71164d 100644 --- a/core/config.mk +++ b/core/config.mk @@ -167,6 +167,8 @@ include $(BUILD_SYSTEM)/envsetup.mk # See envsetup.mk for a description of SCAN_EXCLUDE_DIRS FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git) +-include vendor/extra/BoardConfigExtra.mk + # The build system exposes several variables for where to find the kernel # headers: # TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 9b0b27a3787..2716f656d07 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -25,6 +25,12 @@ print_build_config_vars := \ BUILD_ID \ OUT_DIR +ifeq ($(CYNGN_TARGET),true) +print_build_config_vars += \ + CYNGN_TARGET \ + CYNGN_FEATURES +endif + ifeq ($(TARGET_BUILD_PDK),true) print_build_config_vars += \ TARGET_BUILD_PDK \ diff --git a/core/main.mk b/core/main.mk index 1be40783269..a6893561b8b 100644 --- a/core/main.mk +++ b/core/main.mk @@ -141,6 +141,9 @@ endif # be generated correctly include $(BUILD_SYSTEM)/cleanbuild.mk +# Bring in Qualcomm helper macros +include $(BUILD_SYSTEM)/qcom_utils.mk + # Include the google-specific config -include vendor/google/build/config.mk @@ -294,9 +297,6 @@ endif # Bring in standard build system definitions. include $(BUILD_SYSTEM)/definitions.mk -# Bring in Qualcomm helper macros -include $(BUILD_SYSTEM)/qcom_utils.mk - # Bring in dex_preopt.mk include $(BUILD_SYSTEM)/dex_preopt.mk From 6682bd939249c01e95873baaa5766e4e9eba8ba8 Mon Sep 17 00:00:00 2001 From: Mike Grissom Date: Mon, 26 Aug 2013 16:09:51 -0700 Subject: [PATCH 089/502] Don't set CCACHE_BASEDIR if its already set * enable use of shared ccache Change-Id: Ic708a5d5169291d674b167aa2c87bf2c8adaafae --- core/ccache.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/ccache.mk b/core/ccache.mk index da2c1aeeedd..7b10373e8be 100644 --- a/core/ccache.mk +++ b/core/ccache.mk @@ -30,7 +30,9 @@ ifneq ($(filter-out false,$(USE_CCACHE)),) # We don't really use system headers much so the rootdir is # fine; ensures these paths are relative for all Android trees # on a workstation. - export CCACHE_BASEDIR := $(ANDROID_BUILD_TOP) + ifeq ($(CCACHE_BASEDIR),) + export CCACHE_BASEDIR := $(ANDROID_BUILD_TOP) + endif # Workaround for ccache with clang. # See http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html From f57077a194bd78fc10ddc36fd78221c8ba49b732 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 9 May 2014 22:21:28 +0100 Subject: [PATCH 090/502] ota: Make sure we don't install on top of an incompatible system If the system has data present, make sure said data doesn't depend on a system signature different from our own. If we can't find our platform key, abort the installation Change-Id: I16572daf9464de326a9d0d126597cfbf03208f94 --- tools/releasetools/edify_generator.py | 11 +++++++++++ tools/releasetools/ota_from_target_files.py | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 7442d6580b0..f6af7161d01 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -162,6 +162,17 @@ def RunBackup(self, command): self.script.append('delete("/system/bin/backuptool.sh");') self.script.append('delete("/system/bin/backuptool.functions");') + def ValidateSignatures(self, command): + if command == "cleanup": + self.script.append('delete("/system/bin/otasigcheck.sh");') + else: + self.script.append('package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");') + self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') + self.script.append('set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);') + self.script.append('run_program("/tmp/otasigcheck.sh");') + ## Hax: a failure from run_program doesn't trigger an abort, so have it change the key value and check for "INVALID" + self.script.append('sha1_check(read_file("/tmp/releasekey"),"7241e92725436afc79389d4fc2333a2aa8c20230") && abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') + def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next 'dur' seconds. 'dur' may be zero to advance it via SetProgress diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 623453c8801..22892b07353 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -628,6 +628,10 @@ def WriteFullOTAPackage(input_zip, output_zip): device_specific.FullOTA_InstallBegin() + script.Mount("/data") + script.ValidateSignatures("data") + script.Unmount("/data") + if OPTIONS.backuptool: script.Mount("/system") script.RunBackup("backup") @@ -706,6 +710,8 @@ def output_sink(fn, data): common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict) common.ZipWriteStr(output_zip, "boot.img", boot_img.data) + script.ValidateSignatures("cleanup") + if OPTIONS.backuptool: script.ShowProgress(0.02, 10) script.RunBackup("restore") From 3cdf4be1a202c16629e8b9321d991f3ffc5bcb45 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 10 Jul 2014 10:38:59 -0700 Subject: [PATCH 091/502] build: Store the jenkins build number in misc_info If the jenkins build number is available, list it as build_number in the misc_info.txt file. Change-Id: I6500c6b53661f2904dff738d25d8a8d24a7dca80 --- core/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/Makefile b/core/Makefile index cabd8adc6e2..a7a7d86e1ce 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1811,6 +1811,9 @@ ifneq ($(OEM_THUMBPRINT_PROPERTIES),) # OTA scripts are only interested in fingerprint related properties $(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $(zip_root)/META/misc_info.txt endif +ifdef BUILD_NO + $(hide) echo "build_number=$(BUILD_NO)" >> $(zip_root)/META/misc_info.txt +endif ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),) $(hide) $(ACP) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH) \ $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)) From 002c141587f928ff3671ccdc9fabdb5a451936a4 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Tue, 20 May 2014 02:52:23 -0500 Subject: [PATCH 092/502] envsetup: fixup dopush * After clobber, $OUT does not exist and tee cannot create .log; fix this by calling mkdir -p $OUT * Make sure Copy and Install are at the beginning of the log line being analyzed and also search for ':' so that "Copying:" lines don't count * Fix Copy file list by quoting so shell doesn't think this is a command: $LOC $(...) * Fix 'only copy files from $OUT' now that multiple file pushing works right * Only stop java services once (if needed) and then wait to restart services until after all files have been pushed * Change location of SystemUI.apk to priv-app Signed-off-by: Chirayu Desai Change-Id: I65edd34bf445b28c2638cb3e9621719121fb962f --- envsetup.sh | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 97dc3577367..117726255ed 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2155,37 +2155,45 @@ function dopush() sleep 0.3 adb remount &> /dev/null + mkdir -p $OUT $func $* | tee $OUT/.log # Install: - LOC=$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Install' | cut -d ':' -f 2) + LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" # Copy: - LOC=$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep 'Copy' | cut -d ':' -f 2) + LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + stop_n_start=false for FILE in $LOC; do - # Get target file name (i.e. system/bin/adb) - TARGET=$(echo $FILE | sed "s#$OUT/##") + # Make sure file is in $OUT/system + case $FILE in + $OUT/system/*) + # Get target file name (i.e. /system/bin/adb) + TARGET=$(echo $FILE | sed "s#$OUT##") + ;; + *) continue ;; + esac - # Don't send files that are not under /system or /data - if [ ! "echo $TARGET | egrep '^system\/' > /dev/null" -o \ - "echo $TARGET | egrep '^data\/' > /dev/null" ] ; then - continue - else - case $TARGET in - system/app/SystemUI.apk|system/framework/*) - stop_n_start=true + case $TARGET in + /system/priv-app/SystemUI.apk|/system/framework/*) + # Only need to stop services once + if ! $stop_n_start; then + adb shell stop + stop_n_start=true + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET ;; *) - stop_n_start=false + echo "Pushing: $TARGET" + adb push $FILE $TARGET ;; - esac - if $stop_n_start ; then adb shell stop ; fi - echo "Pushing: $TARGET" - adb push $FILE $TARGET - if $stop_n_start ; then adb shell start ; fi - fi + esac done + if $stop_n_start; then + adb shell start + fi rm -f $OUT/.log return 0 else From 84c2cc13d87dabe19f99f4f7391a4cfcb4e83fe7 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Tue, 20 May 2014 02:52:23 -0500 Subject: [PATCH 093/502] envsetup: dopush: set file permissions on files pushed to /data too * If pushing to /data, transfer old file owner, group, permissions to pushed files, then restorecon Signed-off-by: Chirayu Desai Change-Id: Ibf2945adee457a680a288f2bdfba3d2e29ba25a1 --- envsetup.sh | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 117726255ed..2915900e8a7 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2164,11 +2164,29 @@ function dopush() # Copy: LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + # If any files are going to /data, push an octal file permissions reader to device + if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then + CHKPERM="/data/local/tmp/chkfileperm.sh" +( +cat <<'EOF' +#!/system/xbin/sh +FILE=$@ +if [ -e $FILE ]; then + ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1 +fi +EOF +) > $OUT/.chkfileperm.sh + echo "Pushing file permissions checker to device" + adb push $OUT/.chkfileperm.sh $CHKPERM + adb shell chmod 755 $CHKPERM + rm -f $OUT/.chkfileperm.sh + fi + stop_n_start=false for FILE in $LOC; do - # Make sure file is in $OUT/system + # Make sure file is in $OUT/system or $OUT/data case $FILE in - $OUT/system/*) + $OUT/system/*|$OUT/data/*) # Get target file name (i.e. /system/bin/adb) TARGET=$(echo $FILE | sed "s#$OUT##") ;; @@ -2176,6 +2194,25 @@ function dopush() esac case $TARGET in + /data/*) + # fs_config only sets permissions and se labels for files pushed to /system + if [ -n "$CHKPERM" ]; then + OLDPERM=$(adb shell $CHKPERM $TARGET) + OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n') + OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}') + OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}') + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + if [ -n "$OLDPERM" ]; then + echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP" + adb shell chown "$OLDOWN":"$OLDGRP" $TARGET + adb shell chmod "$OLDPERM" $TARGET + else + echo "$TARGET did not exist previously, you should set file permissions manually" + fi + adb shell restorecon "$TARGET" + ;; /system/priv-app/SystemUI.apk|/system/framework/*) # Only need to stop services once if ! $stop_n_start; then @@ -2191,6 +2228,9 @@ function dopush() ;; esac done + if [ -n "$CHKPERM" ]; then + adb shell rm $CHKPERM + fi if $stop_n_start; then adb shell start fi From c32b855e9716fbbb40b423b73647ce9480ce0321 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 5 Nov 2014 17:08:57 +0000 Subject: [PATCH 094/502] qcom_utils: Make "is-vendor-board-platform,XX" depend on BOARD_HAS_XX_HARDWARE Prevent qc's code from wrongly kicking in for AOSP-derived configurations --- core/qcom_utils.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk index 7f13ccf0769..50e0b4e04b7 100755 --- a/core/qcom_utils.mk +++ b/core/qcom_utils.mk @@ -107,7 +107,7 @@ endef # $(call get-vendor-board-platforms,v) # returns list of board platforms for vendor v define get-vendor-board-platforms -$($(1)_BOARD_PLATFORMS) +$(if $(call match-word,$(BOARD_USES_$(1)_HARDWARE),true),$($(1)_BOARD_PLATFORMS)) endef # $(call is-board-platform,bp) From e4d7205f8b8c38c3506af6fe0a9ec218ff576f43 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 5 Nov 2014 18:16:43 +0000 Subject: [PATCH 095/502] ota: Include copies of the recovery scripts even if shipping in block mode --- tools/releasetools/ota_from_target_files.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 22892b07353..29e73af0c14 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -628,11 +628,17 @@ def WriteFullOTAPackage(input_zip, output_zip): device_specific.FullOTA_InstallBegin() + if block_based: + common.ZipWriteStr(output_zip, "system/bin/otasigcheck.sh", + ""+input_zip.read("SYSTEM/bin/otasigcheck.sh")) script.Mount("/data") script.ValidateSignatures("data") script.Unmount("/data") if OPTIONS.backuptool: + if block_based: + common.ZipWriteStr(output_zip, "system/bin/backuptool.sh", + ""+input_zip.read("SYSTEM/bin/backuptool.sh")) script.Mount("/system") script.RunBackup("backup") script.Unmount("/system") From fef2c7913806d6d27a2399937c3e3a4c8a05c121 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Thu, 28 Aug 2014 16:51:02 -0500 Subject: [PATCH 096/502] Edify: Add AssertSomeBaseband Allow releasetools.py to assert a baseband version. Works just like AssertSomeBootloader. Change-Id: Ic8eb341cef1d777d983be25ba21a3bc545819c29 --- tools/releasetools/edify_generator.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index f6af7161d01..461fcb141f4 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -148,6 +148,14 @@ def AssertSomeBootloader(self, *bootloaders): ");") self.script.append(self.WordWrap(cmd)) + def AssertSomeBaseband(self, *basebands): + """Assert that the baseband version is one of *basebands.""" + cmd = ("assert(" + + " ||\0".join(['getprop("ro.baseband") == "%s"' % (b,) + for b in basebands]) + + ");") + self.script.append(self._WordWrap(cmd)) + def RunBackup(self, command): self.script.append('package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");') self.script.append('package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");') From 2298382f0e78fb1dcbbd3fd1292ebb9fc92dfc6e Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Mon, 18 Aug 2014 14:28:42 -0700 Subject: [PATCH 097/502] ota_from_target_files: Validate signatures after possible data wipe If the data is being wiped, we want to validate the signature after this step. This is also a good check that the data wipe succeeded. Change-Id: Iaecfddfb2010944de0c97e7bb21d8e581f20deec --- tools/releasetools/ota_from_target_files.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 29e73af0c14..220862dabeb 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -628,13 +628,6 @@ def WriteFullOTAPackage(input_zip, output_zip): device_specific.FullOTA_InstallBegin() - if block_based: - common.ZipWriteStr(output_zip, "system/bin/otasigcheck.sh", - ""+input_zip.read("SYSTEM/bin/otasigcheck.sh")) - script.Mount("/data") - script.ValidateSignatures("data") - script.Unmount("/data") - if OPTIONS.backuptool: if block_based: common.ZipWriteStr(output_zip, "system/bin/backuptool.sh", @@ -650,6 +643,13 @@ def WriteFullOTAPackage(input_zip, output_zip): if HasVendorPartition(input_zip): system_progress -= 0.1 + if block_based: + common.ZipWriteStr(output_zip, "system/bin/otasigcheck.sh", + ""+input_zip.read("SYSTEM/bin/otasigcheck.sh")) + script.Mount("/data") + script.ValidateSignatures("data") + script.Unmount("/data") + # Place a copy of file_contexts.bin into the OTA package which will be used # by the recovery program. if "selinux_fc" in OPTIONS.info_dict: From bbdd118512dcf647a87bf47bce89c2cf50d41a06 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 5 Nov 2014 19:58:59 +0000 Subject: [PATCH 098/502] ota: Fix recovery-script cleanups in block mode Change-Id: Iadb480f8062cfb7a0e6c9024e32ac0d71a7481d7 --- tools/releasetools/ota_from_target_files.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 220862dabeb..225b63eb71c 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -632,6 +632,8 @@ def WriteFullOTAPackage(input_zip, output_zip): if block_based: common.ZipWriteStr(output_zip, "system/bin/backuptool.sh", ""+input_zip.read("SYSTEM/bin/backuptool.sh")) + common.ZipWriteStr(output_zip, "system/bin/backuptool.functions", + ""+input_zip.read("SYSTEM/bin/backuptool.functions")) script.Mount("/system") script.RunBackup("backup") script.Unmount("/system") @@ -716,11 +718,19 @@ def output_sink(fn, data): common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict) common.ZipWriteStr(output_zip, "boot.img", boot_img.data) + if block_based: + script.Mount("/system") script.ValidateSignatures("cleanup") + if block_based: + script.Unmount("/system") if OPTIONS.backuptool: script.ShowProgress(0.02, 10) + if block_based: + script.Mount("/system") script.RunBackup("restore") + if block_based: + script.Unmount("/system") script.ShowProgress(0.05, 5) script.WriteRawImage("/boot", "boot.img") From 71ad2e70598c42d0c81a915049f7df5dbfe1abc9 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Sun, 22 Jun 2014 14:37:30 +0200 Subject: [PATCH 099/502] Build: Add support for specifying build variant in brunch/breakfast This little modification allows specifying build variant in brunch/ breakfast commands. For example we can use "brunch i9300 user" to build user variant instead of default userdebug. When no extra argument is given, userdebug is default. Change-Id: I935327252098ee74b34a815a023d2ac6b9a53a30 --- envsetup.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 2915900e8a7..6a532eff535 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -606,6 +606,7 @@ function brunch() function breakfast() { target=$1 + local variant=$2 CM_DEVICES_ONLY="true" unset LUNCH_MENU_CHOICES add_lunch_combo full-eng @@ -626,7 +627,10 @@ function breakfast() lunch $target else # This is probably just the CM model name - lunch cm_$target-userdebug + if [ -z "$variant" ]; then + variant="userdebug" + fi + lunch cm_$target-$variant fi fi return $? From b36c48896e9ad5547072c9441592d10de22273d9 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 23 Feb 2014 23:36:22 +0100 Subject: [PATCH 100/502] [HAX] Allow per-target dtbTool * Revert this when fixed Change-Id: I97ecb0448ae7bd5859454be290c5dde6248b2859 build: Default to dtbToolCM * The default dtbTool isn't the correct module name for the module that actually lives in device/qcom/common/dtbtool Change-Id: I80b427e3652b99742573bc4d2829e51645a8822b generate_extra_images: Look for 3.10 dtbs The dtbs have changed location between 3.4 and 3.10. Look for the new location first and fallback to the 3.4 location if they're missing. Change-Id: I7aada8dbcf01ea6f62b3235b452c9329cd69e5e8 build: Generalize kernel DTB path Use $TARGET_KERNEL_ARCH to specify the architecture-dependent path location of the DTB files. Change-Id: I302f407d987e1b33acb0e47b284a1cb793747691 generate_extra_images: Allow supplying arguments to dtbtool * Also add a message to indicate when dt.img is generated Change-Id: I670cc8aa571269d1dc1085e51b063fb890dc05f2 --- core/generate_extra_images.mk | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk index 2e59339ef71..eaa52aba685 100644 --- a/core/generate_extra_images.mk +++ b/core/generate_extra_images.mk @@ -85,18 +85,28 @@ ifeq ($(strip $(BUILD_TINY_ANDROID)),true) include device/qcom/common/dtbtool/Android.mk endif -DTBTOOL := $(HOST_OUT_EXECUTABLES)/dtbTool$(HOST_EXECUTABLE_SUFFIX) +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +DTBTOOL_NAME := dtbToolCM +else +DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) +endif + +DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(TARGET_KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/arm/boot/ +dtb_dir = $(firstword $(wildcard $(possible_dtb_dirs))) + define build-dtimage-target $(call pretty,"Target dt image: $(INSTALLED_DTIMAGE_TARGET)") - $(hide) $(DTBTOOL) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(KERNEL_OUT)/arch/arm/boot/ + $(hide) $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(dtb_dir) $(hide) chmod a+r $@ endef $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) $(build-dtimage-target) + @echo -e ${CL_CYN}"Made DT image: $@"${CL_RST} ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) From 56a8986e8dd2ef38d4d609f0bd36862b7f05dac0 Mon Sep 17 00:00:00 2001 From: James Roberts-Thomson Date: Tue, 16 Apr 2013 15:53:39 +1200 Subject: [PATCH 101/502] Consolidate bash version checks There were two checks for bash version, the 2nd was superfluous; this patch removes the duplicate checks, and shifts the bash version check to being back after the "are we in bash" check. Change-Id: I57ff8c1fedce80f739c06643d2976d2c1465db1b --- envsetup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 6a532eff535..b75985dd1ce 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -348,18 +348,18 @@ function settitle() function addcompletions() { - local T dir f - # Keep us from trying to run in something that isn't bash. if [ -z "${BASH_VERSION}" ]; then return fi # Keep us from trying to run in bash that's too old. - if [ ${BASH_VERSINFO[0]} -lt 3 ]; then + if [ "${BASH_VERSINFO[0]}" -lt 4 ] ; then return fi + local T dir f + dirs="sdk/bash_completion vendor/cm/bash_completion" for dir in $dirs; do if [ -d ${dir} ]; then From 3e391f8ce6909379f7d13fce9041324f1bec9620 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 19 Mar 2013 17:50:37 +0530 Subject: [PATCH 102/502] envsetup: export ANDROID_BUILD_TOP earlier Change-Id: Ia3497f61f4e9aaeeb793cecd3b4f488f0a48181a --- envsetup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index b75985dd1ce..da44a297c39 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -305,7 +305,6 @@ function set_stuff_for_environment() setpaths set_sequence_number - export ANDROID_BUILD_TOP=$(gettop) # With this environment variable new GCC can apply colors to warnings/errors export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' export ASAN_OPTIONS=detect_leaks=0 @@ -2421,3 +2420,5 @@ done unset f addcompletions + +export ANDROID_BUILD_TOP=$(gettop) From 3264bf32c2cfda3b80acc642552c87b2f59e5e42 Mon Sep 17 00:00:00 2001 From: Kyle Ladd Date: Wed, 11 Sep 2013 20:43:42 -0400 Subject: [PATCH 103/502] build: fix bash completion sourcing Sourcing functions in files from a function within a file being sourced was giving bash a hard time. This fixes 'repo' command tab completions. Change-Id: Iac1b3078e20749fb474ed1270e0886cf435e24d9 --- envsetup.sh | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index da44a297c39..1d12bd99602 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -345,29 +345,19 @@ function settitle() fi } -function addcompletions() +function check_bash_version() { # Keep us from trying to run in something that isn't bash. if [ -z "${BASH_VERSION}" ]; then - return + return 1 fi # Keep us from trying to run in bash that's too old. if [ "${BASH_VERSINFO[0]}" -lt 4 ] ; then - return + return 2 fi - local T dir f - - dirs="sdk/bash_completion vendor/cm/bash_completion" - for dir in $dirs; do - if [ -d ${dir} ]; then - for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do - echo "including $f" - . $f - done - fi - done + return 0 } function choosetype() @@ -2419,6 +2409,17 @@ do done unset f -addcompletions +# Add completions +check_bash_version && { + dirs="sdk/bash_completion vendor/cm/bash_completion" + for dir in $dirs; do + if [ -d ${dir} ]; then + for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do + echo "including $f" + . $f + done + fi + done +} export ANDROID_BUILD_TOP=$(gettop) From 6fec2810e5578b13db5be6c532c2788a75dacb5e Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Fri, 1 Jun 2012 13:30:25 -0700 Subject: [PATCH 104/502] Fix file-size stats on OSX Kernel makefiles that the stat on the system is GNU stat. GNU stat uses the "-c" option to specify format. Darwin stat uses the "-f" option to specify format. This discrepency will cause kernel build breaks. On my system, I symlink stat to GNU stat. This causes the "get-file-size" define to fail. The fix for this is to detect "gstat", aka GNU stat, and use that appropriately. Change-Id: I987c155b7dc3ff14ffe6da40edf834ca34b7df75 Fix up the get-file-size function that was broken due to the prior commit that made it utilize gnu stat (gstat) Change-Id: I24bba2bfcb509ad1ad76d2260eedd685ba45c393 --- core/combo/HOST_darwin-x86.mk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk index fc56e52996f..c2898617e91 100644 --- a/core/combo/HOST_darwin-x86.mk +++ b/core/combo/HOST_darwin-x86.mk @@ -102,5 +102,10 @@ endef # $(1): The file to check define get-file-size -stat -f "%z" $(1) +GSTAT=$(which gstat) ; \ +if [ ! -z "$GSTAT" ]; then \ +gstat -c "%s" $(1) ; \ +else \ +stat -f "%z" $(1) ; \ +fi endef From 54f89c0f1359eb4f86a35326d6d4fcf77da6b1e2 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sat, 8 Nov 2014 23:03:53 +0000 Subject: [PATCH 105/502] Remove nulls from the edify generator. These would break the scripts. WTF are they doing here? Change-Id: I0c52335a27f7ae974279fde1c2461b2dba24d263 --- tools/releasetools/edify_generator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 461fcb141f4..20a7f3f1c6a 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -133,7 +133,7 @@ def AssertOlderBuild(self, timestamp, timestamp_text): def AssertDevice(self, device): """Assert that the device identifier is the given string.""" cmd = ('assert(' + - ' || \0'.join(['getprop("ro.product.device") == "%s"' % i + ' || '.join(['getprop("ro.product.device") == "%s"' % i for i in device.split(",")]) + ' || abort("E%d: This package is for device: %s; ' + 'this device is " + getprop("ro.product.device") + ".");' + @@ -143,7 +143,7 @@ def AssertDevice(self, device): def AssertSomeBootloader(self, *bootloaders): """Asert that the bootloader version is one of *bootloaders.""" cmd = ("assert(" + - " ||\0".join(['getprop("ro.bootloader") == "%s"' % (b,) + " || ".join(['getprop("ro.bootloader") == "%s"' % (b,) for b in bootloaders]) + ");") self.script.append(self.WordWrap(cmd)) @@ -151,7 +151,7 @@ def AssertSomeBootloader(self, *bootloaders): def AssertSomeBaseband(self, *basebands): """Assert that the baseband version is one of *basebands.""" cmd = ("assert(" + - " ||\0".join(['getprop("ro.baseband") == "%s"' % (b,) + " || ".join(['getprop("ro.baseband") == "%s"' % (b,) for b in basebands]) + ");") self.script.append(self._WordWrap(cmd)) From c5e36ba69fc242a9623749de2034b3693f7aa2a3 Mon Sep 17 00:00:00 2001 From: Danesh Mondegarian Date: Thu, 7 Nov 2013 18:44:02 -0800 Subject: [PATCH 106/502] Remove HomeSample from builds As good as it looks, we already have a launcher (Launcher3) Change-Id: I87cac70eec30fd62d6f7ecb7777caa9d240fe0ee --- target/product/core_base.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/target/product/core_base.mk b/target/product/core_base.mk index 03d33e1b65d..e4e3a7beba4 100644 --- a/target/product/core_base.mk +++ b/target/product/core_base.mk @@ -23,7 +23,6 @@ PRODUCT_PROPERTY_OVERRIDES := \ PRODUCT_PACKAGES += \ ContactsProvider \ DefaultContainerService \ - Home \ TelephonyProvider \ UserDictionaryProvider \ atrace \ From 60b3712702cd2185b74874abf8f83d179606bf05 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Tue, 14 Oct 2014 12:43:28 -0700 Subject: [PATCH 107/502] product_config: Set CM_BUILD priority above TARGET_BUILD_APPS Even if we are doing TARGET_BUILD_APPS, we may want to use a cm target for building. Change-Id: Ic8053bc679fa8b726be90e611aeaacdf1850cabc --- core/product_config.mk | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/product_config.mk b/core/product_config.mk index be0c6193f02..04d6e5f5228 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -179,19 +179,20 @@ include $(BUILD_SYSTEM)/node_fns.mk include $(BUILD_SYSTEM)/product.mk include $(BUILD_SYSTEM)/device.mk -ifneq ($(strip $(TARGET_BUILD_APPS)),) -# An unbundled app build needs only the core product makefiles. -all_product_configs := $(call get-product-makefiles,\ - $(SRC_TARGET_DIR)/product/AndroidProducts.mk) +# A CM build needs only the CM product makefiles. +ifneq ($(CM_BUILD),) + all_product_configs := $(shell ls device/*/$(CM_BUILD)/cm.mk) else - ifneq ($(CM_BUILD),) - all_product_configs := $(shell ls device/*/$(CM_BUILD)/cm.mk) + ifneq ($(strip $(TARGET_BUILD_APPS)),) + # An unbundled app build needs only the core product makefiles. + all_product_configs := $(call get-product-makefiles,\ + $(SRC_TARGET_DIR)/product/AndroidProducts.mk) else # Read in all of the product definitions specified by the AndroidProducts.mk # files in the tree. all_product_configs := $(get-all-product-makefiles) - endif -endif + endif # TARGET_BUILD_APPS +endif # CM_BUILD ifeq ($(CM_BUILD),) # Find the product config makefile for the current product. From 329287b9738590edb51661029513931862e4215c Mon Sep 17 00:00:00 2001 From: nuclearmistake Date: Sun, 27 Apr 2014 21:59:42 -0400 Subject: [PATCH 108/502] Colorize javac errors You know those multi-line ones that are frequently interspersed with other buld output? The ones that don't even have the word "error" in them to search for? This makes them red. ps2: fix jar_check failures cause by leaving empty stderr files in intermediates dirs this is probably not the best place to store stderr before colorizing it if javac exits non-zero, but it seems much lighter than mkdiring a bunch of temp directories or using sed to mangle the paths to point to per-intermediates directory unique temporary file names Change-Id: I3b9b7d8a0c76958588ac1603b6742987d6dde54c Signed-off-by: nuclearmistake colorize non-fatal javac stderr yellow (and actually display it... at all) woops! Signed-off-by: nuclearmistake Change-Id: I984f428022a68a825aa041866e8d459bd6611f71 --- core/definitions.mk | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index 2d594639124..478a5f99505 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2050,7 +2050,13 @@ $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; the -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ $(PRIVATE_JAVACFLAGS) \ \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ - || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \ + 2>$(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr \ + && ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_YLW}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ) \ + || ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ + echo -e ${CL_RED}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR); exit 41 ) \ fi $(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \ $(PRIVATE_JAVA_LAYERS_FILE) \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq,) @@ -2662,8 +2668,9 @@ endef ########################################################### ## Commands to call Proguard ########################################################### +@echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" +@echo -e ${CL_GRN}"Proguard:"${CL_RST}" $@" define transform-jar-to-proguard -@echo Proguard: $@ $(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \ $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) endef From f7ae4fe9b97a1ea0b07f74ee936d16ac9a961f60 Mon Sep 17 00:00:00 2001 From: Oliver Middleton Date: Sun, 12 Oct 2014 22:11:26 +0100 Subject: [PATCH 109/502] build: Fix some colored build issues * Fix some broken lines in definitions.mk * Finish adding colors to product-graph.mk Change-Id: I235a60c967b1f10ec6dd1cac25740badbd3b64c9 --- core/definitions.mk | 6 +++--- core/product-graph.mk | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/definitions.mk b/core/definitions.mk index 478a5f99505..2b7f952ff3c 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2637,19 +2637,19 @@ endef # Copy a prebuilt file to a target location. define transform-prebuilt-to-target -@echo -e "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) endef # Copy a prebuilt file to a target location, using zipalign on it. define transform-prebuilt-to-target-with-zipalign -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt APK:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-zipalign) endef # Copy a prebuilt file to a target location, stripping "# comment" comments. define transform-prebuilt-to-target-strip-comments -@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) "${CL_CYN}"Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-strip-comments) endef diff --git a/core/product-graph.mk b/core/product-graph.mk index 2138dae2602..f083b450744 100644 --- a/core/product-graph.mk +++ b/core/product-graph.mk @@ -70,7 +70,7 @@ $(products_graph): PRIVATE_PRODUCTS := $(really_all_products) $(products_graph): PRIVATE_PRODUCTS_FILTER := $(products_list) $(products_graph): $(this_makefile) - @echo Product graph DOT: $@ for $(PRIVATE_PRODUCTS_FILTER) + @echo -e ${CL_GRN}"Product graph DOT:"${CL_RST}" $@ for $(PRIVATE_PRODUCTS_FILTER)" $(hide) echo 'digraph {' > $@.in $(hide) echo 'graph [ ratio=.5 ];' >> $@.in $(hide) $(foreach p,$(PRIVATE_PRODUCTS), \ @@ -89,7 +89,7 @@ endef # $(1) product file define transform-product-debug $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) - @echo Product debug info file: $$@ + @echo -e ${CL_GRN}"Product debug info file:"${CL_RST}" $$@" $(hide) rm -f $$@ $(hide) mkdir -p $$(dir $$@) $(hide) echo 'FILE=$(strip $(1))' >> $$@ @@ -123,7 +123,7 @@ $(call product-debug-filename, $(p)): \ $(OUT_DIR)/products/$(strip $(1)).txt \ build/tools/product_debug.py \ $(this_makefile) - @echo Product debug html file: $$@ + @echo -e ${CL_GRN}"Product debug html file:"${CL_RST}" $$@" $(hide) mkdir -p $$(dir $$@) $(hide) cat $$< | build/tools/product_debug.py > $$@ endef @@ -139,7 +139,7 @@ $(products_pdf): $(products_graph) dot -Tpdf -Nshape=box -o $@ $< $(products_svg): $(products_graph) $(product_debug_files) - @echo Product graph SVG: $@ + @echo -e ${CL_GRN}"Product graph SVG:"${CL_RST}" $@" dot -Tsvg -Nshape=box -o $@ $< product-graph: $(products_pdf) $(products_svg) From e5670ff23361d5963b9171574ce048b6ed607208 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 1 May 2014 16:33:02 +0300 Subject: [PATCH 110/502] build: Don't build video editor libraries * These are gone in L Change-Id: I7dae9c6736590be8cd080195da4062258ee4a424 --- target/product/generic_no_telephony.mk | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk index 5c4835877a5..6c23fbb7d9d 100644 --- a/target/product/generic_no_telephony.mk +++ b/target/product/generic_no_telephony.mk @@ -37,12 +37,7 @@ PRODUCT_PACKAGES += \ screenrecord PRODUCT_PACKAGES += \ - librs_jni \ - libvideoeditor_jni \ - libvideoeditor_core \ - libvideoeditor_osal \ - libvideoeditor_videofilters \ - libvideoeditorplayer \ + librs_jni PRODUCT_PACKAGES += \ audio.primary.default \ From d587c69344a01e4f4f9e06b24e78eef36af38da5 Mon Sep 17 00:00:00 2001 From: Arne Coucheron Date: Sat, 3 Mar 2012 22:53:06 +0100 Subject: [PATCH 111/502] Fix inheritance of PRODUCT_PROPERTY_OVERRIDES for CM audio files Otherwise the ones set in CM vendor will be overridden by these. Change-Id: I3f87dfd009d8ddfd48972c15770599742b12c4af Author: Abhisek Devkota Remove extra product property overrides This appears to clash with vendor/cm/common mk's for overrides; causes a broken default alarm (and OnTheHunt is so bleh). Change-Id: I5ec990d3c5ad56b573c45f1a3b20169c989851a0 --- target/product/core_base.mk | 4 ---- target/product/full_base.mk | 5 ----- 2 files changed, 9 deletions(-) diff --git a/target/product/core_base.mk b/target/product/core_base.mk index e4e3a7beba4..86fb36cd767 100644 --- a/target/product/core_base.mk +++ b/target/product/core_base.mk @@ -16,10 +16,6 @@ # Note that components added here will be also shared in PDK. Components # that should not be in PDK should be added in lower level like core.mk. -PRODUCT_PROPERTY_OVERRIDES := \ - ro.config.notification_sound=OnTheHunt.ogg \ - ro.config.alarm_alert=Alarm_Classic.ogg - PRODUCT_PACKAGES += \ ContactsProvider \ DefaultContainerService \ diff --git a/target/product/full_base.mk b/target/product/full_base.mk index 7d19685f1b3..d0c6ca1d0b4 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -27,11 +27,6 @@ PRODUCT_PACKAGES := \ libwnndict \ WAPPushManager -# Additional settings used in all AOSP builds -PRODUCT_PROPERTY_OVERRIDES := \ - ro.config.ringtone=Ring_Synth_04.ogg \ - ro.config.notification_sound=pixiedust.ogg - # Put en_US first in the list, so make it default. PRODUCT_LOCALES := en_US From f7df50c4b48285631e7a6f60451a60b3fcd76985 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Tue, 28 Oct 2014 16:12:15 -0700 Subject: [PATCH 112/502] build: recovery: Support adding device-specific items (cdesai): Also add the relevant parts from koush's commit 7fd5a89df5ec3961c9aedfd2afad50d6d2561056 "Add initial support for charge mode. also support recovery/root in the device tree to easily copy props into recovery images." Change-Id: I25205e68282680932917016646dabd1abadbfce6 --- core/Makefile | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index a7a7d86e1ce..9a709d1bd74 100644 --- a/core/Makefile +++ b/core/Makefile @@ -902,6 +902,16 @@ else recovery_font := $(call include-path-for, recovery)/fonts/12x22.png endif +ifneq ($(TARGET_RECOVERY_DEVICE_DIRS),) +recovery_root_private := $(strip \ + $(foreach d,$(TARGET_RECOVERY_DEVICE_DIRS), $(wildcard $(d)/recovery/root))) +else +recovery_root_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/root)) +endif +ifneq ($(recovery_root_private),) +recovery_root_deps := $(shell find $(recovery_root_private) -type f) +endif + ifndef TARGET_PRIVATE_RES_DIRS TARGET_PRIVATE_RES_DIRS := $(wildcard $(TARGET_DEVICE_DIR)/recovery/res) endif @@ -1002,6 +1012,8 @@ define build-recoveryimage-target $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/* $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png + $(hide) $(foreach item,$(recovery_root_private), \ + cp -rf $(item) $(TARGET_RECOVERY_OUT)/) $(hide) $(foreach item,$(TARGET_PRIVATE_RES_DIRS), \ cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline)) $(hide) $(foreach item,$(recovery_fstab), \ @@ -1052,7 +1064,7 @@ $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ $(INTERNAL_RECOVERYIMAGE_FILES) \ $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \ $(INSTALLED_2NDBOOTLOADER_TARGET) \ - $(recovery_build_prop) $(recovery_resource_deps) \ + $(recovery_build_prop) $(recovery_resource_deps) $(recovery_root_deps) \ $(recovery_fstab) \ $(RECOVERY_INSTALL_OTA_KEYS) $(call build-recoveryimage-target, $@) From cf6c3d34dce4c383020ebd17f755b5a1968d05de Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 5 Nov 2014 21:30:23 +0000 Subject: [PATCH 113/502] Redo BOARD_CUSTOM_BOOTIMG_MK support Simplified version of the previous implementation. Recovery's ramdisk is spun off from the main recovery target again to allow overriding just the image-generation step [mikeioannina]: Squash cm-13.0 changes and adapt to N --- core/Makefile | 56 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/core/Makefile b/core/Makefile index 9a709d1bd74..06889145b57 100644 --- a/core/Makefile +++ b/core/Makefile @@ -580,7 +580,9 @@ bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) $(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) -else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true +else ifndef BOARD_CUSTOM_BOOTIMG_MK + + ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) $(call pretty,"Target boot image: $@") @@ -595,7 +597,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) -else # PRODUCT_SUPPORTS_VBOOT != true + else # PRODUCT_SUPPORTS_VBOOT != true $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(call pretty,"Target boot image: $@") @@ -610,7 +612,8 @@ bootimage-nodeps: $(MKBOOTIMG) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} -endif # TARGET_BOOTIMAGE_USE_EXT2 + endif # PRODUCT_SUPPORTS_VBOOT +endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK endif # BOARD_USES_RECOVERY_AS_BOOT else # TARGET_NO_KERNEL @@ -872,6 +875,7 @@ recovery_initrc := $(call include-path-for, recovery)/etc/init.rc recovery_sepolicy := $(call intermediates-dir-for,ETC,sepolicy.recovery)/sepolicy.recovery recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img +recovery_uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.cpio recovery_build_prop := $(intermediate_system_build_prop) recovery_resources_common := $(call include-path-for, recovery)/res @@ -994,10 +998,8 @@ $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) @mkdir -p $(dir $@) java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ -RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id -# $(1): output file -define build-recoveryimage-target - @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} +define build-recoveryramdisk + @echo -e ${CL_CYN}"----- Making recovery ramdisk ------"${CL_RST} $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp @echo Copying baseline ramdisk... @@ -1025,7 +1027,11 @@ define build-recoveryimage-target $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root; \ rm -rf $(TARGET_RECOVERY_ROOT_OUT)/system; \ ln -sf /system_root/system $(TARGET_RECOVERY_ROOT_OUT)/system) # Mount the system_root_image to /system_root and symlink /system. - $(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) +endef + +RECOVERYIMAGE_ID_FILE := $(PRODUCT_OUT)/recovery.id +# $(1): output file +define build-recoveryimage-target $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \ $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1) --id > $(RECOVERYIMAGE_ID_FILE)) @@ -1054,20 +1060,36 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ $(recovery_build_prop) $(recovery_resource_deps) \ $(recovery_fstab) \ $(RECOVERY_INSTALL_OTA_KEYS) - $(call pretty,"Target boot image from recovery: $@") - $(call build-recoveryimage-target, $@) + $(call pretty,"Target boot image from recovery: $@") + $(call build-recoveryramdisk) + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk) + $(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk) + $(call build-recoveryimage-target, $@) endif -$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \ +$(recovery_uncompressed_ramdisk): $(MKBOOTFS) \ $(INSTALLED_RAMDISK_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(INTERNAL_RECOVERYIMAGE_FILES) \ - $(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \ + $(recovery_initrc) $(recovery_sepolicy) \ $(INSTALLED_2NDBOOTLOADER_TARGET) \ $(recovery_build_prop) $(recovery_resource_deps) $(recovery_root_deps) \ $(recovery_fstab) \ $(RECOVERY_INSTALL_OTA_KEYS) - $(call build-recoveryimage-target, $@) + $(call build-recoveryramdisk) + @echo -e ${CL_CYN}"----- Making uncompressed recovery ramdisk ------"${CL_RST} + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $@ + +$(recovery_ramdisk): $(MINIGZIP) \ + $(recovery_uncompressed_ramdisk) + @echo -e ${CL_CYN}"----- Making compressed recovery ramdisk ------"${CL_RST} + $(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $@ + +ifndef BOARD_CUSTOM_BOOTIMG_MK +$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) + @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} + $(call build-recoveryimage-target, $@) +endif # BOARD_CUSTOM_BOOTIMG_MK ifdef RECOVERY_RESOURCE_ZIP $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME) @@ -1079,6 +1101,9 @@ endif .PHONY: recoveryimage-nodeps recoveryimage-nodeps: @echo "make $@: ignoring dependencies" + $(call build-recoveryramdisk) + $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk) + $(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk) $(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET)) else # INSTALLED_RECOVERYIMAGE_TARGET not defined @@ -1104,6 +1129,11 @@ ifeq ($(BOARD_NAND_SPARE_SIZE),) BOARD_NAND_SPARE_SIZE := 64 endif +ifdef BOARD_CUSTOM_BOOTIMG_MK +include $(BOARD_CUSTOM_BOOTIMG_MK) +endif + + # ----------------------------------------------------------------- # system image # From ad8ee2d3a191495971d70da6ec1734658089c03f Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Tue, 28 Jan 2014 15:51:51 -0600 Subject: [PATCH 114/502] Allow devices to specify certain ro. props via TARGET_UNIFIED_DEVICE This modifies buildinfo.sh to not set model, name, description, and fingerprint in build.prop. These can then be set via custom init lib. This also fixes ota_from_target_files to function without these props being preset. Change-Id: I945b2c38e60b207d2d0f82b34f4f230ac21b0657 --- core/Makefile | 7 +- tools/buildinfo.sh | 16 +++-- tools/releasetools/ota_from_target_files.py | 78 +++++++++++++-------- 3 files changed, 65 insertions(+), 36 deletions(-) diff --git a/core/Makefile b/core/Makefile index 06889145b57..ffb5cb5e721 100644 --- a/core/Makefile +++ b/core/Makefile @@ -276,6 +276,7 @@ endif TARGET_CPU_ABI="$(TARGET_CPU_ABI)" \ TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ + TARGET_UNIFIED_DEVICE="$(TARGET_UNIFIED_DEVICE)" \ $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ @@ -1965,6 +1966,10 @@ else $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_OTA_ASSERT_DEVICE) endif +ifneq ($(TARGET_UNIFIED_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_prop := --override_prop=true +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device @@ -1975,7 +1980,7 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ --backup=$(backuptool) \ - --override_device=$(override_device) \ + --override_device=$(override_device) $(override_prop) \ $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index 43c8e9d4108..a12ebbe52d6 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -26,10 +26,8 @@ fi if [ -n "$AB_OTA_UPDATER" ] ; then echo "ro.build.ab_update=$AB_OTA_UPDATER" fi -echo "ro.product.model=$PRODUCT_MODEL" echo "ro.product.brand=$PRODUCT_BRAND" echo "ro.product.name=$PRODUCT_NAME" -echo "ro.product.device=$TARGET_DEVICE" echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME" # These values are deprecated, use "ro.product.cpu.abilist" @@ -54,11 +52,15 @@ echo "ro.board.platform=$TARGET_BOARD_PLATFORM" echo "# ro.build.product is obsolete; use ro.product.device" echo "ro.build.product=$TARGET_DEVICE" -echo "# Do not try to parse description, fingerprint, or thumbprint" -echo "ro.build.description=$PRIVATE_BUILD_DESC" -echo "ro.build.fingerprint=$BUILD_FINGERPRINT" -if [ -n "$BUILD_THUMBPRINT" ] ; then - echo "ro.build.thumbprint=$BUILD_THUMBPRINT" +if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then + echo "ro.product.model=$PRODUCT_MODEL" + echo "ro.product.device=$TARGET_DEVICE" + echo "# Do not try to parse description, fingerprint, or thumbprint" + echo "ro.build.description=$PRIVATE_BUILD_DESC" + echo "ro.build.fingerprint=$BUILD_FINGERPRINT" + if [ -n "$BUILD_THUMBPRINT" ] ; then + echo "ro.build.thumbprint=$BUILD_THUMBPRINT" + fi fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 225b63eb71c..a5b9cb77037 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -121,6 +121,10 @@ --override_device Override device-specific asserts. Can be a comma-separated list. + --override_prop + Override build.prop items with custom vendor init. + Enabled when TARGET_UNIFIED_DEVICE is defined in BoardConfig + """ import sys @@ -170,6 +174,7 @@ OPTIONS.log_diff = None OPTIONS.backuptool = False OPTIONS.override_device = 'auto' +OPTIONS.override_prop = False def MostPopularKey(d, default): """Given a dict, return the key corresponding to the largest @@ -451,7 +456,10 @@ def AppendAssertions(script, info_dict, oem_dict=None): oem_props = info_dict.get("oem_fingerprint_properties") if oem_props is None or len(oem_props) == 0: if OPTIONS.override_device == "auto": - device = GetBuildProp("ro.product.device", info_dict) + if OPTIONS.override_prop: + device = GetBuildProp("ro.build.product", info_dict) + else: + device = GetBuildProp("ro.product.device", info_dict) else: device = OPTIONS.override_device script.AssertDevice(device) @@ -552,13 +560,18 @@ def WriteFullOTAPackage(input_zip, output_zip): oem_dict = common.LoadDictionaryFromLines( open(OPTIONS.oem_source).readlines()) - metadata = { - "post-build": CalculateFingerprint(oem_props, oem_dict, - OPTIONS.info_dict), - "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, - OPTIONS.info_dict), - "post-timestamp": GetBuildProp("ro.build.date.utc", OPTIONS.info_dict), - } + if OPTIONS.override_prop: + metadata = { + "post-timestamp": GetBuildProp("ro.build.date.utc", OPTIONS.info_dict), + } + else: + metadata = { + "post-build": CalculateFingerprint(oem_props, oem_dict, + OPTIONS.info_dict), + "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, + OPTIONS.info_dict), + "post-timestamp": GetBuildProp("ro.build.date.utc", OPTIONS.info_dict), + } device_specific = common.DeviceSpecificParams( input_zip=input_zip, @@ -837,11 +850,16 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): oem_dict = common.LoadDictionaryFromLines( open(OPTIONS.oem_source).readlines()) - metadata = { - "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, - OPTIONS.source_info_dict), - "ota-type": "BLOCK", - } + if OPTIONS.override_prop: + metadata = { + "ota-type": "BLOCK", + } + else: + metadata = { + "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, + OPTIONS.source_info_dict), + "ota-type": "BLOCK", + } post_timestamp = GetBuildProp("ro.build.date.utc", OPTIONS.target_info_dict) pre_timestamp = GetBuildProp("ro.build.date.utc", OPTIONS.source_info_dict) @@ -1541,23 +1559,24 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): else: vendor_diff = None - target_fp = CalculateFingerprint(oem_props, oem_dict, - OPTIONS.target_info_dict) - source_fp = CalculateFingerprint(oem_props, oem_dict, - OPTIONS.source_info_dict) + if not OPTIONS.override_prop: + target_fp = CalculateFingerprint(oem_props, oem_dict, + OPTIONS.target_info_dict) + source_fp = CalculateFingerprint(oem_props, oem_dict, + OPTIONS.source_info_dict) - if oem_props is None: - script.AssertSomeFingerprint(source_fp, target_fp) - else: - script.AssertSomeThumbprint( - GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), - GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) + if oem_props is None: + script.AssertSomeFingerprint(source_fp, target_fp) + else: + script.AssertSomeThumbprint( + GetBuildProp("ro.build.thumbprint", OPTIONS.target_info_dict), + GetBuildProp("ro.build.thumbprint", OPTIONS.source_info_dict)) - metadata["pre-build"] = source_fp - metadata["post-build"] = target_fp - metadata["pre-build-incremental"] = GetBuildProp( + metadata["pre-build"] = source_fp + metadata["post-build"] = target_fp + metadata["pre-build-incremental"] = GetBuildProp( "ro.build.version.incremental", OPTIONS.source_info_dict) - metadata["post-build-incremental"] = GetBuildProp( + metadata["post-build-incremental"] = GetBuildProp( "ro.build.version.incremental", OPTIONS.target_info_dict) source_boot = common.GetBootableImage( @@ -1950,6 +1969,8 @@ def option_handler(o, a): OPTIONS.backuptool = bool(a.lower() == 'true') elif o in ("--override_device"): OPTIONS.override_device = a + elif o in ("--override_prop"): + OPTIONS.override_prop = bool(a.lower() == 'true') else: return False return True @@ -1980,7 +2001,8 @@ def option_handler(o, a): "gen_verify", "log_diff=", "backup=", - "override_device=" + "override_device=", + "override_prop=" ], extra_option_handler=option_handler) if len(args) != 2: From e9612c85c0d7ab77fcc7a385c6190cc28496b7f0 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Thu, 28 Aug 2014 18:29:14 -0500 Subject: [PATCH 115/502] Edify: Add/Update abort messages for some asserts * If a bootloader or baseband assert is not satisfied, print the versions that are supported by the package as well as the version on the device. Change-Id: I958d49281c51bd4e60d596a727bb94cfc4a21909 --- tools/releasetools/edify_generator.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 20a7f3f1c6a..cd82f6529d0 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -141,10 +141,13 @@ def AssertDevice(self, device): self.script.append(cmd) def AssertSomeBootloader(self, *bootloaders): - """Asert that the bootloader version is one of *bootloaders.""" + """Assert that the bootloader version is one of *bootloaders.""" cmd = ("assert(" + " || ".join(['getprop("ro.bootloader") == "%s"' % (b,) for b in bootloaders]) + + ' || abort("This package supports bootloader(s): ' + + ", ".join(["%s" % (b,) for b in bootloaders]) + + '; this device has bootloader " + getprop("ro.bootloader") + ".");' + ");") self.script.append(self.WordWrap(cmd)) @@ -153,6 +156,9 @@ def AssertSomeBaseband(self, *basebands): cmd = ("assert(" + " || ".join(['getprop("ro.baseband") == "%s"' % (b,) for b in basebands]) + + ' || abort("This package supports baseband(s): ' + + ", ".join(["%s" % (b,) for b in basebands]) + + '; this device has baseband " + getprop("ro.baseband") + ".");' + ");") self.script.append(self._WordWrap(cmd)) From 9811472b0d81a2541ea36cf06c60183dd72da3ee Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Thu, 17 Nov 2011 00:13:29 +0000 Subject: [PATCH 116/502] ota: Build uboot bootable images when necessary Change-Id: I18996bb1f5377bbf369fb41774aaa1f5821e7d1f --- core/Makefile | 18 ++++++++ tools/releasetools/common.py | 90 ++++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 40 deletions(-) diff --git a/core/Makefile b/core/Makefile index ffb5cb5e721..4dc92a82d82 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1714,6 +1714,21 @@ else $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_RECOVERY_OUT := RECOVERY endif +ifeq ($(BOARD_USES_UBOOT_MULTIIMAGE),true) + + ZIP_SAVE_UBOOTIMG_ARGS := -A ARM -O Linux -T multi -C none -n Image + + BOARD_UBOOT_ENTRY := $(strip $(BOARD_UBOOT_ENTRY)) + ifdef BOARD_UBOOT_ENTRY + ZIP_SAVE_UBOOTIMG_ARGS += -e $(BOARD_UBOOT_ENTRY) + endif + BOARD_UBOOT_LOAD := $(strip $(BOARD_UBOOT_LOAD)) + ifdef BOARD_UBOOT_LOAD + ZIP_SAVE_UBOOTIMG_ARGS += -a $(BOARD_UBOOT_LOAD) + endif + +endif + # Depending on the various images guarantees that the underlying # directories are up-to-date. $(BUILT_TARGET_FILES_PACKAGE): \ @@ -1782,6 +1797,9 @@ endif ifdef BOARD_KERNEL_PAGESIZE $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize endif +ifdef ZIP_SAVE_UBOOTIMG_ARGS + $(hide) echo "$(ZIP_SAVE_UBOOTIMG_ARGS)" > $(zip_root)/BOOT/ubootargs +endif endif # BOARD_USES_RECOVERY_AS_BOOT $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ mkdir -p $(zip_root)/RADIO; \ diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 422ba432153..9c2a4b4054b 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -433,48 +433,58 @@ def make_ramdisk(): if has_ramdisk: ramdisk_img = make_ramdisk() - # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set - mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" - - cmd = [mkbootimg, "--kernel", os.path.join(sourcedir, "kernel")] - - fn = os.path.join(sourcedir, "second") - if os.access(fn, os.F_OK): - cmd.append("--second") - cmd.append(fn) - - fn = os.path.join(sourcedir, "cmdline") - if os.access(fn, os.F_OK): - cmd.append("--cmdline") - cmd.append(open(fn).read().rstrip("\n")) - - fn = os.path.join(sourcedir, "base") - if os.access(fn, os.F_OK): - cmd.append("--base") - cmd.append(open(fn).read().rstrip("\n")) - - fn = os.path.join(sourcedir, "pagesize") + """check if uboot is requested""" + fn = os.path.join(sourcedir, "ubootargs") if os.access(fn, os.F_OK): - cmd.append("--pagesize") - cmd.append(open(fn).read().rstrip("\n")) - - args = info_dict.get("mkbootimg_args", None) - if args and args.strip(): - cmd.extend(shlex.split(args)) - - args = info_dict.get("mkbootimg_version_args", None) - if args and args.strip(): - cmd.extend(shlex.split(args)) - - if has_ramdisk: - cmd.extend(["--ramdisk", ramdisk_img.name]) - - img_unsigned = None - if info_dict.get("vboot", None): - img_unsigned = tempfile.NamedTemporaryFile() - cmd.extend(["--output", img_unsigned.name]) + cmd = ["mkimage"] + for argument in open(fn).read().rstrip("\n").split(" "): + cmd.append(argument) + cmd.append("-d") + cmd.append(os.path.join(sourcedir, "kernel") + ":" + ramdisk_img.name) + cmd.append(img.name) else: - cmd.extend(["--output", img.name]) + # use MKBOOTIMG from environ, or "mkbootimg" if empty or not set + mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg" + + cmd = [mkbootimg, "--kernel", os.path.join(sourcedir, "kernel")] + + fn = os.path.join(sourcedir, "second") + if os.access(fn, os.F_OK): + cmd.append("--second") + cmd.append(fn) + + fn = os.path.join(sourcedir, "cmdline") + if os.access(fn, os.F_OK): + cmd.append("--cmdline") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "base") + if os.access(fn, os.F_OK): + cmd.append("--base") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "pagesize") + if os.access(fn, os.F_OK): + cmd.append("--pagesize") + cmd.append(open(fn).read().rstrip("\n")) + + args = info_dict.get("mkbootimg_args", None) + if args and args.strip(): + cmd.extend(shlex.split(args)) + + args = info_dict.get("mkbootimg_version_args", None) + if args and args.strip(): + cmd.extend(shlex.split(args)) + + if has_ramdisk: + cmd.extend(["--ramdisk", ramdisk_img.name]) + + img_unsigned = None + if info_dict.get("vboot", None): + img_unsigned = tempfile.NamedTemporaryFile() + cmd.extend(["--output", img_unsigned.name]) + else: + cmd.extend(["--output", img.name]) p = Run(cmd, stdout=subprocess.PIPE) p.communicate() From 2953bd886e78eefa7dec93a1e78a12ce9f0b4d1b Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Wed, 13 Aug 2014 12:27:38 -0700 Subject: [PATCH 117/502] build: Handle custom boot images properly When a pre-built image should be used, it should be stored in the target files zip so that it can be used with external signing processes. Original-Change-Id: I2661af9ac58af30bb9314b552775046d3abf44e0 Change-Id: I10b3bd0bb33489b8ffb26d16d002f8dd6ff405ad --- core/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/Makefile b/core/Makefile index 4dc92a82d82..b66a6b09b3d 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1810,6 +1810,12 @@ endif # BOARD_USES_RECOVERY_AS_BOOT @# Contents of the data image $(hide) $(call package_files-copy-root, \ $(TARGET_OUT_DATA),$(zip_root)/DATA) +ifdef BOARD_CUSTOM_BOOTIMG + @# Prebuilt boot images + $(hide) mkdir -p $(zip_root)/BOOTABLE_IMAGES + $(hide) $(ACP) $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/ + $(hide) $(ACP) $(INSTALLED_RECOVERYIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/ +endif ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE @# Contents of the vendor image $(hide) $(call package_files-copy-root, \ From e9e57d84c1122b503202213d4519c81d25b0275a Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Wed, 1 Oct 2014 07:33:51 -0700 Subject: [PATCH 118/502] build: Use project pathmap for recovery Change-Id: I6339ac77b899a43db21261d587252b65cb58ad79 --- core/Makefile | 8 ++++---- core/config.mk | 4 ++++ core/pathmap.mk | 1 - 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/Makefile b/core/Makefile index b66a6b09b3d..336a6b5672c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -872,13 +872,13 @@ ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_ INTERNAL_RECOVERYIMAGE_FILES := $(filter $(TARGET_RECOVERY_OUT)/%, \ $(ALL_DEFAULT_INSTALLED_MODULES)) -recovery_initrc := $(call include-path-for, recovery)/etc/init.rc +recovery_initrc := $(call project-path-for,recovery)/etc/init.rc recovery_sepolicy := $(call intermediates-dir-for,ETC,sepolicy.recovery)/sepolicy.recovery recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system recovery_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.img recovery_uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk-recovery.cpio recovery_build_prop := $(intermediate_system_build_prop) -recovery_resources_common := $(call include-path-for, recovery)/res +recovery_resources_common := $(call project-path-for,recovery)/res # Set recovery_density to the density bucket of the device. recovery_density := unknown @@ -902,9 +902,9 @@ endif # its private recovery resources. ifneq (,$(filter xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density))) -recovery_font := $(call include-path-for, recovery)/fonts/18x32.png +recovery_font := $(call project-path-for,recovery)/fonts/18x32.png else -recovery_font := $(call include-path-for, recovery)/fonts/12x22.png +recovery_font := $(call project-path-for,recovery)/fonts/12x22.png endif ifneq ($(TARGET_RECOVERY_DEVICE_DIRS),) diff --git a/core/config.mk b/core/config.mk index d2d4f71164d..9442a640c1a 100644 --- a/core/config.mk +++ b/core/config.mk @@ -167,6 +167,10 @@ include $(BUILD_SYSTEM)/envsetup.mk # See envsetup.mk for a description of SCAN_EXCLUDE_DIRS FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git) +# General entries for project pathmap. Any entries listed here should +# be device and hardware independent. +$(call project-set-path-variant,recovery,RECOVERY_VARIANT,bootable/recovery) + -include vendor/extra/BoardConfigExtra.mk # The build system exposes several variables for where to find the kernel diff --git a/core/pathmap.mk b/core/pathmap.mk index 9e48c7cdd70..fb9515cd13d 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -41,7 +41,6 @@ pathmap_INCL := \ libhardware_legacy:hardware/libhardware_legacy/include \ libril:hardware/ril/include \ opengl-tests-includes:frameworks/native/opengl/tests/include \ - recovery:bootable/recovery \ system-core:system/core/include \ audio:system/media/audio/include \ audio-effects:system/media/audio_effects/include \ From 252e525507ae0d0b684bd40586b2467bf2ba80bd Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Wed, 19 Nov 2014 23:22:41 +0700 Subject: [PATCH 119/502] build: clean up otasigcheck - Only mount and unmount /data if it was originally unmounted - Don't use comparison hack, just check the result of the script Change-Id: I4a22485d315cf91e95ce578907c49f5fa3a03222 --- tools/releasetools/edify_generator.py | 4 +--- tools/releasetools/ota_from_target_files.py | 5 +++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index cd82f6529d0..cadc931538c 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -183,9 +183,7 @@ def ValidateSignatures(self, command): self.script.append('package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");') self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') self.script.append('set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);') - self.script.append('run_program("/tmp/otasigcheck.sh");') - ## Hax: a failure from run_program doesn't trigger an abort, so have it change the key value and check for "INVALID" - self.script.append('sha1_check(read_file("/tmp/releasekey"),"7241e92725436afc79389d4fc2333a2aa8c20230") && abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') + self.script.append('run_program("/tmp/otasigcheck.sh") == "0" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index a5b9cb77037..4ebd19e87d3 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -661,9 +661,14 @@ def WriteFullOTAPackage(input_zip, output_zip): if block_based: common.ZipWriteStr(output_zip, "system/bin/otasigcheck.sh", ""+input_zip.read("SYSTEM/bin/otasigcheck.sh")) + + script.AppendExtra("if is_mounted(\"/data\") then") + script.ValidateSignatures("data") + script.AppendExtra("else") script.Mount("/data") script.ValidateSignatures("data") script.Unmount("/data") + script.AppendExtra("endif;") # Place a copy of file_contexts.bin into the OTA package which will be used # by the recovery program. From 1d55bc110ea8cc74f79a89287491d8451e0b8fae Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Thu, 19 Jun 2014 01:45:15 +0100 Subject: [PATCH 120/502] ota: Let devices specify their own recovery-from-boot.p installer Some devices apply transformations to the installed images, making the sha1 checksums fail (or, worse, generating invalid images). If "/system/etc/recovery-transform.sh" exists, run that instead, passing the expected sizes and checksums as arguments in the form of recovery-transform.sh A direct emulation of the standard patcher could look like this, transformations should be added as needed. ---------------- RECSIZE=$1 RECSHA1=$2 BOOTSIZE=$3 BOOTSHA1=$4 dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=$C/recovery.img dd if=/dev/block/platform/msm_sdcc.1/by-name/boot of=$C/boot.img if ! applypatch -c EMMC:$C/recovery.img:$RECSIZE:$RECSHA1; then log -t recovery "Installing new recovery image" applypatch -b /system/etc/recovery-resource.dat EMMC:$C/boot.img:$BOOTSIZE:$BOOTSHA1 EMMC:$C/recovery.img $RECSHA1 $RECSIZE $BOOTSHA1:/system/recovery-from-boot.p || exit 1 else log -t recovery "Recovery image already installed" fi ---------------- Conflicts: tools/releasetools/ota_from_target_files Change-Id: Ie601841ca1cdad6b8f3b16e593d2718a92e8ca09 --- tools/releasetools/common.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 9c2a4b4054b..a941e8c54e7 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1666,6 +1666,9 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, if full_recovery_image: sh = """#!/system/bin/sh +if [ -f /system/etc/recovery-transform.sh ]; then + exec sh /system/etc/recovery-transform.sh %(recovery_size)d %(recovery_sha1)s %(boot_size)d %(boot_sha1)s +fi if ! applypatch -c %(type)s:%(device)s:%(size)d:%(sha1)s; then applypatch /system/etc/recovery.img %(type)s:%(device)s %(sha1)s %(size)d && log -t recovery "Installing new recovery image: succeeded" || log -t recovery "Installing new recovery image: failed" else From dcfb1976cb9b82d7266399a979f4f201b551c15a Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Fri, 21 Nov 2014 00:46:52 -0600 Subject: [PATCH 121/502] build: Ensure /system unmounted at install start Account for the possibility that a user has mounted system manually before installing the FullOTA package. Change-Id: I97d0540676a7ce98762545e76ecb1a7f6335d204 --- tools/releasetools/ota_from_target_files.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 4ebd19e87d3..d1a7e218c90 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -639,6 +639,7 @@ def WriteFullOTAPackage(input_zip, output_zip): script.Print("Target: %s" % CalculateFingerprint( oem_props, oem_dict, OPTIONS.info_dict)) + script.AppendExtra("ifelse(is_mounted(\"/system\"), unmount(\"/system\"));") device_specific.FullOTA_InstallBegin() if OPTIONS.backuptool: From 78715b747bf332838e072c2ea682100c9e0f84e5 Mon Sep 17 00:00:00 2001 From: M1cha Date: Tue, 25 Nov 2014 15:30:48 +0100 Subject: [PATCH 122/502] releasetools: ota_from_target_files: add FullOTA_PostValidate Change-Id: I152412049f90fd546d4516cc064238c3192be553 --- tools/releasetools/common.py | 5 +++++ tools/releasetools/ota_from_target_files.py | 2 ++ 2 files changed, 7 insertions(+) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index a941e8c54e7..8ca870d9180 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1167,6 +1167,11 @@ def FullOTA_InstallEnd(self): used to install the image for the device's baseband processor.""" return self._DoCall("FullOTA_InstallEnd") + def FullOTA_PostValidate(self): + """Called after installing and validating /system; typically this is + used to resize the system partition after a block based installation.""" + return self._DoCall("FullOTA_PostValidate") + def IncrementalOTA_Assertions(self): """Called after emitting the block of assertions at the top of an incremental OTA package. Implementations can add whatever diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index d1a7e218c90..870f0de6970 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -743,6 +743,8 @@ def output_sink(fn, data): if block_based: script.Unmount("/system") + device_specific.FullOTA_PostValidate() + if OPTIONS.backuptool: script.ShowProgress(0.02, 10) if block_based: From 8ad28d4c26871bac72ad682dd027f98da3461407 Mon Sep 17 00:00:00 2001 From: Brandon Bennett Date: Sat, 19 Nov 2011 16:02:04 -0700 Subject: [PATCH 123/502] Add ext2, ext3, and vfat to releasetools Support some non-standard partition that may be found in recovery.fstab Change-Id: I0026a1d3ae5d432db10150d1a15f7bc8e7a6054b --- tools/releasetools/common.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 8ca870d9180..fda22a62c64 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1598,7 +1598,10 @@ def _HashZeroBlocks(self, num_blocks): # pylint: disable=no-self-use "ext4": "EMMC", "emmc": "EMMC", "f2fs": "EMMC", - "squashfs": "EMMC" + "squashfs": "EMMC", + "ext2": "EMMC", + "ext3": "EMMC", + "vfat": "EMMC" } def GetTypeAndDevice(mount_point, info): From e91e80074aabb8d33e36c9d1c86d2d1ff96e3f0a Mon Sep 17 00:00:00 2001 From: Cristoforo Cataldo Date: Sun, 30 Nov 2014 02:06:42 +0100 Subject: [PATCH 124/502] core: Enable -mcpu=cortex-a8 flag for Scorpion cpu variant To be used with http://review.cyanogenmod.org/#/c/77758/ Change-Id: I7ecc4707fa45bd7098165615c0521a12c85fb087 --- core/combo/arch/arm/armv7-a-neon.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index 5d5b050098a..009fbe9b60f 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -19,7 +19,7 @@ ifneq (,$(filter cortex-a15 krait denver,$(TARGET_$(combo_2nd_arch_prefix)CPU_VA arch_variant_ldflags := \ -Wl,--no-fix-cortex-a8 else -ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a8) +ifneq (,$(filter cortex-a8 scorpion,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) arch_variant_cflags := -mcpu=cortex-a8 arch_variant_ldflags := \ -Wl,--fix-cortex-a8 From 985f69a78333193960af500af6aecc590a859b9f Mon Sep 17 00:00:00 2001 From: invisiblek Date: Sat, 29 Nov 2014 11:14:13 -0600 Subject: [PATCH 125/502] buildinfo: only set ro.build.product on non-unified devices Change-Id: I5dccba2172dade3dacc55d832a2042fce306b5f5 --- tools/buildinfo.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index a12ebbe52d6..039c344a42c 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -49,10 +49,9 @@ fi echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS" echo "ro.board.platform=$TARGET_BOARD_PLATFORM" -echo "# ro.build.product is obsolete; use ro.product.device" -echo "ro.build.product=$TARGET_DEVICE" - if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then + echo "# ro.build.product is obsolete; use ro.product.device" + echo "ro.build.product=$TARGET_DEVICE" echo "ro.product.model=$PRODUCT_MODEL" echo "ro.product.device=$TARGET_DEVICE" echo "# Do not try to parse description, fingerprint, or thumbprint" From dd9d4954c7e57d738f101a7a1d36edef0672c057 Mon Sep 17 00:00:00 2001 From: Cristoforo Cataldo Date: Sun, 30 Nov 2014 06:12:35 +0100 Subject: [PATCH 126/502] core: Enable -mcpu=cortex-a9 flag for Cortex-A9 cpu variant Change-Id: I9294a518bcdc21ccbae72eadd9f3c1a12982d028 core: armv7-a-neon.mk: Add missing endif Change-Id: Id6f9c952d01d3c980115a52605d9c86038b3b5bd --- core/combo/arch/arm/armv7-a-neon.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index 009fbe9b60f..dd65d34a406 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -19,6 +19,9 @@ ifneq (,$(filter cortex-a15 krait denver,$(TARGET_$(combo_2nd_arch_prefix)CPU_VA arch_variant_ldflags := \ -Wl,--no-fix-cortex-a8 else +ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a9) + arch_variant_cflags := -mcpu=cortex-a9 +else ifneq (,$(filter cortex-a8 scorpion,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) arch_variant_cflags := -mcpu=cortex-a8 arch_variant_ldflags := \ @@ -38,6 +41,7 @@ else endif endif endif +endif ifeq (true,$(local_arch_has_lpae)) # Fake an ARM compiler flag as these processors support LPAE which GCC/clang From 84f3c867a3786eb3892914a4ef2de0906524b2fa Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sun, 30 Nov 2014 15:09:43 +0000 Subject: [PATCH 127/502] otasigcheck: Go back to the key-rewrite check. Using an intermediate file had the at-the-time unintended but good side-effect of making execution failures (absent script, no busybox in recovery, bad selinux setup) pass gracefully. Since this check is intended as a blacklist, blocking the update when only sure that breakage will ensue, that was a nice thing to get. Checking the return code, while cleaner, is making non-key-related failures like those mentioned above abort execution of the script. The key itself isn't even checked, yet we're aborting because of it. So go back to the original behavior: In case we're not sure... pass. To do: This can be cleaned up differently, and to the same effect, by returning an explicit error code from the script and aborting when that error comes up. Change the script to do that and come back here. :) Change-Id: Ic9d7c3128047c25f31e2ef416c9df4d21ca0a1a8 Revert "otasigcheck: Go back to the key-rewrite check." sigcheck now returns an explicit abort code This reverts commit bab150d79c7b9b1f233fc3592b69a42f0b38fbd8. Change-Id: I2b5860ea427a4db7e29b55cc632b92c6e2910494 --- tools/releasetools/edify_generator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index cadc931538c..6becad9e7f0 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -183,7 +183,8 @@ def ValidateSignatures(self, command): self.script.append('package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");') self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') self.script.append('set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);') - self.script.append('run_program("/tmp/otasigcheck.sh") == "0" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') + # Exit code 124 == abort. run_program returns raw, so left-shift 8bit + self.script.append('run_program("/tmp/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next From 0706addf81ad31d6a550e2985471284fc212e866 Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Tue, 2 Dec 2014 02:01:56 -0500 Subject: [PATCH 128/502] Fix ro.build.product not found by ota_from_target_files in some cases After I5dccba2172dade3dacc55d832a2042fce306b5f5 it was possible that if override_prop was set and override_device was not set the script was looking for a prop that did not exist. Change-Id: I444a33de5bcb59f129bdcf631c2a6540c5926545 --- core/Makefile | 3 +++ tools/releasetools/ota_from_target_files.py | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/Makefile b/core/Makefile index 336a6b5672c..d0d4cf3b8a3 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1992,6 +1992,9 @@ endif ifneq ($(TARGET_UNIFIED_DEVICE),) $(INTERNAL_OTA_PACKAGE_TARGET): override_prop := --override_prop=true + ifeq ($(TARGET_OTA_ASSERT_DEVICE),) + $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_DEVICE) + endif endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 870f0de6970..4f4405b9f78 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -456,10 +456,7 @@ def AppendAssertions(script, info_dict, oem_dict=None): oem_props = info_dict.get("oem_fingerprint_properties") if oem_props is None or len(oem_props) == 0: if OPTIONS.override_device == "auto": - if OPTIONS.override_prop: - device = GetBuildProp("ro.build.product", info_dict) - else: - device = GetBuildProp("ro.product.device", info_dict) + device = GetBuildProp("ro.product.device", info_dict) else: device = OPTIONS.override_device script.AssertDevice(device) @@ -1522,11 +1519,16 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): oem_dict = common.LoadDictionaryFromLines( open(OPTIONS.oem_source).readlines()) - metadata = { - "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, - OPTIONS.source_info_dict), - "ota-type": "FILE", - } + if OPTIONS.override_prop: + metadata = { + "ota-type": "FILE", + } + else: + metadata = { + "pre-device": GetOemProperty("ro.product.device", oem_props, oem_dict, + OPTIONS.source_info_dict), + "ota-type": "FILE", + } post_timestamp = GetBuildProp("ro.build.date.utc", OPTIONS.target_info_dict) pre_timestamp = GetBuildProp("ro.build.date.utc", OPTIONS.source_info_dict) From d9a9ea06f71b058fde602c0f34e235d2609240d0 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 7 Dec 2014 16:42:28 -0800 Subject: [PATCH 129/502] build: Parse TARGET_COPY_FILES_OVERRIDES late in the setup Change-Id: Ie3e4a168ff224e3b65e4627c0757e8813a02167f --- core/config.mk | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/config.mk b/core/config.mk index 9442a640c1a..aa3a85e975f 100644 --- a/core/config.mk +++ b/core/config.mk @@ -877,6 +877,17 @@ RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 # Rules for QCOM targets include $(BUILD_SYSTEM)/qcom_target.mk +# We might want to skip items listed in PRODUCT_COPY_FILES based on +# various target flags. This is useful for replacing a binary module with one +# built from source. This should be a list of destination files under $OUT +# +TARGET_COPY_FILES_OVERRIDES := \ + $(addprefix %:, $(strip $(TARGET_COPY_FILES_OVERRIDES))) + +ifneq ($(TARGET_COPY_FILES_OVERRIDES),) + PRODUCT_COPY_FILES := $(filter-out $(TARGET_COPY_FILES_OVERRIDES), $(PRODUCT_COPY_FILES)) +endif + ifneq ($(CM_BUILD),) ## We need to be sure the global selinux policies are included ## last, to avoid accidental resetting by device configs From 67d8bb7c297f95879777500a10f836200dea42d3 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 16 Dec 2014 18:22:55 +0530 Subject: [PATCH 130/502] Improve cmremote Change-Id: I7e1f87ed92cddcf8df3ea4fd701f56a9ef806add --- envsetup.sh | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 1d12bd99602..f0ee13bcc69 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1647,21 +1647,13 @@ function godir () { function cmremote() { git remote rm cmremote 2> /dev/null - if [ ! -d .git ] - then - echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. - fi - GERRIT_REMOTE=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) + GERRIT_REMOTE=$(git config --get remote.github.projectname) if [ -z "$GERRIT_REMOTE" ] then - GERRIT_REMOTE=$(cat .git/config | grep http://github.com | awk '{ print $NF }' | sed s#http://github.com/##g) - if [ -z "$GERRIT_REMOTE" ] - then - echo Unable to set up the git remote, are you in the root of the repo? - return 0 - fi + echo Unable to set up the git remote, are you under a git repo? + return 0 fi - CMUSER=`git config --get review.review.cyanogenmod.org.username` + CMUSER=$(git config --get review.review.cyanogenmod.org.username) if [ -z "$CMUSER" ] then git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE From b6513fa73fa8ea0aa970fb8c3add598bf6e64abd Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Thu, 18 Dec 2014 11:26:37 -0600 Subject: [PATCH 131/502] releasetools: allow devices to specify a custom make_recovery_patch Change-Id: I891660c1bf919b369afd4ff496fb6bab85dffe3f --- core/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/Makefile b/core/Makefile index d0d4cf3b8a3..9da8ea96cdc 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1898,8 +1898,13 @@ ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) endif $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt) ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) +ifeq ($(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT),) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ ./build/tools/releasetools/make_recovery_patch $(zip_root) $(zip_root) +else + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ + $(TARGET_RELEASETOOL_MAKE_RECOVERY_PATCH_SCRIPT) $(zip_root) $(zip_root) +endif endif ifeq ($(AB_OTA_UPDATER),true) @# When using the A/B updater, include the updater config files in the zip. From 7bd759db4cdcb722c3ac10131be3f6f4f43eeb14 Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Mon, 22 Dec 2014 20:11:47 +0700 Subject: [PATCH 132/502] build: fix dopush for SystemUI The path for SystemUI has changed in Lollipop Change-Id: Ib2126f48f6769e5f91d0aa1d44d4049bdbe1deff --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index f0ee13bcc69..ceaa226de67 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2198,7 +2198,7 @@ EOF fi adb shell restorecon "$TARGET" ;; - /system/priv-app/SystemUI.apk|/system/framework/*) + /system/priv-app/SystemUI/SystemUI.apk|/system/framework/*) # Only need to stop services once if ! $stop_n_start; then adb shell stop From fe90ef9cb0d42c8d2f49d3a7a3395dd9d251d907 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Fri, 28 Sep 2012 11:56:02 +0530 Subject: [PATCH 133/502] envsetup: new function cmka - The build system adds a clean- target for each module / package. - This utilizes that and cleans and builds using mka. - If no argument is supplied, it runs "mka clean". - If argument is (bacon|otapackage|systemimage), it runs installclean. Change-Id: I582ac2f92df3278c41c254c73e9c02ad7f406851 (cherry picked from commit eb74c2f2b9bb708e77edfdbb8ba0d0b716fef2fc) (Also sneak in another minor change, a help entry for mkap) --- envsetup.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index ceaa226de67..ee59ca138dd 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -29,6 +29,8 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cafremote: Add git remote for matching CodeAurora repository. - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors +- mkap: Builds the module(s) using mka and pushes them to the device. +- cmka: Cleans and builds using mka. - reposync: Parallel repo sync using ionice and SCHED_BATCH - repopick: Utility to fetch changes from Gerrit. - installboot: Installs a boot.img to the connected device. @@ -2087,6 +2089,26 @@ function mka() { esac } +function cmka() { + if [ ! -z "$1" ]; then + for i in "$@"; do + case $i in + bacon|otapackage|systemimage) + mka installclean + mka $i + ;; + *) + mka clean-$i + mka $i + ;; + esac + done + else + mka clean + mka + fi +} + function reposync() { case `uname -s` in Darwin) From 593539780934f6454d6305fa6bda3728a6c75866 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Sun, 21 Dec 2014 23:18:16 -0600 Subject: [PATCH 134/502] releasetools: clean up residual targetfiles-* dirs in /tmp/ Change-Id: I3792307663f8a85513e102c8bf3d78cf4e514760 --- tools/releasetools/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index fda22a62c64..29e592bff4b 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -584,6 +584,7 @@ def UnzipTemp(filename, pattern=None): OPTIONS.tempfiles.append(tmp) def unzip_to_dir(filename, dirname): + subprocess.call(["rm", "-rf", dirname + filename, "targetfiles-*"]) cmd = ["unzip", "-o", "-q", filename, "-d", dirname] if pattern is not None: cmd.append(pattern) From b81fa346202ca81e835b5817c57c929b79004059 Mon Sep 17 00:00:00 2001 From: Clark Scheff Date: Tue, 23 Dec 2014 13:30:51 -0800 Subject: [PATCH 135/502] Add ddclient function for debugging with DDD While debugging via the CLI is great, it is nice to have the option to debug using a graphical front end. This patch adds a function for using ddd to debug native code. Simply replace gdbclient with dddclient and start debugging. Change-Id: I3d3afe08772007b11ad6e0f839868e85386340f1 Note: Requires that ddd be installed on the host PC. --- envsetup.sh | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index ee59ca138dd..2cfe1928d00 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1290,6 +1290,106 @@ function is64bit() fi } +function dddclient() +{ + local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) + local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) + local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_EXE_SYMBOLS=$(get_symbols_directory) + local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) + local ARCH=$(get_build_var TARGET_ARCH) + local GDB + case "$ARCH" in + arm) GDB=arm-linux-androideabi-gdb;; + arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; + mips|mips64) GDB=mips64el-linux-android-gdb;; + x86) GDB=x86_64-linux-android-gdb;; + x86_64) GDB=x86_64-linux-android-gdb;; + *) echo "Unknown arch $ARCH"; return 1;; + esac + + if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then + local EXE="$1" + if [ "$EXE" ] ; then + EXE=$1 + if [[ $EXE =~ ^[^/].* ]] ; then + EXE="system/bin/"$EXE + fi + else + EXE="app_process" + fi + + local PORT="$2" + if [ "$PORT" ] ; then + PORT=$2 + else + PORT=":5039" + fi + + local PID="$3" + if [ "$PID" ] ; then + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + PID=`pid $3` + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + # that likely didn't work because of returning multiple processes + # try again, filtering by root processes (don't contain colon) + PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` + if [[ ! "$PID" =~ ^[0-9]+$ ]] + then + echo "Couldn't resolve '$3' to single PID" + return 1 + else + echo "" + echo "WARNING: multiple processes matching '$3' observed, using root process" + echo "" + fi + fi + fi + adb forward "tcp$PORT" "tcp$PORT" + local USE64BIT="$(is64bit $PID)" + adb shell gdbserver$USE64BIT $PORT --attach $PID & + sleep 2 + else + echo "" + echo "If you haven't done so already, do this first on the device:" + echo " gdbserver $PORT /system/bin/$EXE" + echo " or" + echo " gdbserver $PORT --attach " + echo "" + fi + + OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT + OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT + + echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" + echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" + echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" + echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" + # Enable special debugging for ART processes. + if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then + echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" + fi + echo >>"$OUT_ROOT/gdbclient.cmds" "" + + local WHICH_GDB= + # 64-bit exe found + if [ "$USE64BIT" != "" ] ; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 + # 32-bit exe / 32-bit platform + elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB + # 32-bit exe / 64-bit platform + else + WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB + fi + + ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" + else + echo "Unable to determine build system output dir." + fi +} + case `uname -s` in Darwin) function sgrep() From 626f5b4525d48af25ecea4f2e2ef1ab9adf55597 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 28 Dec 2014 02:53:03 -0800 Subject: [PATCH 136/502] core: Get the RIL variant path into the global includes * Need to have this in the global path, so shuffle things around a little. Change-Id: I2dd2b378d17ff3fa0e379793df31d68964d87278 --- core/config.mk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/config.mk b/core/config.mk index aa3a85e975f..c6455eb4176 100644 --- a/core/config.mk +++ b/core/config.mk @@ -50,7 +50,6 @@ SRC_HEADERS := \ $(TOPDIR)system/media/audio/include \ $(TOPDIR)hardware/libhardware/include \ $(TOPDIR)hardware/libhardware_legacy/include \ - $(TOPDIR)hardware/ril/include \ $(TOPDIR)libnativehelper/include \ $(TOPDIR)frameworks/native/include \ $(TOPDIR)frameworks/native/opengl/include \ @@ -634,6 +633,9 @@ else DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey endif +# Rules for QCOM targets +include $(BUILD_SYSTEM)/qcom_target.mk + # ############################################################### # Set up final options. # ############################################################### @@ -715,7 +717,8 @@ HOST_GLOBAL_LD_DIRS += -L$(HOST_OUT_INTERMEDIATE_LIBRARIES) TARGET_GLOBAL_LD_DIRS += -L$(TARGET_OUT_INTERMEDIATE_LIBRARIES) HOST_PROJECT_INCLUDES:= $(SRC_HEADERS) $(SRC_HOST_HEADERS) $(HOST_OUT_HEADERS) -TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TARGET_OUT_HEADERS) \ +TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TOPDIR)$(call project-path-for,ril)/include \ + $(TARGET_OUT_HEADERS) \ $(TARGET_DEVICE_KERNEL_HEADERS) $(TARGET_BOARD_KERNEL_HEADERS) \ $(TARGET_PRODUCT_KERNEL_HEADERS) @@ -874,9 +877,6 @@ endif RSCOMPAT_32BIT_ONLY_API_LEVELS := 8 9 10 11 12 13 14 15 16 17 18 19 20 RSCOMPAT_NO_USAGEIO_API_LEVELS := 8 9 10 11 12 13 -# Rules for QCOM targets -include $(BUILD_SYSTEM)/qcom_target.mk - # We might want to skip items listed in PRODUCT_COPY_FILES based on # various target flags. This is useful for replacing a binary module with one # built from source. This should be a list of destination files under $OUT From 33f1986f58c52ae9248be51a619075986cd413fc Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 5 Jan 2015 02:53:51 +0000 Subject: [PATCH 137/502] build: Add an option to block non-enforcing builds Prevent accidental build of test configurations. Hopping back and forth between states (especially disabled) leaves a mess in the filesystems, and we want to try to ensure published builds go out enforcing. Change-Id: I2206975968de421dec842f49b02490fa85ca9f3b --- core/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/Makefile b/core/Makefile index 9da8ea96cdc..28a100853da 100644 --- a/core/Makefile +++ b/core/Makefile @@ -962,6 +962,11 @@ INTERNAL_RECOVERYIMAGE_ARGS := \ # Assumes this has already been stripped ifdef BOARD_KERNEL_CMDLINE + ifdef BUILD_ENFORCE_SELINUX + ifneq (,$(filter androidboot.selinux=permissive androidboot.selinux=disabled, $(BOARD_KERNEL_CMDLINE))) + $(error "Trying to apply non-default selinux settings. Aborting") + endif + endif INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" endif ifdef BOARD_KERNEL_BASE From f0473fd3e984b3009a747cfbe11a5db15f1a5bc0 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 8 Jan 2015 14:36:45 -0800 Subject: [PATCH 138/502] releasetools: Store the build.prop file in the OTA zip This file is often used to read information about the update contained in the OTA. Place it in the update so it can be used by scripts. The file is not added to the updater-script, so it will not be placed onto the actual system. Change-Id: I88044796cbe8f199ca02df2840fd944cba2c73fa --- tools/releasetools/ota_from_target_files.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 4f4405b9f78..7ea97ca90ed 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -783,6 +783,9 @@ def output_sink(fn, data): metadata["ota-required-cache"] = str(script.required_cache) WriteMetadata(metadata, output_zip) + common.ZipWriteStr(output_zip, "system/build.prop", + ""+input_zip.read("SYSTEM/build.prop")) + common.ZipWriteStr(output_zip, "META-INF/org/cyanogenmod/releasekey", ""+input_zip.read("META/releasekey.txt")) From 9dd262e3bdd532b74f043176827658f628b8abd9 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Fri, 12 Dec 2014 11:51:33 -0800 Subject: [PATCH 139/502] build: ota: Support for install tools in /tmp/install * Anything in OUT/install gets packaged up into the zip and extracted to /tmp/install immediately after FullOTA_InstallBegin. * Use /tmp/install in edify scripts and remove code related to using and manipulating /system for install tools. Change-Id: I315a3238e36c8d15e26f935e272f7e27dd59c320 --- tools/releasetools/edify_generator.py | 23 +++------------- tools/releasetools/ota_from_target_files.py | 30 ++++++++++----------- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 6becad9e7f0..5ac0dad7881 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -163,28 +163,11 @@ def AssertSomeBaseband(self, *basebands): self.script.append(self._WordWrap(cmd)) def RunBackup(self, command): - self.script.append('package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");') - self.script.append('package_extract_file("system/bin/backuptool.functions", "/tmp/backuptool.functions");') - if not self.info.get("use_set_metadata", False): - self.script.append('set_perm(0, 0, 0755, "/tmp/backuptool.sh");') - self.script.append('set_perm(0, 0, 0644, "/tmp/backuptool.functions");') - else: - self.script.append('set_metadata("/tmp/backuptool.sh", "uid", 0, "gid", 0, "mode", 0755);') - self.script.append('set_metadata("/tmp/backuptool.functions", "uid", 0, "gid", 0, "mode", 0644);') - self.script.append(('run_program("/tmp/backuptool.sh", "%s");' % command)) - if command == "restore": - self.script.append('delete("/system/bin/backuptool.sh");') - self.script.append('delete("/system/bin/backuptool.functions");') + self.script.append(('run_program("/tmp/install/bin/backuptool.sh", "%s");' % command)) def ValidateSignatures(self, command): - if command == "cleanup": - self.script.append('delete("/system/bin/otasigcheck.sh");') - else: - self.script.append('package_extract_file("system/bin/otasigcheck.sh", "/tmp/otasigcheck.sh");') - self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') - self.script.append('set_metadata("/tmp/otasigcheck.sh", "uid", 0, "gid", 0, "mode", 0755);') - # Exit code 124 == abort. run_program returns raw, so left-shift 8bit - self.script.append('run_program("/tmp/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') + # Exit code 124 == abort. run_program returns raw, so left-shift 8bit + self.script.append('run_program("/tmp/install/bin/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') def ShowProgress(self, frac, dur): """Update the progress bar, advancing it over 'frac' over the next diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 7ea97ca90ed..ca2a02fc1c1 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -539,6 +539,16 @@ def GetImage(which, tmpdir, info_dict): return sparse_img.SparseImage(path, mappath, clobbered_blocks) +def CopyInstallTools(output_zip): + oldcwd = os.getcwd() + os.chdir(os.getenv('OUT')) + for root, subdirs, files in os.walk("install"): + for f in files: + p = os.path.join(root, f) + output_zip.write(p, p) + os.chdir(oldcwd) + + def WriteFullOTAPackage(input_zip, output_zip): # TODO: how to determine this? We don't know what version it will # be installed on top of. For now, we expect the API just won't @@ -639,12 +649,12 @@ def WriteFullOTAPackage(input_zip, output_zip): script.AppendExtra("ifelse(is_mounted(\"/system\"), unmount(\"/system\"));") device_specific.FullOTA_InstallBegin() + CopyInstallTools(output_zip) + script.UnpackPackageDir("install", "/tmp/install") + script.SetPermissionsRecursive("/tmp/install", 0, 0, 0755, 0644, None, None) + script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0755, 0755, None, None) + if OPTIONS.backuptool: - if block_based: - common.ZipWriteStr(output_zip, "system/bin/backuptool.sh", - ""+input_zip.read("SYSTEM/bin/backuptool.sh")) - common.ZipWriteStr(output_zip, "system/bin/backuptool.functions", - ""+input_zip.read("SYSTEM/bin/backuptool.functions")) script.Mount("/system") script.RunBackup("backup") script.Unmount("/system") @@ -656,10 +666,6 @@ def WriteFullOTAPackage(input_zip, output_zip): if HasVendorPartition(input_zip): system_progress -= 0.1 - if block_based: - common.ZipWriteStr(output_zip, "system/bin/otasigcheck.sh", - ""+input_zip.read("SYSTEM/bin/otasigcheck.sh")) - script.AppendExtra("if is_mounted(\"/data\") then") script.ValidateSignatures("data") script.AppendExtra("else") @@ -734,12 +740,6 @@ def output_sink(fn, data): common.CheckSize(boot_img.data, "boot.img", OPTIONS.info_dict) common.ZipWriteStr(output_zip, "boot.img", boot_img.data) - if block_based: - script.Mount("/system") - script.ValidateSignatures("cleanup") - if block_based: - script.Unmount("/system") - device_specific.FullOTA_PostValidate() if OPTIONS.backuptool: From a4c8096dd4a31b2ad4f1b322333b594e87e3e7f2 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Tue, 16 Dec 2014 09:58:47 -0800 Subject: [PATCH 140/502] build: Only set capabilities if provided * Allows OUT/install to be compatibile with K recoveries. Change-Id: I308ee5759da1e3c8e749e9408793f0720fb83cee --- tools/releasetools/edify_generator.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 5ac0dad7881..b94dafc1ccb 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -368,10 +368,10 @@ def SetPermissions(self, fn, uid, gid, mode, selabel, capabilities): if not self.info.get("use_set_metadata", False): self.script.append('set_perm(%d, %d, 0%o, "%s");' % (uid, gid, mode, fn)) else: - if capabilities is None: - capabilities = "0x0" - cmd = 'set_metadata("%s", "uid", %d, "gid", %d, "mode", 0%o, ' \ - '"capabilities", %s' % (fn, uid, gid, mode, capabilities) + cmd = 'set_metadata("%s", "uid", %d, "gid", %d, "mode", 0%o' \ + % (fn, uid, gid, mode) + if capabilities is not None: + cmd += ', "capabilities", %s' % ( capabilities ) if selabel is not None: cmd += ', "selabel", "%s"' % selabel cmd += ');' @@ -384,11 +384,11 @@ def SetPermissionsRecursive(self, fn, uid, gid, dmode, fmode, selabel, self.script.append('set_perm_recursive(%d, %d, 0%o, 0%o, "%s");' % (uid, gid, dmode, fmode, fn)) else: - if capabilities is None: - capabilities = "0x0" cmd = 'set_metadata_recursive("%s", "uid", %d, "gid", %d, ' \ - '"dmode", 0%o, "fmode", 0%o, "capabilities", %s' \ - % (fn, uid, gid, dmode, fmode, capabilities) + '"dmode", 0%o, "fmode", 0%o' \ + % (fn, uid, gid, dmode, fmode) + if capabilities is not None: + cmd += ', "capabilities", "%s"' % ( capabilities ) if selabel is not None: cmd += ', "selabel", "%s"' % selabel cmd += ');' From 9e32251dd6eb8cc39f5f1af72b43ab89c8640111 Mon Sep 17 00:00:00 2001 From: Ameya Thakur Date: Tue, 18 Nov 2014 15:27:07 -0800 Subject: [PATCH 141/502] build: releasetools: ota: Add support for 32-64 bit upgrades We now use the new API to determine if the update package is compatible with the device it is currently being applied on or not. We also use the 32 bit updater libraries while compiling the ota package Change-Id: I4d1d2bd90e03e6f4b2f786d25c6d02f62243c3f3 --- core/Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index 28a100853da..c68ad1b1896 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1691,8 +1691,11 @@ built_ota_tools := # We can't build static executables when SANITIZE_TARGET=address ifeq ($(strip $(SANITIZE_TARGET)),) -built_ota_tools += \ - $(call intermediates-dir-for,EXECUTABLES,updater,,,$(TARGET_PREFER_32_BIT))/updater +ifeq ($(TARGET_ARCH),arm64) + built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater,,,32)/updater +else + built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater)/updater +endif endif $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools) From a5bba7407e1ce5f27167ba1d07599e429360c21f Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Fri, 23 Jan 2015 17:16:30 -0800 Subject: [PATCH 142/502] releasetools: Add radio images to fastboot packages Fastboot packages should include radio images, if they exist. Also generate a flash-radio.sh file if a filesmap file exists to indicate the partition that a radio image should be flashed to. Change-Id: I8f603b1509a5c1b55fee1cb6f6a49a7efb8cc594 --- tools/releasetools/img_from_target_files.py | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index aa21d7eab9f..fac5ab6dec9 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -47,6 +47,31 @@ def CopyInfo(output_zip): output_zip, os.path.join(OPTIONS.input_tmp, "OTA", "android-info.txt"), "android-info.txt") +def AddRadio(output_zip): + """If they exist, add RADIO files to the output.""" + if os.path.isdir(os.path.join(OPTIONS.input_tmp, "RADIO")): + for radio_root, radio_dirs, radio_files in os.walk(os.path.join(OPTIONS.input_tmp, "RADIO")): + for radio_file in radio_files: + output_zip.write(os.path.join(radio_root, radio_file), radio_file) + + # If a filesmap file exists, create a script to flash the radio images based on it + filesmap = os.path.join(OPTIONS.input_tmp, "RADIO/filesmap") + if os.path.isfile(filesmap): + print "creating flash-radio.sh..." + filesmap_data = open(filesmap, "r") + filesmap_regex = re.compile(r'^(\S+)\s\S+\/by-name\/(\S+).*') + tmp_flash_radio = tempfile.NamedTemporaryFile() + tmp_flash_radio.write("#!/bin/sh\n\n") + for filesmap_line in filesmap_data: + filesmap_entry = filesmap_regex.search(filesmap_line) + if filesmap_entry: + tmp_flash_radio.write("fastboot flash %s %s\n" % (filesmap_entry.group(2), filesmap_entry.group(1))) + tmp_flash_radio.flush() + if os.path.getsize(tmp_flash_radio.name) > 0: + output_zip.write(tmp_flash_radio.name, "flash-radio.sh") + else: + print "flash-radio.sh is empty, skipping..." + tmp_flash_radio.close() def main(argv): bootable_only = [False] @@ -72,6 +97,7 @@ def option_handler(o, _): OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0]) output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED) CopyInfo(output_zip) + AddRadio(output_zip) try: done = False From c8a7d16cdbe5a5ea068c526b3f90de899e6c919a Mon Sep 17 00:00:00 2001 From: Marco Brohet Date: Sat, 28 Dec 2013 18:11:52 +0100 Subject: [PATCH 143/502] build: Add support for Asturian Change-Id: If666c8390b3c095c16e66df777c67a46511f4916 --- target/product/languages_full.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk index 98d8c3ce90a..da0c665c358 100644 --- a/target/product/languages_full.mk +++ b/target/product/languages_full.mk @@ -22,3 +22,6 @@ # These are all the locales that have translations and are displayable # by TextView in this branch. PRODUCT_LOCALES := en_US en_AU en_IN fr_FR it_IT es_ES et_EE de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN zh_HK ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA am_ET en_XA ar_XB fr_CA km_KH lo_LA ne_NP si_LK mn_MN hy_AM az_AZ ka_GE my_MM mr_IN ml_IN is_IS mk_MK ky_KG eu_ES gl_ES bn_BD ta_IN kn_IN te_IN uz_UZ ur_PK kk_KZ sq_AL gu_IN pa_IN be_BY bs_BA + +# CyanogenMod +PRODUCT_LOCALES += ast_ES From d7a5051692039aac05226deab319ff1fbc43af61 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 30 Mar 2014 01:13:25 +0200 Subject: [PATCH 144/502] build: Add support for Luxembourgish Change-Id: I0fb6d8f8a33f209d5593f133c2e891fe9be102c2 --- target/product/languages_full.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk index da0c665c358..bfb84788cb3 100644 --- a/target/product/languages_full.mk +++ b/target/product/languages_full.mk @@ -24,4 +24,4 @@ PRODUCT_LOCALES := en_US en_AU en_IN fr_FR it_IT es_ES et_EE de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN zh_HK ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA am_ET en_XA ar_XB fr_CA km_KH lo_LA ne_NP si_LK mn_MN hy_AM az_AZ ka_GE my_MM mr_IN ml_IN is_IS mk_MK ky_KG eu_ES gl_ES bn_BD ta_IN kn_IN te_IN uz_UZ ur_PK kk_KZ sq_AL gu_IN pa_IN be_BY bs_BA # CyanogenMod -PRODUCT_LOCALES += ast_ES +PRODUCT_LOCALES += ast_ES lb_LU From a9d853d0f163d7388b44e2104058a58a8f76e119 Mon Sep 17 00:00:00 2001 From: Konsta Date: Thu, 22 Jan 2015 20:05:00 +0200 Subject: [PATCH 145/502] build: Remove OpenWnn IME from target config Change-Id: Ic34caa26bf53fc882e685794844ecfa27519e580 --- target/product/full_base.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/target/product/full_base.mk b/target/product/full_base.mk index d0c6ca1d0b4..bac3e030f47 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -21,10 +21,6 @@ PRODUCT_PACKAGES := \ libfwdlockengine \ - OpenWnn \ - libWnnEngDic \ - libWnnJpnDic \ - libwnndict \ WAPPushManager # Put en_US first in the list, so make it default. From 05fc6cabe973853f2045185327cc3888013e9cd8 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 2 Feb 2015 00:11:06 +0200 Subject: [PATCH 146/502] build: Add support for Kurdish Change-Id: I1bc7638ff92b61be6c3212dbd5a3f1c354093458 --- target/product/languages_full.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk index bfb84788cb3..ddc1c7f21f4 100644 --- a/target/product/languages_full.mk +++ b/target/product/languages_full.mk @@ -24,4 +24,4 @@ PRODUCT_LOCALES := en_US en_AU en_IN fr_FR it_IT es_ES et_EE de_DE nl_NL cs_CZ pl_PL ja_JP zh_TW zh_CN zh_HK ru_RU ko_KR nb_NO es_US da_DK el_GR tr_TR pt_PT pt_BR sv_SE bg_BG ca_ES en_GB fi_FI hi_IN hr_HR hu_HU in_ID iw_IL lt_LT lv_LV ro_RO sk_SK sl_SI sr_RS uk_UA vi_VN tl_PH ar_EG fa_IR th_TH sw_TZ ms_MY af_ZA zu_ZA am_ET en_XA ar_XB fr_CA km_KH lo_LA ne_NP si_LK mn_MN hy_AM az_AZ ka_GE my_MM mr_IN ml_IN is_IS mk_MK ky_KG eu_ES gl_ES bn_BD ta_IN kn_IN te_IN uz_UZ ur_PK kk_KZ sq_AL gu_IN pa_IN be_BY bs_BA # CyanogenMod -PRODUCT_LOCALES += ast_ES lb_LU +PRODUCT_LOCALES += ast_ES lb_LU ku_IQ From 971f88459161cca4ec4b21d08ae6be7a60e2e587 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Tue, 10 Feb 2015 23:58:10 +0000 Subject: [PATCH 147/502] Revert "Add handheld_core_hardware.xml to telephony base" Don't do this. handheld_core_hardware.xml includes feature declarations that aren't mandatory, particularly cameras and magnetometers, but also things like managed users. According to the CDD, these are optional. Go back to the pre-L mechanism of including the declarations per-device to make them accurate. This reverts commit dccce7bbe9673d4b8ce1a3559182767f926e1ff8. Conflicts: target/product/full_base_telephony.mk Change-Id: I6db55082295171b78fe595e783799ee54458c4fd --- target/product/full_base_telephony.mk | 3 --- 1 file changed, 3 deletions(-) diff --git a/target/product/full_base_telephony.mk b/target/product/full_base_telephony.mk index 4d6fce7a63a..7988e9b777d 100644 --- a/target/product/full_base_telephony.mk +++ b/target/product/full_base_telephony.mk @@ -22,8 +22,5 @@ PRODUCT_PROPERTY_OVERRIDES := \ keyguard.no_require_sim=true -PRODUCT_COPY_FILES := \ - frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml - $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony.mk) From 3c6d06348b722525193716699b13d5710b74c731 Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Tue, 19 Jun 2012 18:39:41 -0700 Subject: [PATCH 148/502] add unpackbootimg to otatools Change-Id: I4e294c05eacc8bef8273247bcf1bf382291a3d31 --- core/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/core/Makefile b/core/Makefile index c68ad1b1896..d620b4f9ed1 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1582,6 +1582,7 @@ OTATOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ $(HOST_OUT_EXECUTABLES)/adb \ $(HOST_OUT_EXECUTABLES)/mkbootfs \ $(HOST_OUT_EXECUTABLES)/mkbootimg \ + $(HOST_OUT_EXECUTABLES)/unpackbootimg \ $(HOST_OUT_EXECUTABLES)/fs_config \ $(HOST_OUT_EXECUTABLES)/zipalign \ $(HOST_OUT_EXECUTABLES)/bsdiff \ From c25c90aa7b83588b0e2a7199eb894c6a9269b79f Mon Sep 17 00:00:00 2001 From: Marcos Marado Date: Tue, 13 Jan 2015 15:14:28 +0000 Subject: [PATCH 149/502] dopush only tries to push if its arg doesn't fail `dopush mm`, as an example, tried to do mm, ignored its result, and went to push. Now, it does mm, and if mm exits successfully it continues to push the results, but if mm fails dopush stops, returning mm's return code. This is useful for having things like: $ mmp && adb reboot which now reboot the device weather the changes were pushed or not. With this patch, the device will only get rebooted if the compilation succeeds. Change-Id: I001e3dd83e25a775919adbccbd49914da1e94cde --- envsetup.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 2cfe1928d00..51a3d317b69 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2263,7 +2263,11 @@ function dopush() adb remount &> /dev/null mkdir -p $OUT - $func $* | tee $OUT/.log + ($func $*|tee $OUT/.log;return ${PIPESTATUS[0]}) + ret=$?; + if [ $ret -ne 0 ]; then + rm -f $OUT/.log;return $ret + fi # Install: LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" From 24ae0c27393dc34dc67a21bf9126de2cd2f14c0c Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 19 Feb 2015 14:29:21 +0200 Subject: [PATCH 150/502] Don't enable ADB by default on userdebug builds Change-Id: I33ae5c6f2787017a62e679aa0c28d4b909d45935 --- tools/post_process_props.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 0ba7464dc91..55491d32e09 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -40,9 +40,8 @@ def mangle_build_prop(prop, overrides): # Put the modifications that you need to make into the /default.prop into this # function. The prop object has get(name) and put(name,value) methods. def mangle_default_prop(prop): - # If ro.debuggable is 1, then enable adb on USB by default - # (this is for userdebug builds) - if prop.get("ro.debuggable") == "1": + # If ro.build.type is eng, then enable adb on USB by default + if prop.get("ro.build.type") == "eng": val = prop.get("persist.sys.usb.config") if "adb" not in val: if val == "": From 671dba1a07bd7ebff1626569dfd739f15160db39 Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Thu, 26 Feb 2015 10:51:44 -0800 Subject: [PATCH 151/502] Enable ADB by default when ro.adb.secure is not 1 * Property ro.build.type is not part of the default.prop we can't use this to decide how to apply adb by default within this function Change-Id: Ib3eb24c655353966d64c7148d7530244b628ce94 --- tools/post_process_props.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 55491d32e09..940dd9b378b 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -40,8 +40,9 @@ def mangle_build_prop(prop, overrides): # Put the modifications that you need to make into the /default.prop into this # function. The prop object has get(name) and put(name,value) methods. def mangle_default_prop(prop): - # If ro.build.type is eng, then enable adb on USB by default - if prop.get("ro.build.type") == "eng": + # If ro.adb.secure is not 1, then enable adb on USB by default + # (this is for eng builds) + if prop.get("ro.adb.secure") != "1": val = prop.get("persist.sys.usb.config") if "adb" not in val: if val == "": From ca65cbeab1a81924818df86e87b431713009ad8c Mon Sep 17 00:00:00 2001 From: David Ng Date: Fri, 27 Jul 2012 18:39:48 -0700 Subject: [PATCH 152/502] build: Add support for device tree in boot.img Add support for optional device tree image (dt.img) to boot and recovery images. Some devices use kernel device tree and this adds the device tree image as a section within the boot/recovery images. Change-Id: I91431ef2f4b86485895678916e39a8572be878eb --- core/Makefile | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index d620b4f9ed1..2b743a1958b 100644 --- a/core/Makefile +++ b/core/Makefile @@ -552,6 +552,11 @@ INTERNAL_MKBOOTIMG_VERSION_ARGS := \ --os_version $(PLATFORM_VERSION) \ --os_patch_level $(PLATFORM_SECURITY_PATCH) +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET) + BOOTIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET) +endif + INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img # BOARD_USES_RECOVERY_AS_BOOT = true must have BOARD_BUILD_SYSTEM_ROOT_IMAGE = true. @@ -600,7 +605,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) else # PRODUCT_SUPPORTS_VBOOT != true -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOTIMAGE_EXTRA_DEPS) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) @@ -976,6 +981,10 @@ BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE)) ifdef BOARD_KERNEL_PAGESIZE INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) endif +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + INTERNAL_RECOVERYIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET) + RECOVERYIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET) +endif # Keys authorized to sign OTA packages this build will accept. The # build always uses dev-keys for this; release packaging tools will @@ -1092,7 +1101,8 @@ $(recovery_ramdisk): $(MINIGZIP) \ $(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $@ ifndef BOARD_CUSTOM_BOOTIMG_MK -$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) +$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) \ + $(RECOVERYIMAGE_EXTRA_DEPS) @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} $(call build-recoveryimage-target, $@) endif # BOARD_CUSTOM_BOOTIMG_MK From 73eeb9e86de25b85b5911fd1a7359472ac76dfe7 Mon Sep 17 00:00:00 2001 From: Sreedhar Date: Wed, 11 Dec 2013 23:16:12 +0530 Subject: [PATCH 153/502] Build: add DT image variable to Makefile DT image variable is currently present in generate_extra_images.mk.This file is moved to build/tasks to support persist image generation during parallel make. As build/tasks is called at the end of Makefile, DT image variable is not available for other images generation like boot and recovery. Adding this variable in Makefile ensures the variable is defined before usage Change-Id: I21f675d8ce648dc1cf1f4f3aede33278300e08c9 CRs-fixed: 548299 --- core/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/Makefile b/core/Makefile index 2b743a1958b..0b6b87cf722 100644 --- a/core/Makefile +++ b/core/Makefile @@ -552,6 +552,8 @@ INTERNAL_MKBOOTIMG_VERSION_ARGS := \ --os_version $(PLATFORM_VERSION) \ --os_patch_level $(PLATFORM_SECURITY_PATCH) +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET) BOOTIMAGE_EXTRA_DEPS := $(INSTALLED_DTIMAGE_TARGET) From 774ffb16fc1116f41f9d7cbe241e1ca1862e80e8 Mon Sep 17 00:00:00 2001 From: Ameya Thakur Date: Wed, 24 Oct 2012 19:31:42 -0700 Subject: [PATCH 154/502] Fix case where boot/recovery.img were being built with wrong params. The boot and recovery images now get built using the same params during ota package generation as during a normal build. Change-Id: I93d46e11a4245288f0e87c87a2e4bf45ac5aff69 --- core/Makefile | 19 +++++++++++++++++++ tools/releasetools/common.py | 15 +++++++++++++++ 2 files changed, 34 insertions(+) mode change 100644 => 100755 tools/releasetools/common.py diff --git a/core/Makefile b/core/Makefile index 0b6b87cf722..f907f618b33 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1789,6 +1789,15 @@ endif ifdef BOARD_KERNEL_PAGESIZE $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize endif +ifdef BOARD_KERNEL_TAGS_ADDR + $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/RECOVERY/tagsaddr +endif +ifdef BOARD_RAMDISK_OFFSET + $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/RECOVERY/ramdisk_offset +endif +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + $(hide) echo "$(INSTALLED_DTIMAGE_TARGET)" > $(zip_root)/RECOVERY/dt_args +endif endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true @# Components of the boot image $(hide) mkdir -p $(zip_root)/BOOT @@ -1818,6 +1827,16 @@ endif ifdef BOARD_KERNEL_PAGESIZE $(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/BOOT/pagesize endif +ifdef BOARD_KERNEL_TAGS_ADDR + $(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/BOOT/tagsaddr +endif +ifdef BOARD_RAMDISK_OFFSET + $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/BOOT/ramdisk_offset +endif + +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) + $(hide) echo "$(INSTALLED_DTIMAGE_TARGET)" > $(zip_root)/BOOT/dt_args +endif ifdef ZIP_SAVE_UBOOTIMG_ARGS $(hide) echo "$(ZIP_SAVE_UBOOTIMG_ARGS)" > $(zip_root)/BOOT/ubootargs endif diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py old mode 100644 new mode 100755 index 29e592bff4b..20045d09f07 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -463,6 +463,21 @@ def make_ramdisk(): cmd.append("--base") cmd.append(open(fn).read().rstrip("\n")) + fn = os.path.join(sourcedir, "tagsaddr") + if os.access(fn, os.F_OK): + cmd.append("--tags-addr") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "ramdisk_offset") + if os.access(fn, os.F_OK): + cmd.append("--ramdisk_offset") + cmd.append(open(fn).read().rstrip("\n")) + + fn = os.path.join(sourcedir, "dt_args") + if os.access(fn, os.F_OK): + cmd.append("--dt") + cmd.append(open(fn).read().rstrip("\n")) + fn = os.path.join(sourcedir, "pagesize") if os.access(fn, os.F_OK): cmd.append("--pagesize") From d4b935d31f16937e28ad128f7da6520be9c4c816 Mon Sep 17 00:00:00 2001 From: AUDITYA BHATTARAM Date: Tue, 5 Aug 2014 11:08:15 +0530 Subject: [PATCH 155/502] Fix the extra dt.img compilation issue. Add support for optional device tree image (dt.img) for device that doesnt have TARGET_BOOTIMAGE_USE_EXT2 Change-Id: I6e07b3ca6d049a8ebdad7ea304b4f39e7c846151 --- core/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index f907f618b33..df34aba6d2a 100644 --- a/core/Makefile +++ b/core/Makefile @@ -592,7 +592,7 @@ else ifndef BOARD_CUSTOM_BOOTIMG_MK ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)) # PRODUCT_SUPPORTS_BOOT_SIGNER != true -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_SIGNER) $(BOOTIMAGE_EXTRA_DEPS) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@ From cbd33a99090be9a62de0627e196f5bdb9450e096 Mon Sep 17 00:00:00 2001 From: Ameya Thakur Date: Mon, 29 Jul 2013 17:39:37 -0700 Subject: [PATCH 156/502] build: Add changes to release tools and mkbootimg Change the prototype of LoadRecoveryFstab to take in the device type as a argument. Fix the case where mkbootimg was being passed a incorrect argument. Change-Id: Ic6ac596d8d96d3a5effbdf513763ec1cb92b1a03 --- core/Makefile | 7 +++++++ tools/releasetools/common.py | 12 ++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index df34aba6d2a..e0989dd9335 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1780,6 +1780,9 @@ ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) $(ACP) \ $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second endif +ifdef BOARD_KERNEL_TAGS_OFFSET + $(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/RECOVERY/tags_offset +endif ifdef BOARD_KERNEL_CMDLINE $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline endif @@ -1818,6 +1821,10 @@ ifdef INSTALLED_2NDBOOTLOADER_TARGET $(hide) $(ACP) \ $(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second endif + +ifdef BOARD_KERNEL_TAGS_OFFSET + $(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/BOOT/tags_offset +endif ifdef BOARD_KERNEL_CMDLINE $(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline endif diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 20045d09f07..216fc05144f 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -230,6 +230,9 @@ def read_helper(fn): vendor_base_fs_file,) del d["vendor_base_fs_file"] + + if "device_type" not in d: + d["device_type"] = "MMC" try: data = read_helper("META/imagesizes.txt") for line in data.split("\n"): @@ -263,7 +266,7 @@ def makeint(key): d["fstab"] = None else: d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], - d.get("system_root_image", False)) + d.get("system_root_image", d["device_type"], False)) d["build.prop"] = LoadBuildProp(read_helper) return d @@ -286,7 +289,7 @@ def LoadDictionaryFromLines(lines): d[name] = value return d -def LoadRecoveryFSTab(read_helper, fstab_version, system_root_image=False): +def LoadRecoveryFSTab(read_helper, fstab_version, type, system_root_image=False): class Partition(object): def __init__(self, mount_point, fs_type, device, length, device2, context): self.mount_point = mount_point @@ -468,6 +471,11 @@ def make_ramdisk(): cmd.append("--tags-addr") cmd.append(open(fn).read().rstrip("\n")) + fn = os.path.join(sourcedir, "tags_offset") + if os.access(fn, os.F_OK): + cmd.append("--tags_offset") + cmd.append(open(fn).read().rstrip("\n")) + fn = os.path.join(sourcedir, "ramdisk_offset") if os.access(fn, os.F_OK): cmd.append("--ramdisk_offset") From 975df6406edc0207206aa7b237ead2142a5b9f54 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Sun, 22 Feb 2015 15:14:26 -0800 Subject: [PATCH 157/502] releasetools: Store and use the dt image file through target files Target files packages may be used for signing images separate from the build process. Store the device tree image file in the target files package so it can be used during the signing process. Change-Id: Ie8507121fa9c4ba57ecffeab05bd859ae5f5b788 --- core/Makefile | 4 ++-- tools/releasetools/common.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/Makefile b/core/Makefile index e0989dd9335..9da96951d63 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1799,7 +1799,7 @@ ifdef BOARD_RAMDISK_OFFSET $(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/RECOVERY/ramdisk_offset endif ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) - $(hide) echo "$(INSTALLED_DTIMAGE_TARGET)" > $(zip_root)/RECOVERY/dt_args + $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/RECOVERY/dt endif endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true @# Components of the boot image @@ -1842,7 +1842,7 @@ ifdef BOARD_RAMDISK_OFFSET endif ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) - $(hide) echo "$(INSTALLED_DTIMAGE_TARGET)" > $(zip_root)/BOOT/dt_args + $(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/BOOT/dt endif ifdef ZIP_SAVE_UBOOTIMG_ARGS $(hide) echo "$(ZIP_SAVE_UBOOTIMG_ARGS)" > $(zip_root)/BOOT/ubootargs diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 216fc05144f..7291744545e 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -481,10 +481,10 @@ def make_ramdisk(): cmd.append("--ramdisk_offset") cmd.append(open(fn).read().rstrip("\n")) - fn = os.path.join(sourcedir, "dt_args") + fn = os.path.join(sourcedir, "dt") if os.access(fn, os.F_OK): cmd.append("--dt") - cmd.append(open(fn).read().rstrip("\n")) + cmd.append(fn) fn = os.path.join(sourcedir, "pagesize") if os.access(fn, os.F_OK): From 55c5936b8f75a18ba1ee770de8a9beb2e9463050 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Sun, 22 Feb 2015 23:23:13 -0800 Subject: [PATCH 158/502] releasetools: Add bootable image signing Set PRODUCT_PRIVATE_KEY to the path of the boot image signing certificate to sign an image for secure boot. Change-Id: I2c767c6f9c3740bed3d7094d2d0b50a075e08abc --- tools/releasetools/common.py | 40 +++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 7291744545e..ecb17ac3d5d 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -432,6 +432,7 @@ def make_ramdisk(): info_dict = OPTIONS.info_dict img = tempfile.NamedTemporaryFile() + bootimg_key = os.getenv("PRODUCT_PRIVATE_KEY", None) if has_ramdisk: ramdisk_img = make_ramdisk() @@ -488,8 +489,9 @@ def make_ramdisk(): fn = os.path.join(sourcedir, "pagesize") if os.access(fn, os.F_OK): + kernel_pagesize = open(fn).read().rstrip("\n") cmd.append("--pagesize") - cmd.append(open(fn).read().rstrip("\n")) + cmd.append(kernel_pagesize) args = info_dict.get("mkbootimg_args", None) if args and args.strip(): @@ -514,6 +516,42 @@ def make_ramdisk(): assert p.returncode == 0, "mkbootimg of %s image failed" % ( os.path.basename(sourcedir),) + if bootimg_key and os.path.exists(bootimg_key) and kernel_pagesize > 0: + print "Signing bootable image..." + bootimg_key_passwords = {} + bootimg_key_passwords.update(PasswordManager().GetPasswords(bootimg_key.split())) + bootimg_key_password = bootimg_key_passwords[bootimg_key] + if bootimg_key_password is not None: + bootimg_key_password += "\n" + img_sha256 = tempfile.NamedTemporaryFile() + img_sig = tempfile.NamedTemporaryFile() + img_sig_padded = tempfile.NamedTemporaryFile() + img_secure = tempfile.NamedTemporaryFile() + p = Run(["openssl", "dgst", "-sha256", "-binary", "-out", img_sha256.name, img.name], + stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["openssl", "rsautl", "-sign", "-in", img_sha256.name, "-inkey", bootimg_key, "-out", + img_sig.name, "-passin", "stdin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) + p.communicate(bootimg_key_password) + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["dd", "if=/dev/zero", "of=%s" % img_sig_padded.name, "bs=%s" % kernel_pagesize, + "count=1"], stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["dd", "if=%s" % img_sig.name, "of=%s" % img_sig_padded.name, "conv=notrunc"], + stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + p = Run(["cat", img.name, img_sig_padded.name], stdout=img_secure.file.fileno()) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + shutil.copyfile(img_secure.name, img.name) + img_sha256.close() + img_sig.close() + img_sig_padded.close() + img_secure.close() + if (info_dict.get("boot_signer", None) == "true" and info_dict.get("verity_key", None)): path = "/" + os.path.basename(sourcedir).lower() From 99af81283f6e6ce650df8eb172f95d8c1ec43b50 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Tue, 10 Mar 2015 18:58:23 -0700 Subject: [PATCH 159/502] build: Update install tools packaging for target-files support Modifies "build: ota: Support for install tools in /tmp/install" to support signing steps being split from build steps. Package install files into target-files INSTALL path Read from target-files for OTA package creation Change-Id: I64f919c2a757b5474f6cc5f82bd6c33c2a8b558a --- core/Makefile | 2 ++ tools/releasetools/ota_from_target_files.py | 13 ++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/Makefile b/core/Makefile index 9da96951d63..f2c716d7b07 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1773,6 +1773,8 @@ ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_ $(hide) mkdir -p $(zip_root)/$(PRIVATE_RECOVERY_OUT) $(hide) $(call package_files-copy-root, \ $(TARGET_RECOVERY_ROOT_OUT),$(zip_root)/$(PRIVATE_RECOVERY_OUT)/RAMDISK) + @# OTA install helpers + $(hide) $(call package_files-copy-root, $(OUT)/install, $(zip_root)/INSTALL) ifdef INSTALLED_KERNEL_TARGET $(hide) $(ACP) $(INSTALLED_KERNEL_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/kernel endif diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index ca2a02fc1c1..e084755d0c3 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -540,13 +540,12 @@ def GetImage(which, tmpdir, info_dict): def CopyInstallTools(output_zip): - oldcwd = os.getcwd() - os.chdir(os.getenv('OUT')) - for root, subdirs, files in os.walk("install"): - for f in files: - p = os.path.join(root, f) - output_zip.write(p, p) - os.chdir(oldcwd) + install_path = os.path.join(OPTIONS.input_tmp, "INSTALL") + for root, subdirs, files in os.walk(install_path): + for f in files: + install_source = os.path.join(root, f) + install_target = os.path.join("install", os.path.relpath(root, install_path), f) + output_zip.write(install_source, install_target) def WriteFullOTAPackage(input_zip, output_zip): From 57da7c646bc8bfe3bb314ac68aaa87384e0bdd3c Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sun, 28 Sep 2014 01:55:24 +0100 Subject: [PATCH 160/502] Add support for mediatek platforms This includes optional support for building the kernel with mediatek's build system, which is usually included with OEM source drops for this platform. (enabled by BOARD_USES_MTK_KERNELBUILD:=true) Change-Id: I69fb50aa17d9c171bf8a7c220a0707c4bc570733 kernel: remove support for unused MTK Kernel Remove unused MTK kernel build support. Change-Id: I4f4df078ae03b1bd5edc7000e5b942bfc05c02bd --- core/main.mk | 3 +++ core/mtk_utils.mk | 5 +++++ 2 files changed, 8 insertions(+) create mode 100755 core/mtk_utils.mk diff --git a/core/main.mk b/core/main.mk index a6893561b8b..175f0c6863e 100644 --- a/core/main.mk +++ b/core/main.mk @@ -144,6 +144,9 @@ include $(BUILD_SYSTEM)/cleanbuild.mk # Bring in Qualcomm helper macros include $(BUILD_SYSTEM)/qcom_utils.mk +# Bring in Mediatek helper macros too +include $(BUILD_SYSTEM)/mtk_utils.mk + # Include the google-specific config -include vendor/google/build/config.mk diff --git a/core/mtk_utils.mk b/core/mtk_utils.mk new file mode 100755 index 00000000000..48fd6605443 --- /dev/null +++ b/core/mtk_utils.mk @@ -0,0 +1,5 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +MTK_BOARD_PLATFORMS := mt6592 +MTK_BOARD_PLATFORMS += mt6582 +MTK_BOARD_PLATFORMS += mt6572 From ac34b8cf4deb9884037604a52065048da83258b8 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Wed, 25 Mar 2015 18:14:46 -0700 Subject: [PATCH 161/502] releasetools: add compatibility for full ota functions with incrementals Some device-specific releasetool functions may expect that input_zip and input_version are set. For incremental OTAs, target_zip and target_version are set instead. Set input_zip=target_zip and input_version=target_version to add compatibility with these functions. Change-Id: I6a04f67440618d3652396656cc1fe223d4a6b195 --- tools/releasetools/ota_from_target_files.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index e084755d0c3..816ccbfda2d 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -893,7 +893,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): source_zip=source_zip, source_version=source_version, target_zip=target_zip, + input_zip=target_zip, target_version=target_version, + input_version=target_version, output_zip=output_zip, script=script, metadata=metadata, @@ -1557,7 +1559,9 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): source_zip=source_zip, source_version=source_version, target_zip=target_zip, + input_zip=target_zip, target_version=target_version, + input_version=target_version, output_zip=output_zip, script=script, metadata=metadata, From 90027907de5add89f5f92f7886a0d34e256c4e66 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 26 Mar 2015 16:32:34 -0700 Subject: [PATCH 162/502] ota_from_target_files: Fix path for SkipNextActionIfTargetExists Without the leading forward slash, the check always fails. Change-Id: I57320c20ca2b384713182082b1ad5321d78dbb2b --- tools/releasetools/ota_from_target_files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 816ccbfda2d..5194c4cefb6 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -1438,7 +1438,7 @@ def EmitVerification(self, script): so_far = 0 for tf, sf, _, _ in self.patch_list: if tf.name != sf.name: - script.SkipNextActionIfTargetExists(tf.name, tf.sha1) + script.SkipNextActionIfTargetExists("/" + tf.name, tf.sha1) script.PatchCheck("/"+sf.name, tf.sha1, sf.sha1) so_far += sf.size return so_far @@ -1470,7 +1470,7 @@ def EmitPatches(self, script, total_patch_size, so_far): deferred_patch_list.append(item) continue if sf.name != tf.name: - script.SkipNextActionIfTargetExists(tf.name, tf.sha1) + script.SkipNextActionIfTargetExists("/" + tf.name, tf.sha1) script.ApplyPatch("/" + sf.name, "-", tf.size, tf.sha1, sf.sha1, "patch/" + sf.name + ".p") so_far += tf.size From 14f0bd0dc53d9e6ac351e7fd228fb6336f5d0c01 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Fri, 27 Mar 2015 20:53:59 -0700 Subject: [PATCH 163/502] ota: Include full boot images when imgdiff fails When generating a non-block based incremental, inclue the full boot image when imgdiff fails to generate a patch. This logic is already used for block based incrementals. Change-Id: Idae484ea8c2553a3480961dfa413724e61c52e5f --- tools/releasetools/ota_from_target_files.py | 53 ++++++++++++--------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 5194c4cefb6..aa3547e39fa 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -1681,20 +1681,24 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): size.append(vendor_diff.largest_source_size) if updating_boot: + boot_type, boot_device = common.GetTypeAndDevice("/boot", OPTIONS.info_dict) d = common.Difference(target_boot, source_boot) _, _, d = d.ComputePatch() - print "boot target: %d source: %d diff: %d" % ( - target_boot.size, source_boot.size, len(d)) + if d is None: + include_full_boot = True + common.ZipWriteStr(output_zip, "boot.img", target_boot.data) + else: + include_full_boot = False - common.ZipWriteStr(output_zip, "patch/boot.img.p", d) + print "boot target: %d source: %d diff: %d" % ( + target_boot.size, source_boot.size, len(d)) - boot_type, boot_device = common.GetTypeAndDevice( - "/boot", OPTIONS.source_info_dict) + common.ZipWriteStr(output_zip, "patch/boot.img.p", d) - script.PatchCheck("%s:%s:%d:%s:%d:%s" % - (boot_type, boot_device, - source_boot.size, source_boot.sha1, - target_boot.size, target_boot.sha1)) + script.PatchCheck("%s:%s:%d:%s:%d:%s" % + (boot_type, boot_device, + source_boot.size, source_boot.sha1, + target_boot.size, target_boot.sha1)) so_far += source_boot.size size.append(target_boot.size) @@ -1740,20 +1744,23 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): if not OPTIONS.two_step: if updating_boot: - # Produce the boot image by applying a patch to the current - # contents of the boot partition, and write it back to the - # partition. - script.Print("Patching boot image...") - script.ApplyPatch("%s:%s:%d:%s:%d:%s" - % (boot_type, boot_device, - source_boot.size, source_boot.sha1, - target_boot.size, target_boot.sha1), - "-", - target_boot.size, target_boot.sha1, - source_boot.sha1, "patch/boot.img.p") - so_far += target_boot.size - script.SetProgress(so_far / total_patch_size) - print "boot image changed; including." + if include_full_boot: + print "boot image changed; including full." + script.Print("Installing boot image...") + script.WriteRawImage("/boot", "boot.img") + else: + # Produce the boot image by applying a patch to the current + # contents of the boot partition, and write it back to the + # partition. + print "boot image changed; including patch." + script.Print("Patching boot image...") + script.ApplyPatch("%s:%s:%d:%s:%d:%s" + % (boot_type, boot_device, + source_boot.size, source_boot.sha1, + target_boot.size, target_boot.sha1), + "-", + target_boot.size, target_boot.sha1, + source_boot.sha1, "patch/boot.img.p") else: print "boot image unchanged; skipping." From 386f9e1767b583d908e1aac83032ec291ebe1958 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Wed, 15 Apr 2015 12:00:43 -0700 Subject: [PATCH 164/502] build/core: Define find-other-aidl-files. Useful when utilizing relative paths that mention external projects. Mimics find-other-java-files, etc. Change-Id: I3df67f4f35a931facbb1de76936936b092a42bb2 --- core/definitions.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/definitions.mk b/core/definitions.mk index 2b7f952ff3c..dc144891677 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -438,6 +438,10 @@ define find-other-java-files $(call all-java-files-under,$(1)) endef +define find-other-aidl-files + $(call find-subdir-files,$(1) -name "*.aidl" -and -not -name ".*") +endef + define find-other-html-files $(call all-html-files-under,$(1)) endef From d3f7ff7e6ffebd90e9ced30e9a9bf8dfff15b3cf Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Mon, 20 Apr 2015 10:40:21 -0700 Subject: [PATCH 165/502] Colorize more target file output Change-Id: I25aee19e9a5a06eeeaa4040803c064a140a86778 --- core/dex_preopt_odex_install.mk | 2 +- core/prebuilt_internal.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 4e486d52a10..27f70d1c1f8 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -106,7 +106,7 @@ $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) $(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_odex))) \ : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ | $(ACP) - @echo "Install: $@" + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-target) endif diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index ee68427541c..54f74f222f4 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -291,7 +291,7 @@ $(built_apk_splits) : $(built_module_path)/%.apk : $(my_src_dir)/%.apk | $(ACP) # Rules to install the split apks. $(installed_apk_splits) : $(my_module_path)/%.apk : $(built_module_path)/%.apk | $(ACP) - @echo "Install: $@" + @echo -e ${CL_CYN}"Install: $@"${CL_RST} $(copy-file-to-new-target) # Register the additional built and installed files. From 6edf055b9d18e00d7e747b24cf0edd5344aa23b5 Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Mon, 2 Jun 2014 16:49:59 -0700 Subject: [PATCH 166/502] Generate extra userdata partition if needed * To support variants of devices which may come in 16/32/64GB variants. Change-Id: I74c32d8316f0450a1445fe95a95e5cabb7a9dd1b (cherry picked from commit aae837f9cbcff739cb660016a6d1abd7ef4663db) --- core/Makefile | 2 + core/generate_extra_images.mk | 28 ++++++++++++++ tools/releasetools/add_img_to_target_files.py | 38 +++++++++++++++++++ tools/releasetools/build_image.py | 13 ++++++- tools/releasetools/common.py | 2 + 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index f2c716d7b07..91856d573fb 100644 --- a/core/Makefile +++ b/core/Makefile @@ -836,6 +836,8 @@ $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "system_squashf $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),$(hide) echo "system_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)" >> $(1)) $(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),$(hide) echo "userdataextra_size=$(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME),$(hide) echo "userdataextra_name=$(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME)" >> $(1)) $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk index eaa52aba685..e4648164679 100644 --- a/core/generate_extra_images.mk +++ b/core/generate_extra_images.mk @@ -9,6 +9,7 @@ # variables again. INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img +INSTALLED_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img #---------------------------------------------------------------------- # Generate secure boot & recovery image @@ -112,6 +113,33 @@ ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) endif +#---------------------------------------------------------------------- +# Generate extra userdata images (for variants with multiple mmc sizes) +#---------------------------------------------------------------------- +ifneq ($(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),) + +ifndef BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME + BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME := extra +endif + +BUILT_USERDATAEXTRAIMAGE_TARGET := $(PRODUCT_OUT)/userdata_$(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME).img + +define build-userdataextraimage-target + $(call pretty,"Target EXTRA userdata fs image: $(INSTALLED_USERDATAEXTRAIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_DATA) + $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_DATA) $@ ext4 data $(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE) + $(hide) chmod a+r $@ + $(hide) $(call assert-max-image-size,$@,$(BOARD_USERDATAEXTRAIMAGE_PARTITION_SIZE),yaffs) +endef + +INSTALLED_USERDATAEXTRAIMAGE_TARGET := $(BUILT_USERDATAEXTRAIMAGE_TARGET) +$(INSTALLED_USERDATAEXTRAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET) + $(build-userdataextraimage-target) + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_USERDATAEXTRAIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_USERDATAEXTRAIMAGE_TARGET) + +endif .PHONY: aboot aboot: $(INSTALLED_BOOTLOADER_MODULE) diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 7cb90726033..8697f8378f6 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -211,6 +211,42 @@ def AddUserdata(output_zip, prefix="IMAGES/"): shutil.rmtree(temp_dir) +def AddUserdataExtra(output_zip): + """Create extra userdata image and store it in output_zip.""" + + image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, + "data_extra") + # If no userdataextra_size is provided for extfs, skip userdata_extra.img. + if (image_props.get("fs_type", "").startswith("ext") and + not image_props.get("partition_size")): + return + + extra_name = image_props.get("partition_name", "extra") + + print "creating userdata_%s.img..." % extra_name + + # The name of the directory it is making an image out of matters to + # mkyaffs2image. So we create a temp dir, and within it we create an + # empty dir named "data", and build the image from that. + temp_dir = tempfile.mkdtemp() + user_dir = os.path.join(temp_dir, "data") + os.mkdir(user_dir) + img = tempfile.NamedTemporaryFile() + + fstab = OPTIONS.info_dict["fstab"] + if fstab: + image_props["fs_type" ] = fstab["/data"].fs_type + succ = build_image.BuildImage(user_dir, image_props, img.name) + assert succ, "build userdata_%s.img image failed" % extra_name + + # Disable size check since this fetches original data partition size + #common.CheckSize(img.name, "userdata_extra.img", OPTIONS.info_dict) + output_zip.write(img.name, "userdata_%s.img" % extra_name) + img.close() + os.rmdir(user_dir) + os.rmdir(temp_dir) + + def AddCache(output_zip, prefix="IMAGES/"): """Create an empty cache image and store it in output_zip.""" @@ -316,6 +352,8 @@ def banner(s): AddVendor(output_zip) banner("userdata") AddUserdata(output_zip) + banner("extrauserdata") + AddUserdataExtra(output_zip) banner("cache") AddCache(output_zip) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 2e802424372..aa46cb1d494 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -367,8 +367,12 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): if "extfs_sparse_flag" in prop_dict: build_command.append(prop_dict["extfs_sparse_flag"]) #run_fsck = True - build_command.extend([in_dir, out_file, fs_type, - prop_dict["mount_point"]]) + if "is_userdataextra" in prop_dict: + build_command.extend([in_dir, out_file, fs_type, + "data"]) + else: + build_command.extend([in_dir, out_file, fs_type, + prop_dict["mount_point"]]) build_command.append(prop_dict["partition_size"]) if "journal_size" in prop_dict: build_command.extend(["-j", prop_dict["journal_size"]]) @@ -558,6 +562,11 @@ def copy_prop(src_p, dest_p): copy_prop("fs_type", "fs_type") copy_prop("userdata_fs_type", "fs_type") copy_prop("userdata_size", "partition_size") + elif mount_point == "data_extra": + copy_prop("fs_type", "fs_type") + copy_prop("userdataextra_size", "partition_size") + copy_prop("userdataextra_name", "partition_name") + d["is_userdataextra"] = True elif mount_point == "cache": copy_prop("cache_fs_type", "fs_type") copy_prop("cache_size", "partition_size") diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index ecb17ac3d5d..21711972d57 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -814,6 +814,8 @@ def CheckSize(data, target, info_dict): fs_type = None limit = None if info_dict["fstab"]: + if mount_point == "/userdata_extra": + mount_point = "/data" if mount_point == "/userdata": mount_point = "/data" p = info_dict["fstab"][mount_point] From 321e7535667684cbe45acbaa80be2cac92e30de8 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Fri, 1 May 2015 19:32:21 -0400 Subject: [PATCH 167/502] build: Move msm899x FLAC metadata flag to qcom_utils.mk Change-Id: I8fa0be15b16324e692547a44ba340657541ca831 --- core/qcom_target.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/qcom_target.mk b/core/qcom_target.mk index 2dde2d9e36a..a7af574b63d 100644 --- a/core/qcom_target.mk +++ b/core/qcom_target.mk @@ -42,6 +42,11 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true) endif endif + # Enable extra offloading for post-805 targets + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + qcom_flags += -DHAS_EXTRA_FLAC_METADATA + endif + TARGET_GLOBAL_CFLAGS += $(qcom_flags) TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) From c3147b1ddc2a4859ad33c3e81c9940c0f6cb0293 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Thu, 30 Apr 2015 22:19:48 +0100 Subject: [PATCH 168/502] envsetup: add mk_timer this wraps around any method call, mainly for 'make'. mka needs this on linux, since ionice and schedtool don't respect functions Change-Id: If8cdd235ed9eba377dd90ab8b12e93036a377ea5 --- envsetup.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 51a3d317b69..ceaa0a12654 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2184,7 +2184,7 @@ function mka() { make -j `sysctl hw.ncpu|cut -d" " -f2` "$@" ;; *) - schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" + mk_timer schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" ;; esac } @@ -2438,10 +2438,10 @@ function get_make_command() echo command make } -function make() +function mk_timer() { local start_time=$(date +"%s") - $(get_make_command) "$@" + $@ local ret=$? local end_time=$(date +"%s") local tdiff=$(($end_time-$start_time)) @@ -2505,6 +2505,11 @@ function provision() "$ANDROID_PRODUCT_OUT/provision-device" "$@" } +function make() +{ + mk_timer $(get_make_command) "$@" +} + if [ "x$SHELL" != "x/bin/bash" ]; then case `ps -o command -p $$` in *bash*) From 8745ad52717a861ee123ffcbe59a13853a7fbf46 Mon Sep 17 00:00:00 2001 From: Hashcode Date: Mon, 1 Jun 2015 15:32:09 -0700 Subject: [PATCH 169/502] build: avoid recovery patch if device setup can't do it correctly In the case of Amazon OMAP4's there is a 2nd-bootloader which is inserted at a fixed location in both boot.img and recovery.img. If this 2nd-bootloader is not present, it puts the device in a non-booting state requiring the user to recover the device using fastboot tools. Also, due to the extra binary information in the image, imgdiff hangs during build. For devices like this, allow bypass of the recovery patch generatation. NOTE: In previous versions of CM the BOARD_CUSTOM_BOOTIMG_MK flag accomplished this, but was never forward ported to cm-12.0 and on. Use a new board flag here for clarity as most custom bootimg makefiles can still process a patch for recovery. https://github.com/CyanogenMod/android_build/blob/cm-11.0/core/Makefile#L935 Change-Id: I9284ee227358224e3add9862db5c1fbd0f5bd226 --- core/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/Makefile b/core/Makefile index 91856d573fb..4063947c306 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1247,7 +1247,11 @@ SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +ifndef BOARD_CANT_BUILD_RECOVERY_FROM_BOOT_PATCH RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p +else +RECOVERY_FROM_BOOT_PATCH := +endif $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(HOST_OUT_EXECUTABLES)/imgdiff \ From 40932dedb20dfbd67a9562c8d9113621754bb37a Mon Sep 17 00:00:00 2001 From: Anthony King Date: Thu, 30 Apr 2015 22:57:08 +0100 Subject: [PATCH 170/502] lunch: sort the choices This will sort the lunch array when lunch is called, giving us a consistent list of devices, which is easier to search through Change-Id: I80854e8b949950cbc928121a184b64fc3b8164c8 envsetup: lunch: always sort the menu this fixes the use case of 'lunch 34' straight after envsetup Change-Id: I19d45016edf254131015aab8476bc815bec9abe4 --- envsetup.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/envsetup.sh b/envsetup.sh index ceaa0a12654..4adeafbaad2 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -632,6 +632,7 @@ alias bib=breakfast function lunch() { local answer + LUNCH_MENU_CHOICES=($(for l in ${LUNCH_MENU_CHOICES[@]}; do echo "$l"; done | sort)) if [ "$1" ] ; then answer=$1 From 3c78fa579f0f0f19771ebeb88e5c4ed58557b1e0 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Thu, 30 Apr 2015 23:16:10 +0100 Subject: [PATCH 171/502] envsetup: cleanup the full list echo each one and stick it in columns. It was unreadable before Change-Id: I99c50595dcf35f0f03d5d3d6b01043ad8a8306d2 --- envsetup.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 4adeafbaad2..2a069d8d731 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -45,12 +45,9 @@ Environment options: Look at the source to view more functions. The complete list is: EOF T=$(gettop) - local A - A="" for i in `cat $T/build/envsetup.sh | sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do - A="$A $i" - done - echo $A + echo "$i" + done | column } # Get all the build variables needed by this script in a single call to the build system. From 8731aab5cbee80cad37d16622a254f6ac236ae23 Mon Sep 17 00:00:00 2001 From: Chris Sarbora Date: Wed, 3 Jun 2015 17:25:30 -0700 Subject: [PATCH 172/502] Allow dopush to load binaries onto the "wrong" device * Lets solitary projects be built+pushed quickly even without a full build * Affects mmp, mmmp, mkap as well Change-Id: I53594bcbece9f9458d28c3ea930453c14df95fe8 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 2a069d8d731..04d5c2c0af2 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2243,7 +2243,7 @@ function dopush() echo "Device Found." fi - if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD") || [ "$FORCE_PUSH" == "true" ]; then # retrieve IP and PORT info if we're using a TCP connection TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ From 15df9799f94b4275f178c04747aecca549282825 Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Sat, 6 Jun 2015 22:22:05 -0400 Subject: [PATCH 173/502] Remove LatinIME as it is included per target in vendor/cm Change-Id: Ibce4a244ec0653a7c7798d864047ac667866a1dc --- target/product/core.mk | 1 - 1 file changed, 1 deletion(-) diff --git a/target/product/core.mk b/target/product/core.mk index 75cf649d2e7..2fe0681cd5f 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -40,7 +40,6 @@ PRODUCT_PACKAGES += \ InputDevices \ KeyChain \ Keyguard \ - LatinIME \ Launcher2 \ ManagedProvisioning \ MtpDocumentsProvider \ From 3c7cad0ef0400b33dc7fefa3f98fa3f95bffe644 Mon Sep 17 00:00:00 2001 From: Diogo Ferreira Date: Fri, 3 Apr 2015 12:39:37 +0100 Subject: [PATCH 174/502] build: Add the factorypackage target The build system generates several artifacts, among them update zips, OTAs and update packages for fastboot. Shipping devices typically need extra-special packages in order to fulfill factory automation requirements. This patches adds a "factorypackage" target that can be customized by devices by providing a script that converts target files into the desired format. The script path should be set into TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT. Change-Id: I993f12766c96274f096c5f6c6da5aaa32394abbc --- core/Makefile | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/Makefile b/core/Makefile index 4063947c306..6aa496873be 100644 --- a/core/Makefile +++ b/core/Makefile @@ -2081,6 +2081,34 @@ bacon: otapackage @echo -e ${CL_CYN}"Package Complete: $(CM_TARGET_PACKAGE)"${CL_RST} endif # build_ota_package +# ----------------------------------------------------------------- +# The factory package + +name := $(TARGET_PRODUCT)-factory-$(FILE_NAME_TAG) + +INTERNAL_FACTORY_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip + +ifeq ($(TARGET_RELEASETOOLS_EXTENSIONS),) +# default to common dir for device vendor +$(INTERNAL_FACTORY_PACKAGE_TARGET): extensions := $(TARGET_DEVICE_DIR)/../common +else +$(INTERNAL_FACTORY_PACKAGE_TARGET): extensions := $(TARGET_RELEASETOOLS_EXTENSIONS) +endif + +$(INTERNAL_FACTORY_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) + @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" + if [ -z $(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT) ]; then \ + echo "Error: Factory script is not defined by target"; \ + exit 1; \ + fi + MKBOOTIMG=$(BOARD_CUSTOM_BOOTIMG_MK) \ + $(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT) -v \ + -s $(extensions) \ + -p $(HOST_OUT) \ + $(BUILT_TARGET_FILES_PACKAGE) $@ + +.PHONY: factorypackage +factorypackage: $(INTERNAL_FACTORY_PACKAGE_TARGET) # ----------------------------------------------------------------- # The update package From 1d51c5a2dc68580d713948ca8709e2a0cbfb6425 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 9 Jun 2015 00:11:29 +0530 Subject: [PATCH 175/502] otasigcheck: Extract the key * commit b110c751b181423d268531c624db212d2d81e816 "build: ota: Support for install tools in /tmp/install" erroneously removed the line extracting the releasekey, making the script a no-op as it couldn't find a key to compare against. Change-Id: I0dc5d15dbf4b0531de4df9e62a5bd47ec463c2a1 --- tools/releasetools/edify_generator.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index b94dafc1ccb..3390f1c4c15 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -166,6 +166,7 @@ def RunBackup(self, command): self.script.append(('run_program("/tmp/install/bin/backuptool.sh", "%s");' % command)) def ValidateSignatures(self, command): + self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') # Exit code 124 == abort. run_program returns raw, so left-shift 8bit self.script.append('run_program("/tmp/install/bin/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') From bd8cd629ee6d298d8b6088bee6eafee74c0bf9de Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Sun, 29 Dec 2013 12:57:20 -0600 Subject: [PATCH 176/502] envsetup: repolastsync Prints date and time of last repo sync. Example: Last repo sync: 11 Jun 2015, 21:54:59 CDT / 12 Jun 2015, 02:54:59 UTC Change-Id: I4280b500e58237479194ad2e230ed7466db87755 --- envsetup.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 04d5c2c0af2..96b9789fb68 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -29,8 +29,9 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - cafremote: Add git remote for matching CodeAurora repository. - cmrebase: Rebase a Gerrit change and push it again - mka: Builds using SCHED_BATCH on all processors -- mkap: Builds the module(s) using mka and pushes them to the device. -- cmka: Cleans and builds using mka. +- mkap: Builds the module(s) using mka and pushes them to the device. +- cmka: Cleans and builds using mka. +- repolastsync: Prints date and time of last repo sync. - reposync: Parallel repo sync using ionice and SCHED_BATCH - repopick: Utility to fetch changes from Gerrit. - installboot: Installs a boot.img to the connected device. @@ -2207,6 +2208,13 @@ function cmka() { fi } +function repolastsync() { + RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json" + RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z") + RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z") + echo "Last repo sync: $RLSLOCAL / $RLSUTC" +} + function reposync() { case `uname -s` in Darwin) From 3aeccdff106cd957dda8e29099350adc0f78b613 Mon Sep 17 00:00:00 2001 From: "Howard M. Harte" Date: Fri, 22 May 2015 09:54:20 -0700 Subject: [PATCH 177/502] minnow_max: search for cm.mk in additional directories Intel's product configuration files are structured slightly differentily than others. Device-specific configuration is nested one additional level, as follows: device/intel/// Change-Id: I78b02978dc759b94024e5c5533d1108ac2634549 --- core/product_config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/product_config.mk b/core/product_config.mk index 04d6e5f5228..4fcd3f43875 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -181,7 +181,7 @@ include $(BUILD_SYSTEM)/device.mk # A CM build needs only the CM product makefiles. ifneq ($(CM_BUILD),) - all_product_configs := $(shell ls device/*/$(CM_BUILD)/cm.mk) + all_product_configs := $(shell find device -path "*/$(CM_BUILD)/cm.mk") else ifneq ($(strip $(TARGET_BUILD_APPS)),) # An unbundled app build needs only the core product makefiles. From ab02f146ff15ca4da069042e7ecc079c5c540bf3 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 10 Jul 2015 00:58:53 -0700 Subject: [PATCH 178/502] build: Fix image creation for F2FS-only configuration * Add f2fs dependencies regardless of whether we're building ext4 images or not. Change-Id: I886c52edaf56eb96fb931384440f33b00aa5c9ec --- core/Makefile | 14 +++++++++++--- tools/releasetools/add_img_to_target_files.py | 3 ++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/Makefile b/core/Makefile index 6aa496873be..1f3d18fb6dd 100644 --- a/core/Makefile +++ b/core/Makefile @@ -781,6 +781,12 @@ INTERNAL_USERIMAGES_EXT_VARIANT := ext4 endif endif endif +ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) +INTERNAL_USERIMAGES_USE_F2FS := true +ifeq ($(INTERNAL_USERIMAGES_EXT_VARIANT),) +INTERNAL_USERIMAGES_EXT_VARIANT := f2fs +endif +endif # These options tell the recovery updater/installer how to mount the partitions writebale. # =[|]... @@ -793,12 +799,12 @@ ifneq (true,$(TARGET_USERIMAGES_SPARSE_EXT_DISABLED)) INTERNAL_USERIMAGES_SPARSE_EXT_FLAG := -s endif +INTERNAL_USERIMAGES_DEPS := ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) -INTERNAL_USERIMAGES_DEPS := $(SIMG2IMG) INTERNAL_USERIMAGES_DEPS += $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(E2FSCK) -ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) -INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif +ifeq ($(INTERNAL_USERIMAGES_USE_F2FS),true) +INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif ifneq (true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED)) @@ -808,6 +814,8 @@ ifneq ($(filter $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) $(BOARD_SYSTEMIMAGE_FILE_S INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG) endif +INTERNAL_USERIMAGES_DEPS += $(SIMG2IMG) + INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY)) diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 8697f8378f6..ad174059218 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -217,7 +217,8 @@ def AddUserdataExtra(output_zip): image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, "data_extra") # If no userdataextra_size is provided for extfs, skip userdata_extra.img. - if (image_props.get("fs_type", "").startswith("ext") and + if ((image_props.get("fs_type", "").startswith("ext") or + image_props.get("fs_type", "").startswith("f2fs")) and not image_props.get("partition_size")): return From b1456dc6592bb6f2248721f3f3c7e1d876a859f6 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Fri, 10 Jul 2015 02:31:24 -0700 Subject: [PATCH 179/502] build: Fix device detection for a few of the envsetup commands * Edge case where a certain developer ended up with a blank system partition in recovery. Wonder how that happened? Change-Id: I17854a53bf18d07c98c4b7f53df252d6f1d7113d --- envsetup.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 96b9789fb68..24b0291d0a6 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -802,7 +802,7 @@ function eat() done echo "Device Found.." fi - if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); then # if adbd isn't root we can't write to /cache/recovery/ adb root @@ -1826,7 +1826,7 @@ function installboot() sleep 1 adb wait-for-online shell mount /system 2>&1 > /dev/null adb wait-for-online remount - if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); then adb push $OUT/boot.img /cache/ for i in $OUT/system/lib/modules/*; @@ -1871,7 +1871,7 @@ function installrecovery() sleep 1 adb wait-for-online shell mount /system 2>&1 >> /dev/null adb wait-for-online remount - if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD"); + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); then adb push $OUT/recovery.img /cache/ adb shell dd if=/cache/recovery.img of=$PARTITION @@ -2251,7 +2251,7 @@ function dopush() echo "Device Found." fi - if (adb shell cat /system/build.prop | grep -q "ro.cm.device=$CM_BUILD") || [ "$FORCE_PUSH" == "true" ]; + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" == "true" ]; then # retrieve IP and PORT info if we're using a TCP connection TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ From 006a750e8bda137e56522442a3d4cc3aa15185e5 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Wed, 15 Jul 2015 19:47:45 +0530 Subject: [PATCH 180/502] Allow setting the recovery density separately from the aapt config Change-Id: I817a4c01302956ec846503d9a585c43e690e45bf --- core/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/Makefile b/core/Makefile index 1f3d18fb6dd..1765faf050d 100644 --- a/core/Makefile +++ b/core/Makefile @@ -899,6 +899,9 @@ recovery_resources_common := $(call project-path-for,recovery)/res # Set recovery_density to the density bucket of the device. recovery_density := unknown +ifneq (,$(TARGET_RECOVERY_DENSITY)) +recovery_density := $(filter %dpi,$(TARGET_RECOVERY_DENSITY)) +else ifneq (,$(PRODUCT_AAPT_PREF_CONFIG)) # If PRODUCT_AAPT_PREF_CONFIG includes a dpi bucket, then use that value. recovery_density := $(filter %dpi,$(PRODUCT_AAPT_PREF_CONFIG)) @@ -906,6 +909,7 @@ else # Otherwise, use the default medium density. recovery_densities := mdpi endif +endif ifneq (,$(wildcard $(recovery_resources_common)-$(recovery_density))) recovery_resources_common := $(recovery_resources_common)-$(recovery_density) From 9c4c2041b6b1e88706d1a1374d650da59e049e6b Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Wed, 22 Jul 2015 14:10:29 -0700 Subject: [PATCH 181/502] misc_info: Add factory script location to misc_info when available When a factory script is specified for the device, store the location of the script in the misc_info package for proper use during package signing. Change-Id: Icd3ab59ebb68b8b6c92aff8eaf9e44322cdcbc18 Ticket: RM-112 --- core/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/Makefile b/core/Makefile index 1765faf050d..0824796527b 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1962,6 +1962,9 @@ ifneq ($(strip $(SANITIZE_TARGET)),) endif ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) $(hide) echo "full_recovery_image=true" >> $(zip_root)/META/misc_info.txt +endif +ifdef TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT + $(hide) echo "factory_from_target_script=$(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT)" >> $(zip_root)/META/misc_info.txt endif $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt) ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) From 9ae0317d551e99194b8fbfe7e83ac823e1d44a58 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 23 Jul 2015 10:36:27 -0700 Subject: [PATCH 182/502] build: Allow packaging of factory image files into target files Files may be required inthe target files package for factory flashing processes. Allow these to be added using PRODUCT_FACTORYIMAGE_FILES. Change-Id: I74b42daee7b73f762f3c75904c6c278b1e5f5c53 Ticket: RM-112 --- core/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/Makefile b/core/Makefile index 0824796527b..bcb4d370936 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1871,6 +1871,9 @@ endif # BOARD_USES_RECOVERY_AS_BOOT $(hide) $(foreach t,$(INSTALLED_RADIOIMAGE_TARGET),\ mkdir -p $(zip_root)/RADIO; \ $(ACP) $(t) $(zip_root)/RADIO/$(notdir $(t));) + $(hide) $(foreach fi,$(PRODUCT_FACTORYIMAGE_FILES),\ + mkdir -p $(zip_root)/FACTORY; \ + $(ACP) $(fi) $(zip_root)/FACTORY/$(notdir $(fi));) @# Contents of the system image $(hide) $(call package_files-copy-root, \ $(SYSTEMIMAGE_SOURCE_DIR),$(zip_root)/SYSTEM) From 291bded157d5a5d67f081f95b93c8ecfcd3f8b05 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 6 Aug 2015 13:21:29 -0700 Subject: [PATCH 183/502] build: Fix extra userdata generation Image generation has been combined into the target file script and requires the prefix parameter to work properly. This also needs to be called properly when creating fastboot packages. Change-Id: I1f716cc375ffe401d5f18487330fc9bb809ff3b4 Ticket: OPO-191 --- tools/releasetools/add_img_to_target_files.py | 20 ++++++++++++++----- tools/releasetools/img_from_target_files.py | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index ad174059218..c16637a23ad 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -211,19 +211,29 @@ def AddUserdata(output_zip, prefix="IMAGES/"): shutil.rmtree(temp_dir) -def AddUserdataExtra(output_zip): +def AddUserdataExtra(output_zip, prefix="IMAGES/"): """Create extra userdata image and store it in output_zip.""" image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, "data_extra") - # If no userdataextra_size is provided for extfs, skip userdata_extra.img. - if ((image_props.get("fs_type", "").startswith("ext") or - image_props.get("fs_type", "").startswith("f2fs")) and - not image_props.get("partition_size")): + + # The build system has to explicitly request extra userdata. + if "fs_type" not in image_props: return extra_name = image_props.get("partition_name", "extra") + prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "userdata_%s.img" % extra_name) + if os.path.exists(prebuilt_path): + print "userdata_%s.img already exists in %s, no need to rebuild..." % (extra_name, prefix,) + return + + # We only allow yaffs to have a 0/missing partition_size. + # Extfs, f2fs must have a size. Skip userdata_extra.img if no size. + if (not image_props.get("fs_type", "").startswith("yaffs") and + not image_props.get("partition_size")): + return + print "creating userdata_%s.img..." % extra_name # The name of the directory it is making an image out of matters to diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index fac5ab6dec9..f12fecb7ad2 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -148,6 +148,8 @@ def banner(s): pass # no vendor partition for this device banner("AddUserdata") add_img_to_target_files.AddUserdata(output_zip, prefix="") + banner("AddUserdataExtra") + add_img_to_target_files.AddUserdataExtra(output_zip, prefix="") banner("AddCache") add_img_to_target_files.AddCache(output_zip, prefix="") From f36a3093db1308dd66ef299052abcf6d217a7889 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 6 Aug 2015 13:21:29 -0700 Subject: [PATCH 184/502] build: Fix extra userdata generation some more Use the prefix variable when placing the file in the target files package. Change-Id: Ia4b795416b58c493c3ea91b964e3b6f4cdf0fef1 Ticket: OPO-191 --- tools/releasetools/add_img_to_target_files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index c16637a23ad..0f7ac36d0b8 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -252,7 +252,7 @@ def AddUserdataExtra(output_zip, prefix="IMAGES/"): # Disable size check since this fetches original data partition size #common.CheckSize(img.name, "userdata_extra.img", OPTIONS.info_dict) - output_zip.write(img.name, "userdata_%s.img" % extra_name) + output_zip.write(img.name, prefix + "userdata_%s.img" % extra_name) img.close() os.rmdir(user_dir) os.rmdir(temp_dir) From 158e6748156b29416457c8d656c5e61471ee3027 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Tue, 9 Jun 2015 19:35:53 -0500 Subject: [PATCH 185/502] build: Enable custom ccache cache dir for Android During lunch, check environment variables for ANDROID_CCACHE_DIR. If it is specified, CCACHE_DIR is set to match. Prevents issues with multiple versions of ccache writing to the same cache dir. ANDROID_CCACHE_SIZE should also be specified, allowing for a distinct cache directory size from the default. Syntax for ANDROID_CCACHE_SIZE is the same as applied in the command: 'ccache -M$ANDROID_CCACHE_SIZE' Change-Id: I17497a6f56347850e0fa7b8ebd4de0b5a0b13e55 --- core/ccache.mk | 6 ++++++ envsetup.sh | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/core/ccache.mk b/core/ccache.mk index 7b10373e8be..0c93a6bd7d2 100644 --- a/core/ccache.mk +++ b/core/ccache.mk @@ -49,6 +49,12 @@ ifneq ($(filter-out false,$(USE_CCACHE)),) ifndef CXX_WRAPPER CXX_WRAPPER := $(ccache) endif + ifeq ($(ANDROID_CCACHE_DIR), $(CCACHE_DIR)) + ifneq ($(ANDROID_CCACHE_SIZE),) + ACCSIZE_RESULT := $(shell $(ccache) -M$(ANDROID_CCACHE_SIZE)) + endif + endif ccache = + ACCSIZE_RESULT = endif endif diff --git a/envsetup.sh b/envsetup.sh index 24b0291d0a6..a80b0b2c3c3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -283,6 +283,10 @@ function setpaths() unset ANDROID_HOST_OUT export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT) + if [ -n "$ANDROID_CCACHE_DIR" ]; then + export CCACHE_DIR=$ANDROID_CCACHE_DIR + fi + # needed for building linux on MacOS # TODO: fix the path #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include From 992fe29fbc95a4f86bec008753634bcf4253f8f7 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Fri, 15 May 2015 06:11:44 -0400 Subject: [PATCH 186/502] Force bsdiff for recovery_from_boot.p if not using GZIP imgdiff expects a ramdisk to use GZIP, which is causing a chunk size issue if recovery is using LZMA Change-Id: I3194b4faed25a298fe23b4e24b6dea2885bafda8 --- core/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/Makefile b/core/Makefile index bcb4d370936..ed478960bc9 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1270,7 +1270,11 @@ $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(HOST_OUT_EXECUTABLES)/bsdiff @echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST} mkdir -p $(dir $@) +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) + PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +else PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +endif else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true RECOVERY_FROM_BOOT_PATCH := $(INSTALLED_RECOVERYIMAGE_TARGET) endif From 6af6d63d203efd27e5a10eece78309396e26cbdd Mon Sep 17 00:00:00 2001 From: arter97 Date: Tue, 9 Sep 2014 11:44:22 +0900 Subject: [PATCH 187/502] Apply correct, optimized mfpu compiler flag for ARMv7-A Cortex CPUs For those ARMv7-A Cortex CPUs that can handle VFPv4 floating point, We can set "-mfpu=neon-vfpv4" instead of generic "-mfpu=neon" to gain extra performance improvements. References : - GCC : https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html - Cortex A15 : http://www.arm.com/products/processors/cortex-a/cortex-a15.php - Cortex A9 : http://www.arm.com/products/processors/cortex-a/cortex-a9.php - Cortex A8 : http://www.arm.com/products/processors/cortex-a/cortex-a8.php - Cortex A7 : http://www.arm.com/products/processors/cortex-a/cortex-a7.php - Cortex A5 : http://www.arm.com/products/processors/cortex-a/cortex-a5.php Currently prebuilt clang doesn't support neon-vfpv4 flag so fall back to neon Also added support for cortex-a5 arch Change-Id: I91893789ed8edabf3767e1782e494b81158332bb Signed-off-by: Park Ju Hyung Signed-off-by: Maxime Poulain --- core/combo/arch/arm/armv7-a-neon.mk | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index dd65d34a406..8dee4eaedc6 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -8,33 +8,38 @@ ARCH_ARM_HAVE_NEON := true local_arch_has_lpae := false -ifneq (,$(filter cortex-a15 krait denver,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) +ifneq (,$(filter cortex-a15 denver krait,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) # TODO: krait is not a cortex-a15, we set the variant to cortex-a15 so that # hardware divide operations are generated. This should be removed and a # krait CPU variant added to GCC. For clang we specify -mcpu for krait in # core/clang/arm.mk. - arch_variant_cflags := -mcpu=cortex-a15 + arch_variant_cflags := -mcpu=cortex-a15 -mfpu=neon-vfpv4 local_arch_has_lpae := true arch_variant_ldflags := \ -Wl,--no-fix-cortex-a8 else ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a9) - arch_variant_cflags := -mcpu=cortex-a9 + arch_variant_cflags := -mcpu=cortex-a9 -mfpu=neon else ifneq (,$(filter cortex-a8 scorpion,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) - arch_variant_cflags := -mcpu=cortex-a8 + arch_variant_cflags := -mcpu=cortex-a8 -mfpu=neon arch_variant_ldflags := \ -Wl,--fix-cortex-a8 else ifneq (,$(filter cortex-a7 cortex-a53 cortex-a53.a57,$(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT))) - arch_variant_cflags := -mcpu=cortex-a7 + arch_variant_cflags := -mcpu=cortex-a7 -mfpu=neon-vfpv4 local_arch_has_lpae := true arch_variant_ldflags := \ -Wl,--no-fix-cortex-a8 else - arch_variant_cflags := -march=armv7-a +ifeq ($(strip $(TARGET_$(combo_2nd_arch_prefix)CPU_VARIANT)),cortex-a5) + arch_variant_cflags := -mcpu=cortex-a7 -mfpu=neon-vfpv4 + arch_variant_ldflags := \ + -Wl,--no-fix-cortex-a8 +else + arch_variant_cflags := -march=armv7-a -mfpu=neon # Generic ARM might be a Cortex A8 -- better safe than sorry arch_variant_ldflags := \ -Wl,--fix-cortex-a8 @@ -42,6 +47,7 @@ endif endif endif endif +endif ifeq (true,$(local_arch_has_lpae)) # Fake an ARM compiler flag as these processors support LPAE which GCC/clang @@ -54,5 +60,4 @@ endif local_arch_has_lpae := arch_variant_cflags += \ - -mfloat-abi=softfp \ - -mfpu=neon + -mfloat-abi=softfp From d8263ecbb39df70e0fe83bcb66b211390ba05b84 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sat, 15 Aug 2015 15:29:29 +0100 Subject: [PATCH 188/502] product: Let a device customize its own locales Use TARGET_LOCALES. If existing, it'll override the defaults except for en_US Change-Id: I450fa5023ba48f07622d23158012b5b7d5f2130b --- target/product/full_base.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/target/product/full_base.mk b/target/product/full_base.mk index bac3e030f47..b98f0be5758 100644 --- a/target/product/full_base.mk +++ b/target/product/full_base.mk @@ -32,8 +32,12 @@ $(call inherit-product-if-exists, frameworks/base/data/sounds/AllAudio.mk) # Get the TTS language packs $(call inherit-product-if-exists, external/svox/pico/lang/all_pico_languages.mk) +ifeq ($(TARGET_LOCALES),) # Get a list of languages. $(call inherit-product, $(SRC_TARGET_DIR)/product/locales_full.mk) +else +PRODUCT_LOCALES := $(TARGET_LOCALES) +endif # Get everything else from the parent package $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_no_telephony.mk) From e00ae63a68d1ebd8109d07fa717f054c04bf6d5d Mon Sep 17 00:00:00 2001 From: luca020400 Date: Mon, 7 Sep 2015 15:22:02 +0200 Subject: [PATCH 189/502] build: allow using host flex binary * Prebuilt flex doesn't work on newer glibc flex-2.5.39: loadlocale.c:131: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_COLLATE) / sizeof (_nl_value_type_LC_COLLATE[0]))' failed. * Enable with USE_HOST_LEX=yes Change-Id: Id683ff2fdf03edf88f8459ed32986a05334cd7fc --- core/config.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/config.mk b/core/config.mk index c6455eb4176..a7c66787f1b 100644 --- a/core/config.mk +++ b/core/config.mk @@ -504,7 +504,11 @@ endif # TARGET_BUILD_APPS || TARGET_BUILD_PDK # Generic tools. JACK := $(HOST_OUT_EXECUTABLES)/jack +ifeq ($(USE_HOST_LEX),yes) +LEX := flex +else LEX := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/flex/flex-2.5.39 +endif # The default PKGDATADIR built in the prebuilt bison is a relative path # external/bison/data. # To run bison from elsewhere you need to set up enviromental variable From 01cd5bde43faa3d69e603699e485edcdc0401e01 Mon Sep 17 00:00:00 2001 From: Diogo Ferreira Date: Fri, 4 Sep 2015 11:59:13 +0100 Subject: [PATCH 190/502] build: Create a oem image when BOARD_OEMIMAGE_FILE_SYSTEM_TYPE is defined This adds the capability of generating a OEM image with the build and adding it to target files when BOARD_OEMIMAGE_FILE_SYSTEM_TYPE is set. Change-Id: I6c596d58d9d5ece1a261d953eeb8c60eac30e642 Ticket: CYNGNOS-936 --- core/Makefile | 7 ++++ core/tasks/oem_image.mk | 11 ++++++- tools/releasetools/add_img_to_target_files.py | 33 +++++++++++++++++++ tools/releasetools/img_from_target_files.py | 6 ++++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index ed478960bc9..eb8efaba45e 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1774,6 +1774,7 @@ endif # Depending on the various images guarantees that the underlying # directories are up-to-date. +include $(BUILD_SYSTEM)/tasks/oem_image.mk $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(INSTALLED_RADIOIMAGE_TARGET) \ @@ -1782,6 +1783,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ + $(INSTALLED_OEMIMAGE_TARGET) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(SELINUX_FC) \ $(APKCERTS_FILE) \ @@ -1894,6 +1896,11 @@ ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE @# Contents of the vendor image $(hide) $(call package_files-copy-root, \ $(TARGET_OUT_VENDOR),$(zip_root)/VENDOR) +endif +ifdef BOARD_OEMIMAGE_FILE_SYSTEM_TYPE + @# Contents of the oem image + $(call package_files-copy-root, \ + $(TARGET_OUT_OEM),$(zip_root)/OEM) endif @# Extra contents of the OTA package $(hide) mkdir -p $(zip_root)/OTA diff --git a/core/tasks/oem_image.mk b/core/tasks/oem_image.mk index 32d56a76e82..8a066700f04 100644 --- a/core/tasks/oem_image.mk +++ b/core/tasks/oem_image.mk @@ -15,7 +15,16 @@ # # We build oem.img only if it's asked for. +skip_oem_image := true ifneq ($(filter $(MAKECMDGOALS),oem_image),) + skip_oem_image := false +endif + +ifneq ($(BOARD_OEMIMAGE_FILE_SYSTEM_TYPE),) + skip_oem_image := false +endif + +ifneq ($(skip_oem_image),true) ifndef BOARD_OEMIMAGE_PARTITION_SIZE $(error BOARD_OEMIMAGE_PARTITION_SIZE is not set.) endif @@ -43,4 +52,4 @@ $(INSTALLED_OEMIMAGE_TARGET) : $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_OEMIMAGE_F oem_image : $(INSTALLED_OEMIMAGE_TARGET) $(call dist-for-goals, oem_image, $(INSTALLED_OEMIMAGE_TARGET)) -endif # oem_image in $(MAKECMDGOALS) +endif diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 0f7ac36d0b8..04fa822f889 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -99,6 +99,29 @@ def BuildVendor(input_dir, info_dict, block_list=None): file containing it.""" return CreateImage(input_dir, info_dict, "vendor", block_list=block_list) +def AddOem(output_zip, prefix="IMAGES/"): + """Turn the contents of OEM into a oem image and store in it + output_zip.""" + + prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "oem.img") + if os.path.exists(prebuilt_path): + print "oem.img already exists in %s, no need to rebuild..." % (prefix,) + return + + block_list = common.MakeTempFile(prefix="oem-blocklist-", suffix=".map") + imgname = BuildOem(OPTIONS.input_tmp, OPTIONS.info_dict, + block_list=block_list) + with open(imgname, "rb") as f: + common.ZipWriteStr(output_zip, prefix + "oem.img", f.read()) + with open(block_list, "rb") as f: + common.ZipWriteStr(output_zip, prefix + "oem.map", f.read()) + + +def BuildOem(input_dir, info_dict, block_list=None): + """Build the (sparse) oem image and return the name of a temp + file containing it.""" + return CreateImage(input_dir, info_dict, "oem", block_list=block_list) + def CreateImage(input_dir, info_dict, what, block_list=None): print "creating " + what + ".img..." @@ -315,6 +338,12 @@ def AddImagesToTargetFiles(filename): except KeyError: has_vendor = False + try: + input_zip.getinfo("OEM/") + has_oem = True + except KeyError: + has_oem = False + OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.input_tmp) common.ZipClose(input_zip) @@ -367,6 +396,10 @@ def banner(s): AddUserdataExtra(output_zip) banner("cache") AddCache(output_zip) + if has_oem: + banner("oem") + AddOem(output_zip) + # For devices using A/B update, copy over images from RADIO/ to IMAGES/ and # make sure we have all the needed images ready under IMAGES/. diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index f12fecb7ad2..832be7c59fb 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -152,6 +152,12 @@ def banner(s): add_img_to_target_files.AddUserdataExtra(output_zip, prefix="") banner("AddCache") add_img_to_target_files.AddCache(output_zip, prefix="") + try: + input_zip.getinfo("OEM/") + banner("AddOem") + add_img_to_target_files.AddOem(output_zip, prefix="") + except KeyError: + pass # no oem partition for this device finally: print "cleaning up..." From b97894b000e455181dc7214856bca7cdadf6d5f5 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Tue, 8 Sep 2015 10:57:18 -0500 Subject: [PATCH 191/502] build: Separate commands in recovery foreach loops The foreach loops output a space separated list, not necessarily one command per line. Separate commands with semicolons. Notably, this fixes an issue with multiple device directories included in TARGET_RECOVERY_DEVICE_DIRS. Change-Id: I5ebdc84ecaaacabaea77b8b752141e2041622480 --- core/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/Makefile b/core/Makefile index eb8efaba45e..2321c85b675 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1046,11 +1046,11 @@ define build-recoveryramdisk $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png $(hide) $(foreach item,$(recovery_root_private), \ - cp -rf $(item) $(TARGET_RECOVERY_OUT)/) + cp -rf $(item) $(TARGET_RECOVERY_OUT)/;) $(hide) $(foreach item,$(TARGET_PRIVATE_RES_DIRS), \ - cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline)) + cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline);) $(hide) $(foreach item,$(recovery_fstab), \ - cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab) + cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab;) $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ > $(TARGET_RECOVERY_ROOT_OUT)/default.prop From f609a18220482d39366c7faa64514269fe858432 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Thu, 1 Oct 2015 15:37:55 -0700 Subject: [PATCH 192/502] build: Fix import build step. Change-Id: Id5a042bd12cf37eec7c856a22d5a7de0e175c2e7 --- core/apicheck_msg_current.txt | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/core/apicheck_msg_current.txt b/core/apicheck_msg_current.txt index 2e065aeffaf..5ca7fa025d1 100644 --- a/core/apicheck_msg_current.txt +++ b/core/apicheck_msg_current.txt @@ -10,6 +10,73 @@ To make these errors go away, you have two choices: make update-api ^^^^^^^^^^^^^^^^^^ + CONGRATS YOU EARNED A QUAIL STAR! + + M + MM + MMM + M.MM + MM M + 7M MM + MMMMM MMMMM + MMMMM .MMMMM + MMMM MMMM + MM M + MM M .M + M+M MMMM + .M++MM .MM + MM+++MM MM + 8NNNNN MM+++++MM + NNNN $Z8. MM+++++MM MM + MM $Z8M7IMNN+++++MM MM + .$$$D ~NNMNN+++++MM MMMM + INNNNM NMNM++++++M M M + NNO:NI=MM+++++++MM MM MM + 8M$MMMMMD?+++++++MM .MMMMMMMMMMMMMMM MMMMN MMMMM + M$$NMMMMMM$++++++++MMMMMMM=+++++++++++++MM MMMMM MMMMM + M77$IMMMMMN.,+++++++++++++++++++++++++++MM .MMMMM MMMMM + .??I8,?M777OM.?+++++++++++++++++++++++++MM MM MM + O==?M7MM$MMI7$.~M+++++++++++++++++++++++MM .M M + NMMM+~M??MMMMMMMMMMMI$$++++++++++++++++++++MM MMMM + MMMM++++MM~=+I$OMMMOO?7M$Z$$$+++++++++++++++++MM MM + NMMM++++++++~~MO~7$OM8O8OMZZ$Z$M$$M++++++++++++++MM7MMM MM + MMMM++++++++++++==D~M~:8N88MMOMMZDM$$Z$$M+++++++++++MM77777MMM +MMM+++++++++++++++~MM~~M $O,NM88MOMMZ$$MM$$$+++++++++MM777777777MMMM + MMM++++++++++++M~M~IMMMO888NMOMMOZM$ZZDZ$$+++++++MM7777777777777OMMZ + MMM+++++++++++~~M~~MDOOMMO8NOOOOZZ$$Z.Z$$M++++MM77777777777777777MMM + MMM++++++++M.Z, D+ 8O88M8D,OOMDZZ$D.$$$N+++M7MMMMMD77777777777777MMM + .MM+++++++MM:.D:ZMMM8888OOOOOOZZ$ND$$$M++MM777777MMMM7777777777777MMD + MMM+++++~M.$.M~,~7M8?MON MOOZZ$$N$$$M++MD777777777MMMM77777777777MMM + MM=+++=ZMZ.MM MMZOOOO88OOZM$M.$$$$+++M7777777777777MMMM7777777777MM + MMM++MM~,,$M.+~M$OOMOOMZMI$$$$$$$++MM7777777777777777MMM777777777MM + MM++++=. ~$$.$.M~M$MZOM7MMZ$$$$$$++MMMMMMD7777777777777MMMI7777777MMM + .M++++++MM+OMI$7M??N+OZM8MMMD$$M$$++M77777MMMMN77777777777MMM7777777MMM + M++++++++M+=?+++++++++++MNMZN$$N$$+MM777777777MMMM7777777777MMM777777MM, + M+++++M=?7$$M+++++++++++++++$NO$$$$+M7777777777777MMMM777777777MMM77777MM + M++~M$M$M+++++M++MMM++++++++++M=$$D$MMMMMMMM7777777777MMM$7777777MMM77777MM + M+M$$$M+++++++++MM MMMMM+++++++M$Z$$M MMMMMI7777777MMMM7777777MM77777MM + M++7NMIN++Z++NMM MMMMM+++N$M$M MMMM7777777MMM777777MM$777MM + M=++8+++++++MM MMMMMZ$M$M MMMM777777MMM77777MMZ777MM + MM++++++++MM MM$ MMM77777MMM77777MM7777MM + MM++++++MM MMMM7777MMM7777MM777MM + MM++++MMM .MMM7777MM7777MM77$M + MM+++MM M MMM777MMN777MM77MM + NM+MM M MMM77MMM77NMM7MM + MM MM MMM77MMM77MM77M + .MMM MMM7MMM7IMM7MM + MM M MMM7MMM7MM7MM + M MM MM7MMN7MMMM + MMMM MMMM MMMMMIMMMM + MMMM. MMMMM MMMMMMMMM + MMMMM MMMMM MMMMMMMM + MM MM OMMMMMM + M MM MMMMMM + MM M MMMMM + MMM MMM + MM MM + M + + NO. NO. STOP BEING LAZY. SERIOUSLY. DO NOT DO THIS in CM. THIS IS A LIE. IT WILL BREAK THINGS. From 482586a6fdf84ee107cf6e2b308a7a40c46c0ecd Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Tue, 8 Sep 2015 17:11:37 -0700 Subject: [PATCH 193/502] img_from_target_files: Skip oem.img in fastboot image creation We don't need this package to be included in fastboot images, so skip it when we are creating fastboot images. Change-Id: I1e0676f5cbf7468088e6997f83ae845578864668 Ticket: CYNGNOS-936 --- tools/releasetools/img_from_target_files.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index 832be7c59fb..8b8a009a6ef 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -105,6 +105,7 @@ def option_handler(o, _): if os.path.exists(images_path): # If this is a new target-files, it already contains the images, # and all we have to do is copy them to the output zip. + # Skip oem.img files since they are not needed in fastboot images. images = os.listdir(images_path) if images: for image in images: @@ -112,6 +113,8 @@ def option_handler(o, _): continue if not image.endswith(".img"): continue + if i == "oem.img": + continue common.ZipWrite( output_zip, os.path.join(images_path, image), image) done = True @@ -152,12 +155,6 @@ def banner(s): add_img_to_target_files.AddUserdataExtra(output_zip, prefix="") banner("AddCache") add_img_to_target_files.AddCache(output_zip, prefix="") - try: - input_zip.getinfo("OEM/") - banner("AddOem") - add_img_to_target_files.AddOem(output_zip, prefix="") - except KeyError: - pass # no oem partition for this device finally: print "cleaning up..." From 7cdf50436368efae60eaea0457a0445a65f1c95b Mon Sep 17 00:00:00 2001 From: d34d Date: Fri, 13 Feb 2015 10:35:31 -0800 Subject: [PATCH 194/502] Themes: Include tm command line tool Change-Id: Icecf9c322102a3d5489d165d53f21c62835dcca7 --- target/product/base.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/target/product/base.mk b/target/product/base.mk index 4d70664677b..dcd48e72d9b 100644 --- a/target/product/base.mk +++ b/target/product/base.mk @@ -125,6 +125,7 @@ PRODUCT_PACKAGES += \ svc \ tc \ telecom \ + tm \ vdc \ vold \ wm From 353eb75af7676b1a231f279fcb04314160ad127d Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Tue, 17 Feb 2015 02:43:12 -0800 Subject: [PATCH 195/502] [2/3] CmHardwareService: add cm hardware jar to system server Change-Id: Ie6ecb4af88a20163aceb3c38b38e10af10f1720f --- target/product/core_minimal.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 009ca529cc8..596bcbace06 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -103,6 +103,7 @@ PRODUCT_BOOT_JARS := \ # The order of PRODUCT_SYSTEM_SERVER_JARS matters. PRODUCT_SYSTEM_SERVER_JARS := \ + org.cyanogenmod.hardware \ services \ ethernet-service \ wifi-service From 3fe71b29551a47de4acf09b8d640a818a125dafb Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Mon, 27 Apr 2015 10:48:47 -0700 Subject: [PATCH 196/502] build/target: Include CM platform jar in system server. Also lock to non-release type builds. Change-Id: Iaeecc4b1d8722f543b36cab76081cd49130a9eea --- target/product/core_minimal.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 596bcbace06..3c15fdb399a 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -108,6 +108,12 @@ PRODUCT_SYSTEM_SERVER_JARS := \ ethernet-service \ wifi-service +ifeq ($(filter NIGHTLY SNAPSHOT EXPERIMENTAL,$(CM_BUILDTYPE)),) +# External system server capable jar +PRODUCT_SYSTEM_SERVER_JARS += \ + org.cyanogenmod.platform +endif + # Adoptable external storage supports both ext4 and f2fs PRODUCT_PACKAGES += \ e2fsck \ From 451c905ef38e78512a8ab4a4ea86f98715fcaed2 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Fri, 8 May 2015 14:42:25 -0700 Subject: [PATCH 197/502] build/core: Create means of ignoring subdir layer for packages. An external resource package that acts as a secondary framework resource should be presented in system/framework similarily to the framework-res module. Change-Id: Ie4110a184cd7262035110a6a04bb7ea91e7a42b0 --- core/base_rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/base_rules.mk b/core/base_rules.mk index 5ef2b765c9e..34d2a125621 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -210,7 +210,7 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) # Apk and its attachments reside in its own subdir. ifeq ($(LOCAL_MODULE_CLASS),APPS) # framework-res.apk doesn't like the additional layer. - ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) + ifeq ($(filter true,$(LOCAL_NO_STANDARD_LIBRARIES) $(LOCAL_IGNORE_SUBDIR)),) my_module_path := $(my_module_path)/$(LOCAL_MODULE) endif endif From 4cb0aacedcfea50b7e26f55829317ed1a3ba2f0b Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Wed, 13 May 2015 00:52:31 -0700 Subject: [PATCH 198/502] build: Add IGNORE_SUBDIR to clear vars. Change-Id: Icc539d6d4e0a2d5a025416841dc05fe6bcb6199f --- core/clear_vars.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 59e907b9464..5b26943e733 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -362,6 +362,8 @@ LOCAL_INIT_RC_32:= LOCAL_INIT_RC_64:= LOCAL_JAVA_LANGUAGE_VERSION:= +LOCAL_IGNORE_SUBDIR:= + # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. # Leave the current makefile to make sure we don't break anything From 719965fce742c7dcdb4d3de8136ca5a8e3d6359a Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Wed, 13 May 2015 03:55:25 -0700 Subject: [PATCH 199/502] build: Ignore filters on platform library. Change-Id: I32b0cd514e58752927fe89044a886d8fc8e18447 --- target/product/core_minimal.mk | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 3c15fdb399a..99b2dce13c5 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -103,17 +103,12 @@ PRODUCT_BOOT_JARS := \ # The order of PRODUCT_SYSTEM_SERVER_JARS matters. PRODUCT_SYSTEM_SERVER_JARS := \ + org.cyanogenmod.platform \ org.cyanogenmod.hardware \ services \ ethernet-service \ wifi-service -ifeq ($(filter NIGHTLY SNAPSHOT EXPERIMENTAL,$(CM_BUILDTYPE)),) -# External system server capable jar -PRODUCT_SYSTEM_SERVER_JARS += \ - org.cyanogenmod.platform -endif - # Adoptable external storage supports both ext4 and f2fs PRODUCT_PACKAGES += \ e2fsck \ From 0701cd251cb309c3c7967cd720ead5d210dfd6ab Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Tue, 26 May 2015 18:21:15 -0700 Subject: [PATCH 200/502] build/core: Inherit vendor/* makefiles for check-api. Change-Id: I72d409075192b18c35068566c5687092d45be9b4 --- core/clear_vars.mk | 3 ++- core/config.mk | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 5b26943e733..bc59e0ce0f6 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -362,7 +362,8 @@ LOCAL_INIT_RC_32:= LOCAL_INIT_RC_64:= LOCAL_JAVA_LANGUAGE_VERSION:= -LOCAL_IGNORE_SUBDIR:= +# Include any vendor specific clear_vars.mk file +-include $(TOPDIR)vendor/*/build/core/clear_vars.mk # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. diff --git a/core/config.mk b/core/config.mk index a7c66787f1b..47a1e634f60 100644 --- a/core/config.mk +++ b/core/config.mk @@ -896,6 +896,13 @@ ifneq ($(CM_BUILD),) ## We need to be sure the global selinux policies are included ## last, to avoid accidental resetting by device configs $(eval include vendor/cm/sepolicy/sepolicy.mk) + +# Include any vendor specific config.mk file +-include $(TOPDIR)vendor/*/build/core/config.mk + +# Include any vendor specific apicheck.mk file +-include $(TOPDIR)vendor/*/build/core/apicheck.mk + endif include $(BUILD_SYSTEM)/dumpvar.mk From d18a317955b061433c67e4d1342552f40649e45d Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Thu, 13 Aug 2015 18:07:23 -0700 Subject: [PATCH 201/502] build/core: Allow EXTERNAL_CLEAN_TARGETS to dump vars. Change-Id: I4623ad38959aaeac75d6b7905133562a195ef531 --- core/dumpvar.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 2716f656d07..4a56349448d 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -25,11 +25,13 @@ print_build_config_vars := \ BUILD_ID \ OUT_DIR +ifneq (,$(filter true, $(CYNGN_TARGET) $(EXTERNAL_CLEAN_TARGET))) ifeq ($(CYNGN_TARGET),true) print_build_config_vars += \ CYNGN_TARGET \ CYNGN_FEATURES endif +endif ifeq ($(TARGET_BUILD_PDK),true) print_build_config_vars += \ From b6171980e76dff15cf11bdf93fe5471f58ba5cbb Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Wed, 30 Sep 2015 12:17:41 -0700 Subject: [PATCH 202/502] build: Make sure we're building our secondary resource package as dependency. This allows us to reference internal or public resources without going explicitily through the platform sdk. Change-Id: Iba361a3dcd20bc62a06e600e0240fb09d4e7bda4 --- core/package_internal.mk | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/package_internal.mk b/core/package_internal.mk index 551f18e57b1..fb7c6e083ae 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -436,11 +436,24 @@ framework_res_package_export_deps := $(framework_res_package_export) else # LOCAL_SDK_RES_VERSION framework_res_package_export := \ $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk + +# Avoid possible circular dependency with our platform-res +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +cm_plat_res_package_export := \ + $(call intermediates-dir-for,APPS,org.cyanogenmod.platform-res,,COMMON)/package-export.apk +endif # LOCAL_IGNORE_SUBDIR + # We can't depend directly on the export.apk file; it won't get its # PRIVATE_ vars set up correctly if we do. Instead, depend on the # corresponding R.stamp file, which lists the export.apk as a dependency. framework_res_package_export_deps := \ $(dir $(framework_res_package_export))src/R.stamp + +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +cm_plat_res_package_export_deps := \ + $(dir $(cm_plat_res_package_export))src/R.stamp +endif # LOCAL_IGNORE_SUBDIR + endif # LOCAL_SDK_RES_VERSION all_library_res_package_exports := \ $(framework_res_package_export) \ @@ -451,6 +464,14 @@ all_library_res_package_export_deps := \ $(framework_res_package_export_deps) \ $(foreach lib,$(LOCAL_RES_LIBRARIES),\ $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) + +ifneq ($(LOCAL_IGNORE_SUBDIR), true) +all_library_res_package_exports += \ + $(cm_plat_res_package_export) +all_library_res_package_export_deps += \ + $(cm_plat_res_package_export_deps) +endif # LOCAL_IGNORE_SUBDIR + $(resource_export_package) $(R_file_stamp) $(LOCAL_BUILT_MODULE): $(all_library_res_package_export_deps) $(LOCAL_INTERMEDIATE_TARGETS): \ PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports) From 8ebbc2843ad5e00d9a9c78f37eafdbba1f8b4497 Mon Sep 17 00:00:00 2001 From: Brian Chu Date: Tue, 6 Oct 2015 23:49:43 -0700 Subject: [PATCH 203/502] Fix OSX support for new CLI Tools (starting with 7.1) To build on OSX with late-2015 CLI Tools, the build system must include C++ headers from a new location. Mid-2015 CLI Tools and older can still be used, so the older location will also be kept. Change-Id: I422d28cb41ab57fcc816538a822df8aecdf7d9d6 --- core/combo/HOST_darwin-x86.mk | 6 ++++++ core/combo/HOST_darwin-x86_64.mk | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk index c2898617e91..4ba05ce3178 100644 --- a/core/combo/HOST_darwin-x86.mk +++ b/core/combo/HOST_darwin-x86.mk @@ -47,7 +47,13 @@ $(combo_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG := $($(combo_2nd_arch_prefix)HO $(combo_2nd_arch_prefix)HOST_AR := $(AR) $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) +ifeq (,$(wildcard $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1)) +# libc++ header locations for XCode CLT 7.1+ +$(combo_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/usr/include/c++/v1 +else +# libc++ header locations for pre-XCode CLT 7.1+ $(combo_2nd_arch_prefix)HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 +endif $(combo_2nd_arch_prefix)HOST_GLOBAL_LDFLAGS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) $(combo_2nd_arch_prefix)HOST_GLOBAL_CFLAGS += -fPIC -funwind-tables diff --git a/core/combo/HOST_darwin-x86_64.mk b/core/combo/HOST_darwin-x86_64.mk index 251455f0bf6..ba984d23577 100644 --- a/core/combo/HOST_darwin-x86_64.mk +++ b/core/combo/HOST_darwin-x86_64.mk @@ -47,7 +47,13 @@ HOST_TOOLCHAIN_FOR_CLANG := $(HOST_TOOLCHAIN_ROOT) HOST_AR := $(AR) HOST_GLOBAL_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) +ifeq (,$(wildcard $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1)) +# libc++ header locations for XCode CLT 7.1+ +HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/usr/include/c++/v1 +else +# libc++ header locations for pre-XCode CLT 7.1+ HOST_GLOBAL_CPPFLAGS += -isystem $(mac_sdk_path)/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 +endif HOST_GLOBAL_LDFLAGS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) HOST_GLOBAL_CFLAGS += -fPIC -funwind-tables From fb1c1cd2c32fa524f4df7817d0a99f3b97d0e783 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Wed, 24 Aug 2016 00:00:56 -0400 Subject: [PATCH 204/502] build: Remove extra $ to properly parse build number file --- core/main.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/main.mk b/core/main.mk index 175f0c6863e..8fe8db0479a 100644 --- a/core/main.mk +++ b/core/main.mk @@ -122,8 +122,8 @@ endif $(shell mkdir -p $(OUT_DIR) && \ echo -n $(BUILD_NUMBER) > $(OUT_DIR)/build_number.txt && \ echo -n $(BUILD_DATETIME) > $(OUT_DIR)/build_date.txt) -BUILD_NUMBER_FROM_FILE := $$(cat $(OUT_DIR)/build_number.txt) -BUILD_DATETIME_FROM_FILE := $$(cat $(OUT_DIR)/build_date.txt) +BUILD_NUMBER_FROM_FILE := $(cat $(OUT_DIR)/build_number.txt) +BUILD_DATETIME_FROM_FILE := $(cat $(OUT_DIR)/build_date.txt) ifeq ($(HOST_OS),darwin) DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE) else From 22f8321457175dc5af945733b65a4f269de0ba35 Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Tue, 6 Oct 2015 11:00:55 -0700 Subject: [PATCH 205/502] mka: allow mka to be run from anywhere in the tree The Android build system expects to be launched from the top of the tree. Invoking mka at any other level often has unintended consequence (e.g. targets the host ARCH because ARCH was not set). The various build shortcuts like m and mm invoke Make from the top of the tree. mka now does the same. Change-Id: Id956cf04cbaf1d12d12549ca54e32b9c2ce1fc29 --- envsetup.sh | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index a80b0b2c3c3..dfc6d9fb2d6 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2182,14 +2182,20 @@ function cmrebase() { } function mka() { - case `uname -s` in - Darwin) - make -j `sysctl hw.ncpu|cut -d" " -f2` "$@" - ;; - *) - mk_timer schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" - ;; - esac + local T=$(gettop) + if [ "$T" ]; then + case `uname -s` in + Darwin) + make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@" + ;; + *) + mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" + ;; + esac + + else + echo "Couldn't locate the top of the tree. Try setting TOP." + fi } function cmka() { From 0eacf00659699861a20d57e3cc8158bc070c7e0a Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Wed, 28 Oct 2015 11:04:01 -0700 Subject: [PATCH 206/502] build: Introduce ainfo, aerror functions envsetup.sh calls make directly to set some build vars. Any "bare" info or error messages interfere with the logic, so they must be guarded with checks for CALLED_FROM_SETUP. This is tedious and error prone, so provide an alternative that handles this logic automagically. Change-Id: I9f9a355a6ae58f2b173cffce796e37be1e68238c --- core/config.mk | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/config.mk b/core/config.mk index 47a1e634f60..d929c2a68ee 100644 --- a/core/config.mk +++ b/core/config.mk @@ -3,6 +3,24 @@ # current configuration and platform, which # are not specific to what is being built. +# These may be used to trace makefile issues without interfering with +# envsetup.sh. Usage: +# $(call ainfo,some info message) +# $(call aerror,some error message) +ifdef CALLED_FROM_SETUP +define ainfo +endef +define aerror +endef +else +define ainfo +$(info $(1)) +endef +define aerror +$(error $(1)) +endef +endif + # Only use ANDROID_BUILD_SHELL to wrap around bash. # DO NOT use other shells such as zsh. ifdef ANDROID_BUILD_SHELL From a23160481bbe8f2e20ddcb520a2f71cc98b5822e Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Fri, 30 Oct 2015 12:48:06 -0700 Subject: [PATCH 207/502] build: skip checking boot jars by default Currently, builds are failing this because of non-whitelisted classes in the boot jar. Lets disable this check until we can refactor the code. Change-Id: I1d4b231d43702441a2d5ee9e3c058b9b2a88a38c --- core/tasks/boot_jars_package_check.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/tasks/boot_jars_package_check.mk b/core/tasks/boot_jars_package_check.mk index 188c267400a..28f2b826a39 100644 --- a/core/tasks/boot_jars_package_check.mk +++ b/core/tasks/boot_jars_package_check.mk @@ -16,6 +16,7 @@ # Rules to check if classes in the boot jars are from the whitelisted packages. # +ifneq ($(SKIP_BOOT_JARS_CHECK),) ifneq ($(SKIP_BOOT_JARS_CHECK),true) ifneq ($(TARGET_BUILD_PDK),true) ifdef PRODUCT_BOOT_JARS @@ -44,3 +45,4 @@ droidcore : check-boot-jars endif # PRODUCT_BOOT_JARS endif # TARGET_BUILD_PDK not true endif # SKIP_BOOT_JARS_CHECK not true +endif # SKIP_BOOT_JARS_CHECK not defined From a4b2672b0723ecce09a3faa02388111e8d92b96c Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Mon, 2 Nov 2015 05:33:10 -0800 Subject: [PATCH 208/502] build: fix dopush with zsh Change-Id: I4a9e71cfa820583c4d48363815f1ced05d972b54 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index dfc6d9fb2d6..25bec96ad81 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2310,7 +2310,7 @@ EOF fi stop_n_start=false - for FILE in $LOC; do + for FILE in $(echo $LOC | tr " " "\n"); do # Make sure file is in $OUT/system or $OUT/data case $FILE in $OUT/system/*|$OUT/data/*) From b92b85c8e0b47ad6d6def37b8ef710172080bfd4 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Sat, 31 Oct 2015 04:50:20 -0700 Subject: [PATCH 209/502] build: create dt.img task * Remove dt.img creation from generate_extra_images Change-Id: I676b588cd9acb671771acda638abefee036f0519 build: Don't load dt.img task if custom mkbootimg is used Change-Id: I7617554a8dc6f44ea0c6a713d834da4fe558caec core: Account for prebuilt DT images Change-Id: I52b49fd3e9fc0cb196372e3249c7e3d8b888cdd1 dt_image: Fix build error build/core/tasks/dt_image.mk:38: *** missing `endif'. Stop. Change-Id: If333d378e091ff9d333729dc8a75323966954194 build: only specify least specific directory to dtbtool New kernels (3.18) place dtb files into the qcom subdirectory, but older kernels simply create a qcom subdirectory and place the dtb files at the same level in the heirarchy. Rather than looking for the first directory that exists, dtbtool has been modified to search all subdirectories for dtb files, and therefore we have to remove the specific subdirectories. Change-Id: I82e948c0a20605f051a60fdfaae9679e1fa6555e core: tasks: Use KERNEL_ARCH in dt_image task * KERNEL_ARCH equals to TARGET_ARCH or TARGET_KERNEL_ARCH if specified Change-Id: I906e04fd646467ce70da92cb047f0fa0a6ebdb94 build: Use compatibility DTB directory path for custom DTB tool builds * dtbToolCM is able to search subdirectories, but we are not guaranteed that other dtbTool binaries have the same capability. Re-specify multiple paths for non-dtbToolCM builds just in case. Change-Id: Id69e000af5eba60a07662b178cb95950451efd17 build: Add dt.img and kernel target Change-Id: I4a266d8bd2b01ec4ec696f10f0cc7e912f25a38a dt_image: Rename target Change-Id: I2fbe952b55296b6e1a533d071c769788ab3f14ae Signed-off-by: Brandon McAnsh --- core/generate_extra_images.mk | 36 -------------------------- core/tasks/dt_image.mk | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 core/tasks/dt_image.mk diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk index e4648164679..f7fb0c50423 100644 --- a/core/generate_extra_images.mk +++ b/core/generate_extra_images.mk @@ -77,42 +77,6 @@ $(INSTALLED_PERSISTIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(INTERNAL_PERS ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_PERSISTIMAGE_TARGET) ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_PERSISTIMAGE_TARGET) - -#---------------------------------------------------------------------- -# Generate device tree image (dt.img) -#---------------------------------------------------------------------- -ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) -ifeq ($(strip $(BUILD_TINY_ANDROID)),true) -include device/qcom/common/dtbtool/Android.mk -endif - -ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) -DTBTOOL_NAME := dtbToolCM -else -DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) -endif - -DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) - -INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img - -possible_dtb_dirs = $(KERNEL_OUT)/arch/$(TARGET_KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/arm/boot/ -dtb_dir = $(firstword $(wildcard $(possible_dtb_dirs))) - -define build-dtimage-target - $(call pretty,"Target dt image: $(INSTALLED_DTIMAGE_TARGET)") - $(hide) $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(dtb_dir) - $(hide) chmod a+r $@ -endef - -$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) - $(build-dtimage-target) - @echo -e ${CL_CYN}"Made DT image: $@"${CL_RST} - -ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) -ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) -endif - #---------------------------------------------------------------------- # Generate extra userdata images (for variants with multiple mmc sizes) #---------------------------------------------------------------------- diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk new file mode 100644 index 00000000000..60d45cc918b --- /dev/null +++ b/core/tasks/dt_image.mk @@ -0,0 +1,48 @@ +#---------------------------------------------------------------------- +# Generate device tree image (dt.img) +#---------------------------------------------------------------------- +ifeq ($(strip $(BOARD_CUSTOM_BOOTIMG_MK)),) +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) +ifneq ($(strip $(BOARD_KERNEL_PREBUILT_DT)),true) +ifeq ($(strip $(BUILD_TINY_ANDROID)),true) +include device/qcom/common/dtbtool/Android.mk +endif + +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +DTBTOOL_NAME := dtbToolCM +else +DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) +endif + +DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) + +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +# dtbToolCM will search subdirectories +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ +else +# Most specific paths must come first in possible_dtb_dirs +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ +endif +dtb_dir = $(firstword $(wildcard $(possible_dtb_dirs))) + +define build-dtimage-target + $(call pretty,"Target dt image: $@") + $(hide) $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(dtb_dir) + $(hide) chmod a+r $@ +endef + +$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) + $(build-dtimage-target) + @echo -e ${CL_CYN}"Made DT image: $@"${CL_RST} + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) + +.PHONY: dtimage +dtimage: $(INSTALLED_DTIMAGE_TARGET) + +endif +endif +endif From 724bff2db8f2be2b84b203014131c58e1d1cc28b Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Thu, 5 Nov 2015 00:55:01 -0500 Subject: [PATCH 210/502] Conditionally create symlink /system/vendor if needed We don't need to build a vendor image in CM, just create the symlink for Nexus devices that use a vendor partition To use add BOARD_NEEDS_VENDORIMAGE_SYMLINK := true to BoardConfig.mk Change-Id: Id39ee89007af39346f0887796ed3cbad81765c46 --- core/Makefile | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/Makefile b/core/Makefile index 2321c85b675..b0e314b851c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1220,6 +1220,18 @@ define create-system-vendor-symlink endef endif +# Only Create symlink /system/vendor to /vendor if necessary. +ifdef BOARD_NEEDS_VENDORIMAGE_SYMLINK +define create-system-vendor-symlink +$(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \ + echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \ + echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \ + exit 1; \ +fi +$(hide) ln -sf /vendor $(TARGET_OUT)/vendor +endef +endif + # $(1): output file define build-systemimage-target @echo "Target system fs image: $(1)" From cd04da9e1c8a0bdf24e0eb64043558c8decb1ea3 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Fri, 30 Oct 2015 06:08:48 -0700 Subject: [PATCH 211/502] build: Disable relocation packing on recovery and utility executables Change-Id: I2a543537c114cfc1a6d9746fe7c0bc00338ad32d --- core/dynamic_binary.mk | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/dynamic_binary.mk b/core/dynamic_binary.mk index 5bae75a3d83..e5bec0747fd 100644 --- a/core/dynamic_binary.mk +++ b/core/dynamic_binary.mk @@ -62,6 +62,14 @@ ifeq ($(LOCAL_MODULE_CLASS),EXECUTABLES) my_pack_module_relocations := false endif +# Likewise for recovery and utility executables +ifeq ($(LOCAL_MODULE_CLASS),RECOVERY_EXECUTABLES) + my_pack_module_relocations := false +endif +ifeq ($(LOCAL_MODULE_CLASS),UTILITY_EXECUTABLES) + my_pack_module_relocations := false +endif + # TODO (dimitry): Relocation packer is not yet available for darwin ifneq ($(HOST_OS),linux) my_pack_module_relocations := false From 012b8e3f5611697d3a1d15a81946fc05e492e165 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Sat, 22 Nov 2014 08:43:59 -0800 Subject: [PATCH 212/502] build: Add option to disable block-based ota While block-based is great when building on a local machine, it kills rsync performance when syncing rebuilds from remote machines. Provide an option to disable it for those whose network bandwidth is less than their device's emmc bandwidth. Usage: export BLOCK_BASED_OTA=false Change-Id: I1dfaa5478a87dad286014dbe57cd5a03da4d1980 --- core/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index b0e314b851c..9ca2928a9a9 100644 --- a/core/Makefile +++ b/core/Makefile @@ -2098,13 +2098,17 @@ ifneq ($(TARGET_UNIFIED_DEVICE),) endif endif +ifneq ($(BLOCK_BASED_OTA),false) + $(INTERNAL_OTA_PACKAGE_TARGET): block_based := --block +endif + $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ - --block \ + $(block_based) \ -p $(HOST_OUT) \ -k $(KEY_CERT_PAIR) \ --backup=$(backuptool) \ From e43bf4dcb57231a25561a877b800bdc8503ccfda Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Tue, 10 Nov 2015 23:51:21 +0100 Subject: [PATCH 213/502] eat: GTFO after done eating * We need to use sideload_auto_reboot if we want to eat and run. Change-Id: I09c31bdd7a381f5fe74cd527c3019f1c3d9be2c3 --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 25bec96ad81..6f60cd40eb3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -813,7 +813,7 @@ function eat() sleep 1 adb wait-for-device cat << EOF > /tmp/command ---sideload +--sideload_auto_reboot EOF if adb push /tmp/command /cache/recovery/ ; then echo "Rebooting into recovery for sideload installation" From d4c9bb4017315148cde73b58645af4d2085bcf90 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 15 Nov 2015 18:47:58 -0800 Subject: [PATCH 214/502] envsetup: Remove Busybox references * Toybox provides the necessary commands. Change-Id: Ia65948a49cb9f7093a6d2b651f6a8a67e300ad6e --- envsetup.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 6f60cd40eb3..059668918f8 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -798,10 +798,10 @@ function eat() return 1 fi adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then echo "No device is online. Waiting for one..." echo "Please connect USB and/or enable USB debugging" - until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do sleep 1 done echo "Device Found.." @@ -2252,10 +2252,10 @@ function dopush() shift adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if [ $(adb get-state) != device -a $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then echo "No device is online. Waiting for one..." echo "Please connect USB and/or enable USB debugging" - until [ $(adb get-state) = device -o $(adb shell busybox test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do sleep 1 done echo "Device Found." From 0a27aecbd69f827b0748dabb2224ce9e716f85af Mon Sep 17 00:00:00 2001 From: Sam Mortimer Date: Mon, 16 Nov 2015 14:47:25 -0800 Subject: [PATCH 215/502] Permit redirection of vendor to system For devices where /system/vendor needs to be a symlink to /vendor. This allows a target to set TARGET_COPY_OUT_VENDOR := system in order to force modules that want to be placed in vendor to instead be redirected into /system. eg angler Change-Id: I4bffcefcda0b33dc5350b1702ec6d0166b18d775 --- core/envsetup.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/envsetup.mk b/core/envsetup.mk index aadaa5637cd..fe4cfa15d5d 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -168,8 +168,8 @@ board_config_mk := # Now we can substitute with the real value of TARGET_COPY_OUT_VENDOR ifeq ($(TARGET_COPY_OUT_VENDOR),$(_vendor_path_placeholder)) TARGET_COPY_OUT_VENDOR := system/vendor -else ifeq ($(filter vendor system/vendor,$(TARGET_COPY_OUT_VENDOR)),) -$(error TARGET_COPY_OUT_VENDOR must be either 'vendor' or 'system/vendor', seeing '$(TARGET_COPY_OUT_VENDOR)'.) +else ifeq ($(filter vendor system/vendor system,$(TARGET_COPY_OUT_VENDOR)),) +$(error TARGET_COPY_OUT_VENDOR must be either 'vendor', 'system/vendor' or 'system', seeing '$(TARGET_COPY_OUT_VENDOR)'.) endif PRODUCT_COPY_FILES := $(subst $(_vendor_path_placeholder),$(TARGET_COPY_OUT_VENDOR),$(PRODUCT_COPY_FILES)) ########################################### From 5c6d59c9c6725b8553ef251b6224a59e865965e9 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Wed, 2 Dec 2015 11:23:53 -0800 Subject: [PATCH 216/502] build: recovery: Support extra recovery resources If set, RECOVERY_EXTRA_RESOURCE_DIR will override default resources. Device specific private directories in TARGET_DEVICE_DIR and TARGET_RECOVERY_DEVICE_DIRS will continue to override both of these. Change-Id: I9e5a2210ffe53483173056f3dc4b17fe669509e7 --- core/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 9ca2928a9a9..f5e217aa330 100644 --- a/core/Makefile +++ b/core/Makefile @@ -917,6 +917,11 @@ else recovery_resources_common := $(recovery_resources_common)-xhdpi endif +ifneq (,$(RECOVERY_EXTRA_RESOURCE_DIR)) +recovery_resources_extra := $(strip \ + $(wildcard $(RECOVERY_EXTRA_RESOURCE_DIR)/res-$(recovery_density))) +endif + # Select the 18x32 font on high-density devices (xhdpi and up); and # the 12x22 font on other devices. Note that the font selected here # can be overridden for a particular device by putting a font.png in @@ -942,7 +947,7 @@ ifndef TARGET_PRIVATE_RES_DIRS TARGET_PRIVATE_RES_DIRS := $(wildcard $(TARGET_DEVICE_DIR)/recovery/res) endif recovery_resource_deps := $(shell find $(recovery_resources_common) \ - $(TARGET_PRIVATE_RES_DIRS) -type f) + $(recovery_resources_extra) $(TARGET_PRIVATE_RES_DIRS) -type f) ifdef TARGET_RECOVERY_FSTAB recovery_fstab := $(TARGET_RECOVERY_FSTAB) else @@ -1044,6 +1049,8 @@ define build-recoveryramdisk $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/res $(hide) rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res/* $(hide) cp -rf $(recovery_resources_common)/* $(TARGET_RECOVERY_ROOT_OUT)/res + $(hide) $(foreach item,$(recovery_resources_extra), \ + cp -rf $(item)/* $(TARGET_RECOVERY_ROOT_OUT)/res;) $(hide) cp -f $(recovery_font) $(TARGET_RECOVERY_ROOT_OUT)/res/images/font.png $(hide) $(foreach item,$(recovery_root_private), \ cp -rf $(item) $(TARGET_RECOVERY_OUT)/;) From 21020e248e789c3581c347bd4ace4d964f78a39f Mon Sep 17 00:00:00 2001 From: Jessica Wagantall Date: Fri, 4 Dec 2015 15:01:12 -0800 Subject: [PATCH 217/502] img_from_target_files: Imports added to fix the script Change-Id: Ib9e43c9d0a067106f5d554b7ea2fa414ce93a55b --- tools/releasetools/img_from_target_files.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index 8b8a009a6ef..5ddd622d4ce 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -32,8 +32,12 @@ print >> sys.stderr, "Python 2.7 or newer is required." sys.exit(1) +import errno import os +import re import shutil +import subprocess +import tempfile import zipfile import common From 5f6c42366b7f0d526ecf864ff7501fa7936383f0 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Tue, 1 Dec 2015 14:53:23 +0100 Subject: [PATCH 218/502] dopush: Add support for OS X * OS X's sed doesn't have `-r` parameter and requires different color stripping regex. Change-Id: I2438f0492b1b564be6b7596fa123fc17eb64b25f --- envsetup.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 059668918f8..368e45f14e1 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2286,10 +2286,18 @@ function dopush() fi # Install: - LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" + if [ `uname` = "Linux" ]; then + LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" + else + LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Install: ' | cut -d ':' -f 2)" + fi # Copy: - LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + if [ `uname` = "Linux" ]; then + LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + else + LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Copy: ' | cut -d ':' -f 2)" + fi # If any files are going to /data, push an octal file permissions reader to device if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then From a6dff31f63b76ec7e1fbd28558fa8efb2fa08e9a Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 14:34:19 -0400 Subject: [PATCH 219/502] py3: fileslist Change-Id: Id80525a2aebb361b8cd178c02861f370ecae91eb --- tools/fileslist.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/fileslist.py b/tools/fileslist.py index a11efaa8fed..1442bd32b4f 100755 --- a/tools/fileslist.py +++ b/tools/fileslist.py @@ -15,6 +15,8 @@ # limitations under the License. # +from __future__ import print_function + import operator, os, sys def get_file_size(path): @@ -39,7 +41,7 @@ def main(argv): pass output.sort(key=operator.itemgetter(0), reverse=True) for row in output: - print "%12d %s" % row + print("%12d %s" % row) if __name__ == '__main__': main(sys.argv) From 0e44b9a201287dce4488456a94bffa1a8c4a85d1 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 14:55:28 -0400 Subject: [PATCH 220/502] py3: filter-product-graph Change-Id: I1f028e054f8b261b486d152b57d6a97bfb9c42af --- tools/filter-product-graph.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/filter-product-graph.py b/tools/filter-product-graph.py index b3a5b42c39f..d6100d8a623 100755 --- a/tools/filter-product-graph.py +++ b/tools/filter-product-graph.py @@ -1,6 +1,8 @@ #!/usr/bin/env python # vim: ts=2 sw=2 nocindent +from __future__ import print_function + import re import sys @@ -55,13 +57,13 @@ def info(m): deps = [dep for dep in deps if dep[1] in included] infos = [info for info in infos if info[0] in included] - print "digraph {" - print "graph [ ratio=.5 ];" + print("digraph {") + print("graph [ ratio=.5 ];") for dep in deps: - print '"%s" -> "%s"' % dep + print('"%s" -> "%s"' % dep) for info in infos: - print '"%s"%s' % info - print "}" + print('"%s"%s' % info) + print("}") if __name__ == "__main__": From b49adcc2a99370c0e12826d503e908607722df7b Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 15:40:11 -0400 Subject: [PATCH 221/502] py3: parsedeps Change-Id: I7a1df87da284e771eeca65c44ab91f88aaab5c80 --- tools/parsedeps.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/tools/parsedeps.py b/tools/parsedeps.py index 32d8ad7d67e..9a4fc8e902e 100755 --- a/tools/parsedeps.py +++ b/tools/parsedeps.py @@ -1,6 +1,8 @@ #!/usr/bin/env python # vim: ts=2 sw=2 +from __future__ import print_function + import optparse import re import sys @@ -49,7 +51,9 @@ def get(self, tgt): return None def __iter__(self): - return self.lines.iteritems() + if hasattr(self.lines, 'iteritems'): + return self.lines.iteritems() + return iter(self.lines.items()) def trace(self, tgt, prereq): self.__visit = self.__visit + 1 @@ -73,9 +77,9 @@ def __trace(self, d, prereq): return result def help(): - print "Commands:" - print " dep TARGET Print the prerequisites for TARGET" - print " trace TARGET PREREQ Print the paths from TARGET to PREREQ" + print("Commands:") + print(" dep TARGET Print the prerequisites for TARGET") + print(" trace TARGET PREREQ Print the paths from TARGET to PREREQ") def main(argv): @@ -87,7 +91,7 @@ def main(argv): deps = Dependencies() filename = args[0] - print "Reading %s" % filename + print("Reading %s" % filename) if True: f = open(filename) @@ -106,7 +110,7 @@ def main(argv): deps.add(tgt, prereq) f.close() - print "Read %d dependencies. %d targets." % (deps.count, len(deps.lines)) + print("Read %d dependencies. %d targets." % (deps.count, len(deps.lines))) while True: line = raw_input("target> ") if not line.strip(): @@ -118,12 +122,12 @@ def main(argv): d = deps.get(tgt) if d: for prereq in d.prereqs: - print prereq.tgt + print(prereq.tgt) elif len(split) == 3 and cmd == "trace": tgt = split[1] prereq = split[2] if False: - print "from %s to %s" % (tgt, prereq) + print("from %s to %s" % (tgt, prereq)) trace = deps.trace(tgt, prereq) if trace: width = 0 @@ -134,10 +138,10 @@ def main(argv): for g in trace: for t in g: if t.pos: - print t.tgt, " " * (width-len(t.tgt)), " #", t.pos + print(t.tgt, " " * (width-len(t.tgt)), " #", t.pos) else: - print t.tgt - print + print(t.tgt) + print() else: help() @@ -145,7 +149,6 @@ def main(argv): try: main(sys.argv) except KeyboardInterrupt: - print + print() except EOFError: - print - + print() From 30ceac779e13fe894ab85d8baaed3beae0540263 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 14:04:43 -0400 Subject: [PATCH 222/502] py3: update checktree Change-Id: Ibaf304bf1103ba3f1451525001f9fb90c164a027 --- core/checktree | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/checktree b/core/checktree index 287268328b2..87b12335bf4 100755 --- a/core/checktree +++ b/core/checktree @@ -1,5 +1,7 @@ #!/usr/bin/env python -E +from __future__ import print_function + import sys, os, re excludes = [r'.*?/\.obj.*?', @@ -11,7 +13,7 @@ excludes = [r'.*?/\.obj.*?', r'.*?/out/.*?', r'.*?/install/.*?'] -excludes_compiled = map(re.compile, excludes) +excludes_compiled = list(map(re.compile, excludes)) def filter_excludes(str): for e in excludes_compiled: @@ -60,9 +62,9 @@ def run(command, regex, filt): filt_compiled = re.compile(filt) if len(lines) >= 1: - lines = filter(filterit, lines) + lines = list(filter(filterit, lines)) if len(lines) >= 1: - return map(matchit, lines) + return list(map(matchit, lines)) return None try: @@ -71,24 +73,24 @@ try: elif len(sys.argv) == 2 and sys.argv[1] == "-a": do_exclude = False else: - print "usage: checktree [-a]" - print " -a don't filter common crud in the tree" + print("usage: checktree [-a]") + print(" -a don't filter common crud in the tree") sys.exit(1) have = run("p4 have ...", r'[^#]+#[0-9]+ - (.*)', r'.*') cwd = os.getcwd() files = run("find . -not -type d", r'.(.*)', r'.*') - files = map(lambda s: cwd+s, files) + files = [cwd+s for s in files] added_depot_path = run("p4 opened ...", r'([^#]+)#.*', r'.*?#[0-9]+ - add .*'); added = [] if added_depot_path: - added_depot_path = map(quotate, added_depot_path) + added_depot_path = list(map(quotate, added_depot_path)) where = "p4 where " + " ".join(added_depot_path) added = run(where, r'(.*)', r'.*') - added = map(split_perforce_parts, added) + added = list(map(split_perforce_parts, added)) extras = [] @@ -106,8 +108,8 @@ try: extras = filter(filter_excludes, extras) for s in extras: - print s.replace(" ", "\\ ") + print(s.replace(" ", "\\ ")) -except PerforceError, e: +except PerforceError as e: sys.exit(2) From fa7dac90d7465f4ebf4b7f21052c6d357759d288 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 13:55:41 -0400 Subject: [PATCH 223/502] py3: update check_boot_jars Change-Id: I71ba943fb8c23713efc7c2a815fd2ddb9fa659f2 --- core/tasks/check_boot_jars/check_boot_jars.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/tasks/check_boot_jars/check_boot_jars.py b/core/tasks/check_boot_jars/check_boot_jars.py index 5a0ec401635..cd0bd75302f 100755 --- a/core/tasks/check_boot_jars/check_boot_jars.py +++ b/core/tasks/check_boot_jars/check_boot_jars.py @@ -1,5 +1,7 @@ #!/usr/bin/env python +from __future__ import print_function + """ Check boot jars. @@ -55,15 +57,15 @@ def CheckJar(jar): package_name = package_name.replace('/', '.') # Skip class without a package name if package_name and not whitelist_re.match(package_name): - print >> sys.stderr, ('Error: %s: unknown package name of class file %s' - % (jar, f)) + print('Error: %s: unknown package name of class file %s' + % (jar, f), file=sys.stderr) return False return True def main(argv): if len(argv) < 2: - print __doc__ + print(__doc__) return 1 if not LoadWhitelist(argv[0]): From 153150c576c06e6a9c370ad4d5c30a2c5b59a84d Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 14:30:58 -0400 Subject: [PATCH 224/502] py3: compare_filelist Change-Id: If44ecbf8b09732f3da72b2ade9c6172dd30e58c3 --- tools/compare_fileslist.py | 45 +++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/tools/compare_fileslist.py b/tools/compare_fileslist.py index 1f507d8647b..148d7405712 100755 --- a/tools/compare_fileslist.py +++ b/tools/compare_fileslist.py @@ -15,8 +15,17 @@ # limitations under the License. # +from __future__ import print_function + import cgi, os, string, sys + +def iteritems(obj): + if hasattr(obj, 'iteritems'): + return obj.iteritems() + return obj.items() + + def IsDifferent(row): val = None for v in row: @@ -37,23 +46,23 @@ def main(argv): lines = f.readlines() f.close() lines = map(string.split, lines) - lines = map(lambda (x,y): (y,int(x)), lines) + lines = [(x_y[1],int(x_y[0])) for x_y in lines] for fn,sz in lines: - if not data.has_key(fn): + if fn not in data: data[fn] = {} data[fn][index] = sz index = index + 1 rows = [] - for fn,sizes in data.iteritems(): + for fn,sizes in iteritems(data): row = [fn] for i in range(0,index): - if sizes.has_key(i): + if i in sizes: row.append(sizes[i]) else: row.append(None) rows.append(row) rows = sorted(rows, key=lambda x: x[0]) - print """ + print(""" - """ - print "" - print "" + """) + print("
") + print("") for input in inputs: combo = input.split(os.path.sep)[1] - print " " % cgi.escape(combo) - print "" + print(" " % cgi.escape(combo)) + print("") for row in rows: - print "" + print("") for sz in row[1:]: if not sz: - print " " + print(" ") elif IsDifferent(row[1:]): - print " " % sz + print(" " % sz) else: - print " " % sz - print " " % cgi.escape(row[0]) - print "" - print "
%s
%s
  %d%d%d%s
" - print "" + print(" %d" % sz) + print(" %s" % cgi.escape(row[0])) + print("") + print("") + print("") if __name__ == '__main__': main(sys.argv) From e9091011fedb557747c3f9b1547f1a961d2bdd59 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 14:54:16 -0400 Subject: [PATCH 225/502] py3: merge-event-log-tags Change-Id: I875d48c67efa129e800bcc834f41d39fc25a62e4 --- tools/merge-event-log-tags.py | 39 +++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/tools/merge-event-log-tags.py b/tools/merge-event-log-tags.py index 64bad3f8133..65580f6a0e0 100755 --- a/tools/merge-event-log-tags.py +++ b/tools/merge-event-log-tags.py @@ -24,7 +24,8 @@ -h to display this usage message and exit. """ -import cStringIO +from __future__ import print_function + import getopt try: import hashlib @@ -33,8 +34,20 @@ import struct import sys +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO + import event_log_tags + +def itermitems(obj): + if hasattr(obj, 'iteritems'): + return obj.iteritems() + return obj.items() + + errors = [] warnings = [] @@ -48,21 +61,21 @@ try: opts, args = getopt.getopt(sys.argv[1:], "ho:m:") -except getopt.GetoptError, err: - print str(err) - print __doc__ +except getopt.GetoptError as err: + print(str(err)) + print(__doc__) sys.exit(2) for o, a in opts: if o == "-h": - print __doc__ + print(__doc__) sys.exit(2) elif o == "-o": output_file = a elif o == "-m": pre_merged_file = a else: - print >> sys.stderr, "unhandled option %s" % (o,) + print("unhandled option %s" % (o,), file=sys.stderr) sys.exit(1) # Restrictions on tags: @@ -133,12 +146,12 @@ if errors: for fn, ln, msg in errors: - print >> sys.stderr, "%s:%d: error: %s" % (fn, ln, msg) + print("%s:%d: error: %s" % (fn, ln, msg), file=sys.stderr) sys.exit(1) if warnings: for fn, ln, msg in warnings: - print >> sys.stderr, "%s:%d: warning: %s" % (fn, ln, msg) + print("%s:%d: warning: %s" % (fn, ln, msg), file=sys.stderr) # Python's hash function (a) isn't great and (b) varies between # versions of python. Using md5 is overkill here but is the same from @@ -154,14 +167,14 @@ def hashname(str): # If we were provided pre-merged tags (w/ the -m option), then don't # ever try to allocate one, just fail if we don't have a number -for name, t in sorted(by_tagname.iteritems()): +for name, t in sorted(iteritems(by_tagname)): if t.tagnum is None: if pre_merged_tags: try: t.tagnum = pre_merged_tags[t.tagname] except KeyError: - print >> sys.stderr, ("Error: Tag number not defined for tag `%s'." - +" Have you done a full build?") % t.tagname + print("Error: Tag number not defined for tag `%s'." + " Have you done a full build?" % t.tagname, file=sys.stderr) sys.exit(1) else: while True: @@ -174,8 +187,8 @@ def hashname(str): # by_tagnum should be complete now; we've assigned numbers to all tags. -buffer = cStringIO.StringIO() -for n, t in sorted(by_tagnum.iteritems()): +buffer = StringIO() +for n, t in sorted(iteritems(by_tagnum)): if t.description: buffer.write("%d %s %s\n" % (t.tagnum, t.tagname, t.description)) else: From ddda28a21773e03332d54180191dfec5ad9bc8bd Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 15:06:38 -0400 Subject: [PATCH 226/502] py3: product_debug Change-Id: I4a1e25753a9addd199f148e7eec883b3d9ea337a --- tools/product_debug.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/product_debug.py b/tools/product_debug.py index ff2657c6d8b..891587f0c68 100755 --- a/tools/product_debug.py +++ b/tools/product_debug.py @@ -14,10 +14,19 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import os import re import sys + +def iteritems(obj): + if hasattr('iteritems'): + return obj.iteritems() + return obj.items() + + def break_lines(key, val): # these don't get split if key in ("PRODUCT_MODEL"): @@ -42,7 +51,7 @@ def parse_variables(lines): def render_variables(variables): variables = dict(variables) del variables["FILE"] - variables = list(variables.iteritems()) + variables = list(variables.items()) variables.sort(lambda a, b: cmp(a[0], b[0])) return ("" + "\n".join([ "" % { "key": key, "val": val } @@ -104,7 +113,7 @@ def main(argv): "variables": render_variables(variables), "original": render_original(variables, original), }) - print """ + print(""" @@ -153,7 +162,7 @@ def main(argv): %(variables)s -""" % values +""" % values) if __name__ == "__main__": main(sys.argv) From caaaedf2b1566896aef1fea21ffd059419ae3e2c Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 15:17:53 -0400 Subject: [PATCH 227/502] py3: java-layers Change-Id: Id3759aa6e25e06dfe7604fc1580ee3060175c485 --- tools/java-layers.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/tools/java-layers.py b/tools/java-layers.py index b3aec2b1d5f..d7c0c8ef352 100755 --- a/tools/java-layers.py +++ b/tools/java-layers.py @@ -1,9 +1,18 @@ #!/usr/bin/env python +from __future__ import print_function + import os import re import sys + +def itervalues(obj): + if hasattr(obj, 'itervalues'): + return obj.itervalues() + return obj.values() + + def fail_with_usage(): sys.stderr.write("usage: java-layers.py DEPENDENCY_FILE SOURCE_DIRECTORIES...\n") sys.stderr.write("\n") @@ -69,27 +78,27 @@ def recurse(obj, dep, visited): if upper in deps: recurse(obj, deps[upper], visited) self.deps = deps - self.parts = [(dep.lower.split('.'),dep) for dep in deps.itervalues()] + self.parts = [(dep.lower.split('.'),dep) for dep in itervalues(deps)] # transitive closure of dependencies - for dep in deps.itervalues(): + for dep in itervalues(deps): recurse(dep, dep, []) # disallow everything from the low level components - for dep in deps.itervalues(): + for dep in itervalues(deps): if dep.lowlevel: - for d in deps.itervalues(): + for d in itervalues(deps): if dep != d and not d.legacy: dep.transitive.add(d.lower) # disallow the 'top' components everywhere but in their own package - for dep in deps.itervalues(): + for dep in itervalues(deps): if dep.top and not dep.legacy: - for d in deps.itervalues(): + for d in itervalues(deps): if dep != d and not d.legacy: d.transitive.add(dep.lower) - for dep in deps.itervalues(): + for dep in itervalues(deps): dep.transitive = set([x+"." for x in dep.transitive]) if False: - for dep in deps.itervalues(): - print "-->", dep.lower, "-->", dep.transitive + for dep in itervalues(deps): + print("-->", dep.lower, "-->", dep.transitive) # Lookup the dep object for the given package. If pkg is a subpackage # of one with a rule, that one will be returned. If no matches are found, @@ -218,8 +227,8 @@ def examine_java_file(deps, filename): imports.append(m.group(1)) # Do the checking if False: - print filename - print "'%s' --> %s" % (pkg, imports) + print(filename) + print("'%s' --> %s" % (pkg, imports)) dep = deps.lookup(pkg) if not dep: sys.stderr.write(("%s: Error: Package does not appear in dependency file: " From 1142301454eac2e3cef4d61f4197665050f9d333 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 15:25:51 -0400 Subject: [PATCH 228/502] py3: java-event-log-tags Change-Id: I0bf4cbe990c21b6d57e54e96ea62c56ca2d41b86 --- tools/java-event-log-tags.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/tools/java-event-log-tags.py b/tools/java-event-log-tags.py index f364751c4fb..6ac69bdba7b 100755 --- a/tools/java-event-log-tags.py +++ b/tools/java-event-log-tags.py @@ -23,37 +23,43 @@ -h to display this usage message and exit. """ -import cStringIO +from __future__ import print_function + import getopt import os import os.path import re import sys +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO + import event_log_tags output_file = None try: opts, args = getopt.getopt(sys.argv[1:], "ho:") -except getopt.GetoptError, err: - print str(err) - print __doc__ +except getopt.GetoptError as err: + print(str(err)) + print(__doc__) sys.exit(2) for o, a in opts: if o == "-h": - print __doc__ + print(__doc__) sys.exit(2) elif o == "-o": output_file = a else: - print >> sys.stderr, "unhandled option %s" % (o,) + print("unhandled option %s" % o, file=sys.stderr) sys.exit(1) if len(args) != 2: - print "need exactly two input files, not %d" % (len(args),) - print __doc__ + print("need exactly two input files, not %d" % len(args)) + print(__doc__) sys.exit(1) fn = args[0] @@ -85,10 +91,10 @@ if tagfile.errors: for fn, ln, msg in tagfile.errors: - print >> sys.stderr, "%s:%d: error: %s" % (fn, ln, msg) + print("%s:%d: error: %s" % (fn, ln, msg), file=sys.stderr) sys.exit(1) -buffer = cStringIO.StringIO() +buffer = StringIO() buffer.write("/* This file is auto-generated. DO NOT MODIFY.\n" " * Source file: %s\n" " */\n\n" % (fn,)) From 631257bd3ed17a5bc128693d360bc95d629ece40 Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 31 Oct 2015 15:27:39 -0400 Subject: [PATCH 229/502] py3: post_process_props Change-Id: Idf7ed5daa4eaa88f5421c798862ea6bb09593cdc --- tools/post_process_props.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 940dd9b378b..6cfbca6c0d2 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -16,6 +16,13 @@ import os, sys + +def iteritems(obj): + if hasattr(obj, 'iteritems'): + return obj.iteritems() + return obj.items() + + # Usage: post_process_props.py file.prop [blacklist_key, ...] # Blacklisted keys are removed from the property file, if present @@ -64,7 +71,7 @@ def validate(prop): """ check_pass = True buildprops = prop.to_dict() - for key, value in buildprops.iteritems(): + for key, value in iteritems(buildprops): # Check build properties' length. if len(key) > PROP_NAME_MAX: check_pass = False From 6cb0e68159dadb367be69f747b8bf31da53f356d Mon Sep 17 00:00:00 2001 From: Anthony King Date: Tue, 3 Nov 2015 00:23:11 +0000 Subject: [PATCH 230/502] py3: update all the things Change-Id: I5e11b46b7c2f7f8760d6c0e713ca99c1e88b7cd3 py3: update releasetools with proper print syntax Change-Id: I48534a72e6559f60af5f9b1c09040b34b7575b63 py3: ota_from_target_files.py: fix logic that broke Change-Id: I032097c463598d1246feb92c02567175a65f90fd --- tools/adbs | 2 + tools/check_radio_versions.py | 22 ++-- tools/compare_fileslist.py | 6 +- tools/diff_package_overlays.py | 6 +- tools/event_log_tags.py | 10 +- tools/fileslist.py | 2 +- tools/findleaves.py | 6 +- tools/generate-notice-files.py | 87 ++++++++------- tools/getb64key.py | 7 +- tools/java-event-log-tags.py | 2 +- tools/java-layers.py | 6 +- tools/merge-event-log-tags.py | 2 +- tools/parsedeps.py | 8 +- tools/post_process_props.py | 4 +- tools/product_debug.py | 11 +- tools/releasetools/add_img_to_target_files.py | 40 +++---- tools/releasetools/blockimgdiff.py | 2 +- tools/releasetools/build_image.py | 49 +++++---- .../check_target_files_signatures.py | 79 +++++++------ tools/releasetools/common.py | 85 ++++++++------ tools/releasetools/edify_generator.py | 4 +- tools/releasetools/img_from_target_files.py | 20 ++-- tools/releasetools/make_recovery_patch.py | 4 +- tools/releasetools/ota_from_target_files.py | 104 +++++++++--------- tools/releasetools/rangelib.py | 2 + tools/releasetools/sign_target_files_apks.py | 70 ++++++------ tools/releasetools/sparse_img.py | 2 + tools/roomservice.py | 5 +- tools/warn.py | 6 +- 29 files changed, 362 insertions(+), 291 deletions(-) diff --git a/tools/adbs b/tools/adbs index a8f06c04ef3..9bd51604566 100755 --- a/tools/adbs +++ b/tools/adbs @@ -14,6 +14,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import os import os.path import re diff --git a/tools/check_radio_versions.py b/tools/check_radio_versions.py index ebe621f4669..2617424d42f 100755 --- a/tools/check_radio_versions.py +++ b/tools/check_radio_versions.py @@ -14,8 +14,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import sys -import os try: from hashlib import sha1 @@ -52,8 +53,9 @@ try: f = open(fn + ".sha1") except IOError: - if not bad: print - print "*** Error opening \"%s.sha1\"; can't verify %s" % (fn, key) + if not bad: + print() + print("*** Error opening \"%s.sha1\"; can't verify %s" % (fn, key)) bad = True continue for line in f: @@ -63,17 +65,19 @@ versions[h] = v if digest not in versions: - if not bad: print - print "*** SHA-1 hash of \"%s\" doesn't appear in \"%s.sha1\"" % (fn, fn) + if not bad: + print() + print("*** SHA-1 hash of \"%s\" doesn't appear in \"%s.sha1\"" % (fn, fn)) bad = True continue if versions[digest] not in values: - if not bad: print - print "*** \"%s\" is version %s; not any %s allowed by \"%s\"." % ( - fn, versions[digest], key, sys.argv[1]) + if not bad: + print() + print("*** \"%s\" is version %s; not any %s allowed by \"%s\"." % ( + fn, versions[digest], key, sys.argv[1])) bad = True if bad: - print + print() sys.exit(1) diff --git a/tools/compare_fileslist.py b/tools/compare_fileslist.py index 148d7405712..64ad3aee79e 100755 --- a/tools/compare_fileslist.py +++ b/tools/compare_fileslist.py @@ -17,7 +17,7 @@ from __future__ import print_function -import cgi, os, string, sys +import cgi, os, sys def iteritems(obj): @@ -42,10 +42,10 @@ def main(argv): data = {} index = 0 for input in inputs: - f = file(input, "r") + f = open(input) lines = f.readlines() f.close() - lines = map(string.split, lines) + lines = [l.strip() for l in lines] lines = [(x_y[1],int(x_y[0])) for x_y in lines] for fn,sz in lines: if fn not in data: diff --git a/tools/diff_package_overlays.py b/tools/diff_package_overlays.py index 0e2c773d1a9..687e1d02422 100755 --- a/tools/diff_package_overlays.py +++ b/tools/diff_package_overlays.py @@ -34,11 +34,13 @@ ... """ +from __future__ import print_function + import sys def main(argv): if len(argv) != 4: - print >> sys.stderr, __doc__ + print(sys.stderr, __doc__) sys.exit(1) f = open(argv[1]) @@ -85,7 +87,7 @@ def load_overlay_config(filename): # Print out the package names that have overlay change. for r in result: - print r + print(r) if __name__ == "__main__": main(sys.argv) diff --git a/tools/event_log_tags.py b/tools/event_log_tags.py index 645839ec29f..93244a414aa 100644 --- a/tools/event_log_tags.py +++ b/tools/event_log_tags.py @@ -14,6 +14,8 @@ """A module for reading and parsing event-log-tags files.""" +from __future__ import print_function + import re import sys @@ -55,7 +57,7 @@ def __init__(self, filename, file_object=None): if file_object is None: try: file_object = open(filename, "rb") - except (IOError, OSError), e: + except (IOError, OSError) as e: self.AddError(str(e)) return @@ -100,7 +102,7 @@ def __init__(self, filename, file_object=None): self.tags.append(Tag(tag, tagname, description, self.filename, self.linenum)) - except (IOError, OSError), e: + except (IOError, OSError) as e: self.AddError(str(e)) @@ -130,6 +132,6 @@ def WriteOutput(output_file, data): out = open(output_file, "wb") out.write(data) out.close() - except (IOError, OSError), e: - print >> sys.stderr, "failed to write %s: %s" % (output_file, e) + except (IOError, OSError) as e: + print("failed to write %s: %s" % (output_file, e), file=sys.stderr) sys.exit(1) diff --git a/tools/fileslist.py b/tools/fileslist.py index 1442bd32b4f..1538a3015c1 100755 --- a/tools/fileslist.py +++ b/tools/fileslist.py @@ -21,7 +21,7 @@ def get_file_size(path): st = os.lstat(path) - return st.st_size; + return st.st_size def main(argv): output = [] diff --git a/tools/findleaves.py b/tools/findleaves.py index 3a9e5084e2b..d97ed744d29 100755 --- a/tools/findleaves.py +++ b/tools/findleaves.py @@ -20,12 +20,14 @@ # the search in a given subdirectory when the file is found. # +from __future__ import print_function + import os import sys def perform_find(mindepth, prune, dirlist, filename): result = [] - pruneleaves = set(map(lambda x: os.path.split(x)[1], prune)) + pruneleaves = set([os.path.split(x)[1] for x in prune]) for rootdir in dirlist: rootdepth = rootdir.count("/") for root, dirs, files in os.walk(rootdir, followlinks=True): @@ -92,7 +94,7 @@ def main(argv): results = list(set(perform_find(mindepth, prune, dirlist, filename))) results.sort() for r in results: - print r + print(r) if __name__ == "__main__": main(sys.argv) diff --git a/tools/generate-notice-files.py b/tools/generate-notice-files.py index 5b13bf53dea..75d83540958 100755 --- a/tools/generate-notice-files.py +++ b/tools/generate-notice-files.py @@ -20,6 +20,9 @@ -h to display this usage message and exit. """ + +from __future__ import print_function + from collections import defaultdict import getopt import hashlib @@ -40,22 +43,22 @@ try: opts, args = getopt.getopt(sys.argv[1:], "h") -except getopt.GetoptError, err: - print str(err) - print __doc__ +except getopt.GetoptError as err: + print(str(err)) + print(__doc__) sys.exit(2) for o, a in opts: if o == "-h": - print __doc__ + print(__doc__) sys.exit(2) else: - print >> sys.stderr, "unhandled option %s" % (o,) + print("unhandled option %s" % o) if len(args) != 4: - print """need exactly four arguments, the two output files, the file title - and the directory containing notices, not %d""" % (len(args),) - print __doc__ + print("""need exactly four arguments, the two output files, the file title + and the directory containing notices, not %d""" % len(args)) + print(__doc__) sys.exit(1) def hexify(s): @@ -107,13 +110,13 @@ def combine_notice_files_html(file_hash, input_dir, output_filename): # Open the output file, and output the header pieces output_file = open(output_filename, "wb") - print >> output_file, "" - print >> output_file, HTML_OUTPUT_CSS - print >> output_file, '' + print(output_file, "", file=output_file) + print(HTML_OUTPUT_CSS, file=output_file) + print('', file=output_file) # Output our table of contents - print >> output_file, '
' - print >> output_file, "
    " + print('
    ', file=output_file) + print("
      ", file=output_file) # Flatten the list of lists into a single list of filenames sorted_filenames = sorted(itertools.chain.from_iterable(file_hash)) @@ -121,31 +124,31 @@ def combine_notice_files_html(file_hash, input_dir, output_filename): # Print out a nice table of contents for filename in sorted_filenames: stripped_filename = SRC_DIR_STRIP_RE.sub(r"\1", filename) - print >> output_file, '
    • %s
    • ' % (id_table.get(filename), stripped_filename) + print('
    • %s
    • ' % (id_table.get(filename), stripped_filename), file=output_file) - print >> output_file, "
    " - print >> output_file, "
    " + print("
", file=output_file) + print("
", file=output_file) # Output the individual notice file lists - print >>output_file, '
%(key)s%(val)s
' + print('
', file=output_file) for value in file_hash: - print >> output_file, '" - print >> output_file - print >> output_file - print >> output_file + print('", file=output_file) + print(file=output_file) + print(file=output_file) + print(file=output_file) # Finish off the file output - print >> output_file, "
' % id_table.get(value[0]) - print >> output_file, '
Notices for file(s):
' - print >> output_file, '
' - for filename in value: - print >> output_file, "%s
" % (SRC_DIR_STRIP_RE.sub(r"\1", filename)) - print >> output_file, "
" - print >> output_file - print >> output_file, '
'
-        print >> output_file, html_escape(open(value[0]).read())
-        print >> output_file, "
" - print >> output_file, "
' % id_table.get(value[0]), file=output_file) + print('
Notices for file(s):
', file=output_file) + print('
', file=output_file) + for filename in sorted(value): + print("%s
" % (SRC_DIR_STRIP_RE.sub(r"\1", filename)), file=output_file) + print("
", file=output_file) + print(file=output_file) + print('
', file=output_file)
+        print(html_escape(open(value[0]).read()), file=output_file)
+        print("
", file=output_file) + print("
" - print >> output_file, "" + print( "", file=output_file) + print("", file=output_file) output_file.close() def combine_notice_files_text(file_hash, input_dir, output_filename, file_title): @@ -153,14 +156,14 @@ def combine_notice_files_text(file_hash, input_dir, output_filename, file_title) SRC_DIR_STRIP_RE = re.compile(input_dir + "(/.*).txt") output_file = open(output_filename, "wb") - print >> output_file, file_title + print(file_title, file=output_file) for value in file_hash: - print >> output_file, "============================================================" - print >> output_file, "Notices for file(s):" - for filename in value: - print >> output_file, SRC_DIR_STRIP_RE.sub(r"\1", filename) - print >> output_file, "------------------------------------------------------------" - print >> output_file, open(value[0]).read() + print("============================================================", file=output_file) + print("Notices for file(s):", file=output_file) + for filename in sorted(value): + print(SRC_DIR_STRIP_RE.sub(r"\1", filename), file=output_file) + print("------------------------------------------------------------", file=output_file) + print(open(value[0]).read(), file=output_file) output_file.close() def main(args): @@ -180,9 +183,9 @@ def main(args): filesets = [sorted(files_with_same_hash[md5]) for md5 in sorted(files_with_same_hash.keys())] - print "Combining NOTICE files into HTML" + print("Combining NOTICE files into HTML") combine_notice_files_html(filesets, input_dir, html_output_file) - print "Combining NOTICE files into text" + print("Combining NOTICE files into text") combine_notice_files_text(filesets, input_dir, txt_output_file, file_title) if __name__ == "__main__": diff --git a/tools/getb64key.py b/tools/getb64key.py index a0cd1c3ec34..976a1576972 100755 --- a/tools/getb64key.py +++ b/tools/getb64key.py @@ -1,17 +1,18 @@ #!/usr/bin/env python +from __future__ import print_function + import base64 import sys -import os pkFile = open(sys.argv[1], 'rb').readlines() base64Key = "" inCert = False for line in pkFile: - if line.startswith("-"): + if line.startswith(b"-"): inCert = not inCert continue base64Key += line.strip() -print base64.b16encode(base64.b64decode(base64Key)).lower() +print(base64.b16encode(base64.b64decode(base64Key)).lower()) diff --git a/tools/java-event-log-tags.py b/tools/java-event-log-tags.py index 6ac69bdba7b..24bad3c3095 100755 --- a/tools/java-event-log-tags.py +++ b/tools/java-event-log-tags.py @@ -149,7 +149,7 @@ def javaName(name): buffer.write("\n }\n") -buffer.write("}\n"); +buffer.write("}\n") output_dir = os.path.dirname(output_file) if not os.path.exists(output_dir): diff --git a/tools/java-layers.py b/tools/java-layers.py index d7c0c8ef352..3b9d802e5bb 100755 --- a/tools/java-layers.py +++ b/tools/java-layers.py @@ -126,7 +126,7 @@ def compare_parts(parts, pkg): def parse_dependency_file(filename): global err - f = file(filename) + f = open(filename) lines = f.readlines() f.close() def lineno(s, i): @@ -180,7 +180,7 @@ def find_java_files(srcs): result = [] for d in srcs: if d[0] == '@': - f = file(d[1:]) + f = open(d[1:]) result.extend([fn for fn in [s.strip() for s in f.readlines()] if len(fn) != 0]) f.close() @@ -197,7 +197,7 @@ def find_java_files(srcs): def examine_java_file(deps, filename): global err # Yes, this is a crappy java parser. Write a better one if you want to. - f = file(filename) + f = open(filename) text = f.read() f.close() text = COMMENTS.sub("", text) diff --git a/tools/merge-event-log-tags.py b/tools/merge-event-log-tags.py index 65580f6a0e0..77900484119 100755 --- a/tools/merge-event-log-tags.py +++ b/tools/merge-event-log-tags.py @@ -42,7 +42,7 @@ import event_log_tags -def itermitems(obj): +def iteritems(obj): if hasattr(obj, 'iteritems'): return obj.iteritems() return obj.items() diff --git a/tools/parsedeps.py b/tools/parsedeps.py index 9a4fc8e902e..d36442b57e0 100755 --- a/tools/parsedeps.py +++ b/tools/parsedeps.py @@ -4,9 +4,13 @@ from __future__ import print_function import optparse -import re import sys +try: + raw_input +except NameError: + raw_input = input + class Dependency: def __init__(self, tgt): @@ -45,7 +49,7 @@ def setPos(self, tgt, pos): t.pos = pos def get(self, tgt): - if self.lines.has_key(tgt): + if tgt in self.lines: return self.lines[tgt] else: return None diff --git a/tools/post_process_props.py b/tools/post_process_props.py index 6cfbca6c0d2..aa67755f804 100755 --- a/tools/post_process_props.py +++ b/tools/post_process_props.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os, sys +import sys def iteritems(obj): @@ -61,7 +61,7 @@ def mangle_default_prop(prop): # default to "adb". That might not the right policy there, but it's better # to be explicit. if not prop.get("persist.sys.usb.config"): - prop.put("persist.sys.usb.config", "none"); + prop.put("persist.sys.usb.config", "none") def validate(prop): """Validate the properties. diff --git a/tools/product_debug.py b/tools/product_debug.py index 891587f0c68..1433a9ac289 100755 --- a/tools/product_debug.py +++ b/tools/product_debug.py @@ -16,20 +16,20 @@ from __future__ import print_function -import os +from operator import itemgetter import re import sys def iteritems(obj): - if hasattr('iteritems'): + if hasattr(obj, 'iteritems'): return obj.iteritems() return obj.items() def break_lines(key, val): # these don't get split - if key in ("PRODUCT_MODEL"): + if key in ("PRODUCT_MODEL",): return (key,val) return (key, "\n".join(val.split())) @@ -51,8 +51,7 @@ def parse_variables(lines): def render_variables(variables): variables = dict(variables) del variables["FILE"] - variables = list(variables.items()) - variables.sort(lambda a, b: cmp(a[0], b[0])) + variables = sorted(variables.items(), key=itemgetter(0)) return ("" + "\n".join([ "" % { "key": key, "val": val } for key,val in variables]) @@ -78,7 +77,7 @@ def render_original(variables, text): return text def read_file(fn): - f = file(fn) + f = open(fn) text = f.read() f.close() return text diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 04fa822f889..48de81a0c7a 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -22,10 +22,12 @@ Usage: add_img_to_target_files target_files """ +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import datetime @@ -52,7 +54,7 @@ def AddSystem(output_zip, prefix="IMAGES/", recovery_img=None, boot_img=None): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "system.img") if os.path.exists(prebuilt_path): - print "system.img already exists in %s, no need to rebuild..." % (prefix,) + print("system.img already exists in %s, no need to rebuild..." % prefix) return def output_sink(fn, data): @@ -61,7 +63,7 @@ def output_sink(fn, data): ofile.close() if OPTIONS.rebuild_recovery: - print "Building new recovery patch" + print("Building new recovery patch") common.MakeRecoveryPatch(OPTIONS.input_tmp, output_sink, recovery_img, boot_img, info_dict=OPTIONS.info_dict) @@ -84,7 +86,7 @@ def AddVendor(output_zip, prefix="IMAGES/"): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "vendor.img") if os.path.exists(prebuilt_path): - print "vendor.img already exists in %s, no need to rebuild..." % (prefix,) + print("vendor.img already exists in %s, no need to rebuild..." % prefix) return block_list = common.MakeTempFile(prefix="vendor-blocklist-", suffix=".map") @@ -124,7 +126,7 @@ def BuildOem(input_dir, info_dict, block_list=None): def CreateImage(input_dir, info_dict, what, block_list=None): - print "creating " + what + ".img..." + print("creating " + what + ".img...") img = common.MakeTempFile(prefix=what + "-", suffix=".img") @@ -187,7 +189,7 @@ def AddUserdata(output_zip, prefix="IMAGES/"): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "userdata.img") if os.path.exists(prebuilt_path): - print "userdata.img already exists in %s, no need to rebuild..." % (prefix,) + print("userdata.img already exists in %s, no need to rebuild..." % prefix) return image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, "data") @@ -197,7 +199,7 @@ def AddUserdata(output_zip, prefix="IMAGES/"): not image_props.get("partition_size")): return - print "creating userdata.img..." + print("creating userdata.img...") # Use a fixed timestamp (01/01/2009) when packaging the image. # Bug: 24377993 @@ -248,7 +250,7 @@ def AddUserdataExtra(output_zip, prefix="IMAGES/"): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "userdata_%s.img" % extra_name) if os.path.exists(prebuilt_path): - print "userdata_%s.img already exists in %s, no need to rebuild..." % (extra_name, prefix,) + print("userdata_%s.img already exists in %s, no need to rebuild..." % (extra_name, prefix,)) return # We only allow yaffs to have a 0/missing partition_size. @@ -257,7 +259,7 @@ def AddUserdataExtra(output_zip, prefix="IMAGES/"): not image_props.get("partition_size")): return - print "creating userdata_%s.img..." % extra_name + print("creating userdata_%s.img..." % extra_name) # The name of the directory it is making an image out of matters to # mkyaffs2image. So we create a temp dir, and within it we create an @@ -286,7 +288,7 @@ def AddCache(output_zip, prefix="IMAGES/"): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "cache.img") if os.path.exists(prebuilt_path): - print "cache.img already exists in %s, no need to rebuild..." % (prefix,) + print("cache.img already exists in %s, no need to rebuild..." % prefix) return image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, "cache") @@ -294,7 +296,7 @@ def AddCache(output_zip, prefix="IMAGES/"): if "fs_type" not in image_props: return - print "creating cache.img..." + print("creating cache.img...") # Use a fixed timestamp (01/01/2009) when packaging the image. # Bug: 24377993 @@ -329,7 +331,7 @@ def AddImagesToTargetFiles(filename): if not OPTIONS.add_missing: for n in input_zip.namelist(): if n.startswith("IMAGES/"): - print "target_files appears to already contain images." + print("target_files appears to already contain images.") sys.exit(1) try: @@ -353,13 +355,13 @@ def AddImagesToTargetFiles(filename): has_recovery = (OPTIONS.info_dict.get("no_recovery") != "true") def banner(s): - print "\n\n++++ " + s + " ++++\n\n" + print("\n\n++++ " + s + " ++++\n\n") banner("boot") prebuilt_path = os.path.join(OPTIONS.input_tmp, "IMAGES", "boot.img") boot_image = None if os.path.exists(prebuilt_path): - print "boot.img already exists in IMAGES/, no need to rebuild..." + print("boot.img already exists in IMAGES/, no need to rebuild...") if OPTIONS.rebuild_recovery: boot_image = common.GetBootableImage( "IMAGES/boot.img", "boot.img", OPTIONS.input_tmp, "BOOT") @@ -374,7 +376,7 @@ def banner(s): banner("recovery") prebuilt_path = os.path.join(OPTIONS.input_tmp, "IMAGES", "recovery.img") if os.path.exists(prebuilt_path): - print "recovery.img already exists in IMAGES/, no need to rebuild..." + print("recovery.img already exists in IMAGES/, no need to rebuild...") if OPTIONS.rebuild_recovery: recovery_image = common.GetBootableImage( "IMAGES/recovery.img", "recovery.img", OPTIONS.input_tmp, @@ -450,16 +452,16 @@ def option_handler(o, a): sys.exit(1) AddImagesToTargetFiles(args[0]) - print "done." + print("done.") if __name__ == '__main__': try: common.CloseInheritedPipes() main(sys.argv[1:]) except common.ExternalError as e: - print - print " ERROR: %s" % (e,) - print + print() + print(" ERROR: %s" % e) + print() sys.exit(1) finally: common.Cleanup() diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py index 66d59077dd0..0f3f190bd5e 100644 --- a/tools/releasetools/blockimgdiff.py +++ b/tools/releasetools/blockimgdiff.py @@ -437,7 +437,7 @@ def WriteTransfersZero(out, to_zero): stashes[sh] -= 1 if stashes[sh] == 0: free_size += sr.size() - free_string.append("free %s\n" % (sh)) + free_string.append("free %s\n" % sh) stashes.pop(sh) heapq.heappush(free_stash_ids, sid) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index aa46cb1d494..ac8649010b9 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -20,17 +20,24 @@ Usage: build_image input_directory properties_file output_image_file """ + +from __future__ import print_function + import os import os.path import re import subprocess import sys -import commands import common import shutil import sparse_img import tempfile +try: + from commands import getstatusoutput +except ImportError: + from subprocess import getstatusoutput + OPTIONS = common.OPTIONS FIXED_SALT = "aee087a5be3b982978c923f566a94613496b417f2af592639bc80d141e34dfe7" @@ -44,10 +51,10 @@ def RunCommand(cmd): Returns: A tuple of the output and the exit code. """ - print "Running: ", " ".join(cmd) + print("Running: %s" % " ".join(cmd)) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, _ = p.communicate() - print "%s" % (output.rstrip(),) + print("%s" % output.rstrip()) return (output, p.returncode) def GetVerityFECSize(partition_size): @@ -61,9 +68,9 @@ def GetVerityFECSize(partition_size): def GetVerityTreeSize(partition_size): cmd = "build_verity_tree -s %d" cmd %= partition_size - status, output = commands.getstatusoutput(cmd) + status, output = getstatusoutput(cmd) if status: - print output + print(output) return False, 0 return True, int(output) @@ -71,9 +78,9 @@ def GetVerityMetadataSize(partition_size): cmd = "system/extras/verity/build_verity_metadata.py -s %d" cmd %= partition_size - status, output = commands.getstatusoutput(cmd) + status, output = getstatusoutput(cmd) if status: - print output + print(output) return False, 0 return True, int(output) @@ -152,10 +159,10 @@ def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path): def BuildVerityTree(sparse_image_path, verity_image_path, prop_dict): cmd = "build_verity_tree -A %s %s %s" % ( FIXED_SALT, sparse_image_path, verity_image_path) - print cmd - status, output = commands.getstatusoutput(cmd) + print(cmd) + status, output = getstatusoutput(cmd) if status: - print "Could not build verity tree! Error: %s" % output + print("Could not build verity tree! Error: %s" % output) return False root, salt = output.split() prop_dict["verity_root_hash"] = root @@ -168,10 +175,10 @@ def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt, "system/extras/verity/build_verity_metadata.py %s %s %s %s %s %s %s") cmd = cmd_template % (image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key) - print cmd - status, output = commands.getstatusoutput(cmd) + print(cmd) + status, output = getstatusoutput(cmd) if status: - print "Could not build verity metadata! Error: %s" % output + print("Could not build verity metadata! Error: %s" % output) return False return True @@ -186,10 +193,10 @@ def Append2Simg(sparse_image_path, unsparse_image_path, error_message): """ cmd = "append2simg %s %s" cmd %= (sparse_image_path, unsparse_image_path) - print cmd - status, output = commands.getstatusoutput(cmd) + print(cmd) + status, output = getstatusoutput(cmd) if status: - print "%s: %s" % (error_message, output) + print("%s: %s" % (error_message, output)) return False return True @@ -465,7 +472,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): ext4fs_stats = re.compile( r'Created filesystem with .* (?P[0-9]+)/' r'(?P[0-9]+) blocks') - m = ext4fs_stats.match(ext4fs_output.strip().split('\n')[-1]) + m = ext4fs_stats.match(ext4fs_output.strip().split(b'\n')[-1]) used_blocks = int(m.groupdict().get('used_blocks')) total_blocks = int(m.groupdict().get('total_blocks')) reserved_blocks = min(4096, int(total_blocks * 0.02)) @@ -605,7 +612,7 @@ def LoadGlobalDict(filename): def main(argv): if len(argv) != 4: - print __doc__ + print(__doc__) sys.exit(1) in_dir = argv[0] @@ -632,14 +639,14 @@ def main(argv): elif image_filename == "oem.img": mount_point = "oem" else: - print >> sys.stderr, "error: unknown image file name ", image_filename + print("error: unknown image file name ", image_filename, file=sys.stderr) exit(1) image_properties = ImagePropFromGlobalDict(glob_dict, mount_point) if not BuildImage(in_dir, image_properties, out_file, target_out): - print >> sys.stderr, "error: failed to build %s from %s" % (out_file, - in_dir) + print("error: failed to build %s from %s" % (out_file, in_dir), + file=sys.stderr) exit(1) diff --git a/tools/releasetools/check_target_files_signatures.py b/tools/releasetools/check_target_files_signatures.py index 5c541abc6b7..df3be2f0697 100755 --- a/tools/releasetools/check_target_files_signatures.py +++ b/tools/releasetools/check_target_files_signatures.py @@ -39,10 +39,12 @@ """ +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import os @@ -53,6 +55,13 @@ import common + +def iteritems(obj): + if hasattr(obj, 'iteritems'): + return obj.iteritems() + return obj.items() + + # Work around a bug in python's zipfile module that prevents opening # of zipfiles if any entry has an extra field of between 1 and 3 bytes # (which is common with zipaligned APKs). This overrides the @@ -81,9 +90,9 @@ def Pop(): def Banner(msg): - print "-" * 70 - print " ", msg - print "-" * 70 + print("-" * 70) + print(" ", msg) + print("-" * 70) def GetCertSubject(cert): @@ -260,7 +269,7 @@ def CheckSharedUids(self): """Look for any instances where packages signed with different certs request the same sharedUserId.""" apks_by_uid = {} - for apk in self.apks.itervalues(): + for apk in self.apks.values(): if apk.shared_uid: apks_by_uid.setdefault(apk.shared_uid, []).append(apk) @@ -275,15 +284,15 @@ def CheckSharedUids(self): AddProblem("different cert sets for packages with uid %s" % (uid,)) - print "uid %s is shared by packages with different cert sets:" % (uid,) + print("uid %s is shared by packages with different cert sets:" % uid) for apk in apks: - print "%-*s [%s]" % (self.max_pkg_len, apk.package, apk.filename) + print("%-*s [%s]" % (self.max_pkg_len, apk.package, apk.filename)) for cert in apk.certs: - print " ", ALL_CERTS.Get(cert) - print + print(" ", ALL_CERTS.Get(cert)) + print() def CheckExternalSignatures(self): - for apk_filename, certname in self.certmap.iteritems(): + for apk_filename, certname in iteritems(self.certmap): if certname == "EXTERNAL": # Apps marked EXTERNAL should be signed with the test key # during development, then manually re-signed after @@ -299,26 +308,26 @@ def CheckExternalSignatures(self): def PrintCerts(self): """Display a table of packages grouped by cert.""" by_cert = {} - for apk in self.apks.itervalues(): + for apk in self.apks.values(): for cert in apk.certs: by_cert.setdefault(cert, []).append((apk.package, apk)) - order = [(-len(v), k) for (k, v) in by_cert.iteritems()] + order = [(-len(v), k) for (k, v) in iteritems(by_cert)] order.sort() for _, cert in order: - print "%s:" % (ALL_CERTS.Get(cert),) + print("%s:" % ALL_CERTS.Get(cert)) apks = by_cert[cert] apks.sort() for _, apk in apks: if apk.shared_uid: - print " %-*s %-*s [%s]" % (self.max_fn_len, apk.filename, + print(" %-*s %-*s [%s]" % (self.max_fn_len, apk.filename, self.max_pkg_len, apk.package, - apk.shared_uid) + apk.shared_uid)) else: - print " %-*s %-*s" % (self.max_fn_len, apk.filename, - self.max_pkg_len, apk.package) - print + print(" %-*s %-*s" % (self.max_fn_len, apk.filename, + self.max_pkg_len, apk.package)) + print() def CompareWith(self, other): """Look for instances where a given package that exists in both @@ -339,12 +348,12 @@ def CompareWith(self, other): by_certpair.setdefault((other.apks[i].certs, self.apks[i].certs), []).append(i) else: - print "%s [%s]: new APK (not in comparison target_files)" % ( - i, self.apks[i].filename) + print("%s [%s]: new APK (not in comparison target_files)" % ( + i, self.apks[i].filename)) else: if i in other.apks: - print "%s [%s]: removed APK (only in comparison target_files)" % ( - i, other.apks[i].filename) + print("%s [%s]: removed APK (only in comparison target_files)" % ( + i, other.apks[i].filename)) if by_certpair: AddProblem("some APKs changed certs") @@ -352,23 +361,23 @@ def CompareWith(self, other): for (old, new), packages in sorted(by_certpair.items()): for i, o in enumerate(old): if i == 0: - print "was", ALL_CERTS.Get(o) + print("was", ALL_CERTS.Get(o)) else: - print " ", ALL_CERTS.Get(o) + print(" ", ALL_CERTS.Get(o)) for i, n in enumerate(new): if i == 0: - print "now", ALL_CERTS.Get(n) + print("now", ALL_CERTS.Get(n)) else: - print " ", ALL_CERTS.Get(n) + print(" ", ALL_CERTS.Get(n)) for i in sorted(packages): old_fn = other.apks[i].filename new_fn = self.apks[i].filename if old_fn == new_fn: - print " %-*s [%s]" % (max_pkg_len, i, old_fn) + print(" %-*s [%s]" % (max_pkg_len, i, old_fn)) else: - print " %-*s [was: %s; now: %s]" % (max_pkg_len, i, - old_fn, new_fn) - print + print(" %-*s [was: %s; now: %s]" % (max_pkg_len, i, + old_fn, new_fn)) + print() def main(argv): @@ -423,9 +432,9 @@ def option_handler(o, a): target_files.CompareWith(compare_files) if PROBLEMS: - print "%d problem(s) found:\n" % (len(PROBLEMS),) + print("%d problem(s) found:\n" % len(PROBLEMS)) for p in PROBLEMS: - print p + print(p) return 1 return 0 @@ -436,7 +445,7 @@ def option_handler(o, a): r = main(sys.argv[1:]) sys.exit(r) except common.ExternalError as e: - print - print " ERROR: %s" % (e,) - print + print() + print(" ERROR: %s" % e) + print() sys.exit(1) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 21711972d57..9170a8d91b7 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import copy import errno import getopt @@ -33,6 +35,17 @@ from hashlib import sha1 as sha1 +try: + raw_input +except NameError: + raw_input = input + + +def iteritems(obj): + if hasattr(obj, 'iteritems'): + return obj.iteritems() + return obj.items() + class Options(object): def __init__(self): @@ -109,7 +122,7 @@ def Run(args, **kwargs): """Create and return a subprocess.Popen object, printing the command line on the terminal if -v was specified.""" if OPTIONS.verbose: - print " running: ", " ".join(args) + print(" running: ", " ".join(args)) return subprocess.Popen(args, **kwargs) @@ -274,7 +287,7 @@ def LoadBuildProp(read_helper): try: data = read_helper("SYSTEM/build.prop") except KeyError: - print "Warning: could not find SYSTEM/build.prop in %s" % zip + print("Warning: could not find SYSTEM/build.prop in %s" % zip) data = "" return LoadDictionaryFromLines(data.split("\n")) @@ -302,7 +315,7 @@ def __init__(self, mount_point, fs_type, device, length, device2, context): try: data = read_helper("RECOVERY/RAMDISK/etc/recovery.fstab") except KeyError: - print "Warning: could not find RECOVERY/RAMDISK/etc/recovery.fstab" + print("Warning: could not find RECOVERY/RAMDISK/etc/recovery.fstab") data = "" if fstab_version == 1: @@ -334,7 +347,7 @@ def __init__(self, mount_point, fs_type, device, length, device2, context): if i.startswith("length="): length = int(i[7:]) else: - print "%s: unknown option \"%s\"" % (mount_point, i) + print("%s: unknown option \"%s\"" % (mount_point, i)) d[mount_point] = Partition(mount_point=mount_point, fs_type=pieces[1], device=pieces[2], length=length, @@ -392,7 +405,7 @@ def __init__(self, mount_point, fs_type, device, length, device2, context): def DumpInfoDict(d): for k, v in sorted(d.items()): - print "%-25s = (%s) %s" % (k, type(v).__name__, v) + print("%-25s = (%s) %s" % (k, type(v).__name__, v)) def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None, @@ -602,15 +615,15 @@ def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir, prebuilt_path = os.path.join(unpack_dir, "BOOTABLE_IMAGES", prebuilt_name) if os.path.exists(prebuilt_path): - print "using prebuilt %s from BOOTABLE_IMAGES..." % (prebuilt_name,) + print("using prebuilt %s from BOOTABLE_IMAGES..." % prebuilt_name) return File.FromLocalFile(name, prebuilt_path) prebuilt_path = os.path.join(unpack_dir, "IMAGES", prebuilt_name) if os.path.exists(prebuilt_path): - print "using prebuilt %s from IMAGES..." % (prebuilt_name,) + print("using prebuilt %s from IMAGES..." % prebuilt_name) return File.FromLocalFile(name, prebuilt_path) - print "building image from target_files %s..." % (tree_subdir,) + print("building image from target_files %s..." % tree_subdir) if info_dict is None: info_dict = OPTIONS.info_dict @@ -700,7 +713,7 @@ def GetKeyPasswords(keylist): if p.returncode == 0: # Encrypted key with empty string as password. key_passwords[k] = '' - elif stderr.startswith('Error decrypting key'): + elif stderr.startswith(b'Error decrypting key'): # Definitely encrypted key. # It would have said "Error reading key" if it didn't parse correctly. need_passwords.append(k) @@ -837,11 +850,11 @@ def CheckSize(data, target, info_dict): if pct >= 99.0: raise ExternalError(msg) elif pct >= 95.0: - print - print " WARNING: ", msg - print + print() + print(" WARNING: ", msg) + print() elif OPTIONS.verbose: - print " ", msg + print(" ", msg) def ReadApkCerts(tf_zip): @@ -890,8 +903,8 @@ def ReadApkCerts(tf_zip): """ def Usage(docstring): - print docstring.rstrip("\n") - print COMMON_DOCSTRING + print(docstring.rstrip("\n")) + print(COMMON_DOCSTRING) def ParseOptions(argv, @@ -916,7 +929,7 @@ def ParseOptions(argv, list(extra_long_opts)) except getopt.GetoptError as err: Usage(docstring) - print "**", str(err), "**" + print("**", str(err), "**") sys.exit(2) for o, a in opts: @@ -1014,7 +1027,7 @@ def GetPasswords(self, items): current[i] = "" if not first: - print "key file %s still missing some passwords." % (self.pwfile,) + print("key file %s still missing some passwords." % self.pwfile) answer = raw_input("try to edit again? [y]> ").strip() if answer and answer[0] not in 'yY': raise RuntimeError("key passwords unavailable") @@ -1028,7 +1041,7 @@ def PromptResult(self, current): # pylint: disable=no-self-use values. """ result = {} - for k, v in sorted(current.iteritems()): + for k, v in sorted(iteritems(current)): if v: result[k] = v else: @@ -1049,7 +1062,7 @@ def UpdateAndReadFile(self, current): f.write("# (Additional spaces are harmless.)\n\n") first_line = None - sorted_list = sorted([(not v, k, v) for (k, v) in current.iteritems()]) + sorted_list = sorted((not v, k, v) for (k, v) in current.items()) for i, (_, k, v) in enumerate(sorted_list): f.write("[[[ %s ]]] %s\n" % (v, k)) if not v and first_line is None: @@ -1074,13 +1087,13 @@ def ReadFile(self): continue m = re.match(r"^\[\[\[\s*(.*?)\s*\]\]\]\s*(\S+)$", line) if not m: - print "failed to parse password file: ", line + print("failed to parse password file: ", line) else: result[m.group(2)] = m.group(1) f.close() except IOError as e: if e.errno != errno.ENOENT: - print "error reading password file: ", str(e) + print("error reading password file: ", str(e)) return result @@ -1184,7 +1197,7 @@ def __init__(self, **kwargs): """Keyword arguments to the constructor become attributes of this object, which is passed to all functions in the device-specific module.""" - for k, v in kwargs.iteritems(): + for k, v in iteritems(kwargs): setattr(self, k, v) self.extras = OPTIONS.extras @@ -1201,10 +1214,10 @@ def __init__(self, **kwargs): if x == ".py": f = b info = imp.find_module(f, [d]) - print "loaded device-specific extensions from", path + print("loaded device-specific extensions from", path) self.module = imp.load_module("device_specific", *info) except ImportError: - print "unable to load device-specific module; assuming none" + print("unable to load device-specific module; assuming none") def _DoCall(self, function_name, *args, **kwargs): """Call the named function in the device-specific module, passing @@ -1343,7 +1356,7 @@ def run(): th.start() th.join(timeout=300) # 5 mins if th.is_alive(): - print "WARNING: diff command timed out" + print("WARNING: diff command timed out") p.terminate() th.join(5) if th.is_alive(): @@ -1351,8 +1364,8 @@ def run(): th.join() if err or p.returncode != 0: - print "WARNING: failure running %s:\n%s\n" % ( - diff_program, "".join(err)) + print("WARNING: failure running %s:\n%s\n" % ( + diff_program, "".join(err))) self.patch = None return None, None, None diff = ptemp.read() @@ -1374,7 +1387,7 @@ def GetPatch(self): def ComputeDifferences(diffs): """Call ComputePatch on all the Difference objects in 'diffs'.""" - print len(diffs), "diffs to compute" + print(len(diffs), "diffs to compute") # Do the largest files first, to try and reduce the long-pole effect. by_size = [(i.tf.size, i) for i in diffs] @@ -1400,13 +1413,13 @@ def worker(): else: name = "%s (%s)" % (tf.name, sf.name) if patch is None: - print "patching failed! %s" % (name,) + print("patching failed! %s" % name) else: - print "%8.2f sec %8d / %8d bytes (%6.2f%%) %s" % ( - dur, len(patch), tf.size, 100.0 * len(patch) / tf.size, name) + print("%8.2f sec %8d / %8d bytes (%6.2f%%) %s" % ( + dur, len(patch), tf.size, 100.0 * len(patch) / tf.size, name)) lock.release() except Exception as e: - print e + print(e) raise # start worker threads; wait for them all to finish. @@ -1679,16 +1692,18 @@ def GetTypeAndDevice(mount_point, info): def ParseCertificate(data): """Parse a PEM-format certificate.""" + from codecs import decode cert = [] save = False for line in data.split("\n"): if "--END CERTIFICATE--" in line: break if save: - cert.append(line) + l = line.encode() if hasattr(line, 'encode') else line + cert.append(l) if "--BEGIN CERTIFICATE--" in line: save = True - cert = "".join(cert).decode('base64') + cert = decode(b"".join(cert), 'base64') return cert def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, @@ -1793,6 +1808,6 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, if found: break - print "putting script in", sh_location + print("putting script in", sh_location) output_sink(sh_location, sh) diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 3390f1c4c15..225b8669efb 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -160,7 +160,7 @@ def AssertSomeBaseband(self, *basebands): ", ".join(["%s" % (b,) for b in basebands]) + '; this device has baseband " + getprop("ro.baseband") + ".");' + ");") - self.script.append(self._WordWrap(cmd)) + self.script.append(self.WordWrap(cmd)) def RunBackup(self, command): self.script.append(('run_program("/tmp/install/bin/backuptool.sh", "%s");' % command)) @@ -401,7 +401,7 @@ def MakeSymlinks(self, symlink_list): for d, l in symlink_list: by_dest.setdefault(d, []).append(l) - for dest, links in sorted(by_dest.iteritems()): + for dest, links in sorted(by_dest.items()): cmd = ('symlink("%s", ' % (dest,) + ",\0".join(['"' + i + '"' for i in sorted(links)]) + ");") self.script.append(self.WordWrap(cmd)) diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index 5ddd622d4ce..e6385d420ee 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -26,10 +26,12 @@ """ +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import errno @@ -61,7 +63,7 @@ def AddRadio(output_zip): # If a filesmap file exists, create a script to flash the radio images based on it filesmap = os.path.join(OPTIONS.input_tmp, "RADIO/filesmap") if os.path.isfile(filesmap): - print "creating flash-radio.sh..." + print("creating flash-radio.sh...") filesmap_data = open(filesmap, "r") filesmap_regex = re.compile(r'^(\S+)\s\S+\/by-name\/(\S+).*') tmp_flash_radio = tempfile.NamedTemporaryFile() @@ -74,7 +76,7 @@ def AddRadio(output_zip): if os.path.getsize(tmp_flash_radio.name) > 0: output_zip.write(tmp_flash_radio.name, "flash-radio.sh") else: - print "flash-radio.sh is empty, skipping..." + print("flash-radio.sh is empty, skipping...") tmp_flash_radio.close() def main(argv): @@ -142,7 +144,7 @@ def option_handler(o, _): recovery_image.AddToZip(output_zip) def banner(s): - print "\n\n++++ " + s + " ++++\n\n" + print("\n\n++++ " + s + " ++++\n\n") if not bootable_only: banner("AddSystem") @@ -161,11 +163,11 @@ def banner(s): add_img_to_target_files.AddCache(output_zip, prefix="") finally: - print "cleaning up..." + print("cleaning up...") common.ZipClose(output_zip) shutil.rmtree(OPTIONS.input_tmp) - print "done." + print("done.") if __name__ == '__main__': @@ -173,7 +175,7 @@ def banner(s): common.CloseInheritedPipes() main(sys.argv[1:]) except common.ExternalError as e: - print - print " ERROR: %s" % (e,) - print + print() + print(" ERROR: %s" % e) + print() sys.exit(1) diff --git a/tools/releasetools/make_recovery_patch.py b/tools/releasetools/make_recovery_patch.py index 08d14500886..7c6007e5f31 100755 --- a/tools/releasetools/make_recovery_patch.py +++ b/tools/releasetools/make_recovery_patch.py @@ -14,10 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import os diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index aa3547e39fa..3b1b7e54dc5 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -127,10 +127,12 @@ """ +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import multiprocessing @@ -179,7 +181,7 @@ def MostPopularKey(d, default): """Given a dict, return the key corresponding to the largest value. Returns 'default' if the dict is empty.""" - x = [(v, k) for (k, v) in d.iteritems()] + x = [(v, k) for (k, v) in d.items()] if not x: return default x.sort() @@ -299,14 +301,14 @@ def __init__(self, itemset, name, is_dir=False): def Dump(self, indent=0): if self.uid is not None: - print "%s%s %d %d %o" % ( - " " * indent, self.name, self.uid, self.gid, self.mode) + print("%s%s %d %d %o" % ( + " " * indent, self.name, self.uid, self.gid, self.mode)) else: - print "%s%s %s %s %s" % ( - " " * indent, self.name, self.uid, self.gid, self.mode) + print("%s%s %s %s %s" % ( + " " * indent, self.name, self.uid, self.gid, self.mode)) if self.is_dir: - print "%s%s" % (" "*indent, self.descendants) - print "%s%s" % (" "*indent, self.best_subtree) + print("%s%s" % (" "*indent, self.descendants)) + print("%s%s" % (" "*indent, self.best_subtree)) for i in self.children: i.Dump(indent=indent+1) @@ -330,7 +332,7 @@ def CountChildMetadata(self): d = self.descendants for i in self.children: if i.is_dir: - for k, v in i.CountChildMetadata().iteritems(): + for k, v in i.CountChildMetadata().items(): d[k] = d.get(k, 0) + v else: k = (i.uid, i.gid, None, i.mode, i.selabel, i.capabilities) @@ -342,7 +344,7 @@ def CountChildMetadata(self): # First, find the (uid, gid) pair that matches the most # descendants. ug = {} - for (uid, gid, _, _, _, _), count in d.iteritems(): + for (uid, gid, _, _, _, _), count in d.items(): ug[(uid, gid)] = ug.get((uid, gid), 0) + count ug = MostPopularKey(ug, (0, 0)) @@ -352,7 +354,7 @@ def CountChildMetadata(self): best_fmode = (0, 0o644) best_selabel = (0, None) best_capabilities = (0, None) - for k, count in d.iteritems(): + for k, count in d.items(): if k[:2] != ug: continue if k[2] is not None and count >= best_dmode[0]: @@ -510,11 +512,11 @@ def GetImage(which, tmpdir, info_dict): path = os.path.join(tmpdir, "IMAGES", which + ".img") mappath = os.path.join(tmpdir, "IMAGES", which + ".map") if os.path.exists(path) and os.path.exists(mappath): - print "using %s.img from target-files" % (which,) + print("using %s.img from target-files" % which) # This is a 'new' target-files, which already has the image in it. else: - print "building %s.img from target-files" % (which,) + print("building %s.img from target-files" % which) # This is an 'old' target-files, which does not contain images # already built. Build them. @@ -650,8 +652,8 @@ def WriteFullOTAPackage(input_zip, output_zip): CopyInstallTools(output_zip) script.UnpackPackageDir("install", "/tmp/install") - script.SetPermissionsRecursive("/tmp/install", 0, 0, 0755, 0644, None, None) - script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0755, 0755, None, None) + script.SetPermissionsRecursive("/tmp/install", 0, 0, 0o755, 0o644, None, None) + script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0o755, 0o755, None, None) if OPTIONS.backuptool: script.Mount("/system") @@ -795,7 +797,7 @@ def WritePolicyConfig(file_name, output_zip): def WriteMetadata(metadata, output_zip): common.ZipWriteStr(output_zip, "META-INF/com/android/metadata", "".join(["%s=%s\n" % kv - for kv in sorted(metadata.iteritems())])) + for kv in sorted(metadata.items())])) def LoadPartitionFiles(z, partition): @@ -1056,8 +1058,8 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): else: include_full_boot = False - print "boot target: %d source: %d diff: %d" % ( - target_boot.size, source_boot.size, len(d)) + print("boot target: %d source: %d diff: %d" % ( + target_boot.size, source_boot.size, len(d))) common.ZipWriteStr(output_zip, "patch/boot.img.p", d) @@ -1098,19 +1100,19 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): if OPTIONS.two_step: common.ZipWriteStr(output_zip, "boot.img", target_boot.data) script.WriteRawImage("/boot", "boot.img") - print "writing full boot image (forced by two-step mode)" + print("writing full boot image (forced by two-step mode)") if not OPTIONS.two_step: if updating_boot: if include_full_boot: - print "boot image changed; including full." + print("boot image changed; including full.") script.Print("Installing boot image...") script.WriteRawImage("/boot", "boot.img") else: # Produce the boot image by applying a patch to the current # contents of the boot partition, and write it back to the # partition. - print "boot image changed; including patch." + print("boot image changed; including patch.") script.Print("Patching boot image...") script.ShowProgress(0.1, 10) script.ApplyPatch("%s:%s:%d:%s:%d:%s" @@ -1121,7 +1123,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip): target_boot.size, target_boot.sha1, source_boot.sha1, "patch/boot.img.p") else: - print "boot image unchanged; skipping." + print("boot image unchanged; skipping.") # Do device-specific installation (eg, write radio image). device_specific.IncrementalOTA_InstallEnd() @@ -1364,9 +1366,9 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file, class FileDifference(object): def __init__(self, partition, source_zip, target_zip, output_zip): self.deferred_patch_list = None - print "Loading target..." + print("Loading target...") self.target_data = target_data = LoadPartitionFiles(target_zip, partition) - print "Loading source..." + print("Loading source...") self.source_data = source_data = LoadPartitionFiles(source_zip, partition) self.verbatim_targets = verbatim_targets = [] @@ -1393,14 +1395,14 @@ def __init__(self, partition, source_zip, target_zip, output_zip): assert fn == tf.name sf = ClosestFileMatch(tf, matching_file_cache, renames) if sf is not None and sf.name != tf.name: - print "File has moved from " + sf.name + " to " + tf.name + print("File has moved from " + sf.name + " to " + tf.name) renames[sf.name] = tf if sf is None or fn in OPTIONS.require_verbatim: # This file should be included verbatim if fn in OPTIONS.prohibit_verbatim: raise common.ExternalError("\"%s\" must be sent verbatim" % (fn,)) - print "send", fn, "verbatim" + print("send", fn, "verbatim") tf.AddToZip(output_zip) verbatim_targets.append((fn, tf.size, tf.sha1)) if fn in target_data.keys(): @@ -1487,8 +1489,8 @@ def EmitDeferredPatches(self, script): def EmitRenames(self, script): if len(self.renames) > 0: script.Print("Renaming files...") - for src, tgt in self.renames.iteritems(): - print "Renaming " + src + " to " + tgt.name + for src, tgt in self.renames.items(): + print("Renaming " + src + " to " + tgt.name) script.RenameFile(src, tgt.name) @@ -1661,8 +1663,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): """ % bcb_dev) # Dump fingerprints - script.Print("Source: %s" % (source_fp,)) - script.Print("Target: %s" % (target_fp,)) + script.Print("Source: %s" % source_fp) + script.Print("Target: %s" % target_fp) script.Print("Verifying current system...") @@ -1690,7 +1692,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): else: include_full_boot = False - print "boot target: %d source: %d diff: %d" % ( + print( "boot target: %d source: %d diff: %d" % target_boot.size, source_boot.size, len(d)) common.ZipWriteStr(output_zip, "patch/boot.img.p", d) @@ -1722,7 +1724,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): if OPTIONS.two_step: common.ZipWriteStr(output_zip, "boot.img", target_boot.data) script.WriteRawImage("/boot", "boot.img") - print "writing full boot image (forced by two-step mode)" + print("writing full boot image (forced by two-step mode)") script.Print("Removing unneeded files...") system_diff.RemoveUnneededFiles(script, ("/system/recovery.img",)) @@ -1745,14 +1747,14 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): if not OPTIONS.two_step: if updating_boot: if include_full_boot: - print "boot image changed; including full." + print("boot image changed; including full.") script.Print("Installing boot image...") script.WriteRawImage("/boot", "boot.img") else: # Produce the boot image by applying a patch to the current # contents of the boot partition, and write it back to the # partition. - print "boot image changed; including patch." + print("boot image changed; including patch.") script.Print("Patching boot image...") script.ApplyPatch("%s:%s:%d:%s:%d:%s" % (boot_type, boot_device, @@ -1762,7 +1764,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): target_boot.size, target_boot.sha1, source_boot.sha1, "patch/boot.img.p") else: - print "boot image unchanged; skipping." + print("boot image unchanged; skipping.") system_items = ItemSet("system", "META/filesystem_config.txt") if vendor_diff: @@ -1788,9 +1790,9 @@ def output_sink(fn, data): script.DeleteFiles(["/system/recovery-from-boot.p", "/system/etc/recovery.img", "/system/etc/install-recovery.sh"]) - print "recovery image changed; including as patch from boot." + print("recovery image changed; including as patch from boot.") else: - print "recovery image unchanged; skipping." + print("recovery image unchanged; skipping.") script.ShowProgress(0.1, 10) @@ -1974,7 +1976,7 @@ def option_handler(o, a): OPTIONS.verify = True elif o == "--block": OPTIONS.block_based = True - elif o in ("-b", "--binary"): + elif o in ("-b", "--binary",): OPTIONS.updater_binary = a elif o in ("--no_fallback_to_full",): OPTIONS.fallback_to_full = False @@ -1984,15 +1986,15 @@ def option_handler(o, a): except ValueError: raise ValueError("Cannot parse value %r for option %r - expecting " "a float" % (a, o)) - elif o == "--gen_verify": + elif o == ("--gen_verify",): OPTIONS.gen_verify = True - elif o == "--log_diff": + elif o == ("--log_diff",): OPTIONS.log_diff = a - elif o in ("--backup"): + elif o in ("--backup",): OPTIONS.backuptool = bool(a.lower() == 'true') - elif o in ("--override_device"): + elif o in ("--override_device",): OPTIONS.override_device = a - elif o in ("--override_prop"): + elif o in ("--override_prop",): OPTIONS.override_prop = bool(a.lower() == 'true') else: return False @@ -2078,14 +2080,14 @@ def option_handler(o, a): if OPTIONS.extra_script is not None: OPTIONS.extra_script = open(OPTIONS.extra_script).read() - print "unzipping target target-files..." + print("unzipping target target-files...") OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0]) OPTIONS.target_tmp = OPTIONS.input_tmp OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.target_tmp) if OPTIONS.verbose: - print "--- target info ---" + print("--- target info ---") common.DumpInfoDict(OPTIONS.info_dict) # If the caller explicitly specified the device-specific extensions @@ -2098,7 +2100,7 @@ def option_handler(o, a): if OPTIONS.device_specific is None: from_input = os.path.join(OPTIONS.input_tmp, "META", "releasetools.py") if os.path.exists(from_input): - print "(using device-specific extensions from target_files)" + print("(using device-specific extensions from target_files)") OPTIONS.device_specific = from_input else: OPTIONS.device_specific = OPTIONS.info_dict.get("tool_extensions", None) @@ -2167,7 +2169,7 @@ def option_handler(o, a): except ValueError: if not OPTIONS.fallback_to_full: raise - print "--- failed to build incremental; falling back to full ---" + print("--- failed to build incremental; falling back to full ---") OPTIONS.incremental_source = None WriteFullOTAPackage(input_zip, output_zip) @@ -2178,7 +2180,7 @@ def option_handler(o, a): SignOutput(temp_zip_file.name, args[1]) temp_zip_file.close() - print "done." + print("done.") if __name__ == '__main__': @@ -2186,9 +2188,9 @@ def option_handler(o, a): common.CloseInheritedPipes() main(sys.argv[1:]) except common.ExternalError as e: - print - print " ERROR: %s" % (e,) - print + print() + print(" ERROR: %s" % e) + print() sys.exit(1) finally: common.Cleanup() diff --git a/tools/releasetools/rangelib.py b/tools/releasetools/rangelib.py index aa572cc3343..a41ecd540dc 100644 --- a/tools/releasetools/rangelib.py +++ b/tools/releasetools/rangelib.py @@ -46,6 +46,8 @@ def __ne__(self, other): def __nonzero__(self): return bool(self.data) + def __bool__(self): + return self.__nonzero__() def __str__(self): if not self.data: diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py index 7aea86b283a..834eec6ffed 100755 --- a/tools/releasetools/sign_target_files_apks.py +++ b/tools/releasetools/sign_target_files_apks.py @@ -65,14 +65,15 @@ """ +from __future__ import print_function + import sys if sys.hexversion < 0x02070000: - print >> sys.stderr, "Python 2.7 or newer is required." + print("Python 2.7 or newer is required.", file=sys.stderr) sys.exit(1) import base64 -import cStringIO import copy import errno import os @@ -82,6 +83,11 @@ import tempfile import zipfile +try: + from cStringIO import StringIO +except ImportError: + from io import StringIO + import add_img_to_target_files import common @@ -98,11 +104,11 @@ def GetApkCerts(tf_zip): certmap = common.ReadApkCerts(tf_zip) # apply the key remapping to the contents of the file - for apk, cert in certmap.iteritems(): + for apk, cert in certmap.items(): certmap[apk] = OPTIONS.key_map.get(cert, cert) # apply all the -e options, overriding anything in the file - for apk, cert in OPTIONS.extra_apks.iteritems(): + for apk, cert in OPTIONS.extra_apks.items(): if not cert: cert = "PRESIGNED" certmap[apk] = OPTIONS.key_map.get(cert, cert) @@ -120,10 +126,10 @@ def CheckAllApksSigned(input_tf_zip, apk_key_map): if name not in apk_key_map: unknown_apks.append(name) if unknown_apks: - print "ERROR: no key specified for:\n\n ", - print "\n ".join(unknown_apks) - print "\nUse '-e =' to specify a key (which may be an" - print "empty string to not sign this apk)." + print("ERROR: no key specified for:\n\n ", end=' ') + print("\n ".join(unknown_apks)) + print("\nUse '-e =' to specify a key (which may be an") + print("empty string to not sign this apk).") sys.exit(1) @@ -220,26 +226,26 @@ def write_to_temp(fn, attr, data): name = os.path.basename(info.filename) key = apk_key_map[name] if key not in common.SPECIAL_CERT_STRINGS: - print " signing: %-*s (%s)" % (maxsize, name, key) + print(" signing: %-*s (%s)" % (maxsize, name, key)) signed_data = SignApk(data, key, key_passwords[key], platform_api_level, codename_to_api_level_map) common.ZipWriteStr(output_tf_zip, out_info, signed_data) else: # an APK we're not supposed to sign. - print "NOT signing: %s" % (name,) + print("NOT signing: %s" % name) common.ZipWriteStr(output_tf_zip, out_info, data) elif info.filename in ("SYSTEM/build.prop", "VENDOR/build.prop", "BOOT/RAMDISK/default.prop", "RECOVERY/RAMDISK/default.prop"): - print "rewriting %s:" % (info.filename,) + print("rewriting %s:" % info.filename) new_data = RewriteProps(data, misc_info) common.ZipWriteStr(output_tf_zip, out_info, new_data) if info.filename in ("BOOT/RAMDISK/default.prop", "RECOVERY/RAMDISK/default.prop"): write_to_temp(info.filename, info.external_attr, new_data) elif info.filename.endswith("mac_permissions.xml"): - print "rewriting %s with new keys." % (info.filename,) + print("rewriting %s with new keys." % info.filename) new_data = ReplaceCerts(data) common.ZipWriteStr(output_tf_zip, out_info, new_data) elif info.filename in ("SYSTEM/recovery-from-boot.p", @@ -286,10 +292,10 @@ def ReplaceCerts(data): """Given a string of data, replace all occurences of a set of X509 certs with a newer set of X509 certs and return the updated data string.""" - for old, new in OPTIONS.key_map.iteritems(): + for old, new in OPTIONS.key_map.items(): try: if OPTIONS.verbose: - print " Replacing %s.x509.pem with %s.x509.pem" % (old, new) + print(" Replacing %s.x509.pem with %s.x509.pem" % (old, new)) f = open(old + ".x509.pem") old_cert16 = base64.b16encode(common.ParseCertificate(f.read())).lower() f.close() @@ -300,14 +306,14 @@ def ReplaceCerts(data): pattern = "\\b"+old_cert16+"\\b" (data, num) = re.subn(pattern, new_cert16, data, flags=re.IGNORECASE) if OPTIONS.verbose: - print " Replaced %d occurence(s) of %s.x509.pem with " \ - "%s.x509.pem" % (num, old, new) + print(" Replaced %d occurence(s) of %s.x509.pem with " + "%s.x509.pem" % (num, old, new)) except IOError as e: if e.errno == errno.ENOENT and not OPTIONS.verbose: continue - print " Error accessing %s. %s. Skip replacing %s.x509.pem " \ - "with %s.x509.pem." % (e.filename, e.strerror, old, new) + print(" Error accessing %s. %s. Skip replacing %s.x509.pem " + "with %s.x509.pem." % (e.filename, e.strerror, old, new)) return data @@ -360,8 +366,8 @@ def RewriteProps(data, misc_info): value = " ".join(value) line = key + "=" + value if line != original_line: - print " replace: ", original_line - print " with: ", line + print(" replace: ", original_line) + print(" with: ", line) output.append(line) return "\n".join(output) + "\n" @@ -377,7 +383,7 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): extra_recovery_keys = [OPTIONS.key_map.get(k, k) + ".x509.pem" for k in extra_recovery_keys.split()] if extra_recovery_keys: - print "extra recovery-only key(s): " + ", ".join(extra_recovery_keys) + print("extra recovery-only key(s): " + ", ".join(extra_recovery_keys)) else: extra_recovery_keys = [] @@ -391,14 +397,14 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): mapped_keys.append(OPTIONS.key_map.get(k, k) + ".x509.pem") if mapped_keys: - print "using:\n ", "\n ".join(mapped_keys) - print "for OTA package verification" + print("using:\n ", "\n ".join(mapped_keys)) + print("for OTA package verification") else: devkey = misc_info.get("default_system_dev_certificate", "build/target/product/security/testkey") mapped_keys.append( OPTIONS.key_map.get(devkey, devkey) + ".x509.pem") - print "META/otakeys.txt has no keys; using", mapped_keys[0] + print("META/otakeys.txt has no keys; using", mapped_keys[0]) # recovery uses a version of the key that has been slightly # predigested (by DumpPublicKey.java) and put in res/keys. @@ -426,7 +432,7 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): # put into a zipfile system/etc/security/otacerts.zip. # We DO NOT include the extra_recovery_keys (if any) here. - temp_file = cStringIO.StringIO() + temp_file = StringIO() certs_zip = zipfile.ZipFile(temp_file, "w") for k in mapped_keys: common.ZipWrite(certs_zip, k) @@ -437,7 +443,7 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info): return new_recovery_keys def ReplaceVerityPublicKey(targetfile_zip, filename, key_path): - print "Replacing verity public key with %s" % key_path + print("Replacing verity public key with %s" % key_path) with open(key_path) as f: data = f.read() common.ZipWriteStr(targetfile_zip, filename, data) @@ -445,7 +451,7 @@ def ReplaceVerityPublicKey(targetfile_zip, filename, key_path): def ReplaceVerityPrivateKey(targetfile_input_zip, targetfile_output_zip, misc_info, key_path): - print "Replacing verity private key with %s" % key_path + print("Replacing verity private key with %s" % key_path) current_key = misc_info["verity_key"] original_misc_info = targetfile_input_zip.read("META/misc_info.txt") new_misc_info = original_misc_info.replace(current_key, key_path) @@ -596,14 +602,14 @@ def option_handler(o, a): add_img_to_target_files.AddImagesToTargetFiles(args[1]) - print "done." + print("done.") if __name__ == '__main__': try: main(sys.argv[1:]) - except common.ExternalError, e: - print - print " ERROR: %s" % (e,) - print + except common.ExternalError as e: + print() + print(" ERROR: %s" % e) + print() sys.exit(1) diff --git a/tools/releasetools/sparse_img.py b/tools/releasetools/sparse_img.py index 4ba7560dfc2..c4ac37159d7 100644 --- a/tools/releasetools/sparse_img.py +++ b/tools/releasetools/sparse_img.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function + import bisect import os import struct diff --git a/tools/roomservice.py b/tools/roomservice.py index 9f73f02a749..a1b69cdac65 100755 --- a/tools/roomservice.py +++ b/tools/roomservice.py @@ -38,7 +38,7 @@ from xml.etree import ElementTree -product = sys.argv[1]; +product = sys.argv[1] if len(sys.argv) > 2: depsonly = sys.argv[2] @@ -59,7 +59,8 @@ authtuple = netrc.netrc().authenticators("api.github.com") if authtuple: - githubauth = base64.encodestring('%s:%s' % (authtuple[0], authtuple[2])).replace('\n', '') + auth_string = ('%s:%s' % (authtuple[0], authtuple[2])).encode() + githubauth = base64.encodestring(auth_string).decode().replace('\n', '') else: githubauth = None except: diff --git a/tools/warn.py b/tools/warn.py index 80971235c71..b5a49f616fc 100755 --- a/tools/warn.py +++ b/tools/warn.py @@ -1,11 +1,13 @@ #!/usr/bin/env python # This file uses the following encoding: utf-8 +from __future__ import print_function + import sys import re if len(sys.argv) == 1: - print 'usage: ' + sys.argv[0] + ' ' + print('usage: ' + sys.argv[0] + ' ') sys.exit() # if you add another level, don't forget to give it a color below @@ -399,7 +401,7 @@ def colorforseverity(sev): row_colors = [ 'e0e0e0', 'd0d0d0' ] def output(text): - print text, + print(text, end=' ') def htmlbig(param): return '' + param + '' From 24f89a668a733241d39f36384fd352069bfdac1f Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Wed, 21 Oct 2015 12:43:14 -0700 Subject: [PATCH 231/502] mms: introduce a shortcut to quickly rebuild kernel/boot.img Add a new shortcut to short circuit the long build process that walks the entire tree collecting all Android.mks. The resulting dependency list is sufficient to rebuild the kernel, copy product files and repack the system image with updated modules. This shortcut allows Kernel devs to rebuild just the boot.img and kernel modules very quickly (20s vs 3min). Change-Id: Ie0a69f241ea7b920859ff1e02c3542b79952462c --- core/main.mk | 5 +++++ envsetup.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/core/main.mk b/core/main.mk index 8fe8db0479a..bbee00b223a 100644 --- a/core/main.mk +++ b/core/main.mk @@ -521,7 +521,12 @@ endif ifneq ($(ONE_SHOT_MAKEFILE),) # We've probably been invoked by the "mm" shell function # with a subdirectory's makefile. + +# No Makefiles to include if we are performing a mms/short-circuit build. Only +# the targets mentioned by main.mk and tasks/* are built (kernel, boot.img etc) +ifneq ($(ONE_SHOT_MAKEFILE),__none__) include $(ONE_SHOT_MAKEFILE) +endif # Change CUSTOM_MODULES to include only modules that were # defined by this makefile; this will install all of those # modules as a side-effect. Do this after including ONE_SHOT_MAKEFILE diff --git a/envsetup.sh b/envsetup.sh index 368e45f14e1..31116304755 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -13,6 +13,8 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - mmma: Builds all of the modules in the supplied directories, and their dependencies. - mmp: Builds all of the modules in the current directory and pushes them to the device. - mmmp: Builds all of the modules in the supplied directories and pushes them to the device. +- mms: Short circuit builder. Quickly re-build the kernel, rootfs, boot and system images + without deep dependencies. Requires the full build to have run before. - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. @@ -2218,6 +2220,30 @@ function cmka() { fi } +function mms() { + local T=$(gettop) + if [ -z "$T" ] + then + echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 + fi + + case `uname -s` in + Darwin) + local NUM_CPUS=$(sysctl hw.ncpu|cut -d" " -f2) + ONE_SHOT_MAKEFILE="__none__" \ + make -C $T -j $NUM_CPUS "$@" + ;; + *) + local NUM_CPUS=$(cat /proc/cpuinfo | grep "^processor" | wc -l) + ONE_SHOT_MAKEFILE="__none__" \ + mk_timer schedtool -B -n 1 -e ionice -n 1 \ + make -C $T -j $NUM_CPUS "$@" + ;; + esac +} + + function repolastsync() { RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json" RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z") From 9280cc0f6626a213ebf8f06c98ec089201da0205 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 25 Jan 2016 16:49:27 +0000 Subject: [PATCH 232/502] binary: Allow specifying a path for generated proto headers protobuf compilation defaults to dropping the generated objects and headers onto a path derived from the origin source path. This poses a problem with some of our repositories since they're not placed in their original paths, and may include hard references to pb headers assuming the original directory. Typical use of this will be to place a LOCAL_PROTOC_OUTPUT := line in the relevant module block (for example, "hardware/ril" for our "hardware/ril-caf") Change-Id: Ib9b0cadd47e29a0d2e693b331cfc18e71b048ee5 --- core/binary.mk | 15 +++++++++++++++ core/clear_vars.mk | 2 ++ 2 files changed, 17 insertions(+) diff --git a/core/binary.mk b/core/binary.mk index a842f366b78..112d75560b4 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -656,17 +656,32 @@ proto_generated_objects := $(addprefix $(proto_generated_obj_dir)/, \ $(patsubst %.proto,%.pb.o,$(proto_sources_fullpath))) $(call track-src-file-obj,$(proto_sources),$(proto_generated_objects)) +define copy-proto-files +$(if $(PRIVATE_PROTOC_OUTPUT), \ + $(eval proto_generated_path := $(dir $(subst $(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT),$@))) + @mkdir -p $(dir $(proto_generated_path)) + @echo "Protobuf relocation: $@ => $(proto_generated_path)" + @cp -f $@ $(proto_generated_path) ,) +endef + + # Ensure the transform-proto-to-cc rule is only defined once in multilib build. ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined $(proto_generated_sources): PRIVATE_PROTO_INCLUDES := $(TOP) $(proto_generated_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags) +$(proto_generated_sources): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) +$(proto_generated_sources): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) $(proto_generated_sources): $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix): %.proto $(PROTOC) $(transform-proto-to-cc) + $(copy-proto-files) # This is just a dummy rule to make sure gmake doesn't skip updating the dependents. +$(proto_generated_headers): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) +$(proto_generated_headers): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) $(proto_generated_headers): $(proto_generated_sources_dir)/%.pb.h: $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix) @echo "Updated header file $@." $(hide) touch $@ + $(copy-proto-files) $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true endif # transform-proto-to-cc rule included only once diff --git a/core/clear_vars.mk b/core/clear_vars.mk index bc59e0ce0f6..5ca5fb6d431 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -362,6 +362,8 @@ LOCAL_INIT_RC_32:= LOCAL_INIT_RC_64:= LOCAL_JAVA_LANGUAGE_VERSION:= +LOCAL_PROTOC_OUTPUT:= + # Include any vendor specific clear_vars.mk file -include $(TOPDIR)vendor/*/build/core/clear_vars.mk From f6f922c83cb55402ea41e3e240cdaf6b210fb001 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Tue, 26 Jan 2016 20:45:16 +0000 Subject: [PATCH 233/502] binary: Don't run protobuf header relocations if origin/target are the same Change-Id: I3746746bdf1526674f345d884e2eccef85e946ef --- core/binary.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/binary.mk b/core/binary.mk index 112d75560b4..bbdc43d3ead 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -658,10 +658,11 @@ $(call track-src-file-obj,$(proto_sources),$(proto_generated_objects)) define copy-proto-files $(if $(PRIVATE_PROTOC_OUTPUT), \ + $(if $(call streq,$(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT)),, \ $(eval proto_generated_path := $(dir $(subst $(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT),$@))) @mkdir -p $(dir $(proto_generated_path)) @echo "Protobuf relocation: $@ => $(proto_generated_path)" - @cp -f $@ $(proto_generated_path) ,) + @cp -f $@ $(proto_generated_path) ),) endef From fff8c1c14dccf733d659969053bc470adaa9aef2 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Fri, 26 Feb 2016 18:06:39 +0000 Subject: [PATCH 234/502] binary: Generate dummy rule for relocated protobuf headers Similar to (and dependent on) the rule already in place for pb headers, to avoid dependency breakage when builds are interrupted for random reasons Change-Id: Ie88f468f8a5b0d240121db6791a1053c4a7c5bfb --- core/binary.mk | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/binary.mk b/core/binary.mk index bbdc43d3ead..23703141bb3 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -684,6 +684,17 @@ $(proto_generated_headers): $(proto_generated_sources_dir)/%.pb.h: $(proto_gener $(hide) touch $@ $(copy-proto-files) +$(if $(LOCAL_PROTOC_OUTPUT), \ +$(if $(call streq,$(LOCAL_PROTOC_OUTPUT),$(LOCAL_PATH)),, \ + $(eval proto_relocated_headers := $(subst $(LOCAL_PATH),$(LOCAL_PROTOC_OUTPUT),$(proto_generated_headers))) \ + ), ) + +ifdef proto_relocated_headers +$(proto_relocated_headers): $(proto_generated_headers) + echo "Refreshed header file $@." + $(hide) touch $@ +endif + $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true endif # transform-proto-to-cc rule included only once From adf8cdc15b2a470419f8b7488dfa6303735bed5f Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sat, 26 Mar 2016 02:56:10 +0000 Subject: [PATCH 235/502] Revert "binary: Generate dummy rule for relocated protobuf headers" This reverts commit ba297413c51feab9fa43be5af56e12b79891f5fb. The dummy rule creates an empty file. Instead of relying on header dependency resolution, copy all protobuf output when the source is generated in replacement of separate source/header steps. Change-Id: I358459be7c812afea5be56e14dc74ea11abb3502 --- core/binary.mk | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/core/binary.mk b/core/binary.mk index 23703141bb3..c020ce3aab9 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -660,9 +660,10 @@ define copy-proto-files $(if $(PRIVATE_PROTOC_OUTPUT), \ $(if $(call streq,$(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT)),, \ $(eval proto_generated_path := $(dir $(subst $(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT),$@))) + $(eval proto_target_files := $(patsubst %.pb$(PRIVATE_PROTOC_SUFFIX), %.pb.*, $@)) @mkdir -p $(dir $(proto_generated_path)) - @echo "Protobuf relocation: $@ => $(proto_generated_path)" - @cp -f $@ $(proto_generated_path) ),) + @echo "Protobuf relocation: $(proto_target_files) => $(proto_generated_path)" + @cp -f $(proto_target_files) $(proto_generated_path) ),) endef @@ -672,28 +673,15 @@ $(proto_generated_sources): PRIVATE_PROTO_INCLUDES := $(TOP) $(proto_generated_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags) $(proto_generated_sources): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) $(proto_generated_sources): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) +$(proto_generated_sources): PRIVATE_PROTOC_SUFFIX := $(my_proto_source_suffix) $(proto_generated_sources): $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix): %.proto $(PROTOC) $(transform-proto-to-cc) $(copy-proto-files) # This is just a dummy rule to make sure gmake doesn't skip updating the dependents. -$(proto_generated_headers): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) -$(proto_generated_headers): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) $(proto_generated_headers): $(proto_generated_sources_dir)/%.pb.h: $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix) @echo "Updated header file $@." $(hide) touch $@ - $(copy-proto-files) - -$(if $(LOCAL_PROTOC_OUTPUT), \ -$(if $(call streq,$(LOCAL_PROTOC_OUTPUT),$(LOCAL_PATH)),, \ - $(eval proto_relocated_headers := $(subst $(LOCAL_PATH),$(LOCAL_PROTOC_OUTPUT),$(proto_generated_headers))) \ - ), ) - -ifdef proto_relocated_headers -$(proto_relocated_headers): $(proto_generated_headers) - echo "Refreshed header file $@." - $(hide) touch $@ -endif $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true endif # transform-proto-to-cc rule included only once From b594d8b529bd432d1a911366115d602e0fb9cdba Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Fri, 29 Jan 2016 11:47:56 -0800 Subject: [PATCH 236/502] releasetools: Use the first entry of a mount point when reading fstab There may be multiple entries in fstab for a mount point. Use the first value found so the entries are prioritized in order. Change-Id: Ibd2631413d3e00507d3a0ec84fb91755f1c7993c Ticket: OPO-326 --- tools/releasetools/common.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 9170a8d91b7..90b047438ad 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -349,9 +349,10 @@ def __init__(self, mount_point, fs_type, device, length, device2, context): else: print("%s: unknown option \"%s\"" % (mount_point, i)) - d[mount_point] = Partition(mount_point=mount_point, fs_type=pieces[1], - device=pieces[2], length=length, - device2=device2) + if not d.get(mount_point): + d[mount_point] = Partition(mount_point=mount_point, fs_type=pieces[1], + device=pieces[2], length=length, + device2=device2) elif fstab_version == 2: d = {} @@ -387,9 +388,10 @@ def __init__(self, mount_point, fs_type, device, length, device2, context): context = i mount_point = pieces[1] - d[mount_point] = Partition(mount_point=mount_point, fs_type=pieces[2], - device=pieces[0], length=length, - device2=None, context=context) + if not d.get(mount_point): + d[mount_point] = Partition(mount_point=mount_point, fs_type=pieces[2], + device=pieces[0], length=length, + device2=None, context=context) else: raise ValueError("Unknown fstab_version: \"%d\"" % (fstab_version,)) From 6753af0508bfe4c8295d7270ece33038ff824558 Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Tue, 2 Feb 2016 12:00:14 -0800 Subject: [PATCH 237/502] envsetup: dopush: fix error when device is not connected $(adb get-state) was unquoted and returns an empty string when no device is connected causing the if and until statements to be malformed. Fix quoting and refactor the test to a separate function. Change-Id: I2cfa0a7b2033e5a379cab2cae64ed57f5495dbed --- envsetup.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 31116304755..7b5660163e3 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2271,6 +2271,19 @@ function repodiff() { 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' } +# Return success if adb is up and not in recovery +function _adb_connected { + { + if [[ "$(adb get-state)" == device && + "$(adb shell test -e /sbin/recovery; echo $?)" == 0 ]] + then + return 0 + fi + } 2>/dev/null + + return 1 +}; + # Credit for color strip sed: http://goo.gl/BoIcm function dopush() { @@ -2278,10 +2291,10 @@ function dopush() shift adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + if ! _adb_connected; then echo "No device is online. Waiting for one..." echo "Please connect USB and/or enable USB debugging" - until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + until _adb_connected; do sleep 1 done echo "Device Found." From e7e965dcaeaf5760b8f657c1e83b4940f865eab5 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Wed, 16 Dec 2015 16:07:10 -0800 Subject: [PATCH 238/502] build: Always run checkapi when building system image This should significantly reduce the number of quail stars given out. This only applies when building the system image. Packages may still be built and tested individually without any impact. If you like to live dangerously, set I_WANT_A_QUAIL_STAR in your environment. Change-Id: I3da6646f022f2e967ebe2c3dd9ed616fab7991fe --- core/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/Makefile b/core/Makefile index f5e217aa330..d501c39b8dc 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1267,6 +1267,10 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) +ifndef I_WANT_A_QUAIL_STAR +$(BUILT_SYSTEMIMAGE): checkapi +endif + INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) From 4a241a8a6de3553045c2d14177abf3a66478b21a Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Thu, 4 Feb 2016 13:48:13 -0800 Subject: [PATCH 239/502] releasetools: Replace key values in permission files during re-signing Permission files may grant permissions based on signatures in the same way mac_permissions grants selinux permissions. In order to have this work properly with dev-key and production key signed builds, allow these files to be re-written during the signing process to replace the value of the keys in production signed builds. Change-Id: Id0311e49f8bba5a9f71b2fa49b480cb74779c853 Ticket: CYNGNOS-1877, RM-179 --- tools/releasetools/sign_target_files_apks.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py index 834eec6ffed..f2137985182 100755 --- a/tools/releasetools/sign_target_files_apks.py +++ b/tools/releasetools/sign_target_files_apks.py @@ -248,6 +248,10 @@ def write_to_temp(fn, attr, data): print("rewriting %s with new keys." % info.filename) new_data = ReplaceCerts(data) common.ZipWriteStr(output_tf_zip, out_info, new_data) + elif info.filename.startswith("SYSTEM/etc/permissions/"): + print("rewriting %s with new keys." % info.filename) + new_data = ReplaceCerts(data) + common.ZipWriteStr(output_tf_zip, out_info, new_data) elif info.filename in ("SYSTEM/recovery-from-boot.p", "SYSTEM/etc/recovery.img", "SYSTEM/bin/install-recovery.sh"): From 8fc1d401501754dd1b23f570892f7f26cb25daac Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Tue, 9 Feb 2016 11:28:53 -0800 Subject: [PATCH 240/502] prebuild: compress shared libraries in prebundled apks Prebundled APK shared libraries get installed like any other APK. Compress these libraries in the APK to save space. Change-Id: If3f85b43e492dd42d2da89d3b3f0a1b1b44ccdbb --- core/prebuilt_internal.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 54f74f222f4..1af1c779a6d 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -241,7 +241,9 @@ $(built_module): PRIVATE_EMBEDDED_JNI_LIBS := $(embedded_prebuilt_jni_libs) $(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR) $(AAPT) $(transform-prebuilt-to-target) +ifneq ($(LOCAL_MODULE_PATH),$(TARGET_OUT_VENDOR)/bundled-app) $(uncompress-shared-libs) +endif ifdef LOCAL_DEX_PREOPT ifneq ($(BUILD_PLATFORM_ZIP),) @# Keep a copy of apk with classes.dex unstripped From a229e7792287780d23b9a196c0895066222fa3da Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Wed, 10 Feb 2016 15:54:05 -0800 Subject: [PATCH 241/502] releasetools: Don't extract BOOTABLE_IMAGES when signing target files boot and recovery images need to be re-created during the signing process to ensure that the proper keys are embedded in the images. Don't extract the BOOTABLE_IMAGES path if it exists in the source target files to avoid re-using the prebuilt versions. Change-Id: Icdf61367efc2364f89c7ab1c61a81536431aea2e Ticket: CYNGNOS-1994 --- tools/releasetools/sign_target_files_apks.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py index f2137985182..7cf97c97bb5 100755 --- a/tools/releasetools/sign_target_files_apks.py +++ b/tools/releasetools/sign_target_files_apks.py @@ -199,6 +199,9 @@ def write_to_temp(fn, attr, data): if info.filename.startswith("IMAGES/"): continue + if info.filename.startswith("BOOTABLE_IMAGES/"): + continue + data = input_tf_zip.read(info.filename) out_info = copy.copy(info) From 7ffcafbc3139567a228da5942980d3fc5b1abb99 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Tue, 9 Feb 2016 11:15:55 -0800 Subject: [PATCH 242/502] build: Enforce checkapi-cm on system image gen. TICKET: CYNGNOS-1950 Change-Id: If13ff02b913d5586df163ff3aee254dd4cfb4e24 --- core/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/core/Makefile b/core/Makefile index d501c39b8dc..9c73720bc64 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1269,6 +1269,7 @@ $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) ifndef I_WANT_A_QUAIL_STAR $(BUILT_SYSTEMIMAGE): checkapi +$(BUILT_SYSTEMIMAGE): checkapi-cm endif INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img From 599f4073249893c3dbf0c175ac0f6b1f7238b8cc Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Fri, 5 Feb 2016 15:59:21 -0500 Subject: [PATCH 243/502] Implement 'mmap' command Change-Id: I029da8a8421bea2b628b4025f9f2d6f749436c7b --- envsetup.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 7b5660163e3..9ac43dadd8f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -11,6 +11,7 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. +- mmap: Builds all of the modules in the current directory, and its dependencies, then pushes the package to the device. - mmp: Builds all of the modules in the current directory and pushes them to the device. - mmmp: Builds all of the modules in the supplied directories and pushes them to the device. - mms: Short circuit builder. Quickly re-build the kernel, rootfs, boot and system images @@ -2417,6 +2418,7 @@ EOF alias mmp='dopush mm' alias mmmp='dopush mmm' +alias mmap='dopush mma' alias mkap='dopush mka' alias cmkap='dopush cmka' From e24f52375de7c33f41eadde48482c48955b982e9 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Mon, 2 Nov 2015 17:26:07 -0800 Subject: [PATCH 244/502] ota_from_target_files: Don't validate data signatures with data wipe If data is going to be wiped later in the script, there is no reason to validate signatures. This breaks updates that may be designed to wipe data and change signatures. Change-Id: I0b794b43cec2d22996eaa5571688c66582475d55 Ticket: CYNGNOS-1289 --- tools/releasetools/ota_from_target_files.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 3b1b7e54dc5..8ebed9860bb 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -667,13 +667,14 @@ def WriteFullOTAPackage(input_zip, output_zip): if HasVendorPartition(input_zip): system_progress -= 0.1 - script.AppendExtra("if is_mounted(\"/data\") then") - script.ValidateSignatures("data") - script.AppendExtra("else") - script.Mount("/data") - script.ValidateSignatures("data") - script.Unmount("/data") - script.AppendExtra("endif;") + if not OPTIONS.wipe_user_data: + script.AppendExtra("if is_mounted(\"/data\") then") + script.ValidateSignatures("data") + script.AppendExtra("else") + script.Mount("/data") + script.ValidateSignatures("data") + script.Unmount("/data") + script.AppendExtra("endif;") # Place a copy of file_contexts.bin into the OTA package which will be used # by the recovery program. From a860d8b20007ccc07fbf21eeae749f8aa942d480 Mon Sep 17 00:00:00 2001 From: msfkonsole Date: Wed, 27 Jan 2016 04:28:37 +0700 Subject: [PATCH 245/502] build: e2fsck missing from emulator The emulator file system was recently switched to ext4 however, e2fsck was not added to the emulator build. Change-Id: Ida9ed1083de7576e20a7ad11f085e5cc4f17ecf4 Signed-off-by: msfkonsole --- target/product/emulator.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/product/emulator.mk b/target/product/emulator.mk index b08a28a2a9e..a1217e79e98 100644 --- a/target/product/emulator.mk +++ b/target/product/emulator.mk @@ -51,7 +51,8 @@ PRODUCT_PACKAGES += \ power.goldfish \ fingerprint.ranchu \ fingerprintd \ - sensors.ranchu + sensors.ranchu \ + e2fsck PRODUCT_COPY_FILES += \ device/generic/goldfish/fstab.goldfish:root/fstab.goldfish \ From e2520512864446905cec3c87ef22d9625e3573ef Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Mon, 8 Feb 2016 16:27:55 -0800 Subject: [PATCH 246/502] envsetup: add function to detect shell Add a function to detect shell, other functions can now use this to handle shell specific behavior. Change-Id: I4aabc0068e836c5433053b144d163fb0ed49f752 --- envsetup.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 9ac43dadd8f..c53305c02cc 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2575,16 +2575,25 @@ function make() mk_timer $(get_make_command) "$@" } -if [ "x$SHELL" != "x/bin/bash" ]; then +function __detect_shell() { case `ps -o command -p $$` in *bash*) + echo bash ;; *zsh*) + echo zsh ;; *) - echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results" + echo unknown + return 1 ;; esac + return +} + + +if ! __detect_shell > /dev/null; then + echo "WARNING: Only bash and zsh are supported, use of other shell may lead to erroneous results" fi # Execute the contents of any vendorsetup.sh files we can find. From 89ef6245af7b466688736a72ac13b72f4e63b780 Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Mon, 8 Feb 2016 16:54:01 -0800 Subject: [PATCH 247/502] envsetup: cmgerrit: fix for zsh zsh does not define $FUNCNAME, define it for zsh when necessary. Change-Id: I097d3e572b18c84d953ca03b3714271d1d2fd5c3 --- envsetup.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index c53305c02cc..69b795f1684 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1911,6 +1911,12 @@ function makerecipe() { } function cmgerrit() { + + if [ "$(__detect_shell)" == "zsh" ]; then + # zsh does not define FUNCNAME, derive from funcstack + local FUNCNAME=$funcstack[1] + fi + if [ $# -eq 0 ]; then $FUNCNAME help return 1 From adbf135bb392d07714bcbfb97aaa8fa2d78c67f7 Mon Sep 17 00:00:00 2001 From: Artefvck 07 Date: Thu, 4 Feb 2016 09:37:15 -0800 Subject: [PATCH 248/502] releasetool: add OSIP partitions specifics - Declare OSIP as a new partition type - Standard boot.img update is not possible for OSIP partitions We are simply removing it on AOSP handling, and let the board handle it in its own releasetool.py Change-Id: Ie19fc3f6a0ca42e2eda264904b20fceeddbeaf53 --- tools/releasetools/common.py | 5 +++-- tools/releasetools/edify_generator.py | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 90b047438ad..f97429e0087 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1680,7 +1680,8 @@ def _HashZeroBlocks(self, num_blocks): # pylint: disable=no-self-use "squashfs": "EMMC", "ext2": "EMMC", "ext3": "EMMC", - "vfat": "EMMC" + "vfat": "EMMC", + "osip": "OSIP" } def GetTypeAndDevice(mount_point, info): @@ -1812,4 +1813,4 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, print("putting script in", sh_location) - output_sink(sh_location, sh) + output_sink(sh_location, sh) \ No newline at end of file diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 225b8669efb..ac6adddec9f 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -352,6 +352,10 @@ def WriteRawImage(self, mount_point, fn, mapfn=None): self.script.append( 'write_raw_image(package_extract_file("%(fn)s"), "%(device)s");' % args) + elif partition_type == "OSIP": + self.script.append( + 'write_osip_image(package_extract_file("%(fn)s"), "%(device)s");' + % args) elif partition_type == "EMMC": if mapfn: args["map"] = mapfn From 96363533a34714f09455d0a3c93dbc9f94c5187a Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Thu, 11 Feb 2016 14:34:12 -0800 Subject: [PATCH 249/502] envesetup: mmm/mmma: fix for zsh Fix broken argument handling due to differnt word-splitting behavior in zsh [1]. Zsh arrays should be explicitly defined. - [1] http://zsh.sourceforge.net/FAQ/zshfaq03.html Change-Id: Ic299c1952384001e374c64caebbb23e9792fddf2 --- envsetup.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 69b795f1684..3e373b0376c 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -961,8 +961,15 @@ function mmm() local ARGS= local DIR TO_CHOP local GET_INSTALL_PATH= - local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') - local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + + if [ "$(__detect_shell)" == "zsh" ]; then + set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + else + local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + fi + for DIR in $DIRS ; do MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'` if [ "$MODULES" = "" ]; then @@ -1028,8 +1035,13 @@ function mmma() local T=$(gettop) local DRV=$(getdriver $T) if [ "$T" ]; then - local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') - local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + if [ "$(__detect_shell)" == "zsh" ]; then + set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + else + local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') + local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') + fi local MY_PWD=`PWD= /bin/pwd` if [ "$MY_PWD" = "$T" ]; then MY_PWD= From babd339c3970ea02d1d7be790e3587e40a1dc44e Mon Sep 17 00:00:00 2001 From: Roman Birg Date: Tue, 1 Mar 2016 10:27:51 -0800 Subject: [PATCH 250/502] build: better compatibility between zsh shells Handle equals expansion in zsh http://www.zsh.org/mla/users/2011/msg00160.html Change-Id: I2b0cb23991aa88c3fa2c4dce00f7c3a673176e0a Signed-off-by: Roman Birg --- envsetup.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 3e373b0376c..3d1f59dc990 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -962,7 +962,7 @@ function mmm() local DIR TO_CHOP local GET_INSTALL_PATH= - if [ "$(__detect_shell)" == "zsh" ]; then + if [ "$(__detect_shell)" = "zsh" ]; then set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') else @@ -1035,7 +1035,7 @@ function mmma() local T=$(gettop) local DRV=$(getdriver $T) if [ "$T" ]; then - if [ "$(__detect_shell)" == "zsh" ]; then + if [ "$(__detect_shell)" = "zsh" ]; then set -lA DASH_ARGS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') set -lA DIRS $(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') else @@ -1913,7 +1913,7 @@ function makerecipe() { repo forall -c ' - if [ "$REPO_REMOTE" == "github" ] + if [ "$REPO_REMOTE" = "github" ] then pwd cmremote @@ -1924,7 +1924,7 @@ function makerecipe() { function cmgerrit() { - if [ "$(__detect_shell)" == "zsh" ]; then + if [ "$(__detect_shell)" = "zsh" ]; then # zsh does not define FUNCNAME, derive from funcstack local FUNCNAME=$funcstack[1] fi @@ -2319,7 +2319,7 @@ function dopush() echo "Device Found." fi - if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" == "true" ]; + if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" = "true" ]; then # retrieve IP and PORT info if we're using a TCP connection TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ From 0b710d97062919c8906a88020c18376c4f47230a Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Wed, 2 Mar 2016 14:01:45 -0800 Subject: [PATCH 251/502] envsetup: fix mm under zsh Fix a word splitting issue in zsh. Instead of building a duplicate ARGS array for the !GET-INSTALL-PATH case, leave it untouched. For the GET-INSTALL-PATH case, modify the argument list as needed. Change-Id: I902ff1bc7a53e7afa8c4737d4208592ac18f95d7 --- envsetup.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 3d1f59dc990..6bb5587138f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -924,7 +924,6 @@ function mm() local M=$(findmakefile) local MODULES= local GET_INSTALL_PATH= - local ARGS= # Remove the path to top as the makefilepath needs to be relative local M=`echo $M|sed 's:'$T'/::'` if [ ! "$T" ]; then @@ -941,12 +940,12 @@ function mm() done if [ -n "$GET_INSTALL_PATH" ]; then MODULES= - ARGS=GET-INSTALL-PATH + # set all args to 'GET-INSTALL-PATH' + set -- GET-INSTALL-PATH else MODULES=all_modules - ARGS=$@ fi - ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS + ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES "$@" fi fi } From df45bc2c1959b97e4c0559f2bb6cceb661ff2c3c Mon Sep 17 00:00:00 2001 From: Abhishek G Date: Mon, 4 Apr 2016 17:03:24 -0700 Subject: [PATCH 252/502] Preventing default locale from being overridden because of buildinfo.sh Adding the ability to set default locale from the device tree. Adding the TARGET_SKIP_DEFAULT_LOCALE flag which can be set in the device tree, thus preventing buildinfo.sh from overriding default locale. Change-Id: I66bcedb42216acee56ceaf657a39dc23d7eea6f4 Issue-Id: FEIJ-22 --- core/Makefile | 1 + core/product.mk | 3 +++ tools/buildinfo.sh | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 9c73720bc64..8d3d6d98017 100644 --- a/core/Makefile +++ b/core/Makefile @@ -277,6 +277,7 @@ endif TARGET_CPU_ABI2="$(TARGET_CPU_ABI2)" \ TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ TARGET_UNIFIED_DEVICE="$(TARGET_UNIFIED_DEVICE)" \ + TARGET_SKIP_DEFAULT_LOCALE="$(TARGET_SKIP_DEFAULT_LOCALE)" \ $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ diff --git a/core/product.mk b/core/product.mk index e2a5c3a8309..078066e3287 100644 --- a/core/product.mk +++ b/core/product.mk @@ -294,6 +294,9 @@ _product_stash_var_list += \ GLOBAL_CPPFLAGS_NO_OVERRIDE \ GLOBAL_CLANG_CFLAGS_NO_OVERRIDE \ +_product_stash_var_list += \ + TARGET_SKIP_DEFAULT_LOCALE \ + # # Stash values of the variables in _product_stash_var_list. # $(1): Renamed prefix diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index 039c344a42c..b169c3d84eb 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -43,7 +43,7 @@ echo "ro.product.cpu.abilist32=$TARGET_CPU_ABI_LIST_32_BIT" echo "ro.product.cpu.abilist64=$TARGET_CPU_ABI_LIST_64_BIT" echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER" -if [ -n "$PRODUCT_DEFAULT_LOCALE" ] ; then +if [ -n "$PRODUCT_DEFAULT_LOCALE" ] && [ -z "$TARGET_SKIP_DEFAULT_LOCALE" ] ; then echo "ro.product.locale=$PRODUCT_DEFAULT_LOCALE" fi echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS" From 82fb0ca3d6fe88f71d3e807c920cf00cf92b8588 Mon Sep 17 00:00:00 2001 From: Khalid Zubair Date: Wed, 2 Mar 2016 13:57:01 -0800 Subject: [PATCH 253/502] build: add cmts config to global build Change-Id: I554840be954545ab7637c9e5a6fcc7cb5a5da7c1 --- core/main.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/main.mk b/core/main.mk index bbee00b223a..4190559c858 100644 --- a/core/main.mk +++ b/core/main.mk @@ -135,6 +135,9 @@ endif # VTS-specific config. -include test/vts/tools/vts-tradefed/build/config.mk +# CMTS-specific config. +-include vendor/cmts/build/config.mk + # This allows us to force a clean build - included after the config.mk # environment setup is done, but before we generate any dependencies. This # file does the rm -rf inline so the deps which are all done below will From 7d2b847264c63b22d3b3f2d2023f44a9b36809a3 Mon Sep 17 00:00:00 2001 From: Diogo Ferreira Date: Wed, 16 Mar 2016 19:04:48 +0000 Subject: [PATCH 254/502] build: Add MTK support When setting BOARD_USES_MTK_HARDWARE, a global MTK_HARDWARE define will be available to all target modules. Change-Id: Id2a2996139a31afb6eb37f7ee24202587cb4beb1 kernel: remove support for unused MTK Kernel Remove unused MTK kernel build support. Change-Id: I4f4df078ae03b1bd5edc7000e5b942bfc05c02bd --- core/config.mk | 3 +++ core/mtk_target.mk | 13 +++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 core/mtk_target.mk diff --git a/core/config.mk b/core/config.mk index d929c2a68ee..961c0b0d8a5 100644 --- a/core/config.mk +++ b/core/config.mk @@ -658,6 +658,9 @@ endif # Rules for QCOM targets include $(BUILD_SYSTEM)/qcom_target.mk +# Rules for MTK targets +include $(BUILD_SYSTEM)/mtk_target.mk + # ############################################################### # Set up final options. # ############################################################### diff --git a/core/mtk_target.mk b/core/mtk_target.mk new file mode 100644 index 00000000000..7c3ba1f6259 --- /dev/null +++ b/core/mtk_target.mk @@ -0,0 +1,13 @@ +ifeq ($(BOARD_USES_MTK_HARDWARE),true) + mtk_flags := -DMTK_HARDWARE + + TARGET_GLOBAL_CFLAGS += $(mtk_flags) + TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + + 2ND_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + 2ND_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) +endif From fdba01535445dd0056ba7fbd4f49571095dd926a Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Wed, 13 Apr 2016 17:49:36 -0700 Subject: [PATCH 255/502] build: Add BOOTIMAGE_EXTRA_DEPS for BOOT_SIGNER products too * Products supporting BOOT_SIGNER should depend on BOOTIMAGE_EXTRA_DEPS as well, since that dt.img generation is tied to that rule. Change-Id: I7c3040d0c59c66aaac46121d6ca50ab96bdf7e72 --- core/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 8d3d6d98017..ac0c9254364 100644 --- a/core/Makefile +++ b/core/Makefile @@ -575,7 +575,7 @@ ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true) $(error TARGET_BOOTIMAGE_USE_EXT2 is not supported anymore) else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) # TARGET_BOOTIMAGE_USE_EXT2 != true -$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) +$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER) $(BOOTIMAGE_EXTRA_DEPS) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ From 0e489ef28d3b39531fe68df4c1cad0fb1fa86958 Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Fri, 15 Apr 2016 23:03:14 -0700 Subject: [PATCH 256/502] build: skip 'ro.product.device' using new macro "TARGET_SKIP_PRODUCT_DEVICE" Change-Id: Id17ef7de8b0146dd6e4b2cc3cc5b88453da38f6c Ticket: FEIJ-62 --- core/Makefile | 1 + core/product.mk | 1 + tools/buildinfo.sh | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index ac0c9254364..9dfd40d580a 100644 --- a/core/Makefile +++ b/core/Makefile @@ -278,6 +278,7 @@ endif TARGET_AAPT_CHARACTERISTICS="$(TARGET_AAPT_CHARACTERISTICS)" \ TARGET_UNIFIED_DEVICE="$(TARGET_UNIFIED_DEVICE)" \ TARGET_SKIP_DEFAULT_LOCALE="$(TARGET_SKIP_DEFAULT_LOCALE)" \ + TARGET_SKIP_PRODUCT_DEVICE="$(TARGET_SKIP_PRODUCT_DEVICE)" \ $(PRODUCT_BUILD_PROP_OVERRIDES) \ bash $(BUILDINFO_SH) >> $@ $(hide) $(foreach file,$(system_prop_file), \ diff --git a/core/product.mk b/core/product.mk index 078066e3287..1a0fe3125df 100644 --- a/core/product.mk +++ b/core/product.mk @@ -296,6 +296,7 @@ _product_stash_var_list += \ _product_stash_var_list += \ TARGET_SKIP_DEFAULT_LOCALE \ + TARGET_SKIP_PRODUCT_DEVICE \ # # Stash values of the variables in _product_stash_var_list. diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index b169c3d84eb..bb85e7a0803 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -52,7 +52,9 @@ echo "ro.board.platform=$TARGET_BOARD_PLATFORM" if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then echo "# ro.build.product is obsolete; use ro.product.device" echo "ro.build.product=$TARGET_DEVICE" - echo "ro.product.model=$PRODUCT_MODEL" + if [ -z "$TARGET_SKIP_PRODUCT_DEVICE" ] ; then + echo "ro.product.model=$PRODUCT_MODEL" + fi echo "ro.product.device=$TARGET_DEVICE" echo "# Do not try to parse description, fingerprint, or thumbprint" echo "ro.build.description=$PRIVATE_BUILD_DESC" From cffa9933696a1c0fafe3e09633d2dda78913bc34 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Fri, 29 Apr 2016 17:55:51 +0200 Subject: [PATCH 257/502] build: allow to set a consumer proguard file This allow to specify a proguard file by defining LOCAL_CONSUMER_PROGUARD_FILE that will inserted in the root directory of the aar and to be consumed by another apk via gradle plugin Change-Id: Ia3c11e5ea8e694800fb262b835432f86a6777f86 Signed-off-by: Jorge Ruesga --- core/static_java_library.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 9a2cd6e719f..655c61daacd 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -180,6 +180,7 @@ $(built_aar): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) $(built_aar): PRIVATE_CLASSES_JAR := $(full_classes_jar) $(built_aar): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) $(built_aar): PRIVATE_R_TXT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.txt +$(built_aar): PRIVATE_CONSUMER_PROGUARD_FILE := $(LOCAL_CONSUMER_PROGUARD_FILE) $(built_aar) : $(full_classes_jar) $(full_android_manifest) @echo "target AAR: $(PRIVATE_MODULE) ($@)" $(hide) rm -rf $(dir $@)aar && mkdir -p $(dir $@)aar/res @@ -188,6 +189,9 @@ $(built_aar) : $(full_classes_jar) $(full_android_manifest) # Note: Use "cp -n" to honor the resource overlay rules, if multiple res dirs exist. $(hide) $(foreach res,$(PRIVATE_RESOURCE_DIR),cp -Rfn $(res)/* $(dir $@)aar/res;) $(hide) cp $(PRIVATE_R_TXT) $(dir $@)aar/R.txt +ifneq ($(PRIVATE_CONSUMER_PROGUARD_FILE),) + $(hide) cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt +endif $(hide) jar -cMf $@ \ -C $(dir $@)aar . From b023438d0bbd6a371aa7766a2f287a76e7e5ea97 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Mon, 2 May 2016 15:22:30 -0700 Subject: [PATCH 258/502] build: Make sure to check for variable definition during execution. TICKET: RM-232 Change-Id: Ic5b3850a81b959b05a218cd967dcec71c15a4cd5 --- core/static_java_library.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 655c61daacd..22e6958c67f 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -189,9 +189,9 @@ $(built_aar) : $(full_classes_jar) $(full_android_manifest) # Note: Use "cp -n" to honor the resource overlay rules, if multiple res dirs exist. $(hide) $(foreach res,$(PRIVATE_RESOURCE_DIR),cp -Rfn $(res)/* $(dir $@)aar/res;) $(hide) cp $(PRIVATE_R_TXT) $(dir $@)aar/R.txt -ifneq ($(PRIVATE_CONSUMER_PROGUARD_FILE),) - $(hide) cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt -endif + $(hide) if [ ! -z "$(PRIVATE_CONSUMER_PROGUARD_FILE)" ]; then \ + echo "Including '$(PRIVATE_CONSUMER_PROGUARD_FILE)'"; \ + $(hide) cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt; fi $(hide) jar -cMf $@ \ -C $(dir $@)aar . From 9cbbef4920c5be22695c774f6fb2113bdcc92d9b Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Mon, 2 May 2016 15:53:56 -0700 Subject: [PATCH 259/502] build: Fix manual invocation of aar targets. Change-Id: Ic5a4980d1d45df24f6242e31fdfd86543f56e19c TICKET: RM-232 --- core/static_java_library.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 22e6958c67f..e2bf43afaa9 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -190,8 +190,8 @@ $(built_aar) : $(full_classes_jar) $(full_android_manifest) $(hide) $(foreach res,$(PRIVATE_RESOURCE_DIR),cp -Rfn $(res)/* $(dir $@)aar/res;) $(hide) cp $(PRIVATE_R_TXT) $(dir $@)aar/R.txt $(hide) if [ ! -z "$(PRIVATE_CONSUMER_PROGUARD_FILE)" ]; then \ - echo "Including '$(PRIVATE_CONSUMER_PROGUARD_FILE)'"; \ - $(hide) cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt; fi + echo "Including '$(PRIVATE_CONSUMER_PROGUARD_FILE)'"; \ + cp $(PRIVATE_CONSUMER_PROGUARD_FILE) $(dir $@)aar/proguard.txt; fi $(hide) jar -cMf $@ \ -C $(dir $@)aar . From 32661e1dcac81a8615ed9b2ff20143a2e4312eae Mon Sep 17 00:00:00 2001 From: luca020400 Date: Thu, 5 May 2016 21:53:40 +0200 Subject: [PATCH 260/502] envsetup: Fix aosp & caf remote Fixes: sed: -e expression #1, char 9: unknown option to `s' * Return if .git directory is missing and move it on the top * Update cmremote strings ( match caf/aosp remote ) Change-Id: Ifb606a20f308e7317e9ce519d682a3fdb8bfe9bf --- envsetup.sh | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 6bb5587138f..4e30133808f 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1765,13 +1765,13 @@ function godir () { function cmremote() { - git remote rm cmremote 2> /dev/null - GERRIT_REMOTE=$(git config --get remote.github.projectname) - if [ -z "$GERRIT_REMOTE" ] + if ! git rev-parse --git-dir &> /dev/null then - echo Unable to set up the git remote, are you under a git repo? - return 0 + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 fi + git remote rm cmremote 2> /dev/null + GERRIT_REMOTE=$(git config --get remote.github.projectname) CMUSER=$(git config --get review.review.cyanogenmod.org.username) if [ -z "$CMUSER" ] then @@ -1779,17 +1779,18 @@ function cmremote() else git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE fi - echo You can now push to "cmremote". + echo "Remote 'cmremote' created" } function aospremote() { - git remote rm aosp 2> /dev/null - if [ ! -d .git ] + if ! git rev-parse --git-dir &> /dev/null then - echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 fi - PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` + git remote rm aosp 2> /dev/null + PROJECT=${$(pwd -P)#$ANDROID_BUILD_TOP/} if (echo $PROJECT | grep -qv "^device") then PFX="platform/" @@ -1800,12 +1801,13 @@ function aospremote() function cafremote() { - git remote rm caf 2> /dev/null - if [ ! -d .git ] + if ! git rev-parse --git-dir &> /dev/null then - echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up. + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 fi - PROJECT=`pwd -P | sed s#$ANDROID_BUILD_TOP/##g` + git remote rm caf 2> /dev/null + PROJECT=${$(pwd -P)#$ANDROID_BUILD_TOP/} if (echo $PROJECT | grep -qv "^device") then PFX="platform/" From 29d60edf7f2890a381fe5edf46422d9898aeed8b Mon Sep 17 00:00:00 2001 From: Alistair Strachan Date: Thu, 5 May 2016 16:29:08 -0700 Subject: [PATCH 261/502] Avoid accidentally using the host's native 'as' command. When invoking clang for the host to assemble .S files, the -B flag would not be provided, which allowed the host prebuilt clang to use an 'as' from the native environment. Most of the time this "just works", but some newer 'as' versions cause problems with the older prebuilt toolchain, for example by generating unsupported relocation types. To avoid this problem, simply use the -B flag to tell clang to invoke the assembler from the correct prebuilt gcc prefix. Change-Id: I18ea4f37ae637b652cfd7321c41929f8be075342 Signed-off-by: Alistair Strachan --- core/clang/HOST_x86_common.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/clang/HOST_x86_common.mk b/core/clang/HOST_x86_common.mk index 9e71750c142..690c0f6b389 100644 --- a/core/clang/HOST_x86_common.mk +++ b/core/clang/HOST_x86_common.mk @@ -13,7 +13,8 @@ endif ifeq ($(HOST_OS),linux) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ - --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot + --sysroot $($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) From 70a4b429bec4c09418e55ff47ec6406ce0273b94 Mon Sep 17 00:00:00 2001 From: "Brint E. Kriebel" Date: Mon, 16 May 2016 18:53:19 -0700 Subject: [PATCH 262/502] ereleasetools: Allow for custom boot image signing tools Some boot images will need to be signed using specific tools. Allow passing the path to this tool through an environment variable. Change-Id: I958726fdae8d63fe99d639dfa361046b528a087c Ticket: CYNGNOS-2868 --- tools/releasetools/common.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index f97429e0087..24b6b291c1f 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -448,6 +448,7 @@ def make_ramdisk(): img = tempfile.NamedTemporaryFile() bootimg_key = os.getenv("PRODUCT_PRIVATE_KEY", None) + custom_boot_signer = os.getenv("PRODUCT_BOOT_SIGNER", None) if has_ramdisk: ramdisk_img = make_ramdisk() @@ -531,8 +532,16 @@ def make_ramdisk(): assert p.returncode == 0, "mkbootimg of %s image failed" % ( os.path.basename(sourcedir),) - if bootimg_key and os.path.exists(bootimg_key) and kernel_pagesize > 0: - print "Signing bootable image..." + if custom_boot_signer and bootimg_key and os.path.exists(bootimg_key): + print("Signing bootable image with custom boot signer...") + img_secure = tempfile.NamedTemporaryFile() + p = Run([custom_boot_signer, img.name, img_secure.name], stdout=subprocess.PIPE) + p.communicate() + assert p.returncode == 0, "signing of bootable image failed" + shutil.copyfile(img_secure.name, img.name) + img_secure.close() + elif bootimg_key and os.path.exists(bootimg_key) and kernel_pagesize > 0: + print("Signing bootable image...") bootimg_key_passwords = {} bootimg_key_passwords.update(PasswordManager().GetPasswords(bootimg_key.split())) bootimg_key_password = bootimg_key_passwords[bootimg_key] @@ -1813,4 +1822,4 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, print("putting script in", sh_location) - output_sink(sh_location, sh) \ No newline at end of file + output_sink(sh_location, sh) From 27714adf21bf9ad80bd55585eb419783bc56927a Mon Sep 17 00:00:00 2001 From: luca020400 Date: Thu, 19 May 2016 21:02:51 +0200 Subject: [PATCH 263/502] build: Fix caf and aospremote Change-Id: I8ad28d71254941c0aacb91b1c6c702f9f13caf5f --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 4e30133808f..5bd4dfcfca4 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1790,7 +1790,7 @@ function aospremote() return 1 fi git remote rm aosp 2> /dev/null - PROJECT=${$(pwd -P)#$ANDROID_BUILD_TOP/} + PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") if (echo $PROJECT | grep -qv "^device") then PFX="platform/" @@ -1807,7 +1807,7 @@ function cafremote() return 1 fi git remote rm caf 2> /dev/null - PROJECT=${$(pwd -P)#$ANDROID_BUILD_TOP/} + PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") if (echo $PROJECT | grep -qv "^device") then PFX="platform/" From 3cf3fc68b9ad64a9e8172537ec7af1fb3aba32bf Mon Sep 17 00:00:00 2001 From: Scott Mertz Date: Wed, 1 Jun 2016 13:40:25 -0700 Subject: [PATCH 264/502] build: add kernel header dependency if module uses kernel headers Many of the QCOM components use kernel headers, but don't declare the dependency on them. This is fine in CAF because of the way they build the boot.img before anything else. In CM, we don't build the boot.img the same, so we run into a race between the kernel build & these modules... and the modules lose. Warn about modules that have this missing dependency, and add it for them so we don't have to modify each Android.mk. Change-Id: I95f1e47b5ef440f6f5d8f64a0c3f38d9572e839e --- core/binary.mk | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/binary.mk b/core/binary.mk index c020ce3aab9..d3986ac60ac 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -30,6 +30,15 @@ else endif endif +# Many qcom modules don't correctly set a dependency on the kernel headers. Fix it for them, +# but warn the user. +ifneq (,$(findstring $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include,$(LOCAL_C_INCLUDES))) + ifeq (,$(findstring $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr,$(LOCAL_ADDITIONAL_DEPENDENCIES))) + $(warning $(LOCAL_MODULE) uses kernel headers, but does not depend on them!) + LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr + endif +endif + # The following LOCAL_ variables will be modified in this file. # Because the same LOCAL_ variables may be used to define modules for both 1st arch and 2nd arch, # we can't modify them in place. From 75cbf2cbbf258e7d6e73183051e11742c6e91d28 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Wed, 15 Jun 2016 22:35:15 +0100 Subject: [PATCH 265/502] Conditionally skip dex-preopting specific prebuilts. Extend change I13f10e2a9c251366f29606158f8c2fb54f8ee8b so that it optionally applies to a specific list of modules. Change-Id: Id56aeadfb8d2581a2c7b7045725419bf4f6b8faa --- core/prebuilt_internal.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 1af1c779a6d..a62a15d5990 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -215,6 +215,11 @@ LOCAL_DEX_PREOPT := false endif endif +# Disable dex-preopt of specific prebuilts to save space, if requested. +ifneq ($(filter $(DEXPREOPT_BLACKLIST),$(LOCAL_MODULE)),) +LOCAL_DEX_PREOPT := false +endif + ####################################### # defines built_odex along with rule to install odex include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk From d6aca19ca31bd6c26b8e42f05b7496daf764f518 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 4 Jul 2016 16:34:19 +0100 Subject: [PATCH 266/502] build: Let the verity signer and metadata builders ask for a password Don't grab stdin/out for these tools. We want to know when a password is being requested (and be able to actually provide one) if the corresponding key needs it Change-Id: I8dd439322b7d8942adc9ce7ce0912fb20c69654f Ref: CYNGNOS-3156 --- tools/releasetools/build_image.py | 10 +++++++--- tools/releasetools/common.py | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index ac8649010b9..40336f68fae 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -176,10 +176,14 @@ def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt, cmd = cmd_template % (image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key) print(cmd) - status, output = getstatusoutput(cmd) - if status: - print("Could not build verity metadata! Error: %s" % output) + runcmd = ["system/extras/verity/build_verity_metadata.py", image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key]; + sp = subprocess.Popen(runcmd) + sp.wait() + + if sp.returncode != 0: + print("Could not build verity metadata!") return False + return True def Append2Simg(sparse_image_path, unsparse_image_path, error_message): diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 24b6b291c1f..c4d237328e5 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -584,7 +584,7 @@ def make_ramdisk(): cmd.extend([path, img.name, info_dict["verity_key"] + ".pk8", info_dict["verity_key"] + ".x509.pem", img.name]) - p = Run(cmd, stdout=subprocess.PIPE) + p = Run(cmd) p.communicate() assert p.returncode == 0, "boot_signer of %s image failed" % path From f116e964e9cdd21ab5021c984ada7560af1e1c25 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Mon, 11 Jul 2016 11:17:56 +0100 Subject: [PATCH 267/502] build: Use the password manager for the verity key if possible If we're operating with a password dict, try to use it for verity Change-Id: Ie0e8e33c873fc9f1ae9bd6da559f9cbbced183e9 Ref: CYNGNOS-3156 --- tools/releasetools/build_image.py | 15 ++++++++++++++- tools/releasetools/common.py | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 40336f68fae..3680783ee4f 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -171,13 +171,26 @@ def BuildVerityTree(sparse_image_path, verity_image_path, prop_dict): def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key): + verity_key = os.getenv("PRODUCT_VERITY_KEY", None) + verity_key_password = None + + if verity_key and os.path.exists(verity_key+".pk8"): + verity_key_passwords = {} + verity_key_passwords.update(common.PasswordManager().GetPasswords(verity_key.split())) + verity_key_password = verity_key_passwords[verity_key] + cmd_template = ( "system/extras/verity/build_verity_metadata.py %s %s %s %s %s %s %s") cmd = cmd_template % (image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key) print(cmd) runcmd = ["system/extras/verity/build_verity_metadata.py", image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key]; - sp = subprocess.Popen(runcmd) + if verity_key_password is not None: + sp = subprocess.Popen(runcmd, stdin=subprocess.PIPE) + sp.communicate(verity_key_password) + else: + sp = subprocess.Popen(runcmd) + sp.wait() if sp.returncode != 0: diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index c4d237328e5..9ccb529ddca 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -448,6 +448,7 @@ def make_ramdisk(): img = tempfile.NamedTemporaryFile() bootimg_key = os.getenv("PRODUCT_PRIVATE_KEY", None) + verity_key = os.getenv("PRODUCT_VERITY_KEY", None) custom_boot_signer = os.getenv("PRODUCT_BOOT_SIGNER", None) if has_ramdisk: @@ -584,8 +585,21 @@ def make_ramdisk(): cmd.extend([path, img.name, info_dict["verity_key"] + ".pk8", info_dict["verity_key"] + ".x509.pem", img.name]) - p = Run(cmd) - p.communicate() + verity_key_password = None + + if verity_key and os.path.exists(verity_key+".pk8") and kernel_pagesize > 0: + verity_key_passwords = {} + verity_key_passwords.update(PasswordManager().GetPasswords(verity_key.split())) + verity_key_password = verity_key_passwords[verity_key] + + if verity_key_password is not None: + verity_key_password += "\n" + p = Run(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + p.communicate(verity_key_password) + else: + p = Run(cmd) + p.communicate() + assert p.returncode == 0, "boot_signer of %s image failed" % path # Sign the image if vboot is non-empty. From cc6758da1275e8739bc55e5ffc0885a87d67e1c8 Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 7 Aug 2016 23:07:32 -0700 Subject: [PATCH 268/502] build: Source a CM-specific global BoardConfig * Read vendor/cm/config/BoardConfigCM.mk. Kind of surprised we haven't needed this until now. Change-Id: I91cd89b14f6a5975e91f15dcfce1070502aa3861 --- core/config.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/core/config.mk b/core/config.mk index 961c0b0d8a5..5a0a1876202 100644 --- a/core/config.mk +++ b/core/config.mk @@ -189,6 +189,7 @@ FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .r $(call project-set-path-variant,recovery,RECOVERY_VARIANT,bootable/recovery) -include vendor/extra/BoardConfigExtra.mk +-include vendor/cm/config/BoardConfigCM.mk # The build system exposes several variables for where to find the kernel # headers: From aa9e2de9717a310f8d0b031cd45ffaf059812193 Mon Sep 17 00:00:00 2001 From: Elektroschmock Date: Wed, 17 Aug 2016 20:30:50 +0200 Subject: [PATCH 269/502] core_minimal.mk: Remove duplicate packages Change-Id: Iaf7833334985450576ffb0a8d1b1babf39fcb63a --- target/product/core_minimal.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 99b2dce13c5..e6b42965788 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -109,10 +109,8 @@ PRODUCT_SYSTEM_SERVER_JARS := \ ethernet-service \ wifi-service -# Adoptable external storage supports both ext4 and f2fs +# Adoptable external storage f2fs support PRODUCT_PACKAGES += \ - e2fsck \ - make_ext4fs \ fsck.f2fs \ make_f2fs \ From 0e973a9662df63c1e5811fb70014096640b07112 Mon Sep 17 00:00:00 2001 From: hamaji Date: Wed, 24 Aug 2016 11:36:27 -0400 Subject: [PATCH 270/502] build: Remove --detect_android_echo to properly issue echo commands --- core/ninja.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ninja.mk b/core/ninja.mk index 9d0ff9a70b2..fc0cb30f1b4 100644 --- a/core/ninja.mk +++ b/core/ninja.mk @@ -161,7 +161,7 @@ ifeq ($(KATI_EMULATE_FIND),false) endif $(KATI_BUILD_NINJA): $(KATI) $(MAKEPARALLEL) $(DUMMY_OUT_MKS) $(SOONG_ANDROID_MK) FORCE @echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja... - +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P --detect_android_echo $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) + +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) ifneq ($(USE_SOONG_FOR_KATI),true) KATI_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) From d0ab84532c5fad7db7f3fccbd7b23aec747a4a01 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 24 Aug 2016 19:49:01 +0300 Subject: [PATCH 271/502] core: Fix boot/recoveryimage colors --- core/Makefile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/Makefile b/core/Makefile index 9dfd40d580a..790af8d5731 100644 --- a/core/Makefile +++ b/core/Makefile @@ -589,6 +589,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} else ifndef BOARD_CUSTOM_BOOTIMG_MK @@ -599,6 +600,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_ $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) @@ -606,6 +608,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} else # PRODUCT_SUPPORTS_VBOOT != true @@ -620,7 +623,7 @@ bootimage-nodeps: $(MKBOOTIMG) @echo "make $@: ignoring dependencies" $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_INS}"Made boot image: $@"${CL_RST} + @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} endif # PRODUCT_SUPPORTS_VBOOT endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK @@ -1040,9 +1043,9 @@ define build-recoveryramdisk @echo -e ${CL_CYN}"----- Making recovery ramdisk ------"${CL_RST} $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp - @echo Copying baseline ramdisk... + @echo -e ${CL_CYN}"Copying baseline ramdisk..."${CL_RST} $(hide) rsync -a --exclude=etc --exclude=sdcard $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. - @echo Modifying ramdisk contents... + @echo -e ${CL_CYN}"Modifying ramdisk contents..."${CL_RST} $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/ $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/sepolicy From 593a72d49246faec92b3922b39dc4bf57c999516 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Tue, 23 Aug 2016 15:58:56 -0400 Subject: [PATCH 272/502] Add workaround for iTerm2 integration on macOS --- envsetup.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 5bd4dfcfca4..9405bef2625 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -62,7 +62,7 @@ function build_build_var_cache() cached_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '` cached_abs_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '` # Call the build system to dump the "=" pairs as a shell script. - build_dicts_script=`\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + build_dicts_script=`\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk \ dump-many-vars \ DUMP_MANY_VARS="$cached_vars" \ @@ -115,7 +115,7 @@ function get_abs_build_var() echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi - (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + (\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk dumpvar-abs-$1) } @@ -133,7 +133,7 @@ function get_build_var() echo "Couldn't locate the top of the tree. Try setting TOP." >&2 return fi - (\cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \ + (\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk dumpvar-$1) } From 90bbc2a847640293ffd68df435f3465bef6f1d8f Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 7 Dec 2015 01:21:59 +0200 Subject: [PATCH 273/502] core_minimal: Change make_f2fs to mkfs.f2fs Change-Id: Ic95ea804a4dffb3af5ea5ba7e495bb5175281a78 --- target/product/core_minimal.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index e6b42965788..540377438e5 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -112,7 +112,7 @@ PRODUCT_SYSTEM_SERVER_JARS := \ # Adoptable external storage f2fs support PRODUCT_PACKAGES += \ fsck.f2fs \ - make_f2fs \ + mkfs.f2fs \ PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ ro.zygote=zygote32 From c7d6cc2a9cda88c8b110f69d8e121a732d570aa7 Mon Sep 17 00:00:00 2001 From: Rashed Abdel-Tawab Date: Wed, 24 Aug 2016 15:22:56 -0400 Subject: [PATCH 274/502] build: Add build flag to disable CMSDK usage Change-Id: Ib4d966b1bcc5cf1578a28c0fcd3f9077c14af573 --- core/Makefile | 2 +- core/package_internal.mk | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 790af8d5731..aff111e913e 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1272,7 +1272,7 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) -ifndef I_WANT_A_QUAIL_STAR +ifneq ($(TARGET_DISABLE_CMSDK), true) $(BUILT_SYSTEMIMAGE): checkapi $(BUILT_SYSTEMIMAGE): checkapi-cm endif diff --git a/core/package_internal.mk b/core/package_internal.mk index fb7c6e083ae..5940d6372eb 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -437,11 +437,13 @@ else # LOCAL_SDK_RES_VERSION framework_res_package_export := \ $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk +ifneq ($(TARGET_DISABLE_CMSDK), true) # Avoid possible circular dependency with our platform-res ifneq ($(LOCAL_IGNORE_SUBDIR), true) cm_plat_res_package_export := \ $(call intermediates-dir-for,APPS,org.cyanogenmod.platform-res,,COMMON)/package-export.apk endif # LOCAL_IGNORE_SUBDIR +endif # We can't depend directly on the export.apk file; it won't get its # PRIVATE_ vars set up correctly if we do. Instead, depend on the @@ -449,10 +451,12 @@ endif # LOCAL_IGNORE_SUBDIR framework_res_package_export_deps := \ $(dir $(framework_res_package_export))src/R.stamp +ifneq ($(TARGET_DISABLE_CMSDK), true) ifneq ($(LOCAL_IGNORE_SUBDIR), true) cm_plat_res_package_export_deps := \ $(dir $(cm_plat_res_package_export))src/R.stamp endif # LOCAL_IGNORE_SUBDIR +endif endif # LOCAL_SDK_RES_VERSION all_library_res_package_exports := \ @@ -465,12 +469,14 @@ all_library_res_package_export_deps := \ $(foreach lib,$(LOCAL_RES_LIBRARIES),\ $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp) +ifneq ($(TARGET_DISABLE_CMSDK), true) ifneq ($(LOCAL_IGNORE_SUBDIR), true) all_library_res_package_exports += \ $(cm_plat_res_package_export) all_library_res_package_export_deps += \ $(cm_plat_res_package_export_deps) endif # LOCAL_IGNORE_SUBDIR +endif $(resource_export_package) $(R_file_stamp) $(LOCAL_BUILT_MODULE): $(all_library_res_package_export_deps) $(LOCAL_INTERMEDIATE_TARGETS): \ From 01b8436e5a8e7fe77d6942b466cefb1b5764f7ce Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Thu, 25 Aug 2016 17:55:07 +0200 Subject: [PATCH 275/502] build: Fix py2 support Change-Id: I200730c58ee89fd4151f8e013d53023e098d8ce4 --- tools/normalize_path.py | 5 +++-- tools/releasetools/add_img_to_target_files.py | 2 +- tools/releasetools/build_image.py | 10 +++++----- tools/releasetools/common.py | 8 ++++---- tools/releasetools/ota_from_target_files.py | 12 ++++++------ 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/tools/normalize_path.py b/tools/normalize_path.py index 6c4d5486dc7..4c7b1294612 100755 --- a/tools/normalize_path.py +++ b/tools/normalize_path.py @@ -16,14 +16,15 @@ """ Normalize and output paths from arguments, or stdin if no arguments provided. """ +from __future__ import print_function import os.path import sys if len(sys.argv) > 1: for p in sys.argv[1:]: - print os.path.normpath(p) + print(os.path.normpath(p)) sys.exit(0) for line in sys.stdin: - print os.path.normpath(line.strip()) + print(os.path.normpath(line.strip())) diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py index 48de81a0c7a..6e5c9d6c804 100755 --- a/tools/releasetools/add_img_to_target_files.py +++ b/tools/releasetools/add_img_to_target_files.py @@ -107,7 +107,7 @@ def AddOem(output_zip, prefix="IMAGES/"): prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "oem.img") if os.path.exists(prebuilt_path): - print "oem.img already exists in %s, no need to rebuild..." % (prefix,) + print("oem.img already exists in %s, no need to rebuild..." % (prefix,)) return block_list = common.MakeTempFile(prefix="oem-blocklist-", suffix=".map") diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 3680783ee4f..96dc1431fa1 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -61,7 +61,7 @@ def GetVerityFECSize(partition_size): cmd = "fec -s %d" % partition_size status, output = commands.getstatusoutput(cmd) if status: - print output + print(output) return False, 0 return True, int(output) @@ -149,10 +149,10 @@ def AdjustPartitionSizeForVerity(partition_size, fec_supported): def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path): cmd = "fec -e %s %s %s" % (sparse_image_path, verity_path, verity_fec_path) - print cmd + print(cmd) status, output = commands.getstatusoutput(cmd) if status: - print "Could not build FEC data! Error: %s" % output + print("Could not build FEC data! Error: %s" % output) return False return True @@ -219,10 +219,10 @@ def Append2Simg(sparse_image_path, unsparse_image_path, error_message): def Append(target, file_to_append, error_message): cmd = 'cat %s >> %s' % (file_to_append, target) - print cmd + print(cmd) status, output = commands.getstatusoutput(cmd) if status: - print "%s: %s" % (error_message, output) + print("%s: %s" % (error_message, output)) return False return True diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 9ccb529ddca..a1ac10b7c41 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -229,8 +229,8 @@ def read_helper(fn): if os.path.exists(system_base_fs_file): d["system_base_fs_file"] = system_base_fs_file else: - print "Warning: failed to find system base fs file: %s" % ( - system_base_fs_file,) + print("Warning: failed to find system base fs file: %s" % ( + system_base_fs_file,)) del d["system_base_fs_file"] if "vendor_base_fs_file" in d: @@ -239,8 +239,8 @@ def read_helper(fn): if os.path.exists(vendor_base_fs_file): d["vendor_base_fs_file"] = vendor_base_fs_file else: - print "Warning: failed to find vendor base fs file: %s" % ( - vendor_base_fs_file,) + print("Warning: failed to find vendor base fs file: %s" % ( + vendor_base_fs_file,)) del d["vendor_base_fs_file"] diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 8ebed9860bb..d1bd71eea00 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -2063,11 +2063,11 @@ def option_handler(o, a): common.ZipClose(source_zip) if OPTIONS.verbose: - print "--- target info ---" + print("--- target info ---") common.DumpInfoDict(OPTIONS.info_dict) if OPTIONS.incremental_source is not None: - print "--- source info ---" + print("--- source info ---") common.DumpInfoDict(OPTIONS.source_info_dict) WriteABOTAPackageWithBrilloScript( @@ -2075,7 +2075,7 @@ def option_handler(o, a): output_file=args[1], source_file=OPTIONS.incremental_source) - print "done." + print("done.") return if OPTIONS.extra_script is not None: @@ -2134,7 +2134,7 @@ def option_handler(o, a): # Non A/B OTAs rely on /cache partition to store temporary files. cache_size = OPTIONS.info_dict.get("cache_size", None) if cache_size is None: - print "--- can't determine the cache partition size ---" + print("--- can't determine the cache partition size ---") OPTIONS.cache_size = cache_size # Generate a verify package. @@ -2148,14 +2148,14 @@ def option_handler(o, a): # Generate an incremental OTA. It will fall back to generate a full OTA on # failure unless no_fallback_to_full is specified. else: - print "unzipping source target-files..." + print("unzipping source target-files...") OPTIONS.source_tmp, source_zip = common.UnzipTemp( OPTIONS.incremental_source) OPTIONS.target_info_dict = OPTIONS.info_dict OPTIONS.source_info_dict = common.LoadInfoDict(source_zip, OPTIONS.source_tmp) if OPTIONS.verbose: - print "--- source info ---" + print("--- source info ---") common.DumpInfoDict(OPTIONS.source_info_dict) try: WriteIncrementalOTAPackage(input_zip, source_zip, output_zip) From 1828aa03f44498013b1de21cb0ea29221e5406cb Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Thu, 25 Aug 2016 21:54:58 +0530 Subject: [PATCH 276/502] releasetools: Fix mismerge Change-Id: I11a48fb637b8b155c02c65500773aceb5d4bb376 --- tools/releasetools/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index a1ac10b7c41..413166f2fe3 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -279,7 +279,7 @@ def makeint(key): d["fstab"] = None else: d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], - d.get("system_root_image", d["device_type"], False)) + d.get("system_root_image", False), d["device_type"]) d["build.prop"] = LoadBuildProp(read_helper) return d @@ -302,7 +302,7 @@ def LoadDictionaryFromLines(lines): d[name] = value return d -def LoadRecoveryFSTab(read_helper, fstab_version, type, system_root_image=False): +def LoadRecoveryFSTab(read_helper, fstab_version, system_root_image=False, type): class Partition(object): def __init__(self, mount_point, fs_type, device, length, device2, context): self.mount_point = mount_point From 78302d476dffe60c9d5639013a48359d3f8bdd50 Mon Sep 17 00:00:00 2001 From: luca020400 Date: Mon, 9 May 2016 15:16:19 +0200 Subject: [PATCH 277/502] ninja: build: dt: Move to in-build directory search * We can't depend on a $OUT variable with ninja Change-Id: I9ff050a986e7bb2774d1326f5b396d0afb7f33c1 --- core/tasks/dt_image.mk | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk index 60d45cc918b..7d6264fb96b 100644 --- a/core/tasks/dt_image.mk +++ b/core/tasks/dt_image.mk @@ -25,11 +25,16 @@ else # Most specific paths must come first in possible_dtb_dirs possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ endif -dtb_dir = $(firstword $(wildcard $(possible_dtb_dirs))) define build-dtimage-target $(call pretty,"Target dt image: $@") - $(hide) $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ $(dtb_dir) + $(hide) for dir in $(possible_dtb_dirs); do \ + if [ -d "$$dir" ]; then \ + dtb_dir="$$dir"; \ + break; \ + fi; \ + done; \ + $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ "$$dtb_dir"; $(hide) chmod a+r $@ endef From 54154d050f944d41beed66743c971ca332d2e7a2 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Thu, 25 Aug 2016 20:24:33 +0200 Subject: [PATCH 278/502] releasetools: Fix LoadRecoveryFSTab args order Change-Id: If6f054f30cd76c48415e15cd06ef7433760bb76e --- tools/releasetools/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 413166f2fe3..6ab41620780 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -279,7 +279,7 @@ def makeint(key): d["fstab"] = None else: d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], - d.get("system_root_image", False), d["device_type"]) + d["device_type"], d.get("system_root_image", False)) d["build.prop"] = LoadBuildProp(read_helper) return d @@ -302,7 +302,7 @@ def LoadDictionaryFromLines(lines): d[name] = value return d -def LoadRecoveryFSTab(read_helper, fstab_version, system_root_image=False, type): +def LoadRecoveryFSTab(read_helper, fstab_version, type, system_root_image=False): class Partition(object): def __init__(self, mount_point, fs_type, device, length, device2, context): self.mount_point = mount_point From 64cca8cd43027d9303d6664d57784c8a7e76994f Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Wed, 24 Aug 2016 20:52:03 -0400 Subject: [PATCH 279/502] kernel: Fix libelf location on nougat Change-Id: I34199aba9f6ec38d918c082def3298a3fa5c60f5 Signed-off-by: Brandon McAnsh --- core/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index eedf6ca194b..471a34ab4f7 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -251,7 +251,7 @@ define clean-module-folder endef ifeq ($(HOST_OS),darwin) - MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/src/libelf/ + MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf/ endif ifeq ($(TARGET_KERNEL_MODULES),) From 8e9e1178862fd2f1b4556844b7d2a835d8f72ed1 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Thu, 25 Aug 2016 09:39:27 -0500 Subject: [PATCH 280/502] repopick: try to use remote's default revision * If the project doesn't have a revision specified, try to see if it's remote has one specified before falling back to the global default. Change-Id: I05129413b154e5d08d0fa9ef0ce853631b7e1562 --- tools/repopick.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/repopick.py b/tools/repopick.py index a53c04329b9..2b0aab417cd 100755 --- a/tools/repopick.py +++ b/tools/repopick.py @@ -209,6 +209,7 @@ def fetch_query(remote_url, query): manifest = subprocess.check_output(['repo', 'manifest']) xml_root = ElementTree.fromstring(manifest) projects = xml_root.findall('project') + remotes = xml_root.findall('remote') default_revision = xml_root.findall('default')[0].get('revision').split('/')[-1] #dump project data into the a list of dicts with the following data: @@ -219,7 +220,11 @@ def fetch_query(remote_url, query): path = project.get('path') revision = project.get('revision') if revision is None: - revision = default_revision + for remote in remotes: + if remote.get('name') == project.get('remote'): + revision = remote.get('revision') + if revision is None: + revision = default_revision if not name in project_name_to_data: project_name_to_data[name] = {} From 4e2687c7f89132f65f4366baa27543b61873578c Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Wed, 24 Aug 2016 18:23:03 -0400 Subject: [PATCH 281/502] qcom: Properly select media hal root AOSP split the media hal into msm8974 and msm8996, better to just add target named symlinks in the media hal than ifdefs here for the sake of cleanliness Change-Id: I87f06b9c1b8939a8a8868ff35fcf6e8f5ec48b51 --- core/qcom_target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/qcom_target.mk b/core/qcom_target.mk index a7af574b63d..03279825494 100644 --- a/core/qcom_target.mk +++ b/core/qcom_target.mk @@ -118,7 +118,7 @@ else $(call project-set-path,qcom-audio,hardware/qcom/audio/default) $(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) -$(call project-set-path,qcom-media,hardware/qcom/media/default) +$(call project-set-path,qcom-media,hardware/qcom/media/$(TARGET_BOARD_PLATFORM)) $(call project-set-path,qcom-camera,hardware/qcom/camera) $(call project-set-path,qcom-gps,hardware/qcom/gps) From 867294ec07fb35fbd18357becfd5f22ef04e48ae Mon Sep 17 00:00:00 2001 From: "Christopher N. Hesse" Date: Wed, 16 Sep 2015 14:29:36 +0200 Subject: [PATCH 282/502] All operating systems are beautiful Thou shalt not discriminate OS X. Change-Id: I9c993d44ca74cb15631ea25d6105a3398ea57e95 --- core/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/Makefile b/core/Makefile index aff111e913e..6b10027ec53 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1617,9 +1617,6 @@ build_ota_package := true ifeq ($(TARGET_SKIP_OTA_PACKAGE),true) build_ota_package := false endif -ifeq ($(BUILD_OS),darwin) -build_ota_package := false -endif ifneq ($(strip $(SANITIZE_TARGET)),) build_ota_package := false endif From d4b37672a80b9cbc2d5e61188c4878b23a587a6f Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Thu, 25 Aug 2016 23:11:14 +0200 Subject: [PATCH 283/502] build: Kill colors Change-Id: Icf29909e3df69832a58f3c654a6ed92251d817ca --- core/Makefile | 58 ++++++++++++----------------- core/base_rules.mk | 6 +-- core/binary.mk | 4 +- core/cleanbuild.mk | 4 +- core/definitions.mk | 62 +++++++++++++++---------------- core/dex_preopt_odex_install.mk | 2 +- core/distdir.mk | 2 +- core/droiddoc.mk | 6 +-- core/dynamic_binary.mk | 6 +-- core/host_java_library.mk | 2 +- core/java.mk | 10 ++--- core/java_library.mk | 6 +-- core/main.mk | 6 +-- core/ninja.mk | 2 +- core/notice_files.mk | 2 +- core/pdk_config.mk | 2 +- core/prebuilt_internal.mk | 2 +- core/product-graph.mk | 10 ++--- core/static_java_library.mk | 2 +- core/tasks/apicheck.mk | 4 +- core/tasks/collect_gpl_sources.mk | 2 +- core/tasks/dt_image.mk | 2 +- core/tasks/kernel.mk | 10 ++--- core/tasks/sdk-addon.mk | 2 +- 24 files changed, 101 insertions(+), 113 deletions(-) diff --git a/core/Makefile b/core/Makefile index 6b10027ec53..43c1896eebd 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1,17 +1,5 @@ # Put some miscellaneous rules here -# Build system colors - -ifneq ($(BUILD_WITH_COLORS),0) - CL_RED="\033[31m" - CL_GRN="\033[32m" - CL_YLW="\033[33m" - CL_BLU="\033[34m" - CL_MAG="\033[35m" - CL_CYN="\033[36m" - CL_RST="\033[0m" -endif - # HACK: clear LOCAL_PATH from including last build target before calling # intermedites-dir-for LOCAL_PATH := $(BUILD_SYSTEM) @@ -581,7 +569,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_S $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(BOOT_SIGNER) /boot $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) @@ -589,7 +577,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(BOOT_SIGNER) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(BOOT_SIGNER) /boot $(INSTALLED_BOOTIMAGE_TARGET) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" else ifndef BOARD_CUSTOM_BOOTIMG_MK @@ -600,7 +588,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(VBOOT_ $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@.unsigned $(VBOOT_SIGNER) $(FUTILITY) $@.unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $@.keyblock $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) @@ -608,7 +596,7 @@ bootimage-nodeps: $(MKBOOTIMG) $(VBOOT_SIGNER) $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(VBOOT_SIGNER) $(FUTILITY) $(INSTALLED_BOOTIMAGE_TARGET).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(INSTALLED_BOOTIMAGE_TARGET).keyblock $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" else # PRODUCT_SUPPORTS_VBOOT != true @@ -616,14 +604,14 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOTIM $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" .PHONY: bootimage-nodeps bootimage-nodeps: $(MKBOOTIMG) @echo "make $@: ignoring dependencies" $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE)) - @echo -e ${CL_CYN}"Made boot image: $@"${CL_RST} + @echo "Made boot image: $@" endif # PRODUCT_SUPPORTS_VBOOT endif # TARGET_BOOTIMAGE_USE_EXT2 / BOARD_CUSTOM_BOOTIMG_MK @@ -731,7 +719,7 @@ endif # TARGET_BUILD_APPS $(kernel_notice_file): \ $(BUILD_SYSTEM)/LINUX_KERNEL_COPYING \ | $(ACP) - @echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" + @echo "Copying:"" $@" $(hide) mkdir -p $(dir $@) $(hide) $(ACP) $< $@ @@ -1040,12 +1028,12 @@ $(RECOVERY_INSTALL_OTA_KEYS): $(OTA_PUBLIC_KEYS) $(DUMPKEY_JAR) $(extra_keys) java -jar $(DUMPKEY_JAR) $(PRIVATE_OTA_PUBLIC_KEYS) $(extra_keys) > $@ define build-recoveryramdisk - @echo -e ${CL_CYN}"----- Making recovery ramdisk ------"${CL_RST} + @echo "----- Making recovery ramdisk ------" $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp - @echo -e ${CL_CYN}"Copying baseline ramdisk..."${CL_RST} + @echo "Copying baseline ramdisk..." $(hide) rsync -a --exclude=etc --exclude=sdcard $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. - @echo -e ${CL_CYN}"Modifying ramdisk contents..."${CL_RST} + @echo "Modifying ramdisk contents..." $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/ $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/sepolicy @@ -1085,7 +1073,7 @@ define build-recoveryimage-target $(if $(filter true,BOARD_USES_RECOVERY_AS_BOOT), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))) - @echo -e ${CL_CYN}"Made recovery image: $@"${CL_RST} + @echo "Made recovery image: $@" endef ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) @@ -1120,18 +1108,18 @@ $(recovery_uncompressed_ramdisk): $(MKBOOTFS) \ $(recovery_fstab) \ $(RECOVERY_INSTALL_OTA_KEYS) $(call build-recoveryramdisk) - @echo -e ${CL_CYN}"----- Making uncompressed recovery ramdisk ------"${CL_RST} + @echo "----- Making uncompressed recovery ramdisk ------" $(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $@ $(recovery_ramdisk): $(MINIGZIP) \ $(recovery_uncompressed_ramdisk) - @echo -e ${CL_CYN}"----- Making compressed recovery ramdisk ------"${CL_RST} + @echo "----- Making compressed recovery ramdisk ------" $(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $@ ifndef BOARD_CUSTOM_BOOTIMG_MK $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) \ $(RECOVERYIMAGE_EXTRA_DEPS) - @echo -e ${CL_CYN}"----- Making recovery image ------"${CL_RST} + @echo "----- Making recovery image ------" $(call build-recoveryimage-target, $@) endif # BOARD_CUSTOM_BOOTIMG_MK @@ -1297,7 +1285,7 @@ $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(HOST_OUT_EXECUTABLES)/imgdiff \ $(HOST_OUT_EXECUTABLES)/bsdiff - @echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST} + @echo "Construct recovery from boot" mkdir -p $(dir $@) ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ @@ -1311,7 +1299,7 @@ endif $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) - @echo -e ${CL_CYN}"Install system fs image: $@"${CL_RST} + @echo "Install system fs image: $@" $(copy-file-to-target) $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) @@ -1815,7 +1803,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(APKCERTS_FILE) \ $(HOST_OUT_EXECUTABLES)/fs_config \ | $(ACP) - @echo -e ${CL_YLW}"Package target files:"${CL_RST}" $@" + @echo "Package target files:"" $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) ifneq (,$(INSTALLED_RECOVERYIMAGE_TARGET)$(filter true,$(BOARD_USES_RECOVERY_AS_BOOT))) @@ -2119,7 +2107,7 @@ endif $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) @echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path @echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device - @echo -e ${CL_YLW}"Package OTA:"${CL_RST}" $@" + @echo "Package OTA:"" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(OTA_FROM_TARGET_SCRIPT) -v \ $(block_based) \ @@ -2137,7 +2125,7 @@ otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) bacon: otapackage $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(CM_TARGET_PACKAGE) $(hide) $(MD5SUM) $(CM_TARGET_PACKAGE) > $(CM_TARGET_PACKAGE).md5sum - @echo -e ${CL_CYN}"Package Complete: $(CM_TARGET_PACKAGE)"${CL_RST} + @echo "Package Complete: $(CM_TARGET_PACKAGE)" endif # build_ota_package # ----------------------------------------------------------------- @@ -2155,7 +2143,7 @@ $(INTERNAL_FACTORY_PACKAGE_TARGET): extensions := $(TARGET_RELEASETOOLS_EXTENSIO endif $(INTERNAL_FACTORY_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS) - @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" + @echo "Package:"" $@" if [ -z $(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT) ]; then \ echo "Error: Factory script is not defined by target"; \ exit 1; \ @@ -2187,7 +2175,7 @@ else endif $(INTERNAL_UPDATE_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) - @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" + @echo "Package:"" $@" $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ $(IMG_FROM_TARGET_SCRIPT) -v \ -p $(HOST_OUT) \ @@ -2229,7 +2217,7 @@ name := $(name)-apps-$(FILE_NAME_TAG) APPS_ZIP := $(PRODUCT_OUT)/$(name).zip $(APPS_ZIP): $(INSTALLED_SYSTEMIMAGE) - @echo -e ${CL_YLW}"Package apps:"${CL_RST}" $@" + @echo "Package apps:"" $@" $(hide) rm -rf $@ $(hide) mkdir -p $(dir $@) $(hide) apps_to_zip=`find $(TARGET_OUT_APPS) $(TARGET_OUT_APPS_PRIVILEGED) -mindepth 2 -maxdepth 3 -name "*.apk"`; \ @@ -2296,7 +2284,7 @@ name := $(TARGET_PRODUCT)-emulator-$(FILE_NAME_TAG) INTERNAL_EMULATOR_PACKAGE_TARGET := $(PRODUCT_OUT)/$(name).zip $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) - @echo -e ${CL_YLW}"Package:"${CL_RST}" $@" + @echo "Package:"" $@" $(hide) zip -qjX $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) endif diff --git a/core/base_rules.mk b/core/base_rules.mk index 34d2a125621..838f185375e 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -265,7 +265,7 @@ $(cleantarget) : PRIVATE_CLEAN_FILES := \ $(LOCAL_INSTALLED_MODULE) \ $(intermediates) $(cleantarget):: - @echo -e ${CL_GRN}"Clean:"${CL_RST}" $(PRIVATE_MODULE)" + @echo "Clean:"" $(PRIVATE_MODULE)" $(hide) rm -rf $(PRIVATE_CLEAN_FILES) ########################################################### @@ -313,12 +313,12 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD) ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) | $(ACP) - @echo -e ${CL_CYN}"Install: $@"${CL_RST} + @echo "Install: $@" $(copy-file-to-new-target) $(PRIVATE_POST_INSTALL_CMD) else $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE) - @echo -e ${CL_CYN}"Install: $@"${CL_RST} + @echo "Install: $@" $(copy-file-to-target-with-cp) endif diff --git a/core/binary.mk b/core/binary.mk index d3986ac60ac..20a830aaa5a 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -1201,7 +1201,7 @@ import_includes_deps := $(strip \ $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(LOCAL_IS_HOST_MODULE),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/export_includes)) $(import_includes): PRIVATE_IMPORT_EXPORT_INCLUDES := $(import_includes_deps) $(import_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(import_includes_deps) - @echo -e ${CL_CYN}Import includes file:${CL_RST} $@ + @echo Import includes file: $@ $(hide) mkdir -p $(dir $@) && rm -f $@ ifdef import_includes_deps $(hide) for f in $(PRIVATE_IMPORT_EXPORT_INCLUDES); do \ @@ -1454,7 +1454,7 @@ $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs) # People are not going to consume the aidl generated cpp file, but the cpp file is # generated after the headers, so this is a convenient way to ensure the headers exist. $(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) $(vts_gen_cpp) - @echo -e ${CL_CYN}Export includes file:${CL_RST} $< -- $@ + @echo Export includes file: $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@.tmp ifdef my_export_c_include_dirs $(hide) for d in $(PRIVATE_EXPORT_C_INCLUDE_DIRS); do \ diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index 034584a7981..45c49f99d29 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -281,13 +281,13 @@ endif dataclean: FILES := $(dataclean_files) dataclean: $(hide) rm -rf $(FILES) - @echo -e ${CL_GRN}"Deleted emulator userdata images."${CL_RST} + @echo "Deleted emulator userdata images." .PHONY: installclean installclean: FILES := $(installclean_files) installclean: dataclean $(hide) rm -rf $(FILES) - @echo -e ${CL_GRN}"Deleted images and staging directories."${CL_RST} + @echo "Deleted images and staging directories." .PHONY: objclean objclean: FILES := $(objclean_files) diff --git a/core/definitions.mk b/core/definitions.mk index dc144891677..31969046b31 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1206,7 +1206,7 @@ endef ########################################################### define transform-cpp-to-o -@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "target $(PRIVATE_ARM_MODE) C++:"" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1259,7 +1259,7 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-c-to-o-no-deps -@echo -e ${CL_GRN}"target $(PRIVATE_ARM_MODE) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "target $(PRIVATE_ARM_MODE) C:"" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CONLYFLAGS) \ @@ -1268,7 +1268,7 @@ $(call transform-c-or-s-to-o-no-deps, \ endef define transform-s-to-o-no-deps -@echo -e ${CL_GRN}"target asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "target asm:"" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1299,7 +1299,7 @@ endef ########################################################### define transform-m-to-o-no-deps -@echo -e ${CL_GRN}"target ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "target ObjC:"" $(PRIVATE_MODULE) <= $<" $(call transform-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1313,7 +1313,7 @@ endef ########################################################### define transform-host-cpp-to-o -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) C++:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) C++:"" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(RELATIVE_PWD) $(PRIVATE_CXX) \ $(addprefix -I , $(PRIVATE_C_INCLUDES)) \ @@ -1364,12 +1364,12 @@ $(hide) $(RELATIVE_PWD) $(PRIVATE_CC) \ endef define transform-host-c-to-o-no-deps -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) C:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) C:"" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_CONLYFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef define transform-host-s-to-o-no-deps -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) asm:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) asm:"" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_ASFLAGS)) endef @@ -1388,7 +1388,7 @@ endef ########################################################### define transform-host-m-to-o-no-deps -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) ObjC:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "$($(PRIVATE_PREFIX)DISPLAY) ObjC:"" $(PRIVATE_MODULE) <= $<" $(call transform-host-c-or-s-to-o-no-deps, $(PRIVATE_CFLAGS) $(PRIVATE_DEBUG_CFLAGS)) endef @@ -1528,7 +1528,7 @@ endef # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-o-to-static-lib -@echo -e ${CL_GRN}"target StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target StaticLib:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-target-whole-static-libs) @@ -1576,7 +1576,7 @@ endef # Explicitly delete the archive first so that ar doesn't # try to add to an existing archive. define transform-host-o-to-static-lib -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) StaticLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$($(PRIVATE_PREFIX)DISPLAY) StaticLib:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) @rm -f $@ $(extract-and-include-host-whole-static-libs) @@ -1620,13 +1620,13 @@ endef endif define transform-host-o-to-shared-lib -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$($(PRIVATE_PREFIX)DISPLAY) SharedLib:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-shared-lib-inner) endef define transform-host-o-to-package -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Package:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$($(PRIVATE_PREFIX)DISPLAY) Package:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-shared-lib-inner) endef @@ -1662,7 +1662,7 @@ $(hide) $(PRIVATE_CXX) \ endef define transform-o-to-shared-lib -@echo -e ${CL_GRN}"target SharedLib:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target SharedLib:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-shared-lib-inner) endef @@ -1677,14 +1677,14 @@ ifneq ($(TARGET_BUILD_VARIANT),user) endif define transform-to-stripped -@echo -e ${CL_GRN}"target Strip:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target Strip:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(hide) $(PRIVATE_STRIP) --strip-all $< -o $@ \ $(if $(PRIVATE_NO_DEBUGLINK),,$(TARGET_STRIP_EXTRA)) endef define transform-to-stripped-keep-symbols -@echo -e ${CL_GRN}"target Strip (keep symbols):"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target Strip (keep symbols):"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(hide) $(PRIVATE_OBJCOPY) \ `$(PRIVATE_READELF) -S $< | awk '/.debug_/ {print "-R " $$2}' | xargs` \ @@ -1733,7 +1733,7 @@ $(hide) $(PRIVATE_CXX) -pie \ endef define transform-o-to-executable -@echo -e ${CL_GRN}"target Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target Executable:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-executable-inner) endef @@ -1776,7 +1776,7 @@ $(hide) $(PRIVATE_CXX) \ endef define transform-o-to-static-executable -@echo -e ${CL_GRN}"target StaticExecutable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "target StaticExecutable:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-o-to-static-executable-inner) endef @@ -1822,7 +1822,7 @@ endef endif define transform-host-o-to-executable -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Executable:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$($(PRIVATE_PREFIX)DISPLAY) Executable:"" $(PRIVATE_MODULE) ($@)" @mkdir -p $(dir $@) $(transform-host-o-to-executable-inner) endef @@ -2056,10 +2056,10 @@ $(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; the \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ 2>$(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr \ && ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ - echo -e ${CL_YLW}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + echo "`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`" 1>&2; \ rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ) \ || ( [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr ] && \ - echo -e ${CL_RED}"`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`"${CL_RST} 1>&2; \ + echo "`cat $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stderr`" 1>&2; \ rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR); exit 41 ) \ fi $(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \ @@ -2089,7 +2089,7 @@ $(if $(PRIVATE_EXTRA_JAR_ARGS),$(call add-java-resources-to,$@)) endef define transform-java-to-classes.jar -@echo -e ${CL_GRN}"target Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo "target Java:"" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(TARGET_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -2540,7 +2540,7 @@ endef # Note: we intentionally don't clean PRIVATE_CLASS_INTERMEDIATES_DIR # in transform-java-to-classes for the sake of vm-tests. define transform-host-java-to-package -@echo -e ${CL_YLW}"$($(PRIVATE_PREFIX)DISPLAY) Java:"${CL_RST}" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" +@echo "$($(PRIVATE_PREFIX)DISPLAY) Java:"" $(PRIVATE_MODULE) ($(PRIVATE_CLASS_INTERMEDIATES_DIR))" $(call compile-java,$(HOST_JAVAC),$(PRIVATE_BOOTCLASSPATH)) endef @@ -2553,7 +2553,7 @@ endef # $(2): destination header define copy-one-header $(2): $(1) - @echo -e ${CL_YLW}"Header:"${CL_RST}" $$@" + @echo "Header:"" $$@" $$(copy-file-to-new-target-with-cp) endef @@ -2562,7 +2562,7 @@ endef # $(2): destination file define copy-one-file $(2): $(1) | $(ACP) - @echo -e ${CL_YLW}"Copy:"${CL_RST}" $$@" + @echo "Copy:"" $$@" $$(copy-file-to-target) endef @@ -2583,7 +2583,7 @@ endef # $(2): destination file, must end with .xml. define copy-xml-file-checked $(2): $(1) | $(ACP) - @echo -e ${CL_YLW}"Copy xml:"${CL_RST}" $$@" + @echo "Copy xml:"" $$@" $(hide) xmllint $$< >/dev/null # Don't print the xml file to stdout. $$(copy-file-to-target) endef @@ -2641,19 +2641,19 @@ endef # Copy a prebuilt file to a target location. define transform-prebuilt-to-target -@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) endef # Copy a prebuilt file to a target location, using zipalign on it. define transform-prebuilt-to-target-with-zipalign -@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt APK:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-zipalign) endef # Copy a prebuilt file to a target location, stripping "# comment" comments. define transform-prebuilt-to-target-strip-comments -@echo -e ${CL_CYN}"$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"${CL_RST}" $(PRIVATE_MODULE) ($@)" +@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-strip-comments) endef @@ -2672,8 +2672,8 @@ endef ########################################################### ## Commands to call Proguard ########################################################### -@echo -e ${CL_CYN}"Copying:"${CL_RST}" $@" -@echo -e ${CL_GRN}"Proguard:"${CL_RST}" $@" +@echo "Copying:"" $@" +@echo "Proguard:"" $@" define transform-jar-to-proguard $(hide) $(PROGUARD) -injars $< -outjars $@ $(PRIVATE_PROGUARD_FLAGS) \ $(addprefix -injars , $(PRIVATE_EXTRA_INPUT_JAR)) @@ -2684,7 +2684,7 @@ endef ########################################################### define transform-generated-source -@echo -e ${CL_GRN}"target Generated:"${CL_RST}" $(PRIVATE_MODULE) <= $<" +@echo "target Generated:"" $(PRIVATE_MODULE) <= $<" @mkdir -p $(dir $@) $(hide) $(PRIVATE_CUSTOM_TOOL) endef diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 27f70d1c1f8..4e486d52a10 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -106,7 +106,7 @@ $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) $(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_odex))) \ : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ | $(ACP) - @echo -e ${CL_CYN}"Install: $@"${CL_RST} + @echo "Install: $@" $(copy-file-to-target) endif diff --git a/core/distdir.mk b/core/distdir.mk index 829951e8d79..b058dc26429 100644 --- a/core/distdir.mk +++ b/core/distdir.mk @@ -37,7 +37,7 @@ ifdef dist_goal define copy-one-dist-file $(3): $(2) $(2): $(1) - @echo -e ${CL_YLW}"Dist:"${CL_RST}" $$@" + @echo "Dist:"" $$@" $$(copy-file-to-new-target-with-cp) endef diff --git a/core/droiddoc.mk b/core/droiddoc.mk index 77a54aa2a34..d29cbf4f060 100644 --- a/core/droiddoc.mk +++ b/core/droiddoc.mk @@ -167,7 +167,7 @@ $(full_target): \ $(full_java_lib_deps) \ $(LOCAL_MODULE_MAKEFILE_DEP) \ $(LOCAL_ADDITIONAL_DEPENDENCIES) - @echo -e ${CL_YLW}"Docs droiddoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" + @echo "Docs droiddoc:"" $(PRIVATE_OUT_DIR)" $(hide) mkdir -p $(dir $@) $(addprefix $(hide) rm -rf ,$(PRIVATE_STUB_OUT_DIR)) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ @@ -204,7 +204,7 @@ else ## ## $(full_target): $(full_src_files) $(full_java_lib_deps) - @echo -e ${CL_YLW}"Docs javadoc:"${CL_RST}" $(PRIVATE_OUT_DIR)" + @echo "Docs javadoc:"" $(PRIVATE_OUT_DIR)" @mkdir -p $(dir $@) $(call prepare-doc-source-list,$(PRIVATE_SRC_LIST_FILE),$(PRIVATE_JAVA_FILES), \ $(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR)) @@ -245,7 +245,7 @@ ifeq ($(strip $(LOCAL_UNINSTALLABLE_MODULE)),) out_zip := $(OUT_DOCS)/$(LOCAL_MODULE)-docs.zip $(out_zip): PRIVATE_DOCS_DIR := $(out_dir) $(out_zip): $(full_target) - @echo -e ${CL_YLW}"Package docs:"${CL_RST}" $@" + @echo "Package docs:"" $@" @rm -f $@ @mkdir -p $(dir $@) $(hide) ( F=$$(pwd)/$@ ; cd $(PRIVATE_DOCS_DIR) && zip -rqX $$F * ) diff --git a/core/dynamic_binary.mk b/core/dynamic_binary.mk index e5bec0747fd..f7fb2068fe0 100644 --- a/core/dynamic_binary.mk +++ b/core/dynamic_binary.mk @@ -96,7 +96,7 @@ endif symbolic_input := $(relocation_packer_output) symbolic_output := $(my_unstripped_path)/$(my_installed_module_stem) $(symbolic_output) : $(symbolic_input) | $(ACP) - @echo -e ${CL_GRN}"target Symbolic:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target Symbolic:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) ########################################################### @@ -161,11 +161,11 @@ else # use cp(1) instead. ifneq ($(LOCAL_ACP_UNAVAILABLE),true) $(strip_output): $(strip_input) | $(ACP) - @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target Unstripped:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) else $(strip_output): $(strip_input) - @echo -e ${CL_GRN}"target Unstripped:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target Unstripped:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target-with-cp) endif endif # my_strip_module diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 70e49032937..84cff42ef2f 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -98,7 +98,7 @@ $(full_classes_emma_jar) : $(full_classes_jarjar_jar) | $(EMMA_JAR) $(transform-classes.jar-to-emma) $(built_javalib_jar) : $(full_classes_emma_jar) - @echo -e ${CL_YLW}"Copying:"${CL_RST}" $@" + @echo "Copying:"" $@" $(hide) $(ACP) -fp $< $@ else # LOCAL_EMMA_INSTRUMENT diff --git a/core/java.mk b/core/java.mk index 0beebc6412d..a023aa6be8a 100644 --- a/core/java.mk +++ b/core/java.mk @@ -412,7 +412,7 @@ ifdef full_classes_jar # PRIVATE_ vars to be preserved. $(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar) $(full_classes_stubs_jar) : $(full_classes_jar) | $(ACP) - @echo -e ${CL_GRN}"Copying"${CL_RST}" $(PRIVATE_SOURCE_FILE)" + @echo "Copying"" $(PRIVATE_SOURCE_FILE)" $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) @@ -451,11 +451,11 @@ $(full_classes_compiled_jar): \ ifneq ($(strip $(LOCAL_JARJAR_RULES)),) $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) $(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR) - @echo -e ${CL_GRN}"JarJar:"${CL_RST}" $@" + @echo "JarJar:"" $@" $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ else $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP) - @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" + @echo "Copying:"" $@" $(hide) $(ACP) -fp $< $@ endif @@ -483,7 +483,7 @@ endif # Keep a copy of the jar just before proguard processing. $(full_classes_jar): $(full_classes_jar_source) | $(ACP) - @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" + @echo "Copying:"" $@" $(hide) $(ACP) -fp $< $@ $(call define-jar-to-toc-rule, $(full_classes_jar)) @@ -619,7 +619,7 @@ endif endif # LOCAL_JACK_ENABLED is disabled $(built_dex): $(built_dex_intermediate) | $(ACP) - @echo -e ${CL_GRN}"Copying:"${CL_RST}" $@" + @echo "Copying:"" $@" $(hide) mkdir -p $(dir $@) $(hide) rm -f $(dir $@)/classes*.dex $(hide) $(ACP) -fp $(dir $<)/classes*.dex $(dir $@) diff --git a/core/java_library.mk b/core/java_library.mk index d62c605730d..2e11bfb6c03 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -71,7 +71,7 @@ $(common_javalib.jar) : $(full_classes_proguard_jar) else $(common_javalib.jar) : $(full_classes_jar) endif - @echo -e ${CL_GRN}"target Static Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target Static Jar:"" $(PRIVATE_MODULE) ($@)" $(copy-file-to-target) ifdef LOCAL_JACK_ENABLED @@ -87,7 +87,7 @@ $(common_javalib.jar): PRIVATE_DEX_FILE := $(built_dex) $(common_javalib.jar): PRIVATE_SOURCE_ARCHIVE := $(full_classes_jarjar_jar) $(common_javalib.jar): PRIVATE_DONT_DELETE_JAR_DIRS := $(LOCAL_DONT_DELETE_JAR_DIRS) $(common_javalib.jar) : $(built_dex) $(java_resource_sources) | $(ZIPTIME) - @echo -e ${CL_GRN}"target Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target Jar:"" $(PRIVATE_MODULE) ($@)" ifdef LOCAL_JACK_ENABLED $(create-empty-package) else @@ -111,7 +111,7 @@ else # ! boot jar $(built_odex): PRIVATE_MODULE := $(LOCAL_MODULE) # Use pattern rule - we may have multiple built odex files. $(built_odex) : $(dir $(LOCAL_BUILT_MODULE))% : $(common_javalib.jar) - @echo -e ${CL_GRN}"Dexpreopt Jar:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "Dexpreopt Jar:"" $(PRIVATE_MODULE) ($@)" $(call dexpreopt-one-file,$<,$@) $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) diff --git a/core/main.mk b/core/main.mk index 4190559c858..b9137bcb29d 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1109,7 +1109,7 @@ $(foreach module,$(sample_MODULES),$(eval $(call \ sample_ADDITIONAL_INSTALLED := \ $(filter-out $(modules_to_install) $(modules_to_check) $(ALL_PREBUILT),$(sample_MODULES)) samplecode: $(sample_APKS_COLLECTION) - @echo -e ${CL_GRN}"Collect sample code apks:"${CL_RST}" $^" + @echo "Collect sample code apks:"" $^" # remove apks that are not intended to be installed. rm -f $(sample_ADDITIONAL_INSTALLED) endif # samplecode in $(MAKECMDGOALS) @@ -1120,7 +1120,7 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET) .PHONY: clean clean: @rm -rf $(OUT_DIR)/* - @echo -e ${CL_GRN}"Entire build directory removed."${CL_RST} + @echo "Entire build directory removed." .PHONY: clobber clobber: clean @@ -1130,7 +1130,7 @@ clobber: clean #xxx scrape this from ALL_MODULE_NAME_TAGS .PHONY: modules modules: - @echo -e ${CL_GRN}"Available sub-modules:"${CL_RST} + @echo "Available sub-modules:" @echo "$(call module-names-for-tag-list,$(ALL_MODULE_TAGS))" | \ tr -s ' ' '\n' | sort -u | $(COLUMN) diff --git a/core/ninja.mk b/core/ninja.mk index fc0cb30f1b4..9d0ff9a70b2 100644 --- a/core/ninja.mk +++ b/core/ninja.mk @@ -161,7 +161,7 @@ ifeq ($(KATI_EMULATE_FIND),false) endif $(KATI_BUILD_NINJA): $(KATI) $(MAKEPARALLEL) $(DUMMY_OUT_MKS) $(SOONG_ANDROID_MK) FORCE @echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja... - +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) + +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P --detect_android_echo $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) ifneq ($(USE_SOONG_FOR_KATI),true) KATI_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) diff --git a/core/notice_files.mk b/core/notice_files.mk index ea59d4a65f8..e7f89745b79 100644 --- a/core/notice_files.mk +++ b/core/notice_files.mk @@ -68,7 +68,7 @@ installed_notice_file := $($(my_prefix)OUT_NOTICE_FILES)/src/$(module_installed_ $(installed_notice_file): PRIVATE_INSTALLED_MODULE := $(module_installed_filename) $(installed_notice_file): $(notice_file) - @echo -e ${CL_CYN}Notice file:${CL_RST} $< -- $@ + @echo Notice file: $< -- $@ $(hide) mkdir -p $(dir $@) $(hide) cat $< > $@ diff --git a/core/pdk_config.mk b/core/pdk_config.mk index e1ecc080eb3..daf02c8e49e 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -71,7 +71,7 @@ endif endif $(_pdk_fusion_stamp) : $(PDK_FUSION_PLATFORM_ZIP) - @echo -e ${CL_YLW}"Unzip"${CL_RST}" $(dir $@) <- $<" + @echo "Unzip"" $(dir $@) <- $<" $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) unzip -qo $< -d $(dir $@) $(call split-long-arguments,-touch,$(_pdk_fusion_files)) diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index a62a15d5990..961f8aa1415 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -298,7 +298,7 @@ $(built_apk_splits) : $(built_module_path)/%.apk : $(my_src_dir)/%.apk | $(ACP) # Rules to install the split apks. $(installed_apk_splits) : $(my_module_path)/%.apk : $(built_module_path)/%.apk | $(ACP) - @echo -e ${CL_CYN}"Install: $@"${CL_RST} + @echo "Install: $@" $(copy-file-to-new-target) # Register the additional built and installed files. diff --git a/core/product-graph.mk b/core/product-graph.mk index f083b450744..1030c6aab04 100644 --- a/core/product-graph.mk +++ b/core/product-graph.mk @@ -70,7 +70,7 @@ $(products_graph): PRIVATE_PRODUCTS := $(really_all_products) $(products_graph): PRIVATE_PRODUCTS_FILTER := $(products_list) $(products_graph): $(this_makefile) - @echo -e ${CL_GRN}"Product graph DOT:"${CL_RST}" $@ for $(PRIVATE_PRODUCTS_FILTER)" + @echo "Product graph DOT:"" $@ for $(PRIVATE_PRODUCTS_FILTER)" $(hide) echo 'digraph {' > $@.in $(hide) echo 'graph [ ratio=.5 ];' >> $@.in $(hide) $(foreach p,$(PRIVATE_PRODUCTS), \ @@ -89,7 +89,7 @@ endef # $(1) product file define transform-product-debug $(OUT_DIR)/products/$(strip $(1)).txt: $(this_makefile) - @echo -e ${CL_GRN}"Product debug info file:"${CL_RST}" $$@" + @echo "Product debug info file:"" $$@" $(hide) rm -f $$@ $(hide) mkdir -p $$(dir $$@) $(hide) echo 'FILE=$(strip $(1))' >> $$@ @@ -123,7 +123,7 @@ $(call product-debug-filename, $(p)): \ $(OUT_DIR)/products/$(strip $(1)).txt \ build/tools/product_debug.py \ $(this_makefile) - @echo -e ${CL_GRN}"Product debug html file:"${CL_RST}" $$@" + @echo "Product debug html file:"" $$@" $(hide) mkdir -p $$(dir $$@) $(hide) cat $$< | build/tools/product_debug.py > $$@ endef @@ -135,11 +135,11 @@ $(foreach p,$(really_all_products), \ ) $(products_pdf): $(products_graph) - @echo -e ${CL_GRN}"Product graph PDF:"${CL_RST}" $@" + @echo "Product graph PDF:"" $@" dot -Tpdf -Nshape=box -o $@ $< $(products_svg): $(products_graph) $(product_debug_files) - @echo -e ${CL_GRN}"Product graph SVG:"${CL_RST}" $@" + @echo "Product graph SVG:"" $@" dot -Tsvg -Nshape=box -o $@ $< product-graph: $(products_pdf) $(products_svg) diff --git a/core/static_java_library.mk b/core/static_java_library.mk index e2bf43afaa9..d5ab8553e2e 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -160,7 +160,7 @@ include $(BUILD_SYSTEM)/aapt2.mk $(my_res_package) : $(framework_res_package_export_deps) else $(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export_deps) - @echo -e ${CL_YLW}"target R.java/Manifest.java:"${CL_RST}" $(PRIVATE_MODULE) ($@)" + @echo "target R.java/Manifest.java:"" $(PRIVATE_MODULE) ($@)" $(create-resource-java-files) $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ endif # LOCAL_USE_AAPT2 diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk index 67995d9f0a6..f45bf8c532b 100644 --- a/core/tasks/apicheck.mk +++ b/core/tasks/apicheck.mk @@ -76,9 +76,9 @@ $(eval $(call check-api, \ .PHONY: update-public-api update-public-api: $(INTERNAL_PLATFORM_API_FILE) | $(ACP) - @echo -e ${CL_GRN}"Copying current.txt"${CL_RST} + @echo "Copying current.txt" $(hide) $(ACP) $(INTERNAL_PLATFORM_API_FILE) frameworks/base/api/current.txt - @echo -e ${CL_GRN}"Copying removed.txt"${CL_RST} + @echo "Copying removed.txt" $(hide) $(ACP) $(INTERNAL_PLATFORM_REMOVED_API_FILE) frameworks/base/api/removed.txt update-api : update-public-api diff --git a/core/tasks/collect_gpl_sources.mk b/core/tasks/collect_gpl_sources.mk index fc03f48b77e..63bf2b0468b 100644 --- a/core/tasks/collect_gpl_sources.mk +++ b/core/tasks/collect_gpl_sources.mk @@ -17,7 +17,7 @@ gpl_source_tgz := $(call intermediates-dir-for,PACKAGING,gpl_source,HOST,COMMON) # FORCE since we can't know whether any of the sources changed $(gpl_source_tgz): PRIVATE_PATHS := $(sort $(patsubst %/, %, $(dir $(ALL_GPL_MODULE_LICENSE_FILES)))) $(gpl_source_tgz) : $(ALL_GPL_MODULE_LICENSE_FILES) FORCE - @echo -e ${CL_GRN}"Package gpl sources:"${CL_RST}" $@" + @echo "Package gpl sources:"" $@" @rm -rf $(dir $@) && mkdir -p $(dir $@) $(hide) tar cfz $@ --exclude ".git*" $(PRIVATE_PATHS) diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk index 7d6264fb96b..0f849466b7d 100644 --- a/core/tasks/dt_image.mk +++ b/core/tasks/dt_image.mk @@ -40,7 +40,7 @@ endef $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) $(build-dtimage-target) - @echo -e ${CL_CYN}"Made DT image: $@"${CL_RST} + @echo "Made DT image: $@" ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index 471a34ab4f7..9c73ad0f8cf 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -271,7 +271,7 @@ $(KERNEL_ADDITIONAL_CONFIG_OUT): force_additional_config $(hide) cmp -s $(KERNEL_ADDITIONAL_CONFIG_SRC) $@ || cp $(KERNEL_ADDITIONAL_CONFIG_SRC) $@; $(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) - @echo -e ${CL_GRN}"Building Kernel Config"${CL_RST} + @echo "Building Kernel Config" $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG) $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ @@ -283,18 +283,18 @@ $(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONA $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL_STAMP) - @echo -e ${CL_GRN}"Building Kernel"${CL_RST} + @echo "Building Kernel" $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \ then \ - echo -e ${CL_GRN}"Building DTBs"${CL_RST} ; \ + echo "Building DTBs" ; \ $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \ else \ echo "DTBs not enabled" ; \ fi ; $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \ then \ - echo -e ${CL_GRN}"Building Kernel Modules"${CL_RST} ; \ + echo "Building Kernel Modules" ; \ $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \ $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \ $(mv-modules) && \ @@ -311,7 +311,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES) $(clean-module-folder) $(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) - @echo -e ${CL_GRN}"Building Kernel Headers"${CL_RST} + @echo "Building Kernel Headers" $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \ rm -f ../$(KERNEL_CONFIG); \ $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ diff --git a/core/tasks/sdk-addon.mk b/core/tasks/sdk-addon.mk index ab950a27af8..2ecfbbf3d59 100644 --- a/core/tasks/sdk-addon.mk +++ b/core/tasks/sdk-addon.mk @@ -105,7 +105,7 @@ $(full_target): PRIVATE_DOCS_DIRS := $(addprefix $(OUT_DOCS)/, $(doc_modules)) $(full_target): PRIVATE_STAGING_DIR := $(call append-path,$(staging),$(addon_dir_leaf)) $(full_target): $(sdk_addon_deps) | $(ACP) - @echo -e ${CL_GRN}"Packaging SDK Addon:"${CL_RST}" $@" + @echo "Packaging SDK Addon:"" $@" $(hide) mkdir -p $(PRIVATE_STAGING_DIR)/docs $(hide) for d in $(PRIVATE_DOCS_DIRS); do \ $(ACP) -r $$d $(PRIVATE_STAGING_DIR)/docs ;\ From a7483725811580b49929ba2e0218e77e9d567ed8 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Thu, 15 Oct 2015 09:10:50 -0500 Subject: [PATCH 284/502] releasetools: don't attempt to read fingerprint on unified devices * You wont find this in the build.prop on these devices and this is how we handled them in previous versions Change-Id: I56332c87916da1a1206980df0e7a6ca8a55f0e8e --- tools/releasetools/ota_from_target_files.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index d1bd71eea00..008f687b7f7 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -492,6 +492,8 @@ def GetOemProperty(name, oem_props, oem_dict, info_dict): def CalculateFingerprint(oem_props, oem_dict, info_dict): + if OPTIONS.override_prop: + return GetBuildProp("ro.build.date.utc", info_dict) if oem_props is None: return GetBuildProp("ro.build.fingerprint", info_dict) return "%s/%s/%s:%s" % ( From fda150c8dfb687a3f3e8947018803e78649eb69b Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Fri, 26 Aug 2016 14:18:56 -0500 Subject: [PATCH 285/502] build: Don't add cm jars if cm sdk is disabled Change-Id: Iaec955e1738cd644d879db0c38d66d250c24ce91 --- target/product/core_minimal.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 540377438e5..0e60013f57e 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -102,9 +102,12 @@ PRODUCT_BOOT_JARS := \ org.apache.http.legacy.boot # The order of PRODUCT_SYSTEM_SERVER_JARS matters. +ifneq ($(TARGET_DISABLE_CMSDK), true) PRODUCT_SYSTEM_SERVER_JARS := \ org.cyanogenmod.platform \ - org.cyanogenmod.hardware \ + org.cyanogenmod.hardware +endif +PRODUCT_SYSTEM_SERVER_JARS += \ services \ ethernet-service \ wifi-service From 391238ceb808fc6242f99f691559ea80b311479f Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Fri, 26 Aug 2016 22:13:51 +0530 Subject: [PATCH 286/502] envsetup: fix lunch Change-Id: I9dea4605857741132b8d10143c20d4bd7829086a --- envsetup.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 9405bef2625..9e09b7104eb 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -683,9 +683,7 @@ function lunch() fi local product=$(echo -n $selection | sed -e "s/-.*$//") - TARGET_PRODUCT=$product \ - TARGET_BUILD_VARIANT=$variant \ - build_build_var_cache + check_product $product if [ $? -ne 0 ] then # if we can't find a product, try to grab it off the CM github @@ -697,6 +695,10 @@ function lunch() else build/tools/roomservice.py $product true fi + TARGET_PRODUCT=$product \ + TARGET_BUILD_VARIANT=$variant \ + build_build_var_cache + if [ $? -ne 0 ] then echo From 73f68876ae1449fbe7ef15648c9c86c9b6b1b27a Mon Sep 17 00:00:00 2001 From: LorDClockaN Date: Sat, 27 Aug 2016 17:15:10 +0200 Subject: [PATCH 287/502] AICPfy Change-Id: I5c9599da2e68a17bafc73e8afabc06f6d54a77b6 --- core/Makefile | 34 +++++++++---- core/config.mk | 6 +-- core/dumpvar.mk | 2 +- core/product_config.mk | 10 ++-- envsetup.sh | 48 +++++++++---------- tools/buildinfo.sh | 2 +- .../{cm.mk.template => aicp.mk.template} | 6 +-- tools/releasetools/edify_generator.py | 2 +- tools/releasetools/ota_from_target_files.py | 2 +- tools/roomservice.py | 22 ++++----- 10 files changed, 76 insertions(+), 58 deletions(-) rename tools/device/{cm.mk.template => aicp.mk.template} (73%) diff --git a/core/Makefile b/core/Makefile index 43c1896eebd..bd6b4ee4d58 100644 --- a/core/Makefile +++ b/core/Makefile @@ -232,7 +232,7 @@ endif $(hide) TARGET_BUILD_TYPE="$(TARGET_BUILD_VARIANT)" \ TARGET_BUILD_FLAVOR="$(TARGET_BUILD_FLAVOR)" \ TARGET_DEVICE="$(TARGET_VENDOR_DEVICE_NAME)" \ - CM_DEVICE="$(TARGET_DEVICE)" \ + AICP_DEVICE="$(TARGET_DEVICE)" \ PRODUCT_NAME="$(TARGET_VENDOR_PRODUCT_NAME)" \ PRODUCT_BRAND="$(PRODUCT_BRAND)" \ PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \ @@ -1010,8 +1010,8 @@ ifneq ($(OTA_PACKAGE_SIGNING_KEY),) PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) else PRODUCT_EXTRA_RECOVERY_KEYS += \ - build/target/product/security/cm \ - build/target/product/security/cm-devkey + build/target/product/security/aicp \ + build/target/product/security/aicp-devkey endif # Generate a file containing the keys that will be read by the @@ -2080,7 +2080,7 @@ endif ifeq ($(WITH_GMS),true) $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false else -ifneq ($(CM_BUILD),) +ifneq ($(AICP_BUILD),) $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := true else $(INTERNAL_OTA_PACKAGE_TARGET): backuptool := false @@ -2118,14 +2118,32 @@ $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \ $(BUILT_TARGET_FILES_PACKAGE) $@ -CM_TARGET_PACKAGE := $(PRODUCT_OUT)/cm-$(CM_VERSION).zip +AICP_TARGET_PACKAGE := $(PRODUCT_OUT)/$(AICP_VERSION).zip .PHONY: otapackage bacon otapackage: $(INTERNAL_OTA_PACKAGE_TARGET) bacon: otapackage - $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(CM_TARGET_PACKAGE) - $(hide) $(MD5SUM) $(CM_TARGET_PACKAGE) > $(CM_TARGET_PACKAGE).md5sum - @echo "Package Complete: $(CM_TARGET_PACKAGE)" + $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(AICP_TARGET_PACKAGE) + $(hide) $(MD5SUM) $(AICP_TARGET_PACKAGE) > $(AICP_TARGET_PACKAGE).md5sum + @echo "" + @echo -e " ▄▄▄· "" ▪ "" ▄▄· "" ▄▄▄· " + @echo -e "▐█ ▀█ "" ██ "" ▐█ ▌▪ "" ▐█ ▄█ " + @echo -e "▄█▀▀█ "" ▐█· "" ██ ▄▄ "" ██▀· " + @echo -e "▐█ ▪▐▌ "" ▐█▌ "" ▐███▌ "" ▐█▪·• " + @echo -e " ▀ ▀ "" ▀▀▀ "" ▀▀▀ "" .▀ " + @echo "" + @echo -e "▄▄▄ "" ""• ▌ ▄ ·. " + @echo -e "▀▄ █· ""▪ ""·██ ▐███▪ " + @echo -e "▐▀▀▄ "" ▄█▀▄ ""▐█ ▌▐▌▐█· " + @echo -e "▐█•█▌ ""▐█▌.▐▌ ""██ ██▌▐█▌ " + @echo -e ".▀ ▀ "" ▀█▄▀▪ ""▀▀ █▪▀▀▀ " + @echo "" + @echo -e "===========-Package complete-===========" + @echo -e "zip: " $(AICP_TARGET_PACKAGE) + @echo -e "md5: "" `cat $(AICP_TARGET_PACKAGE).md5sum | cut -d ' ' -f 1`" + @echo -e "size:"" `ls -lah $(AICP_TARGET_PACKAGE) | cut -d ' ' -f 5`" + @echo -e "========================================" + @echo -e "" endif # build_ota_package # ----------------------------------------------------------------- diff --git a/core/config.mk b/core/config.mk index 5a0a1876202..0fb3ab9473d 100644 --- a/core/config.mk +++ b/core/config.mk @@ -189,7 +189,7 @@ FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .r $(call project-set-path-variant,recovery,RECOVERY_VARIANT,bootable/recovery) -include vendor/extra/BoardConfigExtra.mk --include vendor/cm/config/BoardConfigCM.mk +-include vendor/aicp/configs/BoardConfigCM.mk # The build system exposes several variables for where to find the kernel # headers: @@ -914,10 +914,10 @@ ifneq ($(TARGET_COPY_FILES_OVERRIDES),) PRODUCT_COPY_FILES := $(filter-out $(TARGET_COPY_FILES_OVERRIDES), $(PRODUCT_COPY_FILES)) endif -ifneq ($(CM_BUILD),) +ifneq ($(AICP_BUILD),) ## We need to be sure the global selinux policies are included ## last, to avoid accidental resetting by device configs -$(eval include vendor/cm/sepolicy/sepolicy.mk) +$(eval include vendor/aicp/sepolicy/sepolicy.mk) # Include any vendor specific config.mk file -include $(TOPDIR)vendor/*/build/core/config.mk diff --git a/core/dumpvar.mk b/core/dumpvar.mk index 4a56349448d..d887ed0ad95 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -3,7 +3,7 @@ print_build_config_vars := \ PLATFORM_VERSION_CODENAME \ PLATFORM_VERSION \ - CM_VERSION \ + AICP_VERSION \ TARGET_PRODUCT \ TARGET_BUILD_VARIANT \ TARGET_BUILD_TYPE \ diff --git a/core/product_config.mk b/core/product_config.mk index 4fcd3f43875..774b342b979 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -179,9 +179,9 @@ include $(BUILD_SYSTEM)/node_fns.mk include $(BUILD_SYSTEM)/product.mk include $(BUILD_SYSTEM)/device.mk -# A CM build needs only the CM product makefiles. -ifneq ($(CM_BUILD),) - all_product_configs := $(shell find device -path "*/$(CM_BUILD)/cm.mk") +# A AICP build needs only the AICP product makefiles. +ifneq ($(AICP_BUILD),) + all_product_configs := $(shell ls vendor/aicp/products/${AICP_BUILD}.mk) else ifneq ($(strip $(TARGET_BUILD_APPS)),) # An unbundled app build needs only the core product makefiles. @@ -192,9 +192,9 @@ else # files in the tree. all_product_configs := $(get-all-product-makefiles) endif # TARGET_BUILD_APPS -endif # CM_BUILD +endif # AICP_BUILD -ifeq ($(CM_BUILD),) +ifeq ($(AICP_BUILD),) # Find the product config makefile for the current product. # all_product_configs consists items like: # : diff --git a/envsetup.sh b/envsetup.sh index 9e09b7104eb..35372a8a095 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -146,13 +146,13 @@ function check_product() return fi - if (echo -n $1 | grep -q -e "^cm_") ; then - CM_BUILD=$(echo -n $1 | sed -e 's/^cm_//g') - export BUILD_NUMBER=$((date +%s%N ; echo $CM_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10) + if (echo -n $1 | grep -q -e "^aicp_") ; then + AICP_BUILD=$(echo -n $1 | sed -e 's/^aicp_//g') + export BUILD_NUMBER=$((date +%s%N ; echo $AICP_BUILD; hostname) | openssl sha1 | sed -e 's/.*=//g; s/ //g' | cut -c1-10) else - CM_BUILD= + AICP_BUILD= fi - export CM_BUILD + export AICP_BUILD TARGET_PRODUCT=$1 \ TARGET_BUILD_VARIANT= \ @@ -566,7 +566,7 @@ function print_lunch_menu() echo " (ohai, koush!)" fi echo - if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + if [ "z${AICP_DEVICES_ONLY}" != "z" ]; then echo "Breakfast menu... pick a combo:" else echo "Lunch menu... pick a combo:" @@ -580,7 +580,7 @@ function print_lunch_menu() i=$(($i+1)) done | column - if [ "z${CM_DEVICES_ONLY}" != "z" ]; then + if [ "z${AICP_DEVICES_ONLY}" != "z" ]; then echo "... and don't forget the bacon!" fi @@ -603,10 +603,10 @@ function breakfast() { target=$1 local variant=$2 - CM_DEVICES_ONLY="true" + AICP_DEVICES_ONLY="true" unset LUNCH_MENU_CHOICES add_lunch_combo full-eng - for f in `/bin/ls vendor/cm/vendorsetup.sh 2> /dev/null` + for f in `/bin/ls vendor/aicp/vendorsetup.sh 2> /dev/null` do echo "including $f" . $f @@ -622,11 +622,11 @@ function breakfast() # A buildtype was specified, assume a full device name lunch $target else - # This is probably just the CM model name + # This is probably just the AICP model name if [ -z "$variant" ]; then variant="userdebug" fi - lunch cm_$target-$variant + lunch aicp_$target-$variant fi fi return $? @@ -686,7 +686,7 @@ function lunch() check_product $product if [ $? -ne 0 ] then - # if we can't find a product, try to grab it off the CM github + # if we can't find a product, try to grab it off the AICP github T=$(gettop) pushd $T > /dev/null build/tools/roomservice.py $product @@ -795,8 +795,8 @@ function tapas() function eat() { if [ "$OUT" ] ; then - MODVERSION=$(get_build_var CM_VERSION) - ZIPFILE=cm-$MODVERSION.zip + MODVERSION=$(get_build_var AICP_VERSION) + ZIPFILE=aicp-$MODVERSION.zip ZIPPATH=$OUT/$ZIPFILE if [ ! -f $ZIPPATH ] ; then echo "Nothing to eat" @@ -811,7 +811,7 @@ function eat() done echo "Device Found.." fi - if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); then # if adbd isn't root we can't write to /cache/recovery/ adb root @@ -833,7 +833,7 @@ EOF fi return $? else - echo "The connected device does not appear to be $CM_BUILD, run away!" + echo "The connected device does not appear to be $AICP_BUILD, run away!" fi } @@ -1848,7 +1848,7 @@ function installboot() sleep 1 adb wait-for-online shell mount /system 2>&1 > /dev/null adb wait-for-online remount - if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); then adb push $OUT/boot.img /cache/ for i in $OUT/system/lib/modules/*; @@ -1859,7 +1859,7 @@ function installboot() adb shell chmod 644 /system/lib/modules/* echo "Installation complete." else - echo "The connected device does not appear to be $CM_BUILD, run away!" + echo "The connected device does not appear to be $AICP_BUILD, run away!" fi } @@ -1893,13 +1893,13 @@ function installrecovery() sleep 1 adb wait-for-online shell mount /system 2>&1 >> /dev/null adb wait-for-online remount - if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD"); + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); then adb push $OUT/recovery.img /cache/ adb shell dd if=/cache/recovery.img of=$PARTITION echo "Installation complete." else - echo "The connected device does not appear to be $CM_BUILD, run away!" + echo "The connected device does not appear to be $AICP_BUILD, run away!" fi } @@ -2322,7 +2322,7 @@ function dopush() echo "Device Found." fi - if (adb shell getprop ro.cm.device | grep -q "$CM_BUILD") || [ "$FORCE_PUSH" = "true" ]; + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD") || [ "$FORCE_PUSH" = "true" ]; then # retrieve IP and PORT info if we're using a TCP connection TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ @@ -2433,7 +2433,7 @@ EOF rm -f $OUT/.log return 0 else - echo "The connected device does not appear to be $CM_BUILD, run away!" + echo "The connected device does not appear to be $AICP_BUILD, run away!" fi } @@ -2451,7 +2451,7 @@ function repopick() { function fixup_common_out_dir() { common_out_dir=$(get_build_var OUT_DIR)/target/common target_device=$(get_build_var TARGET_DEVICE) - if [ ! -z $CM_FIXUP_COMMON_OUT ]; then + if [ ! -z $AICP_FIXUP_COMMON_OUT ]; then if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then mv ${common_out_dir} ${common_out_dir}-${target_device} ln -s ${common_out_dir}-${target_device} ${common_out_dir} @@ -2629,7 +2629,7 @@ unset f # Add completions check_bash_version && { - dirs="sdk/bash_completion vendor/cm/bash_completion" + dirs="sdk/bash_completion vendor/aicp/bash_completion" for dir in $dirs; do if [ -d ${dir} ]; then for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index bb85e7a0803..9cef971a018 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -65,6 +65,6 @@ if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" -echo "ro.cm.device=$CM_DEVICE" +echo "ro.aicp.device=$AICP_DEVICE" echo "# end build properties" diff --git a/tools/device/cm.mk.template b/tools/device/aicp.mk.template similarity index 73% rename from tools/device/cm.mk.template rename to tools/device/aicp.mk.template index e07898a411c..5f76abaa27b 100644 --- a/tools/device/cm.mk.template +++ b/tools/device/aicp.mk.template @@ -1,15 +1,15 @@ # Release name PRODUCT_RELEASE_NAME := __DEVICE__ -# Inherit some common CM stuff. -$(call inherit-product, vendor/cm/config/common_full_phone.mk) +# Inherit some common AICP stuff. +$(call inherit-product, vendor/aicp/configs/common.mk) # Inherit device configuration $(call inherit-product, device/__MANUFACTURER__/__DEVICE__/device___DEVICE__.mk) ## Device identifier. This must come after all inclusions PRODUCT_DEVICE := __DEVICE__ -PRODUCT_NAME := cm___DEVICE__ +PRODUCT_NAME := aicp___DEVICE__ PRODUCT_BRAND := __MANUFACTURER__ PRODUCT_MODEL := __DEVICE__ PRODUCT_MANUFACTURER := __MANUFACTURER__ diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index ac6adddec9f..c545b516ec7 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -166,7 +166,7 @@ def RunBackup(self, command): self.script.append(('run_program("/tmp/install/bin/backuptool.sh", "%s");' % command)) def ValidateSignatures(self, command): - self.script.append('package_extract_file("META-INF/org/cyanogenmod/releasekey", "/tmp/releasekey");') + self.script.append('package_extract_file("META-INF/org/aicp/releasekey", "/tmp/releasekey");') # Exit code 124 == abort. run_program returns raw, so left-shift 8bit self.script.append('run_program("/tmp/install/bin/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");') diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 008f687b7f7..ae34d9cca45 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -790,7 +790,7 @@ def output_sink(fn, data): common.ZipWriteStr(output_zip, "system/build.prop", ""+input_zip.read("SYSTEM/build.prop")) - common.ZipWriteStr(output_zip, "META-INF/org/cyanogenmod/releasekey", + common.ZipWriteStr(output_zip, "META-INF/org/aicp/releasekey", ""+input_zip.read("META/releasekey.txt")) def WritePolicyConfig(file_name, output_zip): diff --git a/tools/roomservice.py b/tools/roomservice.py index a1b69cdac65..f51b983d7e0 100755 --- a/tools/roomservice.py +++ b/tools/roomservice.py @@ -51,7 +51,7 @@ device = product if not depsonly: - print("Device %s not found. Attempting to retrieve device repository from CyanogenMod Github (http://github.com/CyanogenMod)." % device) + print("Device %s not found. Attempting to retrieve device repository from AICP Github (http://github.com/AICP)." % device) repositories = [] @@ -71,7 +71,7 @@ def add_auth(githubreq): githubreq.add_header("Authorization","Basic %s" % githubauth) if not depsonly: - githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:CyanogenMod+in:name+fork:true" % device) + githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:AICP+in:name+fork:true" % device) add_auth(githubreq) try: result = json.loads(urllib.request.urlopen(githubreq).read().decode()) @@ -175,12 +175,12 @@ def add_to_manifest(repositories, fallback_branch = None): repo_target = repository['target_path'] print('Checking if %s is fetched from %s' % (repo_target, repo_name)) if is_in_manifest(repo_target): - print('CyanogenMod/%s already fetched to %s' % (repo_name, repo_target)) + print('AICP/%s already fetched to %s' % (repo_name, repo_target)) continue - print('Adding dependency: CyanogenMod/%s -> %s' % (repo_name, repo_target)) + print('Adding dependency: AICP/%s -> %s' % (repo_name, repo_target)) project = ElementTree.Element("project", attrib = { "path": repo_target, - "remote": "github", "name": "CyanogenMod/%s" % repo_name }) + "remote": "github", "name": "AICP/%s" % repo_name }) if 'branch' in repository: project.set('revision',repository['branch']) @@ -202,7 +202,7 @@ def add_to_manifest(repositories, fallback_branch = None): def fetch_dependencies(repo_path, fallback_branch = None): print('Looking for dependencies') - dependencies_path = repo_path + '/cm.dependencies' + dependencies_path = repo_path + '/aicp.dependencies' syncable_repos = [] if os.path.exists(dependencies_path): @@ -247,9 +247,9 @@ def has_branch(branches, revision): repo_name = repository['name'] if repo_name.startswith("android_device_") and repo_name.endswith("_" + device): print("Found repository: %s" % repository['name']) - + manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "") - + default_revision = get_default_revision() print("Default revision: %s" % default_revision) print("Checking branch info") @@ -262,10 +262,10 @@ def has_branch(branches, revision): githubreq = urllib.request.Request(repository['tags_url'].replace('{/tag}', '')) add_auth(githubreq) result.extend (json.loads(urllib.request.urlopen(githubreq).read().decode())) - + repo_path = "device/%s/%s" % (manufacturer, device) adding = {'repository':repo_name,'target_path':repo_path} - + fallback_branch = None if not has_branch(result, default_revision): if os.getenv('ROOMSERVICE_BRANCHES'): @@ -294,4 +294,4 @@ def has_branch(branches, revision): print("Done") sys.exit() -print("Repository for %s not found in the CyanogenMod Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) +print("Repository for %s not found in the AICP Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) From 64987e9bd80eb53d142db022a2868ad3b5e442da Mon Sep 17 00:00:00 2001 From: Akhil Narang Date: Wed, 11 Nov 2015 18:45:54 +0200 Subject: [PATCH 288/502] build: Port Changelog from lp5.1 Change-Id: I48aa4f0f231230f456645a9b36ab062cadf3dbb6 --- core/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index bd6b4ee4d58..68b3969b6ab 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1182,7 +1182,14 @@ INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \ $(RECOVERY_RESOURCE_ZIP)) -FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) +systemimage-changelog: $(INTERNAL_SYSTEMIMAGE_FILES) + @echo -e "Making changelog!" + $(hide) APKCERTS=$(APKCERTS_FILE) ./vendor/aicp/tools/changelog + +.PHONY: systemimage-changelog + +FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) systemimage-changelog + # ----------------------------------------------------------------- # installed file list # Depending on anything that $(BUILT_SYSTEMIMAGE) depends on. From 0e8f4965a29819ac55a6adf161d339af97ddefa2 Mon Sep 17 00:00:00 2001 From: Simon Shields Date: Sat, 27 Aug 2016 01:49:14 +1000 Subject: [PATCH 289/502] repopick: don't re-pick duplicate changes check the last 10 commits to HEAD for a dupe change id. Change-Id: Icfbf8b4eae165cf84ef4a82f54f792e9c9acd67b --- tools/repopick.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/repopick.py b/tools/repopick.py index 2b0aab417cd..6e40f384980 100755 --- a/tools/repopick.py +++ b/tools/repopick.py @@ -275,6 +275,7 @@ def fetch_query(remote_url, query): 'subject': review['subject'], 'project': review['project'], 'branch': review['branch'], + 'change_id': review['change_id'], 'change_number': review['number'], 'status': review['status'], 'fetch': None @@ -317,6 +318,19 @@ def fetch_query(remote_url, query): if args.start_branch: subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) + # Check if change is already picked to HEAD...HEAD~10 + found_change = False + for i in range(0, 10): + output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() + if 'Change-Id:' in output: + head_change_id = output[output.index('Change-Id:')+1] + if head_change_id.strip() == item['change_id']: + print('Skipping {0} - already picked in {1} as HEAD~{2}'.format(item['id'], project_path, i)) + found_change = True + break + if found_change: + continue + # Print out some useful info if not args.quiet: print('--> Subject: "{0}"'.format(item['subject'])) From 9bd4349a15e2e6b9f40780e5d9dfbf98502186c5 Mon Sep 17 00:00:00 2001 From: Simon Shields Date: Sun, 28 Aug 2016 01:52:11 +1000 Subject: [PATCH 290/502] build: don't overwrite flags from BoardConfig Change-Id: Iff413c1ede334c8315a2082d9849e6c32d3aa8f7 --- core/combo/select.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/combo/select.mk b/core/combo/select.mk index df12e7e3845..8e72589b3ec 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -33,12 +33,12 @@ $(combo_var_prefix)CXX := $(CXX) $(combo_var_prefix)AR := $(AR) $(combo_var_prefix)STRIP := $(STRIP) -$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar -$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing -$(combo_var_prefix)GLOBAL_CPPFLAGS := -$(combo_var_prefix)GLOBAL_LDFLAGS := -$(combo_var_prefix)GLOBAL_ARFLAGS := crsPD -$(combo_var_prefix)GLOBAL_LD_DIRS := +$(combo_var_prefix)GLOBAL_CFLAGS += -fno-exceptions -Wno-multichar +$(combo_var_prefix)RELEASE_CFLAGS += -O2 -g -fno-strict-aliasing +$(combo_var_prefix)GLOBAL_CPPFLAGS += +$(combo_var_prefix)GLOBAL_LDFLAGS += +$(combo_var_prefix)GLOBAL_ARFLAGS += crsPD +$(combo_var_prefix)GLOBAL_LD_DIRS += $(combo_var_prefix)EXECUTABLE_SUFFIX := $(combo_var_prefix)SHLIB_SUFFIX := .so From 1e5e8fe246594a9a66e4bda678e6234345bb6de0 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Sun, 28 Aug 2016 20:25:56 +0800 Subject: [PATCH 291/502] Revert "build: don't overwrite flags from BoardConfig" * Broke bionic build on multiarch. This reverts commit 8a570fa12fae714641d7590f77b39d676a533409. Change-Id: I1bc3aa90d584ac7985ce48aabe6f1ca63f065899 --- core/combo/select.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/combo/select.mk b/core/combo/select.mk index 8e72589b3ec..df12e7e3845 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -33,12 +33,12 @@ $(combo_var_prefix)CXX := $(CXX) $(combo_var_prefix)AR := $(AR) $(combo_var_prefix)STRIP := $(STRIP) -$(combo_var_prefix)GLOBAL_CFLAGS += -fno-exceptions -Wno-multichar -$(combo_var_prefix)RELEASE_CFLAGS += -O2 -g -fno-strict-aliasing -$(combo_var_prefix)GLOBAL_CPPFLAGS += -$(combo_var_prefix)GLOBAL_LDFLAGS += -$(combo_var_prefix)GLOBAL_ARFLAGS += crsPD -$(combo_var_prefix)GLOBAL_LD_DIRS += +$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar +$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing +$(combo_var_prefix)GLOBAL_CPPFLAGS := +$(combo_var_prefix)GLOBAL_LDFLAGS := +$(combo_var_prefix)GLOBAL_ARFLAGS := crsPD +$(combo_var_prefix)GLOBAL_LD_DIRS := $(combo_var_prefix)EXECUTABLE_SUFFIX := $(combo_var_prefix)SHLIB_SUFFIX := .so From fd7ca28cbdbed3f93228938dc52dbe67c8688d2d Mon Sep 17 00:00:00 2001 From: LorDClockaN Date: Sun, 28 Aug 2016 22:42:21 +0200 Subject: [PATCH 292/502] Use MM roomservice Change-Id: Ifb67c1269a738bf263f5caa56e963bb05cefbcb1 --- tools/roomservice.py | 173 +++++++++++++++++++------------------------ 1 file changed, 75 insertions(+), 98 deletions(-) diff --git a/tools/roomservice.py b/tools/roomservice.py index f51b983d7e0..110c7b5d261 100755 --- a/tools/roomservice.py +++ b/tools/roomservice.py @@ -1,5 +1,6 @@ #!/usr/bin/env python -# Copyright (C) 2012-2013, The CyanogenMod Project +# Copyright (C) 2012 The CyanogenMod Project +# Copyright (C) 2012-2014 AICP Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -55,43 +56,29 @@ repositories = [] -try: - authtuple = netrc.netrc().authenticators("api.github.com") - - if authtuple: - auth_string = ('%s:%s' % (authtuple[0], authtuple[2])).encode() - githubauth = base64.encodestring(auth_string).decode().replace('\n', '') - else: - githubauth = None -except: - githubauth = None - -def add_auth(githubreq): - if githubauth: - githubreq.add_header("Authorization","Basic %s" % githubauth) - -if not depsonly: - githubreq = urllib.request.Request("https://api.github.com/search/repositories?q=%s+user:AICP+in:name+fork:true" % device) - add_auth(githubreq) - try: - result = json.loads(urllib.request.urlopen(githubreq).read().decode()) - except urllib.error.URLError: - print("Failed to search GitHub") - sys.exit() - except ValueError: - print("Failed to parse return data from GitHub") - sys.exit() - for res in result.get('items', []): +page = 1 +while not depsonly: + result = json.loads(urllib.request.urlopen("https://api.github.com/users/AICP/repos?page=%d" % page).read().decode()) + if len(result) == 0: + break + for res in result: repositories.append(res) + page = page + 1 local_manifests = r'.repo/local_manifests' if not os.path.exists(local_manifests): os.makedirs(local_manifests) -def exists_in_tree(lm, path): +def exists_in_tree(lm, repository): for child in lm.getchildren(): - if child.attrib['path'] == path: - return True - return False + if child.attrib['path'].endswith(repository): + return child + return None + +def exists_in_tree_device(lm, repository): + for child in lm.getchildren(): + if child.attrib['name'].endswith(repository): + return child + return None # in-place prettyprint formatter def indent(elem, level=0): @@ -109,21 +96,15 @@ def indent(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i -def get_default_revision(): - m = ElementTree.parse(".repo/manifest.xml") - d = m.findall('default')[0] - r = d.get('revision') - return r.replace('refs/heads/', '').replace('refs/tags/', '') - def get_from_manifest(devicename): try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") lm = lm.getroot() except: lm = ElementTree.Element("manifest") for localpath in lm.findall("project"): - if re.search("android_device_.*_%s$" % device, localpath.get("name")): + if re.search("device_.*_%s$" % device, localpath.get("name")): return localpath.get("path") # Devices originally from AOSP are in the main manifest... @@ -134,38 +115,66 @@ def get_from_manifest(devicename): mm = ElementTree.Element("manifest") for localpath in mm.findall("project"): - if re.search("android_device_.*_%s$" % device, localpath.get("name")): + if re.search("device_.*_%s$" % device, localpath.get("name")): return localpath.get("path") return None -def is_in_manifest(projectpath): +def is_in_manifest(projectname, branch): try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") lm = lm.getroot() except: lm = ElementTree.Element("manifest") for localpath in lm.findall("project"): - if localpath.get("path") == projectpath: - return True + if localpath.get("name") == projectname and localpath.get("revision") == branch: + return 1 + + return None - ## Search in main manifest, too +def add_to_manifest_dependencies(repositories): try: - lm = ElementTree.parse(".repo/manifest.xml") + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") lm = lm.getroot() except: lm = ElementTree.Element("manifest") - for localpath in lm.findall("project"): - if localpath.get("path") == projectpath: - return True + for repository in repositories: + repo_name = repository['repository'] + repo_target = repository['target_path'] + existing_project = exists_in_tree(lm, repo_target) + if existing_project != None: + if existing_project.attrib['name'] != repository['repository']: + print ('Updating dependency %s' % (repo_name)) + existing_project.set('name', repository['repository']) + if existing_project.attrib['revision'] == repository['branch']: + print ('AICP/%s already exists' % (repo_name)) + else: + print ('updating branch for %s to %s' % (repo_name, repository['branch'])) + existing_project.set('revision', repository['branch']) + continue + + print ('Adding dependency: %s -> %s' % (repo_name, repo_target)) + project = ElementTree.Element("project", attrib = { "path": repo_target, + "remote": "aicp", "name": repo_name, "revision": "n7.0" }) + + if 'branch' in repository: + project.set('revision',repository['branch']) + + lm.append(project) + + indent(lm, 0) + raw_xml = ElementTree.tostring(lm).decode() + raw_xml = '\n' + raw_xml - return False + f = open('.repo/local_manifests/aicp_manifest.xml', 'w') + f.write(raw_xml) + f.close() -def add_to_manifest(repositories, fallback_branch = None): +def add_to_manifest(repositories): try: - lm = ElementTree.parse(".repo/local_manifests/roomservice.xml") + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") lm = lm.getroot() except: lm = ElementTree.Element("manifest") @@ -173,14 +182,13 @@ def add_to_manifest(repositories, fallback_branch = None): for repository in repositories: repo_name = repository['repository'] repo_target = repository['target_path'] - print('Checking if %s is fetched from %s' % (repo_target, repo_name)) - if is_in_manifest(repo_target): - print('AICP/%s already fetched to %s' % (repo_name, repo_target)) + if exists_in_tree(lm, repo_name): + print('AICP/%s already exists' % (repo_name)) continue print('Adding dependency: AICP/%s -> %s' % (repo_name, repo_target)) project = ElementTree.Element("project", attrib = { "path": repo_target, - "remote": "github", "name": "AICP/%s" % repo_name }) + "remote": "aicp", "name": "AICP/%s" % repo_name, "revision": "n7.0" }) if 'branch' in repository: project.set('revision',repository['branch']) @@ -196,7 +204,7 @@ def add_to_manifest(repositories, fallback_branch = None): raw_xml = ElementTree.tostring(lm).decode() raw_xml = '\n' + raw_xml - f = open('.repo/local_manifests/roomservice.xml', 'w') + f = open('.repo/local_manifests/aicp_manifest.xml', 'w') f.write(raw_xml) f.close() @@ -211,7 +219,7 @@ def fetch_dependencies(repo_path, fallback_branch = None): fetch_list = [] for dependency in dependencies: - if not is_in_manifest(dependency['target_path']): + if not is_in_manifest("%s" % dependency['repository'], "%s" % dependency['branch']): fetch_list.append(dependency) syncable_repos.append(dependency['target_path']) @@ -219,7 +227,7 @@ def fetch_dependencies(repo_path, fallback_branch = None): if len(fetch_list) > 0: print('Adding dependencies to manifest') - add_to_manifest(fetch_list, fallback_branch) + add_to_manifest_dependencies(fetch_list) else: print('Dependencies file not found, bailing out.') @@ -233,6 +241,7 @@ def fetch_dependencies(repo_path, fallback_branch = None): def has_branch(branches, revision): return revision in [branch['name'] for branch in branches] + if depsonly: repo_path = get_from_manifest(device) if repo_path: @@ -245,53 +254,21 @@ def has_branch(branches, revision): else: for repository in repositories: repo_name = repository['name'] - if repo_name.startswith("android_device_") and repo_name.endswith("_" + device): + if repo_name.startswith("device_") and repo_name.endswith("_" + device): print("Found repository: %s" % repository['name']) - manufacturer = repo_name.replace("android_device_", "").replace("_" + device, "") - - default_revision = get_default_revision() - print("Default revision: %s" % default_revision) - print("Checking branch info") - githubreq = urllib.request.Request(repository['branches_url'].replace('{/branch}', '')) - add_auth(githubreq) - result = json.loads(urllib.request.urlopen(githubreq).read().decode()) - - ## Try tags, too, since that's what releases use - if not has_branch(result, default_revision): - githubreq = urllib.request.Request(repository['tags_url'].replace('{/tag}', '')) - add_auth(githubreq) - result.extend (json.loads(urllib.request.urlopen(githubreq).read().decode())) + manufacturer = repo_name.replace("device_", "").replace("_" + device, "") repo_path = "device/%s/%s" % (manufacturer, device) - adding = {'repository':repo_name,'target_path':repo_path} - - fallback_branch = None - if not has_branch(result, default_revision): - if os.getenv('ROOMSERVICE_BRANCHES'): - fallbacks = list(filter(bool, os.getenv('ROOMSERVICE_BRANCHES').split(' '))) - for fallback in fallbacks: - if has_branch(result, fallback): - print("Using fallback branch: %s" % fallback) - fallback_branch = fallback - break - - if not fallback_branch: - print("Default revision %s not found in %s. Bailing." % (default_revision, repo_name)) - print("Branches found:") - for branch in [branch['name'] for branch in result]: - print(branch) - print("Use the ROOMSERVICE_BRANCHES environment variable to specify a list of fallback branches.") - sys.exit() - - add_to_manifest([adding], fallback_branch) + + add_to_manifest([{'repository':repo_name,'target_path':repo_path,'branch':'n7.0'}]) print("Syncing repository to retrieve project.") os.system('repo sync --force-sync %s' % repo_path) print("Repository synced!") - fetch_dependencies(repo_path, fallback_branch) + fetch_dependencies(repo_path) print("Done") sys.exit() -print("Repository for %s not found in the AICP Github repository list. If this is in error, you may need to manually add it to your local_manifests/roomservice.xml." % device) +print("Repository for %s not found in the AICP Github repository list. If this is in error, you may need to manually add it to your local_manifests/aicp_manifest.xml." % device) From 6aa786d3a107008ed331bc2714c231466a9df512 Mon Sep 17 00:00:00 2001 From: doc HD Date: Mon, 29 Aug 2016 19:41:30 +0300 Subject: [PATCH 293/502] build: AICPfy Part XX Change-Id: I3daa570db99b633d657ff60f2d0648124e5964ec --- .../product/security/{cm-devkey.x509.pem => aicp-devkey.x509.pem} | 0 target/product/security/{cm.x509.pem => aicp.x509.pem} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename target/product/security/{cm-devkey.x509.pem => aicp-devkey.x509.pem} (100%) rename target/product/security/{cm.x509.pem => aicp.x509.pem} (100%) diff --git a/target/product/security/cm-devkey.x509.pem b/target/product/security/aicp-devkey.x509.pem similarity index 100% rename from target/product/security/cm-devkey.x509.pem rename to target/product/security/aicp-devkey.x509.pem diff --git a/target/product/security/cm.x509.pem b/target/product/security/aicp.x509.pem similarity index 100% rename from target/product/security/cm.x509.pem rename to target/product/security/aicp.x509.pem From e0a81a5569e3b16980d23990dbcc9ca93f81acfd Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Wed, 31 Aug 2016 16:30:19 +0200 Subject: [PATCH 294/502] repopick: handle revisions with slashes Change-Id: I6f7891a52fb1538e88f5a68dd28ef1c603ee7067 --- tools/repopick.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/repopick.py b/tools/repopick.py index 6e40f384980..2b436ef9b55 100755 --- a/tools/repopick.py +++ b/tools/repopick.py @@ -210,7 +210,7 @@ def fetch_query(remote_url, query): xml_root = ElementTree.fromstring(manifest) projects = xml_root.findall('project') remotes = xml_root.findall('remote') - default_revision = xml_root.findall('default')[0].get('revision').split('/')[-1] + default_revision = xml_root.findall('default')[0].get('revision') #dump project data into the a list of dicts with the following data: #{project: {path, revision}} @@ -228,6 +228,7 @@ def fetch_query(remote_url, query): if not name in project_name_to_data: project_name_to_data[name] = {} + revision = revision.split('refs/heads/')[-1] project_name_to_data[name][revision] = path # get data on requested changes From e9ac166e64f25f87abdf0759ee25b4a07c6c3c96 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Wed, 31 Aug 2016 15:12:01 +0200 Subject: [PATCH 295/502] core: Fix build_{date,number} Change-Id: I81e6cb0e5e191f669bb665207d71f28f3fa19581 --- core/main.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/main.mk b/core/main.mk index b9137bcb29d..90150065f48 100644 --- a/core/main.mk +++ b/core/main.mk @@ -122,8 +122,8 @@ endif $(shell mkdir -p $(OUT_DIR) && \ echo -n $(BUILD_NUMBER) > $(OUT_DIR)/build_number.txt && \ echo -n $(BUILD_DATETIME) > $(OUT_DIR)/build_date.txt) -BUILD_NUMBER_FROM_FILE := $(cat $(OUT_DIR)/build_number.txt) -BUILD_DATETIME_FROM_FILE := $(cat $(OUT_DIR)/build_date.txt) +BUILD_NUMBER_FROM_FILE := $(shell cat $(OUT_DIR)/build_number.txt) +BUILD_DATETIME_FROM_FILE := $(shell cat $(OUT_DIR)/build_date.txt) ifeq ($(HOST_OS),darwin) DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE) else From e50fba80dd67fff67b6c2a4699c808d0eb2f8905 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Tue, 30 Aug 2016 22:24:18 -0400 Subject: [PATCH 296/502] main: Use date -d on OSX * OSX doesn't have an -r flag on date Change-Id: I04cb58366926418fb9b05482514800a5a72af0e1 Signed-off-by: Brandon McAnsh --- core/main.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/main.mk b/core/main.mk index 90150065f48..ed37e02ae32 100644 --- a/core/main.mk +++ b/core/main.mk @@ -125,7 +125,7 @@ $(shell mkdir -p $(OUT_DIR) && \ BUILD_NUMBER_FROM_FILE := $(shell cat $(OUT_DIR)/build_number.txt) BUILD_DATETIME_FROM_FILE := $(shell cat $(OUT_DIR)/build_date.txt) ifeq ($(HOST_OS),darwin) -DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE) +DATE_FROM_FILE := date -d $(BUILD_DATETIME_FROM_FILE) else DATE_FROM_FILE := date -d @$(BUILD_DATETIME_FROM_FILE) endif From f04466809be173b3e7802821957cf551c41bff28 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Tue, 30 Aug 2016 15:38:04 -0700 Subject: [PATCH 297/502] build: Re-add I_WANT_A_QUAIL_STAR * This partially reverts commit c7d6cc2a9cda88c8b110f69d8e121a732d570aa7 * Move cmsdk check to checkapi-cm, android checkapi shouldn't be under this ifeq Change-Id: Ia7c9853cc5f978ed533f2879367428eb1d64bd46 --- core/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 68b3969b6ab..4d5cbec83ff 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1267,10 +1267,12 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) -ifneq ($(TARGET_DISABLE_CMSDK), true) +ifndef I_WANT_A_QUAIL_STAR $(BUILT_SYSTEMIMAGE): checkapi +ifneq ($(TARGET_DISABLE_CMSDK),true) $(BUILT_SYSTEMIMAGE): checkapi-cm endif +endif INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) From e0cb1c927e092c5ed3fefcc3fbf94ee45d3e83b1 Mon Sep 17 00:00:00 2001 From: doc HD Date: Mon, 29 Aug 2016 01:16:23 +0300 Subject: [PATCH 298/502] build: No more Java check Change-Id: Ifed887874b517ec335082f3eb7a4e079f4cac099 --- core/main.mk | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/main.mk b/core/main.mk index ed37e02ae32..abb811fc3cc 100644 --- a/core/main.mk +++ b/core/main.mk @@ -236,7 +236,6 @@ $(info ************************************************************) $(info You asked for an OpenJDK based build but your version is) $(info $(java_version_str).) $(info ************************************************************) -$(error stop) endif # java version is not OpenJdk else # if requires_openjdk ifneq ($(shell echo '$(java_version_str)' | grep -i openjdk),) @@ -247,7 +246,6 @@ $(info You use OpenJDK but only Sun/Oracle JDK is supported.) $(info Please follow the machine setup instructions at) $(info $(space)$(space)$(space)$(space)https://source.android.com/source/download.html) $(info ************************************************************) -$(error stop) endif # java version is not Sun Oracle JDK endif # if requires_openjdk From ef8542b9ad06bb76bdab8cd466f0493e1adabd9c Mon Sep 17 00:00:00 2001 From: Simon Shields Date: Sun, 28 Aug 2016 23:52:24 +1000 Subject: [PATCH 299/502] build: add BOARD_GLOBAL_C[PP]FLAGS to TARGET_GLOBAL_C[PP]FLAGS * workaround these being reset after BoardConfig.mk is run Change-Id: Ibe984d862df0e1a5910ea80a66c44d599c299f10 --- core/combo/select.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/combo/select.mk b/core/combo/select.mk index df12e7e3845..97d62c6845f 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -33,9 +33,9 @@ $(combo_var_prefix)CXX := $(CXX) $(combo_var_prefix)AR := $(AR) $(combo_var_prefix)STRIP := $(STRIP) -$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar -$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing -$(combo_var_prefix)GLOBAL_CPPFLAGS := +$(combo_var_prefix)GLOBAL_CFLAGS := -fno-exceptions -Wno-multichar $(BOARD_GLOBAL_CFLAGS) +$(combo_var_prefix)RELEASE_CFLAGS := -O2 -g -fno-strict-aliasing $(BOARD_RELEASE_CFLAGS) +$(combo_var_prefix)GLOBAL_CPPFLAGS := $(BOARD_GLOBAL_CPPFLAGS) $(combo_var_prefix)GLOBAL_LDFLAGS := $(combo_var_prefix)GLOBAL_ARFLAGS := crsPD $(combo_var_prefix)GLOBAL_LD_DIRS := From a59d8a41ecb9743f73440d89ccacb60dc1c4ad9c Mon Sep 17 00:00:00 2001 From: doc HD Date: Wed, 31 Aug 2016 15:28:54 +0300 Subject: [PATCH 300/502] build: Don't force checkapi-cm on system image gen. This reverts commit 7ffcafbc3139567a228da5942980d3fc5b1abb99. Change-Id: Ic79e954bb97f4b6748ecce874def97ce432099bc --- core/Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/Makefile b/core/Makefile index 4d5cbec83ff..59b592a76de 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1267,11 +1267,8 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) -ifndef I_WANT_A_QUAIL_STAR -$(BUILT_SYSTEMIMAGE): checkapi ifneq ($(TARGET_DISABLE_CMSDK),true) -$(BUILT_SYSTEMIMAGE): checkapi-cm -endif +$(BUILT_SYSTEMIMAGE): checkapi endif INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img From 62d9ff03bebde89eb79a38fb8f56aa4523ddebee Mon Sep 17 00:00:00 2001 From: Steve Kondik Date: Sun, 4 Sep 2016 02:39:12 -0700 Subject: [PATCH 301/502] releasetools: Fix py3 issue in QC change Conflicts: tools/releasetools/build_image.py Change-Id: I04c4f7b4e978e4c0cd4928f3afd8243914d86f68 --- tools/releasetools/build_image.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 96dc1431fa1..4b64db869e7 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -382,6 +382,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): adjusted_size = AdjustPartitionSizeForVerity(partition_size, verity_fec_supported) if not adjusted_size: + print("Error: adjusting partition size for verity failed, partition_size = %d" % partition_size) return False prop_dict["partition_size"] = str(adjusted_size) prop_dict["original_partition_size"] = str(partition_size) @@ -411,6 +412,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): if "base_fs_file" in prop_dict: base_fs_file = ConvertBlockMapToBaseFs(prop_dict["base_fs_file"]) if base_fs_file is None: + print("Error: no base fs file found") return False build_command.extend(["-d", base_fs_file]) build_command.extend(["-L", prop_dict["mount_point"]]) @@ -464,8 +466,10 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): try: if reserved_blocks and fs_type.startswith("ext4"): + print("fs type is ext4") (ext4fs_output, exit_code) = RunCommand(build_command) else: + print("fs type is not ext4") (_, exit_code) = RunCommand(build_command) finally: if in_dir != origin_in: @@ -476,6 +480,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): if base_fs_file is not None: os.remove(base_fs_file) if exit_code != 0: + print("Error: %s command unsuccessful" % build_command) return False # Bug: 21522719, 22023465 @@ -516,11 +521,13 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None): # create the verified image if this is to be verified if verity_supported and is_verity_partition: if not MakeVerityEnabledImage(out_file, verity_fec_supported, prop_dict): + print("Error: making verity enabled image failed") return False if run_fsck and prop_dict.get("skip_fsck") != "true": success, unsparse_image = UnsparseImage(out_file, replace=False) if not success: + print("Error: unparsing of image failed") return False # Run e2fsck on the inflated image file From 28a89fb4ebbdc92613f607165d2a27ddb564411d Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Thu, 1 Sep 2016 00:30:37 -0400 Subject: [PATCH 302/502] kernel: Add MAKE_FLAGS to kernel header generation Change-Id: I284dc1df58ca33c0e4e029c152088cc19b8f2f56 Signed-off-by: Brandon McAnsh --- core/tasks/kernel.mk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index 9c73ad0f8cf..30b7d2c3b50 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -314,20 +314,20 @@ $(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) @echo "Building Kernel Headers" $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \ rm -f ../$(KERNEL_CONFIG); \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi $(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \ echo "Used a different defconfig for header generation"; \ rm -f ../$(KERNEL_CONFIG); \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi $(hide) touch $@ # provide this rule because there are dependencies on this throughout the repo From 72425a18a24ec0e005b89042a67e9a39eb63fb03 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 11 Oct 2015 19:10:28 +0300 Subject: [PATCH 303/502] Revert "Remove mkyaffs2image references." * Can be enabled on devices that need it with TARGET_USERIMAGES_USE_YAFFS This reverts commit 65d4186f85ddd8c3f6d0c521f31911cceee573c1. Change-Id: I891f2e6a963178ffec92fedb25e7e28c60a768d1 --- core/Makefile | 17 +++++++++++++++-- core/config.mk | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/core/Makefile b/core/Makefile index 59b592a76de..57cfd4b4003 100644 --- a/core/Makefile +++ b/core/Makefile @@ -780,6 +780,9 @@ ifeq ($(INTERNAL_USERIMAGES_EXT_VARIANT),) INTERNAL_USERIMAGES_EXT_VARIANT := f2fs endif endif +ifeq ($(TARGET_USERIMAGES_USE_YAFFS),true) +INTERNAL_USERIMAGES_USE_YAFFS := true +endif # These options tell the recovery updater/installer how to mount the partitions writebale. # =[|]... @@ -799,6 +802,9 @@ endif ifeq ($(INTERNAL_USERIMAGES_USE_F2FS),true) INTERNAL_USERIMAGES_DEPS += $(MKF2FSUSERIMG) $(MAKE_F2FS) endif +ifeq ($(INTERNAL_USERIMAGES_USE_YAFFS),true) +INTERNAL_USERIMAGES_DEPS += $(MKYAFFS2) +endif ifneq (true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED)) INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG := -s @@ -851,6 +857,7 @@ $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),$(hide) echo "v $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1)) $(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1)) $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1)) +$(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1)) $(if $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG),$(hide) echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG)" >> $(1)) $(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER),$(hide) echo "boot_signer=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)" >> $(1)) @@ -1153,11 +1160,16 @@ $(INSTALLED_RECOVERYZIP_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(TARGET_OUT) .PHONY: recoveryzip recoveryzip: $(INSTALLED_RECOVERYZIP_TARGET) -ifeq ($(BOARD_NAND_PAGE_SIZE),) +ifneq ($(BOARD_NAND_PAGE_SIZE),) +mkyaffs2_extra_flags := -c $(BOARD_NAND_PAGE_SIZE) +else +mkyaffs2_extra_flags := BOARD_NAND_PAGE_SIZE := 2048 endif -ifeq ($(BOARD_NAND_SPARE_SIZE),) +ifneq ($(BOARD_NAND_SPARE_SIZE),) +mkyaffs2_extra_flags += -s $(BOARD_NAND_SPARE_SIZE) +else BOARD_NAND_SPARE_SIZE := 64 endif @@ -1638,6 +1650,7 @@ OTATOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \ $(HOST_OUT_EXECUTABLES)/mkbootimg \ $(HOST_OUT_EXECUTABLES)/unpackbootimg \ $(HOST_OUT_EXECUTABLES)/fs_config \ + $(HOST_OUT_EXECUTABLES)/mkyaffs2image \ $(HOST_OUT_EXECUTABLES)/zipalign \ $(HOST_OUT_EXECUTABLES)/bsdiff \ $(HOST_OUT_EXECUTABLES)/imgdiff \ diff --git a/core/config.mk b/core/config.mk index 0fb3ab9473d..99744b1f2c0 100644 --- a/core/config.mk +++ b/core/config.mk @@ -556,6 +556,7 @@ MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX) else MKBOOTIMG := $(BOARD_CUSTOM_MKBOOTIMG) endif +MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX) APICHECK := $(HOST_OUT_EXECUTABLES)/apicheck$(HOST_EXECUTABLE_SUFFIX) MKIMAGE := $(HOST_OUT_EXECUTABLES)/mkimage$(HOST_EXECUTABLE_SUFFIX) FS_GET_STATS := $(HOST_OUT_EXECUTABLES)/fs_get_stats$(HOST_EXECUTABLE_SUFFIX) From 4dda4278847ec1ba5e3904ffebfb4da9f31a737b Mon Sep 17 00:00:00 2001 From: Chris Sarbora Date: Wed, 17 Dec 2014 14:41:04 -0800 Subject: [PATCH 304/502] Allow finer control over how product variables are inherited. Change-Id: I3abc22eea94293d1d0ebf0a81b396ebea0baf5a8 (cherry picked from commit 29357f5ea1dd8507f70efc330b2e5966d13504e8) --- core/product.mk | 69 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/core/product.mk b/core/product.mk index 1a0fe3125df..23df6a22aa7 100644 --- a/core/product.mk +++ b/core/product.mk @@ -141,19 +141,37 @@ $(foreach p,$(PRODUCTS),$(call dump-product,$(p))) endef # -# $(1): product to inherit +# Internal function. Appends inherited product variables to an existing one. # -# Does three things: -# 1. Inherits all of the variables from $1. -# 2. Records the inheritance in the .INHERITS_FROM variable -# 3. Records that we've visited this node, in ALL_PRODUCTS +# $(1): Product variable to operate on +# $(2): Value to append # -define inherit-product +define inherit-product_append-var + $(if $(findstring ../,$(2)),\ + $(eval np := $(call normalize-paths,$(2))),\ + $(eval np := $(strip $(2))))\ + $(eval $(1) := $($(1)) $(INHERIT_TAG)$(np)) +endef + +# +# Internal function. Prepends inherited product variables to an existing one. +# +# $(1): Product variable to operate on +# $(2): Value to prepend +# +define inherit-product_prepend-var + $(eval $(1) := $(INHERIT_TAG)$(strip $(2)) $($(1))) +endef + +# +# Internal function. Tracks visited notes during inheritance resolution. +# +# $(1): Product being inherited +# +define inherit-product_track-node $(if $(findstring ../,$(1)),\ $(eval np := $(call normalize-paths,$(1))),\ $(eval np := $(strip $(1))))\ - $(foreach v,$(_product_var_list), \ - $(eval $(v) := $($(v)) $(INHERIT_TAG)$(np))) \ $(eval inherit_var := \ PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \ $(eval $(inherit_var) := $(sort $($(inherit_var)) $(np))) \ @@ -161,6 +179,34 @@ define inherit-product $(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack)))) endef +# +# $(1): product to inherit +# +# Does three things: +# 1. Inherits all of the variables from $1, prioritizing existing settings. +# 2. Records the inheritance in the .INHERITS_FROM variable +# 3. Records that we've visited this node, in ALL_PRODUCTS +# + +define inherit-product + $(foreach v,$(_product_var_list), \ + $(call inherit-product_append-var,$(v),$(1))) \ + $(call inherit-product_track-node,$(1)) +endef + +# +# $(1): product to inherit +# +# Does three things: +# 1. Inherits all of the variables from $1, prioritizing inherited settings. +# 2. Records the inheritance in the .INHERITS_FROM variable +# 3. Records that we've visited this node, in ALL_PRODUCTS +# +define prepend-product + $(foreach v,$(_product_var_list), \ + $(call inherit-product_prepend-var,$(v),$(1))) \ + $(call inherit-product_track-node,$(1)) +endef # # Do inherit-product only if $(1) exists @@ -169,6 +215,13 @@ define inherit-product-if-exists $(if $(wildcard $(1)),$(call inherit-product,$(1)),) endef +# +# Do inherit-product-prepend only if $(1) exists +# +define prepend-product-if-exists + $(if $(wildcard $(1)),$(call prepend-product,$(1)),) +endef + # # $(1): product makefile list # From a21c66e57931381b52f593b35be7e76e3531f921 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Thu, 8 Sep 2016 00:05:21 +0100 Subject: [PATCH 305/502] build_image: Unbreak verity/FEC generation Change-Id: Icbd36b11659ced7764599c5d2e0e91be67a3e4bc --- tools/releasetools/build_image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py index 4b64db869e7..864d904aa10 100755 --- a/tools/releasetools/build_image.py +++ b/tools/releasetools/build_image.py @@ -59,7 +59,7 @@ def RunCommand(cmd): def GetVerityFECSize(partition_size): cmd = "fec -s %d" % partition_size - status, output = commands.getstatusoutput(cmd) + status, output = getstatusoutput(cmd) if status: print(output) return False, 0 @@ -150,7 +150,7 @@ def AdjustPartitionSizeForVerity(partition_size, fec_supported): def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path): cmd = "fec -e %s %s %s" % (sparse_image_path, verity_path, verity_fec_path) print(cmd) - status, output = commands.getstatusoutput(cmd) + status, output = getstatusoutput(cmd) if status: print("Could not build FEC data! Error: %s" % output) return False @@ -220,7 +220,7 @@ def Append2Simg(sparse_image_path, unsparse_image_path, error_message): def Append(target, file_to_append, error_message): cmd = 'cat %s >> %s' % (file_to_append, target) print(cmd) - status, output = commands.getstatusoutput(cmd) + status, output = getstatusoutput(cmd) if status: print("%s: %s" % (error_message, output)) return False From 5d7845ddbb4493411f13e727c2b33f7a60f3324b Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Thu, 8 Sep 2016 00:13:56 +0100 Subject: [PATCH 306/502] build: Fix a few mis-merges Change-Id: I6b785bbef48babac21aeb6c4d90999830ddad50d --- tools/generate-notice-files.py | 4 ++-- tools/releasetools/common.py | 6 +++--- tools/releasetools/edify_generator.py | 4 ++-- tools/releasetools/img_from_target_files.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/generate-notice-files.py b/tools/generate-notice-files.py index 75d83540958..a4853e63b3d 100755 --- a/tools/generate-notice-files.py +++ b/tools/generate-notice-files.py @@ -134,7 +134,7 @@ def combine_notice_files_html(file_hash, input_dir, output_filename): print(']","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"
%(key)s%(val)s
' % id_table.get(value[0]), file=output_file) print('
Notices for file(s):
', file=output_file) print('
', file=output_file) - for filename in sorted(value): + for filename in value: print("%s
" % (SRC_DIR_STRIP_RE.sub(r"\1", filename)), file=output_file) print("
", file=output_file) print(file=output_file) @@ -160,7 +160,7 @@ def combine_notice_files_text(file_hash, input_dir, output_filename, file_title) for value in file_hash: print("============================================================", file=output_file) print("Notices for file(s):", file=output_file) - for filename in sorted(value): + for filename in value: print(SRC_DIR_STRIP_RE.sub(r"\1", filename), file=output_file) print("------------------------------------------------------------", file=output_file) print(open(value[0]).read(), file=output_file) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 6ab41620780..124be6d174a 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1779,9 +1779,6 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, if full_recovery_image: sh = """#!/system/bin/sh -if [ -f /system/etc/recovery-transform.sh ]; then - exec sh /system/etc/recovery-transform.sh %(recovery_size)d %(recovery_sha1)s %(boot_size)d %(boot_sha1)s -fi if ! applypatch -c %(type)s:%(device)s:%(size)d:%(sha1)s; then applypatch /system/etc/recovery.img %(type)s:%(device)s %(sha1)s %(size)d && log -t recovery "Installing new recovery image: succeeded" || log -t recovery "Installing new recovery image: failed" else @@ -1793,6 +1790,9 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img, 'size': recovery_img.size} else: sh = """#!/system/bin/sh +if [ -f /system/etc/recovery-transform.sh ]; then + exec sh /system/etc/recovery-transform.sh %(recovery_size)d %(recovery_sha1)s %(boot_size)d %(boot_sha1)s +fi if ! applypatch -c %(recovery_type)s:%(recovery_device)s:%(recovery_size)d:%(recovery_sha1)s; then applypatch %(bonus_args)s %(boot_type)s:%(boot_device)s:%(boot_size)d:%(boot_sha1)s %(recovery_type)s:%(recovery_device)s %(recovery_sha1)s %(recovery_size)d %(boot_sha1)s:/system/recovery-from-boot.p && log -t recovery "Installing new recovery image: succeeded" || log -t recovery "Installing new recovery image: failed" else diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index c545b516ec7..57a1b438274 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -133,8 +133,8 @@ def AssertOlderBuild(self, timestamp, timestamp_text): def AssertDevice(self, device): """Assert that the device identifier is the given string.""" cmd = ('assert(' + - ' || '.join(['getprop("ro.product.device") == "%s"' % i - for i in device.split(",")]) + + ' || '.join(['getprop("ro.product.device") == "%s" || getprop("ro.build.product") == "%s"' + % (i, i) for i in device.split(",")]) + ' || abort("E%d: This package is for device: %s; ' + 'this device is " + getprop("ro.product.device") + ".");' + ');') % (common.ErrorCode.DEVICE_MISMATCH, device) diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py index e6385d420ee..b34d44e5241 100755 --- a/tools/releasetools/img_from_target_files.py +++ b/tools/releasetools/img_from_target_files.py @@ -119,7 +119,7 @@ def option_handler(o, _): continue if not image.endswith(".img"): continue - if i == "oem.img": + if image == "oem.img": continue common.ZipWrite( output_zip, os.path.join(images_path, image), image) From 3506b99883d82c52708ab016be6ba1569090f2ed Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Mon, 5 Sep 2016 18:17:44 -0500 Subject: [PATCH 307/502] build: don't dex preopt by default on linux Change-Id: I7726cb87da576d1fcc59a4a3108e5a7ca2bf5304 --- core/dex_preopt.mk | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index d182dc0739f..15a2b2b8009 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -21,19 +21,19 @@ DEX_PREOPT_DEFAULT ?= true # The default values for pre-opting: always preopt PIC. # Conditional to building on linux, as dex2oat currently does not work on darwin. -ifeq ($(HOST_OS),linux) - WITH_DEXPREOPT_PIC ?= true - WITH_DEXPREOPT ?= true +#ifeq ($(HOST_OS),linux) +# WITH_DEXPREOPT_PIC ?= true +# WITH_DEXPREOPT ?= true # For an eng build only pre-opt the boot image. This gives reasonable performance and still # allows a simple workflow: building in frameworks/base and syncing. - ifeq (eng,$(TARGET_BUILD_VARIANT)) - WITH_DEXPREOPT_BOOT_IMG_ONLY ?= true - endif +# ifeq (eng,$(TARGET_BUILD_VARIANT)) +# WITH_DEXPREOPT_BOOT_IMG_ONLY ?= true +# endif # Add mini-debug-info to the boot classpath unless explicitly asked not to. - ifneq (false,$(WITH_DEXPREOPT_DEBUG_INFO)) - PRODUCT_DEX_PREOPT_BOOT_FLAGS += --generate-mini-debug-info - endif -endif +# ifneq (false,$(WITH_DEXPREOPT_DEBUG_INFO)) +# PRODUCT_DEX_PREOPT_BOOT_FLAGS += --generate-mini-debug-info +# endif +#endif GLOBAL_DEXPREOPT_FLAGS := ifeq ($(WITH_DEXPREOPT_PIC),true) From adab2165312b589aa375cb7eee7107e3bf06e1c6 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Sun, 4 Sep 2016 19:09:53 +0800 Subject: [PATCH 308/502] build: Don't create /system/vendor symlink in recovery ramdisk * Sometimes we want to put some private recovery resources there. Change-Id: I0cfa68ad92872cef654dbe1c71a536f7a950e53f --- core/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index 57cfd4b4003..af1ba0c0bbe 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1039,7 +1039,7 @@ define build-recoveryramdisk $(hide) mkdir -p $(TARGET_RECOVERY_OUT) $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc $(TARGET_RECOVERY_ROOT_OUT)/sdcard $(TARGET_RECOVERY_ROOT_OUT)/tmp @echo "Copying baseline ramdisk..." - $(hide) rsync -a --exclude=etc --exclude=sdcard $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. + $(hide) rsync -a --exclude=etc --exclude=sdcard --exclude=vendor $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT) # "cp -Rf" fails to overwrite broken symlinks on Mac. @echo "Modifying ramdisk contents..." $(hide) rm -f $(TARGET_RECOVERY_ROOT_OUT)/init*.rc $(hide) cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/ From c07b8f2b792e20d34daa72c25f74099fc8046e7a Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Mon, 5 Sep 2016 18:38:05 -0500 Subject: [PATCH 309/502] build: remove dotfiles on a make clean as well * kati & ninja create dotfiles (example: .ninja_log) in out/ Change-Id: I83ffd1c26a37f7ffef45fd4598435db93058ab67 --- core/main.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/main.mk b/core/main.mk index abb811fc3cc..482a72d837c 100644 --- a/core/main.mk +++ b/core/main.mk @@ -1117,7 +1117,7 @@ findbugs: $(INTERNAL_FINDBUGS_HTML_TARGET) $(INTERNAL_FINDBUGS_XML_TARGET) .PHONY: clean clean: - @rm -rf $(OUT_DIR)/* + @rm -rf $(OUT_DIR)/* $(OUT_DIR)/..?* $(OUT_DIR)/.[!.]* @echo "Entire build directory removed." .PHONY: clobber From 3acd5f8182a807bbe8879564f4093d356e39d633 Mon Sep 17 00:00:00 2001 From: flintman Date: Wed, 17 Dec 2014 08:25:44 -0500 Subject: [PATCH 310/502] libart: Allow adjustment of the base address On some devices the base address may need to be adjusted to prevent overlapping of memory. This will allow the adjustment to take place in the boardconfig.mk Change-Id: I17da0301960f1b0183db20b7b592eb1efd28343d --- core/dex_preopt_libart.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 9410c3ccc63..2f994aa200c 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -27,7 +27,12 @@ COMPILED_CLASSES := $(call word-colon,1,$(firstword \ # start of image reserved address space LIBART_IMG_HOST_BASE_ADDRESS := 0x60000000 + +ifneq ($(LIBART_IMG_BASE),) +LIBART_IMG_TARGET_BASE_ADDRESS := $(LIBART_IMG_BASE) +else LIBART_IMG_TARGET_BASE_ADDRESS := 0x70000000 +endif define get-product-default-property $(strip $(patsubst $(1)=%,%,$(filter $(1)=%,$(PRODUCT_DEFAULT_PROPERTY_OVERRIDES)))) From 0942e60b265a22761fdf3966563dcc31b73bc1f5 Mon Sep 17 00:00:00 2001 From: Adrian DC Date: Thu, 8 Sep 2016 17:11:11 +0200 Subject: [PATCH 311/502] build: repopick: Support projects with less than 10 commits * Verify that the project has at least 10 commits to verify, if not check only the amount of existing commits Change-Id: Ic95212510d8f5b980c9a94af8d5ac1e0dfd94b3e --- tools/repopick.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/repopick.py b/tools/repopick.py index 2b436ef9b55..8031a6adbef 100755 --- a/tools/repopick.py +++ b/tools/repopick.py @@ -319,9 +319,15 @@ def fetch_query(remote_url, query): if args.start_branch: subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) - # Check if change is already picked to HEAD...HEAD~10 + # Determine the maximum commits to check already picked changes + check_picked_count = 10 + branch_commits_count = int(subprocess.check_output(['git', 'rev-list', '--count', 'HEAD'], cwd=project_path)) + if branch_commits_count <= check_picked_count: + check_picked_count = branch_commits_count - 1 + + # Check if change is already picked to HEAD...HEAD~check_picked_count found_change = False - for i in range(0, 10): + for i in range(0, check_picked_count): output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() if 'Change-Id:' in output: head_change_id = output[output.index('Change-Id:')+1] From 081d9f7fefda3a9e4b7def2ac1846421187c122f Mon Sep 17 00:00:00 2001 From: Adrian DC Date: Thu, 8 Sep 2016 18:25:02 +0200 Subject: [PATCH 312/502] build: repopick: Support squashed commits for Change-Id detection * Commits are identified by their last Change-Id, but the parser only considers the first one found * Reverse the list to find the last Change-Id and avoid multiple repopick attempts on the same commit Change-Id: Ie0204245a47799f8ead21148e0b4e9356cf271eb --- tools/repopick.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/repopick.py b/tools/repopick.py index 8031a6adbef..9bf26bd18de 100755 --- a/tools/repopick.py +++ b/tools/repopick.py @@ -330,7 +330,11 @@ def fetch_query(remote_url, query): for i in range(0, check_picked_count): output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() if 'Change-Id:' in output: - head_change_id = output[output.index('Change-Id:')+1] + head_change_id = '' + for j,t in enumerate(reversed(output)): + if t == 'Change-Id:': + head_change_id = output[len(output) - j] + break if head_change_id.strip() == item['change_id']: print('Skipping {0} - already picked in {1} as HEAD~{2}'.format(item['id'], project_path, i)) found_change = True From 855ebbc242eff8098de8dee48ee0d73151995dc7 Mon Sep 17 00:00:00 2001 From: Ricardo Cerqueira Date: Sun, 11 Sep 2016 23:58:34 +0100 Subject: [PATCH 313/502] qcom: Fix media pathmap for AOSP variant The makefile now lives at the top and does platform selection Change-Id: I79255f8b98542f6298a74947fc91eeffca523e81 --- core/qcom_target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/qcom_target.mk b/core/qcom_target.mk index 03279825494..29e134a3710 100644 --- a/core/qcom_target.mk +++ b/core/qcom_target.mk @@ -118,7 +118,7 @@ else $(call project-set-path,qcom-audio,hardware/qcom/audio/default) $(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) -$(call project-set-path,qcom-media,hardware/qcom/media/$(TARGET_BOARD_PLATFORM)) +$(call project-set-path,qcom-media,hardware/qcom/media) $(call project-set-path,qcom-camera,hardware/qcom/camera) $(call project-set-path,qcom-gps,hardware/qcom/gps) From 7cc1a9a09a3d8ef1cd358cfcc96a0bf79dff9c49 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Mon, 29 Aug 2016 08:37:10 -0500 Subject: [PATCH 314/502] kernel: default to gcc 4.9; auto-set prefix based on TARGET_ARCH GCC 4.8 doesn't exist anymore in N. ** AICP: PS12 from CM Gerrit Change-Id: I5c83e7de97b75ece9a1306cb20b058d9fd30e288 --- core/tasks/kernel.mk | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index 30b7d2c3b50..527fb543fc7 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -31,8 +31,10 @@ # different from TARGET_KERNEL_ARCH # TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, # optional, defaults to false -# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. aarch64-linux-android-) -# defaults to arm-eabi- +# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) +# defaults to arm-linux-androideabi- for arm +# aarch64-linux-android- for arm64 +# x86_64-linux-android- for x86 # # BOARD_KERNEL_IMAGE_NAME = Built image name, optional, # defaults to Image.gz on arm64 @@ -210,10 +212,14 @@ KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules endif TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) -ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) -KERNEL_TOOLCHAIN_PREFIX ?= arm-eabi- -else +ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) +else ifeq ($(TARGET_ARCH),arm64) +KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- +else ifeq ($(TARGET_ARCH),arm) +KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- +else ifeq ($(TARGET_ARCH),x86) +KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- endif ifeq ($(KERNEL_TOOLCHAIN),) From 03dccdfc1f2a5d631a0090bcbe89cb360b62d75a Mon Sep 17 00:00:00 2001 From: Dark Eyes Date: Tue, 8 Mar 2016 22:05:10 -0500 Subject: [PATCH 315/502] envsetup: Always look up JAVA_HOME path Change-Id: I8b0641eb107cd095079bb17f92e99730f532fda7 --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 35372a8a095..ee927f3d6d2 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2486,7 +2486,7 @@ function set_java_home() { export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 + export JAVA_HOME=$(dirname $(dirname $(dirname $(readlink -f $(which java))))) ;; esac else @@ -2495,7 +2495,7 @@ function set_java_home() { export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ;; *) - export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 + export JAVA_HOME=$(dirname $(dirname $(dirname $(readlink -f $(which java))))) ;; esac fi From ed2809f5df3a87c6bacb9fec2cc6caed249a17d2 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Wed, 31 Aug 2016 21:22:53 -0700 Subject: [PATCH 316/502] Revert "main: Use date -d on OSX" Operation not permitted using -d Needs to be looked into This reverts commit b4bf8caf60c2d61b1dc41d635b68081e57a77d55. Change-Id: I54799e64d31ee6204523e3c51f2fb28ef10a3281 --- core/main.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/main.mk b/core/main.mk index 482a72d837c..85b02fbe131 100644 --- a/core/main.mk +++ b/core/main.mk @@ -125,7 +125,7 @@ $(shell mkdir -p $(OUT_DIR) && \ BUILD_NUMBER_FROM_FILE := $(shell cat $(OUT_DIR)/build_number.txt) BUILD_DATETIME_FROM_FILE := $(shell cat $(OUT_DIR)/build_date.txt) ifeq ($(HOST_OS),darwin) -DATE_FROM_FILE := date -d $(BUILD_DATETIME_FROM_FILE) +DATE_FROM_FILE := date -r $(BUILD_DATETIME_FROM_FILE) else DATE_FROM_FILE := date -d @$(BUILD_DATETIME_FROM_FILE) endif From 7ace3f3910a18e2348192576b6a109f10e20653b Mon Sep 17 00:00:00 2001 From: Davor Bertovic Date: Tue, 20 Sep 2016 19:54:53 +0200 Subject: [PATCH 317/502] Revert "envsetup: Always look up JAVA_HOME path" This reverts commit 03dccdfc1f2a5d631a0090bcbe89cb360b62d75a. Change-Id: I7b1ec73becbb8aadf2e34dce762e24ba98e5a9aa --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index ee927f3d6d2..35372a8a095 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2486,7 +2486,7 @@ function set_java_home() { export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) ;; *) - export JAVA_HOME=$(dirname $(dirname $(dirname $(readlink -f $(which java))))) + export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 ;; esac else @@ -2495,7 +2495,7 @@ function set_java_home() { export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) ;; *) - export JAVA_HOME=$(dirname $(dirname $(dirname $(readlink -f $(which java))))) + export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ;; esac fi From 38c2617b14af8034e1913693b26a8011f832992e Mon Sep 17 00:00:00 2001 From: pranav Date: Sun, 25 Sep 2016 09:53:44 +0200 Subject: [PATCH 318/502] Add command brunchopen to envsetup This command does the normal brunch and just opens up the final zip directory in a file manager. Thanks Davor for helping make this work on all file managers. brunchopen : Don't change dir, only open zip dir. Change-Id: I3e77bc211b5c1179ea6603207f362d7d3a40a0b7 Change-Id: I564bd33afdd842dd409c6ac0a1744b7658cffd70 --- envsetup.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/envsetup.sh b/envsetup.sh index 35372a8a095..5ceb54fbcea 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -599,6 +599,18 @@ function brunch() return $? } +function brunchopen() +{ + breakfast $* + if [ $? -eq 0 ]; then + mka bacon && xdg-open $ANDROID_PRODUCT_OUT + else + echo "No such item in brunch menu. Try 'breakfast'" + return 1 + fi + return $? +} + function breakfast() { target=$1 From e3dd3812fd9bb85832da292e0a0652dd4d863526 Mon Sep 17 00:00:00 2001 From: eyosen Date: Wed, 9 Sep 2015 19:12:42 +0300 Subject: [PATCH 319/502] build: add maintainers to build.prop Change-Id: I9dc1c6a95c441829b5900ff9c83aa32540ddabf1 build: add maintainers for unified devices too Change-Id: I2a25b4b8c04f5c2624107d02b3489a6d154a0cd1 --- tools/buildinfo.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/buildinfo.sh b/tools/buildinfo.sh index 9cef971a018..ee843557246 100755 --- a/tools/buildinfo.sh +++ b/tools/buildinfo.sh @@ -63,6 +63,9 @@ if [ "$TARGET_UNIFIED_DEVICE" == "" ] ; then echo "ro.build.thumbprint=$BUILD_THUMBPRINT" fi fi +if [ -n "$DEVICE_MAINTAINERS" ] ; then + echo "ro.aicp.maintainer=$DEVICE_MAINTAINERS" +fi echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS" echo "ro.aicp.device=$AICP_DEVICE" From 229906182e8299728498d9279bb48c115e086ef5 Mon Sep 17 00:00:00 2001 From: Alexander Martinz Date: Thu, 15 Sep 2016 19:26:49 +0200 Subject: [PATCH 320/502] support macOS sdk 10.12 Change-Id: Ief6c7141303f8f431d95d330b87293d67bcc1386 Signed-off-by: Alexander Martinz --- core/combo/mac_version.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/combo/mac_version.mk b/core/combo/mac_version.mk index 51394c64b16..8fa08c6e655 100644 --- a/core/combo/mac_version.mk +++ b/core/combo/mac_version.mk @@ -9,7 +9,7 @@ ifndef build_mac_version build_mac_version := $(shell sw_vers -productVersion) -mac_sdk_versions_supported := 10.8 10.9 10.10 10.11 +mac_sdk_versions_supported := 10.8 10.9 10.10 10.11 10.12 ifneq ($(strip $(MAC_SDK_VERSION)),) mac_sdk_version := $(MAC_SDK_VERSION) ifeq ($(filter $(mac_sdk_version),$(mac_sdk_versions_supported)),) From 04b2f4b2c02ddeb44d38d73d5e9926a8bd6aa31b Mon Sep 17 00:00:00 2001 From: Anthony King Date: Sat, 7 Feb 2015 21:19:03 -0600 Subject: [PATCH 321/502] build: use the system's ccache by default * ccache gets updated semi-frequently and some builders would like to be able to take advantage of new features without having to rely on the prebuilt version getting updated * If a build system has ccache installed already, use that version instead of the prebuilt Change-Id: I8988c8a25fab3694d84633f957c2b92ce84cf69e --- core/ccache.mk | 10 ++++++++-- core/tasks/kernel.mk | 11 ++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core/ccache.mk b/core/ccache.mk index 0c93a6bd7d2..4a302749054 100644 --- a/core/ccache.mk +++ b/core/ccache.mk @@ -38,8 +38,14 @@ ifneq ($(filter-out false,$(USE_CCACHE)),) # See http://petereisentraut.blogspot.com/2011/09/ccache-and-clang-part-2.html export CCACHE_CPP2 := true - CCACHE_HOST_TAG := $(HOST_PREBUILT_TAG) - ccache := prebuilts/misc/$(CCACHE_HOST_TAG)/ccache/ccache + # Detect if the system already has ccache installed to use instead of the prebuilt + ccache := $(shell which ccache) + + ifeq ($(ccache),) + CCACHE_HOST_TAG := $(HOST_PREBUILT_TAG) + ccache := prebuilts/misc/$(CCACHE_HOST_TAG)/ccache/ccache + endif + # Check that the executable is here. ccache := $(strip $(wildcard $(ccache))) ifdef ccache diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index 527fb543fc7..d4a6ab85aea 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -231,9 +231,14 @@ endif endif ifneq ($(USE_CCACHE),) - ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache - # Check that the executable is here. - ccache := $(strip $(wildcard $(ccache))) + # Detect if the system already has ccache installed to use instead of the prebuilt + ccache := $(shell which ccache) + + ifeq ($(ccache),) + ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache + # Check that the executable is here. + ccache := $(strip $(wildcard $(ccache))) + endif endif KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)" From 01ec68faeb30c7e53b14f81221f5cb831711dfcc Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 26 Aug 2016 00:37:02 +0300 Subject: [PATCH 322/502] Move AICP build additions to vendor/aicp/build Conflicts: core/Makefile envsetup.sh target/product/security/aicp-devkey.x509.pem target/product/security/aicp.x509.pem tools/roomservice.py Change-Id: I39d3e711a6beab47e3284919a9a4fef15b0f40b9 --- core/Makefile | 4 - core/config.mk | 4 +- core/main.mk | 4 +- core/mtk_target.mk | 13 - core/mtk_utils.mk | 5 - core/qcom_target.mk | 133 --- core/qcom_utils.mk | 230 ----- core/tasks/dt_image.mk | 53 - core/tasks/kernel.mk | 378 -------- envsetup.sh | 961 +------------------ target/product/security/aicp-devkey.x509.pem | 23 - target/product/security/aicp.x509.pem | 21 - tools/repopick.py | 407 -------- tools/roomservice.py | 274 ------ 14 files changed, 17 insertions(+), 2493 deletions(-) delete mode 100644 core/mtk_target.mk delete mode 100755 core/mtk_utils.mk delete mode 100644 core/qcom_target.mk delete mode 100755 core/qcom_utils.mk delete mode 100644 core/tasks/dt_image.mk delete mode 100644 core/tasks/kernel.mk delete mode 100644 target/product/security/aicp-devkey.x509.pem delete mode 100644 target/product/security/aicp.x509.pem delete mode 100755 tools/repopick.py delete mode 100755 tools/roomservice.py diff --git a/core/Makefile b/core/Makefile index af1ba0c0bbe..6cc62234a41 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1015,10 +1015,6 @@ OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem ifneq ($(OTA_PACKAGE_SIGNING_KEY),) OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) -else - PRODUCT_EXTRA_RECOVERY_KEYS += \ - build/target/product/security/aicp \ - build/target/product/security/aicp-devkey endif # Generate a file containing the keys that will be read by the diff --git a/core/config.mk b/core/config.mk index 99744b1f2c0..c2d2c8935fe 100644 --- a/core/config.mk +++ b/core/config.mk @@ -658,10 +658,10 @@ else endif # Rules for QCOM targets -include $(BUILD_SYSTEM)/qcom_target.mk +include vendor/aicp/build/core/qcom_target.mk # Rules for MTK targets -include $(BUILD_SYSTEM)/mtk_target.mk +include vendor/aicp/build/core/mtk_target.mk # ############################################################### # Set up final options. diff --git a/core/main.mk b/core/main.mk index 85b02fbe131..e9df745f60a 100644 --- a/core/main.mk +++ b/core/main.mk @@ -145,10 +145,10 @@ endif include $(BUILD_SYSTEM)/cleanbuild.mk # Bring in Qualcomm helper macros -include $(BUILD_SYSTEM)/qcom_utils.mk +include vendor/aicp/build/core/qcom_utils.mk # Bring in Mediatek helper macros too -include $(BUILD_SYSTEM)/mtk_utils.mk +include vendor/aicp/build/core/mtk_utils.mk # Include the google-specific config -include vendor/google/build/config.mk diff --git a/core/mtk_target.mk b/core/mtk_target.mk deleted file mode 100644 index 7c3ba1f6259..00000000000 --- a/core/mtk_target.mk +++ /dev/null @@ -1,13 +0,0 @@ -ifeq ($(BOARD_USES_MTK_HARDWARE),true) - mtk_flags := -DMTK_HARDWARE - - TARGET_GLOBAL_CFLAGS += $(mtk_flags) - TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) - CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) - CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) - - 2ND_TARGET_GLOBAL_CFLAGS += $(mtk_flags) - 2ND_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) - 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) - 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) -endif diff --git a/core/mtk_utils.mk b/core/mtk_utils.mk deleted file mode 100755 index 48fd6605443..00000000000 --- a/core/mtk_utils.mk +++ /dev/null @@ -1,5 +0,0 @@ -# Board platforms lists to be used for -# TARGET_BOARD_PLATFORM specific featurization -MTK_BOARD_PLATFORMS := mt6592 -MTK_BOARD_PLATFORMS += mt6582 -MTK_BOARD_PLATFORMS += mt6572 diff --git a/core/qcom_target.mk b/core/qcom_target.mk deleted file mode 100644 index 29e134a3710..00000000000 --- a/core/qcom_target.mk +++ /dev/null @@ -1,133 +0,0 @@ -# Target-specific configuration - -# Populate the qcom hardware variants in the project pathmap. -define ril-set-path-variant -$(call project-set-path-variant,ril,TARGET_RIL_VARIANT,hardware/$(1)) -endef -define wlan-set-path-variant -$(call project-set-path-variant,wlan,TARGET_WLAN_VARIANT,hardware/qcom/$(1)) -endef -define bt-vendor-set-path-variant -$(call project-set-path-variant,bt-vendor,TARGET_BT_VENDOR_VARIANT,hardware/qcom/$(1)) -endef - -# Set device-specific HALs into project pathmap -define set-device-specific-path -$(if $(USE_DEVICE_SPECIFIC_$(1)), \ - $(if $(DEVICE_SPECIFIC_$(1)_PATH), \ - $(eval path := $(DEVICE_SPECIFIC_$(1)_PATH)), \ - $(eval path := $(TARGET_DEVICE_DIR)/$(2))), \ - $(eval path := $(3))) \ -$(call project-set-path,qcom-$(2),$(strip $(path))) -endef - -ifeq ($(BOARD_USES_QCOM_HARDWARE),true) - - qcom_flags := -DQCOM_HARDWARE - qcom_flags += -DQCOM_BSP - qcom_flags += -DQTI_BSP - - TARGET_USES_QCOM_BSP := true - - # Tell HALs that we're compiling an AOSP build with an in-line kernel - TARGET_COMPILE_WITH_MSM_KERNEL := true - - ifneq ($(filter msm7x27a msm7x30 msm8660 msm8960,$(TARGET_BOARD_PLATFORM)),) - # Enable legacy graphics functions - qcom_flags += -DQCOM_BSP_LEGACY - # Enable legacy audio functions - ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true) - USE_CUSTOM_AUDIO_POLICY := 1 - qcom_flags += -DLEGACY_ALSA_AUDIO - endif - endif - - # Enable extra offloading for post-805 targets - ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) - qcom_flags += -DHAS_EXTRA_FLAC_METADATA - endif - - TARGET_GLOBAL_CFLAGS += $(qcom_flags) - TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) - CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) - CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) - - # Multiarch needs these too.. - 2ND_TARGET_GLOBAL_CFLAGS += $(qcom_flags) - 2ND_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) - 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) - 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) - - ifeq ($(QCOM_HARDWARE_VARIANT),) - ifneq ($(filter msm8610 msm8226 msm8974,$(TARGET_BOARD_PLATFORM)),) - QCOM_HARDWARE_VARIANT := msm8974 - else - ifneq ($(filter msm8909 msm8916,$(TARGET_BOARD_PLATFORM)),) - QCOM_HARDWARE_VARIANT := msm8916 - else - ifneq ($(filter msm8953 msm8937,$(TARGET_BOARD_PLATFORM)),) - QCOM_HARDWARE_VARIANT := msm8937 - else - ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) - QCOM_HARDWARE_VARIANT := msm8994 - else - QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM) - endif - endif - endif - endif - endif - -# HACK: check to see if build uses standard QC HAL paths by checking for CM path structure -AOSP_VARIANT_MAKEFILE := $(wildcard hardware/qcom/audio/default/Android.mk) -ifeq ("$(AOSP_VARIANT_MAKEFILE)","") -$(call project-set-path,qcom-audio,hardware/qcom/audio) -$(call project-set-path,qcom-display,hardware/qcom/display) -$(call project-set-path,qcom-media,hardware/qcom/media) -$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) -$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) -$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) -$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) -$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) -$(call project-set-path,ril,hardware/ril) -$(call project-set-path,wlan,hardware/qcom/wlan) -$(call project-set-path,bt-vendor,hardware/qcom/bt) -else -$(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT)) - -ifeq ($(SONY_BF64_KERNEL_VARIANT),true) -$(call project-set-path,qcom-display,hardware/qcom/display-caf/sony) -$(call project-set-path,qcom-media,hardware/qcom/media-caf/sony) -else -$(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT)) -$(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT)) -endif - -$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) -$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) -$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) -$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) -$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) - -$(call ril-set-path-variant,ril) -$(call wlan-set-path-variant,wlan-caf) -$(call bt-vendor-set-path-variant,bt-caf) -endif # AOSP_VARIANT_MAKEFILE - -else - -$(call project-set-path,qcom-audio,hardware/qcom/audio/default) -$(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) -$(call project-set-path,qcom-media,hardware/qcom/media) - -$(call project-set-path,qcom-camera,hardware/qcom/camera) -$(call project-set-path,qcom-gps,hardware/qcom/gps) -$(call project-set-path,qcom-sensors,hardware/qcom/sensors) -$(call project-set-path,qcom-loc-api,vendor/qcom/opensource/location) -$(call project-set-path,qcom-dataservices,$(TARGET_DEVICE_DIR)/dataservices) - -$(call ril-set-path-variant,ril) -$(call wlan-set-path-variant,wlan) -$(call bt-vendor-set-path-variant,bt) - -endif diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk deleted file mode 100755 index 50e0b4e04b7..00000000000 --- a/core/qcom_utils.mk +++ /dev/null @@ -1,230 +0,0 @@ -# Board platforms lists to be used for -# TARGET_BOARD_PLATFORM specific featurization -QCOM_BOARD_PLATFORMS += msm7x27a -QCOM_BOARD_PLATFORMS += msm7x30 -QCOM_BOARD_PLATFORMS += msm8226 -QCOM_BOARD_PLATFORMS += msm8610 -QCOM_BOARD_PLATFORMS += msm8660 -QCOM_BOARD_PLATFORMS += msm8909 -QCOM_BOARD_PLATFORMS += msm8916 -QCOM_BOARD_PLATFORMS += msm8960 -QCOM_BOARD_PLATFORMS += msm8974 -QCOM_BOARD_PLATFORMS += mpq8092 -QCOM_BOARD_PLATFORMS += msm8937 -QCOM_BOARD_PLATFORMS += msm8952 -QCOM_BOARD_PLATFORMS += msm8953 -QCOM_BOARD_PLATFORMS += msm8992 -QCOM_BOARD_PLATFORMS += msm8994 -QCOM_BOARD_PLATFORMS += msm8996 -QCOM_BOARD_PLATFORMS += msm_bronze -QCOM_BOARD_PLATFORMS += apq8084 - -MSM7K_BOARD_PLATFORMS := msm7x30 -MSM7K_BOARD_PLATFORMS += msm7x27 -MSM7K_BOARD_PLATFORMS += msm7x27a -MSM7K_BOARD_PLATFORMS += msm7k - -QSD8K_BOARD_PLATFORMS := qsd8k - - -# vars for use by utils -empty := -space := $(empty) $(empty) -colon := $(empty):$(empty) -underscore := $(empty)_$(empty) - -# $(call match-word,w1,w2) -# checks if w1 == w2 -# How it works -# if (w1-w2 not empty or w2-w1 not empty) then not_match else match -# -# returns true or empty -#$(warning :$(1): :$(2): :$(subst $(1),,$(2)):) \ -#$(warning :$(2): :$(1): :$(subst $(2),,$(1)):) \ -# -define match-word -$(strip \ - $(if $(or $(subst $(1),$(empty),$(2)),$(subst $(2),$(empty),$(1))),,true) \ -) -endef - -# $(call find-word-in-list,w,wlist) -# finds an exact match of word w in word list wlist -# -# How it works -# fill wlist spaces with colon -# wrap w with colon -# search word w in list wl, if found match m, return stripped word w -# -# returns stripped word or empty -define find-word-in-list -$(strip \ - $(eval wl:= $(colon)$(subst $(space),$(colon),$(strip $(2)))$(colon)) \ - $(eval w:= $(colon)$(strip $(1))$(colon)) \ - $(eval m:= $(findstring $(w),$(wl))) \ - $(if $(m),$(1),) \ -) -endef - -# $(call match-word-in-list,w,wlist) -# does an exact match of word w in word list wlist -# How it works -# if the input word is not empty -# return output of an exact match of word w in wordlist wlist -# else -# return empty -# returns true or empty -define match-word-in-list -$(strip \ - $(if $(strip $(1)), \ - $(call match-word,$(call find-word-in-list,$(1),$(2)),$(strip $(1))), \ - ) \ -) -endef - -# $(call match-prefix,p,delim,w/wlist) -# matches prefix p in wlist using delimiter delim -# -# How it works -# trim the words in wlist w -# if find-word-in-list returns not empty -# return true -# else -# return empty -# -define match-prefix -$(strip \ - $(eval w := $(strip $(1)$(strip $(2)))) \ - $(eval text := $(patsubst $(w)%,$(1),$(3))) \ - $(if $(call match-word-in-list,$(1),$(text)),true,) \ -) -endef - -# ---- -# The following utilities are meant for board platform specific -# featurisation - -# $(call get-vendor-board-platforms,v) -# returns list of board platforms for vendor v -define get-vendor-board-platforms -$(if $(call match-word,$(BOARD_USES_$(1)_HARDWARE),true),$($(1)_BOARD_PLATFORMS)) -endef - -# $(call is-board-platform,bp) -# returns true or empty -define is-board-platform -$(call match-word,$(1),$(TARGET_BOARD_PLATFORM)) -endef - -# $(call is-not-board-platform,bp) -# returns true or empty -define is-not-board-platform -$(if $(call match-word,$(1),$(TARGET_BOARD_PLATFORM)),,true) -endef - -# $(call is-board-platform-in-list,bpl) -# returns true or empty -define is-board-platform-in-list -$(call match-word-in-list,$(TARGET_BOARD_PLATFORM),$(1)) -endef - -# $(call is-vendor-board-platform,vendor) -# returns true or empty -define is-vendor-board-platform -$(strip \ - $(call match-word-in-list,$(TARGET_BOARD_PLATFORM),\ - $(call get-vendor-board-platforms,$(1)) \ - ) \ -) -endef - -# $(call is-chipset-in-board-platform,chipset) -# does a prefix match of chipset in TARGET_BOARD_PLATFORM -# uses underscore as a delimiter -# -# returns true or empty -define is-chipset-in-board-platform -$(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)) -endef - -# $(call is-chipset-prefix-in-board-platform,prefix) -# does a chipset prefix match in TARGET_BOARD_PLATFORM -# assumes '_' and 'a' as the delimiter to the chipset prefix -# -# How it works -# if ($(prefix)_ or $(prefix)a match in board platform) -# return true -# else -# return empty -# -define is-chipset-prefix-in-board-platform -$(strip \ - $(eval delim_a := $(empty)a$(empty)) \ - $(if \ - $(or \ - $(call match-prefix,$(1),$(delim_a),$(TARGET_BOARD_PLATFORM)), \ - $(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)), \ - ), \ - true, \ - ) \ -) -endef - -#---- -# The following utilities are meant for Android Code Name -# specific featurisation -# -# refer http://source.android.com/source/build-numbers.html -# for code names and associated sdk versions -CUPCAKE_SDK_VERSIONS := 3 -DONUT_SDK_VERSIONS := 4 -ECLAIR_SDK_VERSIONS := 5 6 7 -FROYO_SDK_VERSIONS := 8 -GINGERBREAD_SDK_VERSIONS := 9 10 -HONEYCOMB_SDK_VERSIONS := 11 12 13 -ICECREAM_SANDWICH_SDK_VERSIONS := 14 15 -JELLY_BEAN_SDK_VERSIONS := 16 17 18 - -# $(call is-platform-sdk-version-at-least,version) -# version is a numeric SDK_VERSION defined above -define is-platform-sdk-version-at-least -$(strip \ - $(if $(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= $(1) ))" )), \ - true, \ - ) \ -) -endef - -# $(call is-android-codename,codename) -# codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream -# please refer the $(codename)_SDK_VERSIONS declared above -define is-android-codename -$(strip \ - $(if \ - $(call match-word-in-list,$(PLATFORM_SDK_VERSION),$($(1)_SDK_VERSIONS)), \ - true, \ - ) \ -) -endef - -# $(call is-android-codename-in-list,cnlist) -# cnlist is combination/list of android codenames -define is-android-codename-in-list -$(strip \ - $(eval acn := $(empty)) \ - $(foreach \ - i,$(1),\ - $(eval acn += \ - $(if \ - $(call \ - match-word-in-list,\ - $(PLATFORM_SDK_VERSION),\ - $($(i)_SDK_VERSIONS)\ - ),\ - true,\ - )\ - )\ - ) \ - $(if $(strip $(acn)),true,) \ -) -endef diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk deleted file mode 100644 index 0f849466b7d..00000000000 --- a/core/tasks/dt_image.mk +++ /dev/null @@ -1,53 +0,0 @@ -#---------------------------------------------------------------------- -# Generate device tree image (dt.img) -#---------------------------------------------------------------------- -ifeq ($(strip $(BOARD_CUSTOM_BOOTIMG_MK)),) -ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) -ifneq ($(strip $(BOARD_KERNEL_PREBUILT_DT)),true) -ifeq ($(strip $(BUILD_TINY_ANDROID)),true) -include device/qcom/common/dtbtool/Android.mk -endif - -ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) -DTBTOOL_NAME := dtbToolCM -else -DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) -endif - -DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) - -INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img - -ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) -# dtbToolCM will search subdirectories -possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ -else -# Most specific paths must come first in possible_dtb_dirs -possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ -endif - -define build-dtimage-target - $(call pretty,"Target dt image: $@") - $(hide) for dir in $(possible_dtb_dirs); do \ - if [ -d "$$dir" ]; then \ - dtb_dir="$$dir"; \ - break; \ - fi; \ - done; \ - $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ "$$dtb_dir"; - $(hide) chmod a+r $@ -endef - -$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) - $(build-dtimage-target) - @echo "Made DT image: $@" - -ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) -ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) - -.PHONY: dtimage -dtimage: $(INSTALLED_DTIMAGE_TARGET) - -endif -endif -endif diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk deleted file mode 100644 index d4a6ab85aea..00000000000 --- a/core/tasks/kernel.mk +++ /dev/null @@ -1,378 +0,0 @@ -# Copyright (C) 2012 The CyanogenMod 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. - - -# Android makefile to build kernel as a part of Android Build -# -# Configuration -# ============= -# -# These config vars are usually set in BoardConfig.mk: -# -# TARGET_KERNEL_SOURCE = Kernel source dir, optional, defaults -# to kernel/$(TARGET_DEVICE_DIR) -# TARGET_KERNEL_CONFIG = Kernel defconfig -# TARGET_KERNEL_VARIANT_CONFIG = Variant defconfig, optional -# TARGET_KERNEL_SELINUX_CONFIG = SELinux defconfig, optional -# TARGET_KERNEL_ADDITIONAL_CONFIG = Additional defconfig, optional -# TARGET_KERNEL_ARCH = Kernel Arch -# TARGET_KERNEL_HEADER_ARCH = Optional Arch for kernel headers if -# different from TARGET_KERNEL_ARCH -# TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, -# optional, defaults to false -# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) -# defaults to arm-linux-androideabi- for arm -# aarch64-linux-android- for arm64 -# x86_64-linux-android- for x86 -# -# BOARD_KERNEL_IMAGE_NAME = Built image name, optional, -# defaults to Image.gz on arm64 -# defaults to Image if TARGET_USES_UNCOMPRESSED_KERNEL -# defaults to zImage otherwise -# -# KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, -# Set this var in shell to override -# toolchain specified in BoardConfig.mk -# KERNEL_TOOLCHAIN = Path to toolchain, if unset, assumes -# TARGET_KERNEL_CROSS_COMPILE_PREFIX -# is in PATH -# USE_CCACHE = Enable ccache (global Android flag) -# -# NEED_KERNEL_MODULE_ROOT = Optional, if true, install kernel -# modules in root instead of system - - -TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g') - -## Externally influenced variables -# kernel location - optional, defaults to kernel// -TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR) -KERNEL_SRC := $(TARGET_KERNEL_SOURCE) -# kernel configuration - mandatory -KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) -VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) -SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) - -## Internal variables -KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ -KERNEL_CONFIG := $(KERNEL_OUT)/.config -KERNEL_OUT_STAMP := $(KERNEL_OUT)/.mkdir_stamp - -TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH)) -ifeq ($(TARGET_KERNEL_ARCH),) -KERNEL_ARCH := $(TARGET_ARCH) -else -KERNEL_ARCH := $(TARGET_KERNEL_ARCH) -endif - -ifeq ($(KERNEL_ARCH),x86_64) -KERNEL_DEFCONFIG_ARCH := x86 -else -KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) -endif -KERNEL_DEFCONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_DEFCONFIG_ARCH)/configs/$(KERNEL_DEFCONFIG) - -TARGET_KERNEL_HEADER_ARCH := $(strip $(TARGET_KERNEL_HEADER_ARCH)) -ifeq ($(TARGET_KERNEL_HEADER_ARCH),) -KERNEL_HEADER_ARCH := $(KERNEL_ARCH) -else -KERNEL_HEADER_ARCH := $(TARGET_KERNEL_HEADER_ARCH) -endif - -KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG)) -ifeq ($(KERNEL_HEADER_DEFCONFIG),) -KERNEL_HEADER_DEFCONFIG := $(KERNEL_DEFCONFIG) -endif - - -ifneq ($(BOARD_KERNEL_IMAGE_NAME),) - TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME) -else - ifeq ($(TARGET_USES_UNCOMPRESSED_KERNEL),true) - TARGET_PREBUILT_INT_KERNEL_TYPE := Image - else - ifeq ($(KERNEL_ARCH),arm64) - TARGET_PREBUILT_INT_KERNEL_TYPE := Image.gz - else - TARGET_PREBUILT_INT_KERNEL_TYPE := zImage - endif - endif -endif - -TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE) - -# Clear this first to prevent accidental poisoning from env -MAKE_FLAGS := - -ifeq ($(KERNEL_ARCH),arm64) - # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) - MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" - ifeq ($(TARGET_ARCH),arm) - KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y - endif -endif - -ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),) -KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG) -KERNEL_ADDITIONAL_CONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG) - ifeq ("$(wildcard $(KERNEL_ADDITIONAL_CONFIG_SRC))","") - $(warning TARGET_KERNEL_ADDITIONAL_CONFIG '$(TARGET_KERNEL_ADDITIONAL_CONFIG)' doesn't exist) - KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null - endif -else - KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null -endif - -## Do be discontinued in a future version. Notify builder about target -## kernel format requirement -ifeq ($(BOARD_KERNEL_IMAGE_NAME),) -ifeq ($(BOARD_USES_UBOOT),true) - $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage") -else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true) - $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image") -endif -endif - -ifeq "$(wildcard $(KERNEL_SRC) )" "" - ifneq ($(TARGET_PREBUILT_KERNEL),) - HAS_PREBUILT_KERNEL := true - NEEDS_KERNEL_COPY := true - else - $(foreach cf,$(PRODUCT_COPY_FILES), \ - $(eval _src := $(call word-colon,1,$(cf))) \ - $(eval _dest := $(call word-colon,2,$(cf))) \ - $(ifeq kernel,$(_dest), \ - $(eval HAS_PREBUILT_KERNEL := true))) - endif - - ifneq ($(HAS_PREBUILT_KERNEL),) - $(warning ***************************************************************) - $(warning * Using prebuilt kernel binary instead of source *) - $(warning * THIS IS DEPRECATED, AND WILL BE DISCONTINUED *) - $(warning * Please configure your device to download the kernel *) - $(warning * source repository to $(KERNEL_SRC)) - $(warning * See http://wiki.cyanogenmod.org/w/Doc:_integrated_kernel_building) - $(warning * for more information *) - $(warning ***************************************************************) - FULL_KERNEL_BUILD := false - KERNEL_BIN := $(TARGET_PREBUILT_KERNEL) - else - $(warning ***************************************************************) - $(warning * *) - $(warning * No kernel source found, and no fallback prebuilt defined. *) - $(warning * Please make sure your device is properly configured to *) - $(warning * download the kernel repository to $(KERNEL_SRC)) - $(warning * and add the TARGET_KERNEL_CONFIG variable to BoardConfig.mk *) - $(warning * *) - $(warning * As an alternative, define the TARGET_PREBUILT_KERNEL *) - $(warning * variable with the path to the prebuilt binary kernel image *) - $(warning * in your BoardConfig.mk file *) - $(warning * *) - $(warning ***************************************************************) - $(error "NO KERNEL") - endif -else - NEEDS_KERNEL_COPY := true - ifeq ($(TARGET_KERNEL_CONFIG),) - $(warning **********************************************************) - $(warning * Kernel source found, but no configuration was defined *) - $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *) - $(warning * BoardConfig.mk file *) - $(warning **********************************************************) - # $(error "NO KERNEL CONFIG") - else - #$(info Kernel source found, building it) - FULL_KERNEL_BUILD := true - KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) - endif -endif - -ifeq ($(FULL_KERNEL_BUILD),true) - -KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr -KERNEL_HEADERS_INSTALL_STAMP := $(KERNEL_OUT)/.headers_install_stamp - -ifeq ($(NEED_KERNEL_MODULE_ROOT),true) -KERNEL_MODULES_INSTALL := root -KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT)/lib/modules -else -KERNEL_MODULES_INSTALL := system -KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules -endif - -TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) -ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) -KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) -else ifeq ($(TARGET_ARCH),arm64) -KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- -else ifeq ($(TARGET_ARCH),arm) -KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- -else ifeq ($(TARGET_ARCH),x86) -KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- -endif - -ifeq ($(KERNEL_TOOLCHAIN),) -KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) -else -ifneq ($(KERNEL_TOOLCHAIN_PREFIX),) -KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) -endif -endif - -ifneq ($(USE_CCACHE),) - # Detect if the system already has ccache installed to use instead of the prebuilt - ccache := $(shell which ccache) - - ifeq ($(ccache),) - ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache - # Check that the executable is here. - ccache := $(strip $(wildcard $(ccache))) - endif -endif - -KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)" -ccache = - -define mv-modules - mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ - if [ "$$mdpath" != "" ];then\ - mpath=`dirname $$mdpath`;\ - ko=`find $$mpath/kernel -type f -name *.ko`;\ - for i in $$ko; do $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$i;\ - mv $$i $(KERNEL_MODULES_OUT)/; done;\ - fi -endef - -define clean-module-folder - mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ - if [ "$$mdpath" != "" ];then\ - mpath=`dirname $$mdpath`; rm -rf $$mpath;\ - fi -endef - -ifeq ($(HOST_OS),darwin) - MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf/ -endif - -ifeq ($(TARGET_KERNEL_MODULES),) - TARGET_KERNEL_MODULES := no-external-modules -endif - -$(KERNEL_OUT_STAMP): - $(hide) mkdir -p $(KERNEL_OUT) - $(hide) rm -rf $(KERNEL_MODULES_OUT) - $(hide) mkdir -p $(KERNEL_MODULES_OUT) - $(hide) touch $@ - -KERNEL_ADDITIONAL_CONFIG_OUT := $(KERNEL_OUT)/.additional_config - -.PHONY: force_additional_config -$(KERNEL_ADDITIONAL_CONFIG_OUT): force_additional_config - $(hide) cmp -s $(KERNEL_ADDITIONAL_CONFIG_SRC) $@ || cp $(KERNEL_ADDITIONAL_CONFIG_SRC) $@; - -$(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) - @echo "Building Kernel Config" - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG) - $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ - echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi - $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ - echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ - $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi - -TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL_STAMP) - @echo "Building Kernel" - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) - $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \ - then \ - echo "Building DTBs" ; \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \ - else \ - echo "DTBs not enabled" ; \ - fi ; - $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \ - then \ - echo "Building Kernel Modules" ; \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \ - $(mv-modules) && \ - $(clean-module-folder) ; \ - else \ - echo "Kernel Modules not enabled" ; \ - fi ; - - -$(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES - -$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES) - $(mv-modules) - $(clean-module-folder) - -$(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) - @echo "Building Kernel Headers" - $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \ - rm -f ../$(KERNEL_CONFIG); \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi - $(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \ - echo "Used a different defconfig for header generation"; \ - rm -f ../$(KERNEL_CONFIG); \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi - $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ - echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi - $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ - echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ - $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi - $(hide) touch $@ - -# provide this rule because there are dependencies on this throughout the repo -$(KERNEL_HEADERS_INSTALL): $(KERNEL_HEADERS_INSTALL_STAMP) - -kerneltags: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) tags - -kernelconfig: KERNELCONFIG_MODE := menuconfig -kernelxconfig: KERNELCONFIG_MODE := xconfig -kernelxconfig kernelconfig: $(KERNEL_OUT_STAMP) - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) - env KCONFIG_NOTIMESTAMP=true \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNELCONFIG_MODE) - env KCONFIG_NOTIMESTAMP=true \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig - cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC) - -alldefconfig: $(KERNEL_OUT_STAMP) - env KCONFIG_NOTIMESTAMP=true \ - $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) alldefconfig - -endif # FULL_KERNEL_BUILD - -## Install it - -ifeq ($(NEEDS_KERNEL_COPY),true) -file := $(INSTALLED_KERNEL_TARGET) -ALL_PREBUILT += $(file) -$(file) : $(KERNEL_BIN) | $(ACP) - $(transform-prebuilt-to-target) - -ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) -endif - -.PHONY: kernel -kernel: $(INSTALLED_KERNEL_TARGET) diff --git a/envsetup.sh b/envsetup.sh index 5ceb54fbcea..ae6c1df8c17 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -4,18 +4,12 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - lunch: lunch - - tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree. -- cout: Changes directory to out. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. -- mmap: Builds all of the modules in the current directory, and its dependencies, then pushes the package to the device. -- mmp: Builds all of the modules in the current directory and pushes them to the device. -- mmmp: Builds all of the modules in the supplied directories and pushes them to the device. -- mms: Short circuit builder. Quickly re-build the kernel, rootfs, boot and system images - without deep dependencies. Requires the full build to have run before. - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. @@ -26,20 +20,12 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - sepgrep: Greps on all local sepolicy files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file. -- cmremote: Add git remote for CM Gerrit Review -- cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review -- aospremote: Add git remote for matching AOSP repository -- cafremote: Add git remote for matching CodeAurora repository. -- cmrebase: Rebase a Gerrit change and push it again -- mka: Builds using SCHED_BATCH on all processors -- mkap: Builds the module(s) using mka and pushes them to the device. -- cmka: Cleans and builds using mka. -- repolastsync: Prints date and time of last repo sync. -- reposync: Parallel repo sync using ionice and SCHED_BATCH -- repopick: Utility to fetch changes from Gerrit. -- installboot: Installs a boot.img to the connected device. -- installrecovery: Installs a recovery.img to the connected device. -- repodiff: Diff 2 different branches or tags within the same repo + +EOF + + __print_cm_functions_help + +cat <=" pairs as a shell script. build_dicts_script=`\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk \ @@ -562,9 +548,6 @@ function print_lunch_menu() local uname=$(uname) echo echo "You're building on" $uname - if [ "$(uname)" = "Darwin" ] ; then - echo " (ohai, koush!)" - fi echo if [ "z${AICP_DEVICES_ONLY}" != "z" ]; then echo "Breakfast menu... pick a combo:" @@ -587,65 +570,6 @@ function print_lunch_menu() echo } -function brunch() -{ - breakfast $* - if [ $? -eq 0 ]; then - mka bacon - else - echo "No such item in brunch menu. Try 'breakfast'" - return 1 - fi - return $? -} - -function brunchopen() -{ - breakfast $* - if [ $? -eq 0 ]; then - mka bacon && xdg-open $ANDROID_PRODUCT_OUT - else - echo "No such item in brunch menu. Try 'breakfast'" - return 1 - fi - return $? -} - -function breakfast() -{ - target=$1 - local variant=$2 - AICP_DEVICES_ONLY="true" - unset LUNCH_MENU_CHOICES - add_lunch_combo full-eng - for f in `/bin/ls vendor/aicp/vendorsetup.sh 2> /dev/null` - do - echo "including $f" - . $f - done - unset f - - if [ $# -eq 0 ]; then - # No arguments, so let's have the full menu - lunch - else - echo "z$target" | grep -q "-" - if [ $? -eq 0 ]; then - # A buildtype was specified, assume a full device name - lunch $target - else - # This is probably just the AICP model name - if [ -z "$variant" ]; then - variant="userdebug" - fi - lunch aicp_$target-$variant - fi - fi - return $? -} - -alias bib=breakfast - function lunch() { local answer @@ -701,11 +625,11 @@ function lunch() # if we can't find a product, try to grab it off the AICP github T=$(gettop) pushd $T > /dev/null - build/tools/roomservice.py $product + vendor/aicp/build/tools/roomservice.py $product popd > /dev/null check_product $product else - build/tools/roomservice.py $product true + vendor/aicp/build/tools/roomservice.py $product true fi TARGET_PRODUCT=$product \ TARGET_BUILD_VARIANT=$variant \ @@ -804,57 +728,6 @@ function tapas() destroy_build_var_cache } -function eat() -{ - if [ "$OUT" ] ; then - MODVERSION=$(get_build_var AICP_VERSION) - ZIPFILE=aicp-$MODVERSION.zip - ZIPPATH=$OUT/$ZIPFILE - if [ ! -f $ZIPPATH ] ; then - echo "Nothing to eat" - return 1 - fi - adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then - echo "No device is online. Waiting for one..." - echo "Please connect USB and/or enable USB debugging" - until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do - sleep 1 - done - echo "Device Found.." - fi - if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); - then - # if adbd isn't root we can't write to /cache/recovery/ - adb root - sleep 1 - adb wait-for-device - cat << EOF > /tmp/command ---sideload_auto_reboot -EOF - if adb push /tmp/command /cache/recovery/ ; then - echo "Rebooting into recovery for sideload installation" - adb reboot recovery - adb wait-for-sideload - adb sideload $ZIPPATH - fi - rm /tmp/command - else - echo "Nothing to eat" - return 1 - fi - return $? - else - echo "The connected device does not appear to be $AICP_BUILD, run away!" - fi -} - -function omnom -{ - brunch $* - eat -} - function gettop { local TOPFILE=build/core/envsetup.mk @@ -1099,15 +972,6 @@ function croot() fi } -function cout() -{ - if [ "$OUT" ]; then - cd $OUT - else - echo "Couldn't locate out directory. Try setting OUT." - fi -} - function cproj() { TOPFILE=build/core/envsetup.mk @@ -1321,106 +1185,6 @@ function is64bit() fi } -function dddclient() -{ - local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) - local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) - local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) - local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) - local OUT_EXE_SYMBOLS=$(get_symbols_directory) - local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) - local ARCH=$(get_build_var TARGET_ARCH) - local GDB - case "$ARCH" in - arm) GDB=arm-linux-androideabi-gdb;; - arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; - mips|mips64) GDB=mips64el-linux-android-gdb;; - x86) GDB=x86_64-linux-android-gdb;; - x86_64) GDB=x86_64-linux-android-gdb;; - *) echo "Unknown arch $ARCH"; return 1;; - esac - - if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then - local EXE="$1" - if [ "$EXE" ] ; then - EXE=$1 - if [[ $EXE =~ ^[^/].* ]] ; then - EXE="system/bin/"$EXE - fi - else - EXE="app_process" - fi - - local PORT="$2" - if [ "$PORT" ] ; then - PORT=$2 - else - PORT=":5039" - fi - - local PID="$3" - if [ "$PID" ] ; then - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - PID=`pid $3` - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - # that likely didn't work because of returning multiple processes - # try again, filtering by root processes (don't contain colon) - PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` - if [[ ! "$PID" =~ ^[0-9]+$ ]] - then - echo "Couldn't resolve '$3' to single PID" - return 1 - else - echo "" - echo "WARNING: multiple processes matching '$3' observed, using root process" - echo "" - fi - fi - fi - adb forward "tcp$PORT" "tcp$PORT" - local USE64BIT="$(is64bit $PID)" - adb shell gdbserver$USE64BIT $PORT --attach $PID & - sleep 2 - else - echo "" - echo "If you haven't done so already, do this first on the device:" - echo " gdbserver $PORT /system/bin/$EXE" - echo " or" - echo " gdbserver $PORT --attach " - echo "" - fi - - OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT - OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT - - echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" - echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" - echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" - echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" - # Enable special debugging for ART processes. - if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then - echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" - fi - echo >>"$OUT_ROOT/gdbclient.cmds" "" - - local WHICH_GDB= - # 64-bit exe found - if [ "$USE64BIT" != "" ] ; then - WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 - # 32-bit exe / 32-bit platform - elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then - WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB - # 32-bit exe / 64-bit platform - else - WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB - fi - - ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" - else - echo "Unable to determine build system output dir." - fi -} - case `uname -s` in Darwin) function sgrep() @@ -1777,707 +1541,6 @@ function godir () { \cd $T/$pathname } -function cmremote() -{ - if ! git rev-parse --git-dir &> /dev/null - then - echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." - return 1 - fi - git remote rm cmremote 2> /dev/null - GERRIT_REMOTE=$(git config --get remote.github.projectname) - CMUSER=$(git config --get review.review.cyanogenmod.org.username) - if [ -z "$CMUSER" ] - then - git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE - else - git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE - fi - echo "Remote 'cmremote' created" -} - -function aospremote() -{ - if ! git rev-parse --git-dir &> /dev/null - then - echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." - return 1 - fi - git remote rm aosp 2> /dev/null - PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") - if (echo $PROJECT | grep -qv "^device") - then - PFX="platform/" - fi - git remote add aosp https://android.googlesource.com/$PFX$PROJECT - echo "Remote 'aosp' created" -} - -function cafremote() -{ - if ! git rev-parse --git-dir &> /dev/null - then - echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." - return 1 - fi - git remote rm caf 2> /dev/null - PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") - if (echo $PROJECT | grep -qv "^device") - then - PFX="platform/" - fi - git remote add caf git://codeaurora.org/$PFX$PROJECT - echo "Remote 'caf' created" -} - -function installboot() -{ - if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; - then - echo "No recovery.fstab found. Build recovery first." - return 1 - fi - if [ ! -e "$OUT/boot.img" ]; - then - echo "No boot.img found. Run make bootimage first." - return 1 - fi - PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` - if [ -z "$PARTITION" ]; - then - # Try for RECOVERY_FSTAB_VERSION = 2 - PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` - PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` - if [ -z "$PARTITION" ]; - then - echo "Unable to determine boot partition." - return 1 - fi - fi - adb start-server - adb wait-for-online - adb root - sleep 1 - adb wait-for-online shell mount /system 2>&1 > /dev/null - adb wait-for-online remount - if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); - then - adb push $OUT/boot.img /cache/ - for i in $OUT/system/lib/modules/*; - do - adb push $i /system/lib/modules/ - done - adb shell dd if=/cache/boot.img of=$PARTITION - adb shell chmod 644 /system/lib/modules/* - echo "Installation complete." - else - echo "The connected device does not appear to be $AICP_BUILD, run away!" - fi -} - -function installrecovery() -{ - if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; - then - echo "No recovery.fstab found. Build recovery first." - return 1 - fi - if [ ! -e "$OUT/recovery.img" ]; - then - echo "No recovery.img found. Run make recoveryimage first." - return 1 - fi - PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` - if [ -z "$PARTITION" ]; - then - # Try for RECOVERY_FSTAB_VERSION = 2 - PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` - PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` - if [ -z "$PARTITION" ]; - then - echo "Unable to determine recovery partition." - return 1 - fi - fi - adb start-server - adb wait-for-online - adb root - sleep 1 - adb wait-for-online shell mount /system 2>&1 >> /dev/null - adb wait-for-online remount - if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); - then - adb push $OUT/recovery.img /cache/ - adb shell dd if=/cache/recovery.img of=$PARTITION - echo "Installation complete." - else - echo "The connected device does not appear to be $AICP_BUILD, run away!" - fi -} - -function makerecipe() { - if [ -z "$1" ] - then - echo "No branch name provided." - return 1 - fi - cd android - sed -i s/'default revision=.*'/'default revision="refs\/heads\/'$1'"'/ default.xml - git commit -a -m "$1" - cd .. - - repo forall -c ' - - if [ "$REPO_REMOTE" = "github" ] - then - pwd - cmremote - git push cmremote HEAD:refs/heads/'$1' - fi - ' -} - -function cmgerrit() { - - if [ "$(__detect_shell)" = "zsh" ]; then - # zsh does not define FUNCNAME, derive from funcstack - local FUNCNAME=$funcstack[1] - fi - - if [ $# -eq 0 ]; then - $FUNCNAME help - return 1 - fi - local user=`git config --get review.review.cyanogenmod.org.username` - local review=`git config --get remote.github.review` - local project=`git config --get remote.github.projectname` - local command=$1 - shift - case $command in - help) - if [ $# -eq 0 ]; then - cat <&2 "Gerrit username not found." - return 1 - fi - local local_branch remote_branch - case $1 in - *:*) - local_branch=${1%:*} - remote_branch=${1##*:} - ;; - *) - local_branch=HEAD - remote_branch=$1 - ;; - esac - shift - git push $@ ssh://$user@$review:29418/$project \ - $local_branch:refs/for/$remote_branch || return 1 - ;; - changes|for) - if [ "$FUNCNAME" = "cmgerrit" ]; then - echo >&2 "'$FUNCNAME $command' is deprecated." - fi - ;; - __cmg_err_no_arg) - if [ $# -lt 2 ]; then - echo >&2 "'$FUNCNAME $command' missing argument." - elif [ $2 -eq 0 ]; then - if [ -n "$3" ]; then - $FUNCNAME help $1 - else - echo >&2 "'$FUNCNAME $1' missing argument." - fi - else - return 1 - fi - ;; - __cmg_err_not_repo) - if [ -z "$review" -o -z "$project" ]; then - echo >&2 "Not currently in any reviewable repository." - else - return 1 - fi - ;; - __cmg_err_not_supported) - $FUNCNAME __cmg_err_no_arg $command $# && return - case $1 in - #TODO: filter more git commands that don't use refname - init|add|rm|mv|status|clone|remote|bisect|config|stash) - echo >&2 "'$FUNCNAME $1' is not supported." - ;; - *) return 1 ;; - esac - ;; - #TODO: other special cases? - *) - $FUNCNAME __cmg_err_not_supported $command && return 1 - $FUNCNAME __cmg_err_no_arg $command $# help && return 1 - $FUNCNAME __cmg_err_not_repo && return 1 - local args="$@" - local change pre_args refs_arg post_args - case "$args" in - *--\ *) - pre_args=${args%%-- *} - post_args="-- ${args#*-- }" - ;; - *) pre_args="$args" ;; - esac - args=($pre_args) - pre_args= - if [ ${#args[@]} -gt 0 ]; then - change=${args[${#args[@]}-1]} - fi - if [ ${#args[@]} -gt 1 ]; then - pre_args=${args[0]} - for ((i=1; i<${#args[@]}-1; i++)); do - pre_args="$pre_args ${args[$i]}" - done - fi - while ((1)); do - case $change in - ""|--) - $FUNCNAME help $command - return 1 - ;; - *@*) - if [ -z "$refs_arg" ]; then - refs_arg="@${change#*@}" - change=${change%%@*} - fi - ;; - *~*) - if [ -z "$refs_arg" ]; then - refs_arg="~${change#*~}" - change=${change%%~*} - fi - ;; - *^*) - if [ -z "$refs_arg" ]; then - refs_arg="^${change#*^}" - change=${change%%^*} - fi - ;; - *:*) - if [ -z "$refs_arg" ]; then - refs_arg=":${change#*:}" - change=${change%%:*} - fi - ;; - *) break ;; - esac - done - $FUNCNAME fetch $change \ - && git $command $pre_args FETCH_HEAD$refs_arg $post_args \ - || return 1 - ;; - esac -} - -function cmrebase() { - local repo=$1 - local refs=$2 - local pwd="$(pwd)" - local dir="$(gettop)/$repo" - - if [ -z $repo ] || [ -z $refs ]; then - echo "CyanogenMod Gerrit Rebase Usage: " - echo " cmrebase " - echo " The patch IDs appear on the Gerrit commands that are offered." - echo " They consist on a series of numbers and slashes, after the text" - echo " refs/changes. For example, the ID in the following command is 26/8126/2" - echo "" - echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD" - echo "" - return - fi - - if [ ! -d $dir ]; then - echo "Directory $dir doesn't exist in tree." - return - fi - cd $dir - repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) - echo "Starting branch..." - repo start tmprebase . - echo "Bringing it up to date..." - repo sync . - echo "Fetching change..." - git fetch "http://review.cyanogenmod.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD - if [ "$?" != "0" ]; then - echo "Error cherry-picking. Not uploading!" - return - fi - echo "Uploading..." - repo upload . - echo "Cleaning up..." - repo abandon tmprebase . - cd $pwd -} - -function mka() { - local T=$(gettop) - if [ "$T" ]; then - case `uname -s` in - Darwin) - make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@" - ;; - *) - mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" - ;; - esac - - else - echo "Couldn't locate the top of the tree. Try setting TOP." - fi -} - -function cmka() { - if [ ! -z "$1" ]; then - for i in "$@"; do - case $i in - bacon|otapackage|systemimage) - mka installclean - mka $i - ;; - *) - mka clean-$i - mka $i - ;; - esac - done - else - mka clean - mka - fi -} - -function mms() { - local T=$(gettop) - if [ -z "$T" ] - then - echo "Couldn't locate the top of the tree. Try setting TOP." - return 1 - fi - - case `uname -s` in - Darwin) - local NUM_CPUS=$(sysctl hw.ncpu|cut -d" " -f2) - ONE_SHOT_MAKEFILE="__none__" \ - make -C $T -j $NUM_CPUS "$@" - ;; - *) - local NUM_CPUS=$(cat /proc/cpuinfo | grep "^processor" | wc -l) - ONE_SHOT_MAKEFILE="__none__" \ - mk_timer schedtool -B -n 1 -e ionice -n 1 \ - make -C $T -j $NUM_CPUS "$@" - ;; - esac -} - - -function repolastsync() { - RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json" - RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z") - RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z") - echo "Last repo sync: $RLSLOCAL / $RLSUTC" -} - -function reposync() { - case `uname -s` in - Darwin) - repo sync -j 4 "$@" - ;; - *) - schedtool -B -n 1 -e ionice -n 1 `which repo` sync -j 4 "$@" - ;; - esac -} - -function repodiff() { - if [ -z "$*" ]; then - echo "Usage: repodiff [[ref-to] [--numstat]]" - return - fi - diffopts=$* repo forall -c \ - 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' -} - -# Return success if adb is up and not in recovery -function _adb_connected { - { - if [[ "$(adb get-state)" == device && - "$(adb shell test -e /sbin/recovery; echo $?)" == 0 ]] - then - return 0 - fi - } 2>/dev/null - - return 1 -}; - -# Credit for color strip sed: http://goo.gl/BoIcm -function dopush() -{ - local func=$1 - shift - - adb start-server # Prevent unexpected starting server message from adb get-state in the next line - if ! _adb_connected; then - echo "No device is online. Waiting for one..." - echo "Please connect USB and/or enable USB debugging" - until _adb_connected; do - sleep 1 - done - echo "Device Found." - fi - - if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD") || [ "$FORCE_PUSH" = "true" ]; - then - # retrieve IP and PORT info if we're using a TCP connection - TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ - | head -1 | awk '{print $1}') - adb root &> /dev/null - sleep 0.3 - if [ -n "$TCPIPPORT" ] - then - # adb root just killed our connection - # so reconnect... - adb connect "$TCPIPPORT" - fi - adb wait-for-device &> /dev/null - sleep 0.3 - adb remount &> /dev/null - - mkdir -p $OUT - ($func $*|tee $OUT/.log;return ${PIPESTATUS[0]}) - ret=$?; - if [ $ret -ne 0 ]; then - rm -f $OUT/.log;return $ret - fi - - # Install: - if [ `uname` = "Linux" ]; then - LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" - else - LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Install: ' | cut -d ':' -f 2)" - fi - - # Copy: - if [ `uname` = "Linux" ]; then - LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" - else - LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Copy: ' | cut -d ':' -f 2)" - fi - - # If any files are going to /data, push an octal file permissions reader to device - if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then - CHKPERM="/data/local/tmp/chkfileperm.sh" -( -cat <<'EOF' -#!/system/xbin/sh -FILE=$@ -if [ -e $FILE ]; then - ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1 -fi -EOF -) > $OUT/.chkfileperm.sh - echo "Pushing file permissions checker to device" - adb push $OUT/.chkfileperm.sh $CHKPERM - adb shell chmod 755 $CHKPERM - rm -f $OUT/.chkfileperm.sh - fi - - stop_n_start=false - for FILE in $(echo $LOC | tr " " "\n"); do - # Make sure file is in $OUT/system or $OUT/data - case $FILE in - $OUT/system/*|$OUT/data/*) - # Get target file name (i.e. /system/bin/adb) - TARGET=$(echo $FILE | sed "s#$OUT##") - ;; - *) continue ;; - esac - - case $TARGET in - /data/*) - # fs_config only sets permissions and se labels for files pushed to /system - if [ -n "$CHKPERM" ]; then - OLDPERM=$(adb shell $CHKPERM $TARGET) - OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n') - OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}') - OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}') - fi - echo "Pushing: $TARGET" - adb push $FILE $TARGET - if [ -n "$OLDPERM" ]; then - echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP" - adb shell chown "$OLDOWN":"$OLDGRP" $TARGET - adb shell chmod "$OLDPERM" $TARGET - else - echo "$TARGET did not exist previously, you should set file permissions manually" - fi - adb shell restorecon "$TARGET" - ;; - /system/priv-app/SystemUI/SystemUI.apk|/system/framework/*) - # Only need to stop services once - if ! $stop_n_start; then - adb shell stop - stop_n_start=true - fi - echo "Pushing: $TARGET" - adb push $FILE $TARGET - ;; - *) - echo "Pushing: $TARGET" - adb push $FILE $TARGET - ;; - esac - done - if [ -n "$CHKPERM" ]; then - adb shell rm $CHKPERM - fi - if $stop_n_start; then - adb shell start - fi - rm -f $OUT/.log - return 0 - else - echo "The connected device does not appear to be $AICP_BUILD, run away!" - fi -} - -alias mmp='dopush mm' -alias mmmp='dopush mmm' -alias mmap='dopush mma' -alias mkap='dopush mka' -alias cmkap='dopush cmka' - -function repopick() { - T=$(gettop) - $T/build/tools/repopick.py $@ -} - -function fixup_common_out_dir() { - common_out_dir=$(get_build_var OUT_DIR)/target/common - target_device=$(get_build_var TARGET_DEVICE) - if [ ! -z $AICP_FIXUP_COMMON_OUT ]; then - if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then - mv ${common_out_dir} ${common_out_dir}-${target_device} - ln -s ${common_out_dir}-${target_device} ${common_out_dir} - else - [ -L ${common_out_dir} ] && rm ${common_out_dir} - mkdir -p ${common_out_dir}-${target_device} - ln -s ${common_out_dir}-${target_device} ${common_out_dir} - fi - else - [ -L ${common_out_dir} ] && rm ${common_out_dir} - mkdir -p ${common_out_dir} - fi -} - # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that @@ -2653,3 +1716,5 @@ check_bash_version && { } export ANDROID_BUILD_TOP=$(gettop) + +. vendor/aicp/build/envsetup.sh diff --git a/target/product/security/aicp-devkey.x509.pem b/target/product/security/aicp-devkey.x509.pem deleted file mode 100644 index b7a6ae404b0..00000000000 --- a/target/product/security/aicp-devkey.x509.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID1TCCAr2gAwIBAgIJANO67t8hIti6MA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD -VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEX -MBUGA1UECgwOQ3lhbm9nZW4sIEluYy4xGzAZBgNVBAsMElJlbGVhc2UgTWFuYWdl -bWVudDEUMBIGA1UEAwwLRGV2ZWxvcG1lbnQwHhcNMTQwNDI4MjAyODM3WhcNNDEw -OTEzMjAyODM3WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x -EDAOBgNVBAcMB1NlYXR0bGUxFzAVBgNVBAoMDkN5YW5vZ2VuLCBJbmMuMRswGQYD -VQQLDBJSZWxlYXNlIE1hbmFnZW1lbnQxFDASBgNVBAMMC0RldmVsb3BtZW50MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz/V9RvYnr18fraPWNeQEZNeg -Kc0A3QskImQyGY22EGBZ63KUxa6zAfAug0OYSjofVJRaTtdvBXjO/C71XZRh4wun -xhOUAJt8zIJ0lRx8GMC0GHzePEnEVvoiu3zSAPHCNf5lmdhyhccMOtC18J+evPf4 -EVBb3cis+F1m6ZoZKPgSFBR5A9CV5Tai8iiZluGGg15Wt12Rp2vmbmQxiOJZxBs4 -Ps40XR5gjO1q4R3HiGnFyql9qeecwaTUWXAd76lhNiLUr7K8IRs+96i+t5vSKajB -M8O99BtYyBtf8ItMnHSZJxtsMw+TFXNLmMtaQarpsjp0LLGuHb/vsrjgBPvzsQID -AQABo1AwTjAdBgNVHQ4EFgQUTpNgXBqV7j+33bi8B80YLQq6EL8wHwYDVR0jBBgw -FoAUTpNgXBqV7j+33bi8B80YLQq6EL8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B -AQUFAAOCAQEAVlVBNksK+1C3J8uQ9kVemYMozfbboV9c4PLbtVzNSO8vwZ3X5E4T -2zfQPcFsfSMIa51a1tETBcDA6k+72xHZ+xEQJQNrX+o1F1RIIrXp0OKAz/k5cXyk -OS0+nd0EXP/A1EW0m8N/X6E9wpRkIhfqtEsqeCf8GH7O9Ua2qHZ9zkTBpbAVH0oe -ZWorHBdo3GdMJ5vcjFqnDdRs8F0BnZmjS+NrgXRLhLb6ZARS/bkUQyr5TX82dgG6 -vzvKsdKyX34gsKAsjxwLWo7XXgehFfjY+SGjjilJtardr+y/KlHNEw9s9aLe+Xny -Qoa9j9Ut6/KwRaC6lSEQ7HZk6SdzFsdugA== ------END CERTIFICATE----- diff --git a/target/product/security/aicp.x509.pem b/target/product/security/aicp.x509.pem deleted file mode 100644 index 5ff19db7213..00000000000 --- a/target/product/security/aicp.x509.pem +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDZDCCAkygAwIBAgIEUfbexjANBgkqhkiG9w0BAQUFADB0MQswCQYDVQQGEwJV -UzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoTDUN5YW5v -Z2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMTDUN5YW5v -Z2VuIEluYy4wHhcNMTMwNzI5MjEyOTQyWhcNNDAxMjE0MjEyOTQyWjB0MQswCQYD -VQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoT -DUN5YW5vZ2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMT -DUN5YW5vZ2VuIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCP -+K2NPqdZ6UmexXQ8tsc2TkLXYhiuEsifO66qlpwsTTw1522HcbKPVoPRr/JBXqOv -E3K0HuZ/IsYYGsP/wJWWvpaWs+5xC+YkLkittK2uUzTqndpLFiDRAeICKpvDJI57 -Z0DkzVYXBPn+yw+x8ttjT/vWcJ3PEVYuew8MYPUOgKpdZlQtUBeoEBDSL8JPGViq -e6jWOlSAWekhlgb+wb9RoXhu/v2HYzp89GG0sIrAgj7vZCior5XuFmm8eWhqUhTp -TUBv/nNI/ORYt3G8IQyI2pJN1GNPAAv1uA5i4y/deX1x4GCWyN9feiD9fOj2oc3z -Hwf5Frs9BjOb9XMXecbNAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGudhFe9VnES -fWynTYO4kWNlMC++yB6qD3pHW6HtBiaANj9wxrLCTFzf+boHNPeZ8HDkW01zAaQK -fd9/fnGmHf4q/QvxrvGbnb3Fqhw+2hknbbMUoAa+Qp+2ouf9oJaNRquZ+rHEHX8g -Rx8wGyvjaWYfQrwyZRgXj/Jrc/NXxQCmSJeexHVNXgQD6aOLHJYrJ+s+U/hwVNiM -5L+psOh89itwt8DGGSLW16HjQKmPPbWbqxgnfRbOlxWrLDq3agcrskYpDP2aGGBA -5STq/bvh9yZkrNYvMGzrXDhcJ44QRS8e1Jw/ZtfFvJD192e7KKVdy7CJWmOckCNK -gl0KCQ3MBx4= ------END CERTIFICATE----- diff --git a/tools/repopick.py b/tools/repopick.py deleted file mode 100755 index 9bf26bd18de..00000000000 --- a/tools/repopick.py +++ /dev/null @@ -1,407 +0,0 @@ -#!/usr/bin/env python -# -# Copyright (C) 2013-15 The CyanogenMod 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. -# - -# -# Run repopick.py -h for a description of this utility. -# - -from __future__ import print_function - -import sys -import json -import os -import subprocess -import re -import argparse -import textwrap -from xml.etree import ElementTree - -try: - # For python3 - import urllib.error - import urllib.request -except ImportError: - # For python2 - import imp - import urllib2 - urllib = imp.new_module('urllib') - urllib.error = urllib2 - urllib.request = urllib2 - - -# Verifies whether pathA is a subdirectory (or the same) as pathB -def is_subdir(a, b): - a = os.path.realpath(a) + '/' - b = os.path.realpath(b) + '/' - return b == a[:len(b)] - - -def fetch_query_via_ssh(remote_url, query): - """Given a remote_url and a query, return the list of changes that fit it - This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API - We have to get the data, then transform it to match what we're expecting from the HTTP RESET API""" - if remote_url.count(':') == 2: - (uri, userhost, port) = remote_url.split(':') - userhost = userhost[2:] - elif remote_url.count(':') == 1: - (uri, userhost) = remote_url.split(':') - userhost = userhost[2:] - port = 29418 - else: - raise Exception('Malformed URI: Expecting ssh://[user@]host[:port]') - - - out = subprocess.check_output(['ssh', '-x', '-p{0}'.format(port), userhost, 'gerrit', 'query', '--format=JSON --patch-sets --current-patch-set', query]) - if not hasattr(out, 'encode'): - out = out.decode() - reviews = [] - for line in out.split('\n'): - try: - data = json.loads(line) - # make our data look like the http rest api data - review = { - 'branch': data['branch'], - 'change_id': data['id'], - 'current_revision': data['currentPatchSet']['revision'], - 'number': int(data['number']), - 'revisions': {patch_set['revision']: { - 'number': int(patch_set['number']), - 'fetch': { - 'ssh': { - 'ref': patch_set['ref'], - 'url': 'ssh://{0}:{1}/{2}'.format(userhost, port, data['project']) - } - } - } for patch_set in data['patchSets']}, - 'subject': data['subject'], - 'project': data['project'], - 'status': data['status'] - } - reviews.append(review) - except: - pass - args.quiet or print('Found {0} reviews'.format(len(reviews))) - return reviews - - -def fetch_query_via_http(remote_url, query): - - """Given a query, fetch the change numbers via http""" - url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query) - data = urllib.request.urlopen(url).read().decode('utf-8') - reviews = json.loads(data[5:]) - - for review in reviews: - review['number'] = review.pop('_number') - - return reviews - - -def fetch_query(remote_url, query): - """Wrapper for fetch_query_via_proto functions""" - if remote_url[0:3] == 'ssh': - return fetch_query_via_ssh(remote_url, query) - elif remote_url[0:4] == 'http': - return fetch_query_via_http(remote_url, query.replace(' ', '+')) - else: - raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]') - -if __name__ == '__main__': - # Default to CyanogenMod Gerrit - default_gerrit = 'http://review.cyanogenmod.org' - - parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ - repopick.py is a utility to simplify the process of cherry picking - patches from CyanogenMod's Gerrit instance (or any gerrit instance of your choosing) - - Given a list of change numbers, repopick will cd into the project path - and cherry pick the latest patch available. - - With the --start-branch argument, the user can specify that a branch - should be created before cherry picking. This is useful for - cherry-picking many patches into a common branch which can be easily - abandoned later (good for testing other's changes.) - - The --abandon-first argument, when used in conjunction with the - --start-branch option, will cause repopick to abandon the specified - branch in all repos first before performing any cherry picks.''')) - parser.add_argument('change_number', nargs='*', help='change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.') - parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory') - parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking') - parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch') - parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"') - parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible') - parser.add_argument('-v', '--verbose', action='store_true', help='print extra information to aid in debug') - parser.add_argument('-f', '--force', action='store_true', help='force cherry pick even if change is closed') - parser.add_argument('-p', '--pull', action='store_true', help='execute pull instead of cherry-pick') - parser.add_argument('-P', '--path', help='use the specified path for the change') - parser.add_argument('-t', '--topic', help='pick all commits from a specified topic') - parser.add_argument('-Q', '--query', help='pick all commits using the specified query') - parser.add_argument('-g', '--gerrit', default=default_gerrit, help='Gerrit Instance to use. Form proto://[user@]host[:port]') - parser.add_argument('-e', '--exclude', nargs=1, help='exclude a list of commit numbers separated by a ,') - args = parser.parse_args() - if not args.start_branch and args.abandon_first: - parser.error('if --abandon-first is set, you must also give the branch name with --start-branch') - if args.auto_branch: - args.abandon_first = True - args.ignore_missing = True - if not args.start_branch: - args.start_branch = ['auto'] - if args.quiet and args.verbose: - parser.error('--quiet and --verbose cannot be specified together') - - if (1 << bool(args.change_number) << bool(args.topic) << bool(args.query)) != 2: - parser.error('One (and only one) of change_number, topic, and query are allowed') - - # Change current directory to the top of the tree - if 'ANDROID_BUILD_TOP' in os.environ: - top = os.environ['ANDROID_BUILD_TOP'] - - if not is_subdir(os.getcwd(), top): - sys.stderr.write('ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n') - sys.exit(1) - os.chdir(os.environ['ANDROID_BUILD_TOP']) - - # Sanity check that we are being run from the top level of the tree - if not os.path.isdir('.repo'): - sys.stderr.write('ERROR: No .repo directory found. Please run this from the top of your tree.\n') - sys.exit(1) - - # If --abandon-first is given, abandon the branch before starting - if args.abandon_first: - # Determine if the branch already exists; skip the abandon if it does not - plist = subprocess.check_output(['repo', 'info']) - if not hasattr(plist, 'encode'): - plist = plist.decode() - needs_abandon = False - for pline in plist.splitlines(): - matchObj = re.match(r'Local Branches.*\[(.*)\]', pline) - if matchObj: - local_branches = re.split('\s*,\s*', matchObj.group(1)) - if any(args.start_branch[0] in s for s in local_branches): - needs_abandon = True - - if needs_abandon: - # Perform the abandon only if the branch already exists - if not args.quiet: - print('Abandoning branch: %s' % args.start_branch[0]) - subprocess.check_output(['repo', 'abandon', args.start_branch[0]]) - if not args.quiet: - print('') - - # Get the master manifest from repo - # - convert project name and revision to a path - project_name_to_data = {} - manifest = subprocess.check_output(['repo', 'manifest']) - xml_root = ElementTree.fromstring(manifest) - projects = xml_root.findall('project') - remotes = xml_root.findall('remote') - default_revision = xml_root.findall('default')[0].get('revision') - - #dump project data into the a list of dicts with the following data: - #{project: {path, revision}} - - for project in projects: - name = project.get('name') - path = project.get('path') - revision = project.get('revision') - if revision is None: - for remote in remotes: - if remote.get('name') == project.get('remote'): - revision = remote.get('revision') - if revision is None: - revision = default_revision - - if not name in project_name_to_data: - project_name_to_data[name] = {} - revision = revision.split('refs/heads/')[-1] - project_name_to_data[name][revision] = path - - # get data on requested changes - reviews = [] - change_numbers = [] - if args.topic: - reviews = fetch_query(args.gerrit, 'topic:{0}'.format(args.topic)) - change_numbers = sorted([str(r['number']) for r in reviews]) - if args.query: - reviews = fetch_query(args.gerrit, args.query) - change_numbers = sorted([str(r['number']) for r in reviews]) - if args.change_number: - for c in args.change_number: - if '-' in c: - templist = c.split('-') - for i in range(int(templist[0]), int(templist[1]) + 1): - change_numbers.append(str(i)) - else: - change_numbers.append(c) - reviews = fetch_query(args.gerrit, ' OR '.join('change:{0}'.format(x.split('/')[0]) for x in change_numbers)) - - # make list of things to actually merge - mergables = [] - - # If --exclude is given, create the list of commits to ignore - exclude = [] - if args.exclude: - exclude = args.exclude[0].split(',') - - for change in change_numbers: - patchset = None - if '/' in change: - (change, patchset) = change.split('/') - - if change in exclude: - continue - - change = int(change) - review = next((x for x in reviews if x['number'] == change), None) - if review is None: - print('Change %d not found, skipping' % change) - continue - - mergables.append({ - 'subject': review['subject'], - 'project': review['project'], - 'branch': review['branch'], - 'change_id': review['change_id'], - 'change_number': review['number'], - 'status': review['status'], - 'fetch': None - }) - mergables[-1]['fetch'] = review['revisions'][review['current_revision']]['fetch'] - mergables[-1]['id'] = change - if patchset: - try: - mergables[-1]['fetch'] = [x['fetch'] for x in review['revisions'] if x['_number'] == patchset][0] - mergables[-1]['id'] = '{0}/{1}'.format(change, patchset) - except (IndexError, ValueError): - args.quiet or print('ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.'.format(change, patchset)) - - for item in mergables: - args.quiet or print('Applying change number {0}...'.format(item['id'])) - # Check if change is open and exit if it's not, unless -f is specified - if (item['status'] != 'OPEN' and item['status'] != 'NEW') and not args.query: - if args.force: - print('!! Force-picking a closed change !!\n') - else: - print('Change status is ' + item['status'] + '. Skipping the cherry pick.\nUse -f to force this pick.') - continue - - # Convert the project name to a project path - # - check that the project path exists - project_path = None - - if item['project'] in project_name_to_data and item['branch'] in project_name_to_data[item['project']]: - project_path = project_name_to_data[item['project']][item['branch']] - elif args.path: - project_path = args.path - elif args.ignore_missing: - print('WARNING: Skipping {0} since there is no project directory for: {1}\n'.format(item['id'], item['project'])) - continue - else: - sys.stderr.write('ERROR: For {0}, could not determine the project path for project {1}\n'.format(item['id'], item['project'])) - sys.exit(1) - - # If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully) - if args.start_branch: - subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) - - # Determine the maximum commits to check already picked changes - check_picked_count = 10 - branch_commits_count = int(subprocess.check_output(['git', 'rev-list', '--count', 'HEAD'], cwd=project_path)) - if branch_commits_count <= check_picked_count: - check_picked_count = branch_commits_count - 1 - - # Check if change is already picked to HEAD...HEAD~check_picked_count - found_change = False - for i in range(0, check_picked_count): - output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() - if 'Change-Id:' in output: - head_change_id = '' - for j,t in enumerate(reversed(output)): - if t == 'Change-Id:': - head_change_id = output[len(output) - j] - break - if head_change_id.strip() == item['change_id']: - print('Skipping {0} - already picked in {1} as HEAD~{2}'.format(item['id'], project_path, i)) - found_change = True - break - if found_change: - continue - - # Print out some useful info - if not args.quiet: - print('--> Subject: "{0}"'.format(item['subject'])) - print('--> Project path: {0}'.format(project_path)) - print('--> Change number: {0} (Patch Set {0})'.format(item['id'])) - - if 'anonymous http' in item['fetch']: - method = 'anonymous http' - else: - method = 'ssh' - - # Try fetching from GitHub first if using default gerrit - if args.gerrit == default_gerrit: - if args.verbose: - print('Trying to fetch the change from GitHub') - - if args.pull: - cmd = ['git pull --no-edit github', item['fetch'][method]['ref']] - else: - cmd = ['git fetch github', item['fetch'][method]['ref']] - if args.quiet: - cmd.append('--quiet') - else: - print(cmd) - result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) - FETCH_HEAD = '{0}/.git/FETCH_HEAD'.format(project_path) - if result != 0 and os.stat(FETCH_HEAD).st_size != 0: - print('ERROR: git command failed') - sys.exit(result) - # Check if it worked - if args.gerrit != default_gerrit or os.stat(FETCH_HEAD).st_size == 0: - # If not using the default gerrit or github failed, fetch from gerrit. - if args.verbose: - if args.gerrit == default_gerrit: - print('Fetching from GitHub didn\'t work, trying to fetch the change from Gerrit') - else: - print('Fetching from {0}'.format(args.gerrit)) - - if args.pull: - cmd = ['git pull --no-edit', item['fetch'][method]['url'], item['fetch'][method]['ref']] - else: - cmd = ['git fetch', item['fetch'][method]['url'], item['fetch'][method]['ref']] - if args.quiet: - cmd.append('--quiet') - else: - print(cmd) - result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) - if result != 0: - print('ERROR: git command failed') - sys.exit(result) - # Perform the cherry-pick - if not args.pull: - cmd = ['git cherry-pick FETCH_HEAD'] - if args.quiet: - cmd_out = open(os.devnull, 'wb') - else: - cmd_out = None - result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) - if result != 0: - print('ERROR: git command failed') - sys.exit(result) - if not args.quiet: - print('') diff --git a/tools/roomservice.py b/tools/roomservice.py deleted file mode 100755 index 110c7b5d261..00000000000 --- a/tools/roomservice.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python -# Copyright (C) 2012 The CyanogenMod Project -# Copyright (C) 2012-2014 AICP 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. - -from __future__ import print_function - -import base64 -import json -import netrc -import os -import re -import sys -try: - # For python3 - import urllib.error - import urllib.parse - import urllib.request -except ImportError: - # For python2 - import imp - import urllib2 - import urlparse - urllib = imp.new_module('urllib') - urllib.error = urllib2 - urllib.parse = urlparse - urllib.request = urllib2 - -from xml.etree import ElementTree - -product = sys.argv[1] - -if len(sys.argv) > 2: - depsonly = sys.argv[2] -else: - depsonly = None - -try: - device = product[product.index("_") + 1:] -except: - device = product - -if not depsonly: - print("Device %s not found. Attempting to retrieve device repository from AICP Github (http://github.com/AICP)." % device) - -repositories = [] - -page = 1 -while not depsonly: - result = json.loads(urllib.request.urlopen("https://api.github.com/users/AICP/repos?page=%d" % page).read().decode()) - if len(result) == 0: - break - for res in result: - repositories.append(res) - page = page + 1 - -local_manifests = r'.repo/local_manifests' -if not os.path.exists(local_manifests): os.makedirs(local_manifests) - -def exists_in_tree(lm, repository): - for child in lm.getchildren(): - if child.attrib['path'].endswith(repository): - return child - return None - -def exists_in_tree_device(lm, repository): - for child in lm.getchildren(): - if child.attrib['name'].endswith(repository): - return child - return None - -# in-place prettyprint formatter -def indent(elem, level=0): - i = "\n" + level*" " - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + " " - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - indent(elem, level+1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i - -def get_from_manifest(devicename): - try: - lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if re.search("device_.*_%s$" % device, localpath.get("name")): - return localpath.get("path") - - # Devices originally from AOSP are in the main manifest... - try: - mm = ElementTree.parse(".repo/manifest.xml") - mm = mm.getroot() - except: - mm = ElementTree.Element("manifest") - - for localpath in mm.findall("project"): - if re.search("device_.*_%s$" % device, localpath.get("name")): - return localpath.get("path") - - return None - -def is_in_manifest(projectname, branch): - try: - lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for localpath in lm.findall("project"): - if localpath.get("name") == projectname and localpath.get("revision") == branch: - return 1 - - return None - -def add_to_manifest_dependencies(repositories): - try: - lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for repository in repositories: - repo_name = repository['repository'] - repo_target = repository['target_path'] - existing_project = exists_in_tree(lm, repo_target) - if existing_project != None: - if existing_project.attrib['name'] != repository['repository']: - print ('Updating dependency %s' % (repo_name)) - existing_project.set('name', repository['repository']) - if existing_project.attrib['revision'] == repository['branch']: - print ('AICP/%s already exists' % (repo_name)) - else: - print ('updating branch for %s to %s' % (repo_name, repository['branch'])) - existing_project.set('revision', repository['branch']) - continue - - print ('Adding dependency: %s -> %s' % (repo_name, repo_target)) - project = ElementTree.Element("project", attrib = { "path": repo_target, - "remote": "aicp", "name": repo_name, "revision": "n7.0" }) - - if 'branch' in repository: - project.set('revision',repository['branch']) - - lm.append(project) - - indent(lm, 0) - raw_xml = ElementTree.tostring(lm).decode() - raw_xml = '\n' + raw_xml - - f = open('.repo/local_manifests/aicp_manifest.xml', 'w') - f.write(raw_xml) - f.close() - -def add_to_manifest(repositories): - try: - lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") - lm = lm.getroot() - except: - lm = ElementTree.Element("manifest") - - for repository in repositories: - repo_name = repository['repository'] - repo_target = repository['target_path'] - if exists_in_tree(lm, repo_name): - print('AICP/%s already exists' % (repo_name)) - continue - - print('Adding dependency: AICP/%s -> %s' % (repo_name, repo_target)) - project = ElementTree.Element("project", attrib = { "path": repo_target, - "remote": "aicp", "name": "AICP/%s" % repo_name, "revision": "n7.0" }) - - if 'branch' in repository: - project.set('revision',repository['branch']) - elif fallback_branch: - print("Using fallback branch %s for %s" % (fallback_branch, repo_name)) - project.set('revision', fallback_branch) - else: - print("Using default branch for %s" % repo_name) - - lm.append(project) - - indent(lm, 0) - raw_xml = ElementTree.tostring(lm).decode() - raw_xml = '\n' + raw_xml - - f = open('.repo/local_manifests/aicp_manifest.xml', 'w') - f.write(raw_xml) - f.close() - -def fetch_dependencies(repo_path, fallback_branch = None): - print('Looking for dependencies') - dependencies_path = repo_path + '/aicp.dependencies' - syncable_repos = [] - - if os.path.exists(dependencies_path): - dependencies_file = open(dependencies_path, 'r') - dependencies = json.loads(dependencies_file.read()) - fetch_list = [] - - for dependency in dependencies: - if not is_in_manifest("%s" % dependency['repository'], "%s" % dependency['branch']): - fetch_list.append(dependency) - syncable_repos.append(dependency['target_path']) - - dependencies_file.close() - - if len(fetch_list) > 0: - print('Adding dependencies to manifest') - add_to_manifest_dependencies(fetch_list) - else: - print('Dependencies file not found, bailing out.') - - if len(syncable_repos) > 0: - print('Syncing dependencies') - os.system('repo sync --force-sync %s' % ' '.join(syncable_repos)) - - for deprepo in syncable_repos: - fetch_dependencies(deprepo) - -def has_branch(branches, revision): - return revision in [branch['name'] for branch in branches] - - -if depsonly: - repo_path = get_from_manifest(device) - if repo_path: - fetch_dependencies(repo_path) - else: - print("Trying dependencies-only mode on a non-existing device tree?") - - sys.exit() - -else: - for repository in repositories: - repo_name = repository['name'] - if repo_name.startswith("device_") and repo_name.endswith("_" + device): - print("Found repository: %s" % repository['name']) - - manufacturer = repo_name.replace("device_", "").replace("_" + device, "") - - repo_path = "device/%s/%s" % (manufacturer, device) - - add_to_manifest([{'repository':repo_name,'target_path':repo_path,'branch':'n7.0'}]) - - print("Syncing repository to retrieve project.") - os.system('repo sync --force-sync %s' % repo_path) - print("Repository synced!") - - fetch_dependencies(repo_path) - print("Done") - sys.exit() - -print("Repository for %s not found in the AICP Github repository list. If this is in error, you may need to manually add it to your local_manifests/aicp_manifest.xml." % device) From d602c8c5b53d0c8d506a988dfc1d49e425bd744b Mon Sep 17 00:00:00 2001 From: doc HD Date: Tue, 27 Sep 2016 00:25:04 +0300 Subject: [PATCH 323/502] Revert "Move AICP build additions to vendor/aicp/build" This reverts commit 01ec68faeb30c7e53b14f81221f5cb831711dfcc. Change-Id: I8d3a0da869c1385e1e7b08fb7a56d2750b264975 --- core/Makefile | 4 + core/config.mk | 4 +- core/main.mk | 4 +- core/mtk_target.mk | 13 + core/mtk_utils.mk | 5 + core/qcom_target.mk | 133 +++ core/qcom_utils.mk | 230 +++++ core/tasks/dt_image.mk | 53 + core/tasks/kernel.mk | 378 ++++++++ envsetup.sh | 961 ++++++++++++++++++- target/product/security/aicp-devkey.x509.pem | 23 + target/product/security/aicp.x509.pem | 21 + tools/repopick.py | 407 ++++++++ tools/roomservice.py | 274 ++++++ 14 files changed, 2493 insertions(+), 17 deletions(-) create mode 100644 core/mtk_target.mk create mode 100755 core/mtk_utils.mk create mode 100644 core/qcom_target.mk create mode 100755 core/qcom_utils.mk create mode 100644 core/tasks/dt_image.mk create mode 100644 core/tasks/kernel.mk create mode 100644 target/product/security/aicp-devkey.x509.pem create mode 100644 target/product/security/aicp.x509.pem create mode 100755 tools/repopick.py create mode 100755 tools/roomservice.py diff --git a/core/Makefile b/core/Makefile index 6cc62234a41..af1ba0c0bbe 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1015,6 +1015,10 @@ OTA_PUBLIC_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem ifneq ($(OTA_PACKAGE_SIGNING_KEY),) OTA_PUBLIC_KEYS := $(OTA_PACKAGE_SIGNING_KEY).x509.pem PRODUCT_EXTRA_RECOVERY_KEYS := $(DEFAULT_SYSTEM_DEV_CERTIFICATE) +else + PRODUCT_EXTRA_RECOVERY_KEYS += \ + build/target/product/security/aicp \ + build/target/product/security/aicp-devkey endif # Generate a file containing the keys that will be read by the diff --git a/core/config.mk b/core/config.mk index c2d2c8935fe..99744b1f2c0 100644 --- a/core/config.mk +++ b/core/config.mk @@ -658,10 +658,10 @@ else endif # Rules for QCOM targets -include vendor/aicp/build/core/qcom_target.mk +include $(BUILD_SYSTEM)/qcom_target.mk # Rules for MTK targets -include vendor/aicp/build/core/mtk_target.mk +include $(BUILD_SYSTEM)/mtk_target.mk # ############################################################### # Set up final options. diff --git a/core/main.mk b/core/main.mk index e9df745f60a..85b02fbe131 100644 --- a/core/main.mk +++ b/core/main.mk @@ -145,10 +145,10 @@ endif include $(BUILD_SYSTEM)/cleanbuild.mk # Bring in Qualcomm helper macros -include vendor/aicp/build/core/qcom_utils.mk +include $(BUILD_SYSTEM)/qcom_utils.mk # Bring in Mediatek helper macros too -include vendor/aicp/build/core/mtk_utils.mk +include $(BUILD_SYSTEM)/mtk_utils.mk # Include the google-specific config -include vendor/google/build/config.mk diff --git a/core/mtk_target.mk b/core/mtk_target.mk new file mode 100644 index 00000000000..7c3ba1f6259 --- /dev/null +++ b/core/mtk_target.mk @@ -0,0 +1,13 @@ +ifeq ($(BOARD_USES_MTK_HARDWARE),true) + mtk_flags := -DMTK_HARDWARE + + TARGET_GLOBAL_CFLAGS += $(mtk_flags) + TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + + 2ND_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + 2ND_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) + 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(mtk_flags) + 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(mtk_flags) +endif diff --git a/core/mtk_utils.mk b/core/mtk_utils.mk new file mode 100755 index 00000000000..48fd6605443 --- /dev/null +++ b/core/mtk_utils.mk @@ -0,0 +1,5 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +MTK_BOARD_PLATFORMS := mt6592 +MTK_BOARD_PLATFORMS += mt6582 +MTK_BOARD_PLATFORMS += mt6572 diff --git a/core/qcom_target.mk b/core/qcom_target.mk new file mode 100644 index 00000000000..29e134a3710 --- /dev/null +++ b/core/qcom_target.mk @@ -0,0 +1,133 @@ +# Target-specific configuration + +# Populate the qcom hardware variants in the project pathmap. +define ril-set-path-variant +$(call project-set-path-variant,ril,TARGET_RIL_VARIANT,hardware/$(1)) +endef +define wlan-set-path-variant +$(call project-set-path-variant,wlan,TARGET_WLAN_VARIANT,hardware/qcom/$(1)) +endef +define bt-vendor-set-path-variant +$(call project-set-path-variant,bt-vendor,TARGET_BT_VENDOR_VARIANT,hardware/qcom/$(1)) +endef + +# Set device-specific HALs into project pathmap +define set-device-specific-path +$(if $(USE_DEVICE_SPECIFIC_$(1)), \ + $(if $(DEVICE_SPECIFIC_$(1)_PATH), \ + $(eval path := $(DEVICE_SPECIFIC_$(1)_PATH)), \ + $(eval path := $(TARGET_DEVICE_DIR)/$(2))), \ + $(eval path := $(3))) \ +$(call project-set-path,qcom-$(2),$(strip $(path))) +endef + +ifeq ($(BOARD_USES_QCOM_HARDWARE),true) + + qcom_flags := -DQCOM_HARDWARE + qcom_flags += -DQCOM_BSP + qcom_flags += -DQTI_BSP + + TARGET_USES_QCOM_BSP := true + + # Tell HALs that we're compiling an AOSP build with an in-line kernel + TARGET_COMPILE_WITH_MSM_KERNEL := true + + ifneq ($(filter msm7x27a msm7x30 msm8660 msm8960,$(TARGET_BOARD_PLATFORM)),) + # Enable legacy graphics functions + qcom_flags += -DQCOM_BSP_LEGACY + # Enable legacy audio functions + ifeq ($(BOARD_USES_LEGACY_ALSA_AUDIO),true) + USE_CUSTOM_AUDIO_POLICY := 1 + qcom_flags += -DLEGACY_ALSA_AUDIO + endif + endif + + # Enable extra offloading for post-805 targets + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + qcom_flags += -DHAS_EXTRA_FLAC_METADATA + endif + + TARGET_GLOBAL_CFLAGS += $(qcom_flags) + TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + # Multiarch needs these too.. + 2ND_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags) + 2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags) + + ifeq ($(QCOM_HARDWARE_VARIANT),) + ifneq ($(filter msm8610 msm8226 msm8974,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8974 + else + ifneq ($(filter msm8909 msm8916,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8916 + else + ifneq ($(filter msm8953 msm8937,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8937 + else + ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),) + QCOM_HARDWARE_VARIANT := msm8994 + else + QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM) + endif + endif + endif + endif + endif + +# HACK: check to see if build uses standard QC HAL paths by checking for CM path structure +AOSP_VARIANT_MAKEFILE := $(wildcard hardware/qcom/audio/default/Android.mk) +ifeq ("$(AOSP_VARIANT_MAKEFILE)","") +$(call project-set-path,qcom-audio,hardware/qcom/audio) +$(call project-set-path,qcom-display,hardware/qcom/display) +$(call project-set-path,qcom-media,hardware/qcom/media) +$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) +$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) +$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) +$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) +$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) +$(call project-set-path,ril,hardware/ril) +$(call project-set-path,wlan,hardware/qcom/wlan) +$(call project-set-path,bt-vendor,hardware/qcom/bt) +else +$(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT)) + +ifeq ($(SONY_BF64_KERNEL_VARIANT),true) +$(call project-set-path,qcom-display,hardware/qcom/display-caf/sony) +$(call project-set-path,qcom-media,hardware/qcom/media-caf/sony) +else +$(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT)) +$(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT)) +endif + +$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera) +$(call set-device-specific-path,GPS,gps,hardware/qcom/gps) +$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors) +$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location) +$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices) + +$(call ril-set-path-variant,ril) +$(call wlan-set-path-variant,wlan-caf) +$(call bt-vendor-set-path-variant,bt-caf) +endif # AOSP_VARIANT_MAKEFILE + +else + +$(call project-set-path,qcom-audio,hardware/qcom/audio/default) +$(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) +$(call project-set-path,qcom-media,hardware/qcom/media) + +$(call project-set-path,qcom-camera,hardware/qcom/camera) +$(call project-set-path,qcom-gps,hardware/qcom/gps) +$(call project-set-path,qcom-sensors,hardware/qcom/sensors) +$(call project-set-path,qcom-loc-api,vendor/qcom/opensource/location) +$(call project-set-path,qcom-dataservices,$(TARGET_DEVICE_DIR)/dataservices) + +$(call ril-set-path-variant,ril) +$(call wlan-set-path-variant,wlan) +$(call bt-vendor-set-path-variant,bt) + +endif diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk new file mode 100755 index 00000000000..50e0b4e04b7 --- /dev/null +++ b/core/qcom_utils.mk @@ -0,0 +1,230 @@ +# Board platforms lists to be used for +# TARGET_BOARD_PLATFORM specific featurization +QCOM_BOARD_PLATFORMS += msm7x27a +QCOM_BOARD_PLATFORMS += msm7x30 +QCOM_BOARD_PLATFORMS += msm8226 +QCOM_BOARD_PLATFORMS += msm8610 +QCOM_BOARD_PLATFORMS += msm8660 +QCOM_BOARD_PLATFORMS += msm8909 +QCOM_BOARD_PLATFORMS += msm8916 +QCOM_BOARD_PLATFORMS += msm8960 +QCOM_BOARD_PLATFORMS += msm8974 +QCOM_BOARD_PLATFORMS += mpq8092 +QCOM_BOARD_PLATFORMS += msm8937 +QCOM_BOARD_PLATFORMS += msm8952 +QCOM_BOARD_PLATFORMS += msm8953 +QCOM_BOARD_PLATFORMS += msm8992 +QCOM_BOARD_PLATFORMS += msm8994 +QCOM_BOARD_PLATFORMS += msm8996 +QCOM_BOARD_PLATFORMS += msm_bronze +QCOM_BOARD_PLATFORMS += apq8084 + +MSM7K_BOARD_PLATFORMS := msm7x30 +MSM7K_BOARD_PLATFORMS += msm7x27 +MSM7K_BOARD_PLATFORMS += msm7x27a +MSM7K_BOARD_PLATFORMS += msm7k + +QSD8K_BOARD_PLATFORMS := qsd8k + + +# vars for use by utils +empty := +space := $(empty) $(empty) +colon := $(empty):$(empty) +underscore := $(empty)_$(empty) + +# $(call match-word,w1,w2) +# checks if w1 == w2 +# How it works +# if (w1-w2 not empty or w2-w1 not empty) then not_match else match +# +# returns true or empty +#$(warning :$(1): :$(2): :$(subst $(1),,$(2)):) \ +#$(warning :$(2): :$(1): :$(subst $(2),,$(1)):) \ +# +define match-word +$(strip \ + $(if $(or $(subst $(1),$(empty),$(2)),$(subst $(2),$(empty),$(1))),,true) \ +) +endef + +# $(call find-word-in-list,w,wlist) +# finds an exact match of word w in word list wlist +# +# How it works +# fill wlist spaces with colon +# wrap w with colon +# search word w in list wl, if found match m, return stripped word w +# +# returns stripped word or empty +define find-word-in-list +$(strip \ + $(eval wl:= $(colon)$(subst $(space),$(colon),$(strip $(2)))$(colon)) \ + $(eval w:= $(colon)$(strip $(1))$(colon)) \ + $(eval m:= $(findstring $(w),$(wl))) \ + $(if $(m),$(1),) \ +) +endef + +# $(call match-word-in-list,w,wlist) +# does an exact match of word w in word list wlist +# How it works +# if the input word is not empty +# return output of an exact match of word w in wordlist wlist +# else +# return empty +# returns true or empty +define match-word-in-list +$(strip \ + $(if $(strip $(1)), \ + $(call match-word,$(call find-word-in-list,$(1),$(2)),$(strip $(1))), \ + ) \ +) +endef + +# $(call match-prefix,p,delim,w/wlist) +# matches prefix p in wlist using delimiter delim +# +# How it works +# trim the words in wlist w +# if find-word-in-list returns not empty +# return true +# else +# return empty +# +define match-prefix +$(strip \ + $(eval w := $(strip $(1)$(strip $(2)))) \ + $(eval text := $(patsubst $(w)%,$(1),$(3))) \ + $(if $(call match-word-in-list,$(1),$(text)),true,) \ +) +endef + +# ---- +# The following utilities are meant for board platform specific +# featurisation + +# $(call get-vendor-board-platforms,v) +# returns list of board platforms for vendor v +define get-vendor-board-platforms +$(if $(call match-word,$(BOARD_USES_$(1)_HARDWARE),true),$($(1)_BOARD_PLATFORMS)) +endef + +# $(call is-board-platform,bp) +# returns true or empty +define is-board-platform +$(call match-word,$(1),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-not-board-platform,bp) +# returns true or empty +define is-not-board-platform +$(if $(call match-word,$(1),$(TARGET_BOARD_PLATFORM)),,true) +endef + +# $(call is-board-platform-in-list,bpl) +# returns true or empty +define is-board-platform-in-list +$(call match-word-in-list,$(TARGET_BOARD_PLATFORM),$(1)) +endef + +# $(call is-vendor-board-platform,vendor) +# returns true or empty +define is-vendor-board-platform +$(strip \ + $(call match-word-in-list,$(TARGET_BOARD_PLATFORM),\ + $(call get-vendor-board-platforms,$(1)) \ + ) \ +) +endef + +# $(call is-chipset-in-board-platform,chipset) +# does a prefix match of chipset in TARGET_BOARD_PLATFORM +# uses underscore as a delimiter +# +# returns true or empty +define is-chipset-in-board-platform +$(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)) +endef + +# $(call is-chipset-prefix-in-board-platform,prefix) +# does a chipset prefix match in TARGET_BOARD_PLATFORM +# assumes '_' and 'a' as the delimiter to the chipset prefix +# +# How it works +# if ($(prefix)_ or $(prefix)a match in board platform) +# return true +# else +# return empty +# +define is-chipset-prefix-in-board-platform +$(strip \ + $(eval delim_a := $(empty)a$(empty)) \ + $(if \ + $(or \ + $(call match-prefix,$(1),$(delim_a),$(TARGET_BOARD_PLATFORM)), \ + $(call match-prefix,$(1),$(underscore),$(TARGET_BOARD_PLATFORM)), \ + ), \ + true, \ + ) \ +) +endef + +#---- +# The following utilities are meant for Android Code Name +# specific featurisation +# +# refer http://source.android.com/source/build-numbers.html +# for code names and associated sdk versions +CUPCAKE_SDK_VERSIONS := 3 +DONUT_SDK_VERSIONS := 4 +ECLAIR_SDK_VERSIONS := 5 6 7 +FROYO_SDK_VERSIONS := 8 +GINGERBREAD_SDK_VERSIONS := 9 10 +HONEYCOMB_SDK_VERSIONS := 11 12 13 +ICECREAM_SANDWICH_SDK_VERSIONS := 14 15 +JELLY_BEAN_SDK_VERSIONS := 16 17 18 + +# $(call is-platform-sdk-version-at-least,version) +# version is a numeric SDK_VERSION defined above +define is-platform-sdk-version-at-least +$(strip \ + $(if $(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) >= $(1) ))" )), \ + true, \ + ) \ +) +endef + +# $(call is-android-codename,codename) +# codename is one of cupcake,donut,eclair,froyo,gingerbread,icecream +# please refer the $(codename)_SDK_VERSIONS declared above +define is-android-codename +$(strip \ + $(if \ + $(call match-word-in-list,$(PLATFORM_SDK_VERSION),$($(1)_SDK_VERSIONS)), \ + true, \ + ) \ +) +endef + +# $(call is-android-codename-in-list,cnlist) +# cnlist is combination/list of android codenames +define is-android-codename-in-list +$(strip \ + $(eval acn := $(empty)) \ + $(foreach \ + i,$(1),\ + $(eval acn += \ + $(if \ + $(call \ + match-word-in-list,\ + $(PLATFORM_SDK_VERSION),\ + $($(i)_SDK_VERSIONS)\ + ),\ + true,\ + )\ + )\ + ) \ + $(if $(strip $(acn)),true,) \ +) +endef diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk new file mode 100644 index 00000000000..0f849466b7d --- /dev/null +++ b/core/tasks/dt_image.mk @@ -0,0 +1,53 @@ +#---------------------------------------------------------------------- +# Generate device tree image (dt.img) +#---------------------------------------------------------------------- +ifeq ($(strip $(BOARD_CUSTOM_BOOTIMG_MK)),) +ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true) +ifneq ($(strip $(BOARD_KERNEL_PREBUILT_DT)),true) +ifeq ($(strip $(BUILD_TINY_ANDROID)),true) +include device/qcom/common/dtbtool/Android.mk +endif + +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +DTBTOOL_NAME := dtbToolCM +else +DTBTOOL_NAME := $(TARGET_CUSTOM_DTBTOOL) +endif + +DTBTOOL := $(HOST_OUT_EXECUTABLES)/$(DTBTOOL_NAME)$(HOST_EXECUTABLE_SUFFIX) + +INSTALLED_DTIMAGE_TARGET := $(PRODUCT_OUT)/dt.img + +ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),) +# dtbToolCM will search subdirectories +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ +else +# Most specific paths must come first in possible_dtb_dirs +possible_dtb_dirs = $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts/ $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/ +endif + +define build-dtimage-target + $(call pretty,"Target dt image: $@") + $(hide) for dir in $(possible_dtb_dirs); do \ + if [ -d "$$dir" ]; then \ + dtb_dir="$$dir"; \ + break; \ + fi; \ + done; \ + $(DTBTOOL) $(BOARD_DTBTOOL_ARGS) -o $@ -s $(BOARD_KERNEL_PAGESIZE) -p $(KERNEL_OUT)/scripts/dtc/ "$$dtb_dir"; + $(hide) chmod a+r $@ +endef + +$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) + $(build-dtimage-target) + @echo "Made DT image: $@" + +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET) +ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_DTIMAGE_TARGET) + +.PHONY: dtimage +dtimage: $(INSTALLED_DTIMAGE_TARGET) + +endif +endif +endif diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk new file mode 100644 index 00000000000..d4a6ab85aea --- /dev/null +++ b/core/tasks/kernel.mk @@ -0,0 +1,378 @@ +# Copyright (C) 2012 The CyanogenMod 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. + + +# Android makefile to build kernel as a part of Android Build +# +# Configuration +# ============= +# +# These config vars are usually set in BoardConfig.mk: +# +# TARGET_KERNEL_SOURCE = Kernel source dir, optional, defaults +# to kernel/$(TARGET_DEVICE_DIR) +# TARGET_KERNEL_CONFIG = Kernel defconfig +# TARGET_KERNEL_VARIANT_CONFIG = Variant defconfig, optional +# TARGET_KERNEL_SELINUX_CONFIG = SELinux defconfig, optional +# TARGET_KERNEL_ADDITIONAL_CONFIG = Additional defconfig, optional +# TARGET_KERNEL_ARCH = Kernel Arch +# TARGET_KERNEL_HEADER_ARCH = Optional Arch for kernel headers if +# different from TARGET_KERNEL_ARCH +# TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, +# optional, defaults to false +# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) +# defaults to arm-linux-androideabi- for arm +# aarch64-linux-android- for arm64 +# x86_64-linux-android- for x86 +# +# BOARD_KERNEL_IMAGE_NAME = Built image name, optional, +# defaults to Image.gz on arm64 +# defaults to Image if TARGET_USES_UNCOMPRESSED_KERNEL +# defaults to zImage otherwise +# +# KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, +# Set this var in shell to override +# toolchain specified in BoardConfig.mk +# KERNEL_TOOLCHAIN = Path to toolchain, if unset, assumes +# TARGET_KERNEL_CROSS_COMPILE_PREFIX +# is in PATH +# USE_CCACHE = Enable ccache (global Android flag) +# +# NEED_KERNEL_MODULE_ROOT = Optional, if true, install kernel +# modules in root instead of system + + +TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g') + +## Externally influenced variables +# kernel location - optional, defaults to kernel// +TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR) +KERNEL_SRC := $(TARGET_KERNEL_SOURCE) +# kernel configuration - mandatory +KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) +VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) +SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) + +## Internal variables +KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ +KERNEL_CONFIG := $(KERNEL_OUT)/.config +KERNEL_OUT_STAMP := $(KERNEL_OUT)/.mkdir_stamp + +TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH)) +ifeq ($(TARGET_KERNEL_ARCH),) +KERNEL_ARCH := $(TARGET_ARCH) +else +KERNEL_ARCH := $(TARGET_KERNEL_ARCH) +endif + +ifeq ($(KERNEL_ARCH),x86_64) +KERNEL_DEFCONFIG_ARCH := x86 +else +KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) +endif +KERNEL_DEFCONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_DEFCONFIG_ARCH)/configs/$(KERNEL_DEFCONFIG) + +TARGET_KERNEL_HEADER_ARCH := $(strip $(TARGET_KERNEL_HEADER_ARCH)) +ifeq ($(TARGET_KERNEL_HEADER_ARCH),) +KERNEL_HEADER_ARCH := $(KERNEL_ARCH) +else +KERNEL_HEADER_ARCH := $(TARGET_KERNEL_HEADER_ARCH) +endif + +KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG)) +ifeq ($(KERNEL_HEADER_DEFCONFIG),) +KERNEL_HEADER_DEFCONFIG := $(KERNEL_DEFCONFIG) +endif + + +ifneq ($(BOARD_KERNEL_IMAGE_NAME),) + TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME) +else + ifeq ($(TARGET_USES_UNCOMPRESSED_KERNEL),true) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image + else + ifeq ($(KERNEL_ARCH),arm64) + TARGET_PREBUILT_INT_KERNEL_TYPE := Image.gz + else + TARGET_PREBUILT_INT_KERNEL_TYPE := zImage + endif + endif +endif + +TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE) + +# Clear this first to prevent accidental poisoning from env +MAKE_FLAGS := + +ifeq ($(KERNEL_ARCH),arm64) + # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) + MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + ifeq ($(TARGET_ARCH),arm) + KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y + endif +endif + +ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),) +KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG) +KERNEL_ADDITIONAL_CONFIG_SRC := $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG) + ifeq ("$(wildcard $(KERNEL_ADDITIONAL_CONFIG_SRC))","") + $(warning TARGET_KERNEL_ADDITIONAL_CONFIG '$(TARGET_KERNEL_ADDITIONAL_CONFIG)' doesn't exist) + KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null + endif +else + KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null +endif + +## Do be discontinued in a future version. Notify builder about target +## kernel format requirement +ifeq ($(BOARD_KERNEL_IMAGE_NAME),) +ifeq ($(BOARD_USES_UBOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage") +else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true) + $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image") +endif +endif + +ifeq "$(wildcard $(KERNEL_SRC) )" "" + ifneq ($(TARGET_PREBUILT_KERNEL),) + HAS_PREBUILT_KERNEL := true + NEEDS_KERNEL_COPY := true + else + $(foreach cf,$(PRODUCT_COPY_FILES), \ + $(eval _src := $(call word-colon,1,$(cf))) \ + $(eval _dest := $(call word-colon,2,$(cf))) \ + $(ifeq kernel,$(_dest), \ + $(eval HAS_PREBUILT_KERNEL := true))) + endif + + ifneq ($(HAS_PREBUILT_KERNEL),) + $(warning ***************************************************************) + $(warning * Using prebuilt kernel binary instead of source *) + $(warning * THIS IS DEPRECATED, AND WILL BE DISCONTINUED *) + $(warning * Please configure your device to download the kernel *) + $(warning * source repository to $(KERNEL_SRC)) + $(warning * See http://wiki.cyanogenmod.org/w/Doc:_integrated_kernel_building) + $(warning * for more information *) + $(warning ***************************************************************) + FULL_KERNEL_BUILD := false + KERNEL_BIN := $(TARGET_PREBUILT_KERNEL) + else + $(warning ***************************************************************) + $(warning * *) + $(warning * No kernel source found, and no fallback prebuilt defined. *) + $(warning * Please make sure your device is properly configured to *) + $(warning * download the kernel repository to $(KERNEL_SRC)) + $(warning * and add the TARGET_KERNEL_CONFIG variable to BoardConfig.mk *) + $(warning * *) + $(warning * As an alternative, define the TARGET_PREBUILT_KERNEL *) + $(warning * variable with the path to the prebuilt binary kernel image *) + $(warning * in your BoardConfig.mk file *) + $(warning * *) + $(warning ***************************************************************) + $(error "NO KERNEL") + endif +else + NEEDS_KERNEL_COPY := true + ifeq ($(TARGET_KERNEL_CONFIG),) + $(warning **********************************************************) + $(warning * Kernel source found, but no configuration was defined *) + $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *) + $(warning * BoardConfig.mk file *) + $(warning **********************************************************) + # $(error "NO KERNEL CONFIG") + else + #$(info Kernel source found, building it) + FULL_KERNEL_BUILD := true + KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) + endif +endif + +ifeq ($(FULL_KERNEL_BUILD),true) + +KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr +KERNEL_HEADERS_INSTALL_STAMP := $(KERNEL_OUT)/.headers_install_stamp + +ifeq ($(NEED_KERNEL_MODULE_ROOT),true) +KERNEL_MODULES_INSTALL := root +KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT)/lib/modules +else +KERNEL_MODULES_INSTALL := system +KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules +endif + +TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) +ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) +KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) +else ifeq ($(TARGET_ARCH),arm64) +KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- +else ifeq ($(TARGET_ARCH),arm) +KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- +else ifeq ($(TARGET_ARCH),x86) +KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- +endif + +ifeq ($(KERNEL_TOOLCHAIN),) +KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) +else +ifneq ($(KERNEL_TOOLCHAIN_PREFIX),) +KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) +endif +endif + +ifneq ($(USE_CCACHE),) + # Detect if the system already has ccache installed to use instead of the prebuilt + ccache := $(shell which ccache) + + ifeq ($(ccache),) + ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache + # Check that the executable is here. + ccache := $(strip $(wildcard $(ccache))) + endif +endif + +KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)" +ccache = + +define mv-modules + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`;\ + ko=`find $$mpath/kernel -type f -name *.ko`;\ + for i in $$ko; do $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$i;\ + mv $$i $(KERNEL_MODULES_OUT)/; done;\ + fi +endef + +define clean-module-folder + mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ + if [ "$$mdpath" != "" ];then\ + mpath=`dirname $$mdpath`; rm -rf $$mpath;\ + fi +endef + +ifeq ($(HOST_OS),darwin) + MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf/ +endif + +ifeq ($(TARGET_KERNEL_MODULES),) + TARGET_KERNEL_MODULES := no-external-modules +endif + +$(KERNEL_OUT_STAMP): + $(hide) mkdir -p $(KERNEL_OUT) + $(hide) rm -rf $(KERNEL_MODULES_OUT) + $(hide) mkdir -p $(KERNEL_MODULES_OUT) + $(hide) touch $@ + +KERNEL_ADDITIONAL_CONFIG_OUT := $(KERNEL_OUT)/.additional_config + +.PHONY: force_additional_config +$(KERNEL_ADDITIONAL_CONFIG_OUT): force_additional_config + $(hide) cmp -s $(KERNEL_ADDITIONAL_CONFIG_SRC) $@ || cp $(KERNEL_ADDITIONAL_CONFIG_SRC) $@; + +$(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) + @echo "Building Kernel Config" + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG) + $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi + $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ + echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ + $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi + +TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL_STAMP) + @echo "Building Kernel" + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) + $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \ + then \ + echo "Building DTBs" ; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \ + else \ + echo "DTBs not enabled" ; \ + fi ; + $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \ + then \ + echo "Building Kernel Modules" ; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \ + $(mv-modules) && \ + $(clean-module-folder) ; \ + else \ + echo "Kernel Modules not enabled" ; \ + fi ; + + +$(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES + +$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES) + $(mv-modules) + $(clean-module-folder) + +$(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) + @echo "Building Kernel Headers" + $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \ + rm -f ../$(KERNEL_CONFIG); \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi + $(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \ + echo "Used a different defconfig for header generation"; \ + rm -f ../$(KERNEL_CONFIG); \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi + $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi + $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ + echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ + $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig; fi + $(hide) touch $@ + +# provide this rule because there are dependencies on this throughout the repo +$(KERNEL_HEADERS_INSTALL): $(KERNEL_HEADERS_INSTALL_STAMP) + +kerneltags: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) tags + +kernelconfig: KERNELCONFIG_MODE := menuconfig +kernelxconfig: KERNELCONFIG_MODE := xconfig +kernelxconfig kernelconfig: $(KERNEL_OUT_STAMP) + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNELCONFIG_MODE) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig + cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC) + +alldefconfig: $(KERNEL_OUT_STAMP) + env KCONFIG_NOTIMESTAMP=true \ + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) alldefconfig + +endif # FULL_KERNEL_BUILD + +## Install it + +ifeq ($(NEEDS_KERNEL_COPY),true) +file := $(INSTALLED_KERNEL_TARGET) +ALL_PREBUILT += $(file) +$(file) : $(KERNEL_BIN) | $(ACP) + $(transform-prebuilt-to-target) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) +endif + +.PHONY: kernel +kernel: $(INSTALLED_KERNEL_TARGET) diff --git a/envsetup.sh b/envsetup.sh index ae6c1df8c17..5ceb54fbcea 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -4,12 +4,18 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - lunch: lunch - - tapas: tapas [ ...] [arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree. +- cout: Changes directory to out. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. +- mmap: Builds all of the modules in the current directory, and its dependencies, then pushes the package to the device. +- mmp: Builds all of the modules in the current directory and pushes them to the device. +- mmmp: Builds all of the modules in the supplied directories and pushes them to the device. +- mms: Short circuit builder. Quickly re-build the kernel, rootfs, boot and system images + without deep dependencies. Requires the full build to have run before. - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. @@ -20,12 +26,20 @@ Invoke ". build/envsetup.sh" from your shell to add the following functions to y - sepgrep: Greps on all local sepolicy files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file. - -EOF - - __print_cm_functions_help - -cat <=" pairs as a shell script. build_dicts_script=`\cd $T; export CALLED_FROM_SETUP=true; export BUILD_SYSTEM=build/core; \ command make --no-print-directory -f build/core/config.mk \ @@ -548,6 +562,9 @@ function print_lunch_menu() local uname=$(uname) echo echo "You're building on" $uname + if [ "$(uname)" = "Darwin" ] ; then + echo " (ohai, koush!)" + fi echo if [ "z${AICP_DEVICES_ONLY}" != "z" ]; then echo "Breakfast menu... pick a combo:" @@ -570,6 +587,65 @@ function print_lunch_menu() echo } +function brunch() +{ + breakfast $* + if [ $? -eq 0 ]; then + mka bacon + else + echo "No such item in brunch menu. Try 'breakfast'" + return 1 + fi + return $? +} + +function brunchopen() +{ + breakfast $* + if [ $? -eq 0 ]; then + mka bacon && xdg-open $ANDROID_PRODUCT_OUT + else + echo "No such item in brunch menu. Try 'breakfast'" + return 1 + fi + return $? +} + +function breakfast() +{ + target=$1 + local variant=$2 + AICP_DEVICES_ONLY="true" + unset LUNCH_MENU_CHOICES + add_lunch_combo full-eng + for f in `/bin/ls vendor/aicp/vendorsetup.sh 2> /dev/null` + do + echo "including $f" + . $f + done + unset f + + if [ $# -eq 0 ]; then + # No arguments, so let's have the full menu + lunch + else + echo "z$target" | grep -q "-" + if [ $? -eq 0 ]; then + # A buildtype was specified, assume a full device name + lunch $target + else + # This is probably just the AICP model name + if [ -z "$variant" ]; then + variant="userdebug" + fi + lunch aicp_$target-$variant + fi + fi + return $? +} + +alias bib=breakfast + function lunch() { local answer @@ -625,11 +701,11 @@ function lunch() # if we can't find a product, try to grab it off the AICP github T=$(gettop) pushd $T > /dev/null - vendor/aicp/build/tools/roomservice.py $product + build/tools/roomservice.py $product popd > /dev/null check_product $product else - vendor/aicp/build/tools/roomservice.py $product true + build/tools/roomservice.py $product true fi TARGET_PRODUCT=$product \ TARGET_BUILD_VARIANT=$variant \ @@ -728,6 +804,57 @@ function tapas() destroy_build_var_cache } +function eat() +{ + if [ "$OUT" ] ; then + MODVERSION=$(get_build_var AICP_VERSION) + ZIPFILE=aicp-$MODVERSION.zip + ZIPPATH=$OUT/$ZIPFILE + if [ ! -f $ZIPPATH ] ; then + echo "Nothing to eat" + return 1 + fi + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if [ $(adb get-state) != device -a $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) != 0 ] ; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until [ $(adb get-state) = device -o $(adb shell test -e /sbin/recovery 2> /dev/null; echo $?) = 0 ];do + sleep 1 + done + echo "Device Found.." + fi + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); + then + # if adbd isn't root we can't write to /cache/recovery/ + adb root + sleep 1 + adb wait-for-device + cat << EOF > /tmp/command +--sideload_auto_reboot +EOF + if adb push /tmp/command /cache/recovery/ ; then + echo "Rebooting into recovery for sideload installation" + adb reboot recovery + adb wait-for-sideload + adb sideload $ZIPPATH + fi + rm /tmp/command + else + echo "Nothing to eat" + return 1 + fi + return $? + else + echo "The connected device does not appear to be $AICP_BUILD, run away!" + fi +} + +function omnom +{ + brunch $* + eat +} + function gettop { local TOPFILE=build/core/envsetup.mk @@ -972,6 +1099,15 @@ function croot() fi } +function cout() +{ + if [ "$OUT" ]; then + cd $OUT + else + echo "Couldn't locate out directory. Try setting OUT." + fi +} + function cproj() { TOPFILE=build/core/envsetup.mk @@ -1185,6 +1321,106 @@ function is64bit() fi } +function dddclient() +{ + local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) + local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) + local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) + local OUT_EXE_SYMBOLS=$(get_symbols_directory) + local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) + local ARCH=$(get_build_var TARGET_ARCH) + local GDB + case "$ARCH" in + arm) GDB=arm-linux-androideabi-gdb;; + arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; + mips|mips64) GDB=mips64el-linux-android-gdb;; + x86) GDB=x86_64-linux-android-gdb;; + x86_64) GDB=x86_64-linux-android-gdb;; + *) echo "Unknown arch $ARCH"; return 1;; + esac + + if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then + local EXE="$1" + if [ "$EXE" ] ; then + EXE=$1 + if [[ $EXE =~ ^[^/].* ]] ; then + EXE="system/bin/"$EXE + fi + else + EXE="app_process" + fi + + local PORT="$2" + if [ "$PORT" ] ; then + PORT=$2 + else + PORT=":5039" + fi + + local PID="$3" + if [ "$PID" ] ; then + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + PID=`pid $3` + if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then + # that likely didn't work because of returning multiple processes + # try again, filtering by root processes (don't contain colon) + PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` + if [[ ! "$PID" =~ ^[0-9]+$ ]] + then + echo "Couldn't resolve '$3' to single PID" + return 1 + else + echo "" + echo "WARNING: multiple processes matching '$3' observed, using root process" + echo "" + fi + fi + fi + adb forward "tcp$PORT" "tcp$PORT" + local USE64BIT="$(is64bit $PID)" + adb shell gdbserver$USE64BIT $PORT --attach $PID & + sleep 2 + else + echo "" + echo "If you haven't done so already, do this first on the device:" + echo " gdbserver $PORT /system/bin/$EXE" + echo " or" + echo " gdbserver $PORT --attach " + echo "" + fi + + OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT + OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT + + echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" + echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" + echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" + echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" + # Enable special debugging for ART processes. + if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then + echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" + fi + echo >>"$OUT_ROOT/gdbclient.cmds" "" + + local WHICH_GDB= + # 64-bit exe found + if [ "$USE64BIT" != "" ] ; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 + # 32-bit exe / 32-bit platform + elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then + WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB + # 32-bit exe / 64-bit platform + else + WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB + fi + + ddd --debugger $WHICH_GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" + else + echo "Unable to determine build system output dir." + fi +} + case `uname -s` in Darwin) function sgrep() @@ -1541,6 +1777,707 @@ function godir () { \cd $T/$pathname } +function cmremote() +{ + if ! git rev-parse --git-dir &> /dev/null + then + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 + fi + git remote rm cmremote 2> /dev/null + GERRIT_REMOTE=$(git config --get remote.github.projectname) + CMUSER=$(git config --get review.review.cyanogenmod.org.username) + if [ -z "$CMUSER" ] + then + git remote add cmremote ssh://review.cyanogenmod.org:29418/$GERRIT_REMOTE + else + git remote add cmremote ssh://$CMUSER@review.cyanogenmod.org:29418/$GERRIT_REMOTE + fi + echo "Remote 'cmremote' created" +} + +function aospremote() +{ + if ! git rev-parse --git-dir &> /dev/null + then + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 + fi + git remote rm aosp 2> /dev/null + PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add aosp https://android.googlesource.com/$PFX$PROJECT + echo "Remote 'aosp' created" +} + +function cafremote() +{ + if ! git rev-parse --git-dir &> /dev/null + then + echo ".git directory not found. Please run this from the root directory of the Android repository you wish to set up." + return 1 + fi + git remote rm caf 2> /dev/null + PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") + if (echo $PROJECT | grep -qv "^device") + then + PFX="platform/" + fi + git remote add caf git://codeaurora.org/$PFX$PROJECT + echo "Remote 'caf' created" +} + +function installboot() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/boot.img" ]; + then + echo "No boot.img found. Run make bootimage first." + return 1 + fi + PARTITION=`grep "^\/boot" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/boot[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine boot partition." + return 1 + fi + fi + adb start-server + adb wait-for-online + adb root + sleep 1 + adb wait-for-online shell mount /system 2>&1 > /dev/null + adb wait-for-online remount + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); + then + adb push $OUT/boot.img /cache/ + for i in $OUT/system/lib/modules/*; + do + adb push $i /system/lib/modules/ + done + adb shell dd if=/cache/boot.img of=$PARTITION + adb shell chmod 644 /system/lib/modules/* + echo "Installation complete." + else + echo "The connected device does not appear to be $AICP_BUILD, run away!" + fi +} + +function installrecovery() +{ + if [ ! -e "$OUT/recovery/root/etc/recovery.fstab" ]; + then + echo "No recovery.fstab found. Build recovery first." + return 1 + fi + if [ ! -e "$OUT/recovery.img" ]; + then + echo "No recovery.img found. Run make recoveryimage first." + return 1 + fi + PARTITION=`grep "^\/recovery" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + # Try for RECOVERY_FSTAB_VERSION = 2 + PARTITION=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $1'}` + PARTITION_TYPE=`grep "[[:space:]]\/recovery[[:space:]]" $OUT/recovery/root/etc/recovery.fstab | awk {'print $3'}` + if [ -z "$PARTITION" ]; + then + echo "Unable to determine recovery partition." + return 1 + fi + fi + adb start-server + adb wait-for-online + adb root + sleep 1 + adb wait-for-online shell mount /system 2>&1 >> /dev/null + adb wait-for-online remount + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD"); + then + adb push $OUT/recovery.img /cache/ + adb shell dd if=/cache/recovery.img of=$PARTITION + echo "Installation complete." + else + echo "The connected device does not appear to be $AICP_BUILD, run away!" + fi +} + +function makerecipe() { + if [ -z "$1" ] + then + echo "No branch name provided." + return 1 + fi + cd android + sed -i s/'default revision=.*'/'default revision="refs\/heads\/'$1'"'/ default.xml + git commit -a -m "$1" + cd .. + + repo forall -c ' + + if [ "$REPO_REMOTE" = "github" ] + then + pwd + cmremote + git push cmremote HEAD:refs/heads/'$1' + fi + ' +} + +function cmgerrit() { + + if [ "$(__detect_shell)" = "zsh" ]; then + # zsh does not define FUNCNAME, derive from funcstack + local FUNCNAME=$funcstack[1] + fi + + if [ $# -eq 0 ]; then + $FUNCNAME help + return 1 + fi + local user=`git config --get review.review.cyanogenmod.org.username` + local review=`git config --get remote.github.review` + local project=`git config --get remote.github.projectname` + local command=$1 + shift + case $command in + help) + if [ $# -eq 0 ]; then + cat <&2 "Gerrit username not found." + return 1 + fi + local local_branch remote_branch + case $1 in + *:*) + local_branch=${1%:*} + remote_branch=${1##*:} + ;; + *) + local_branch=HEAD + remote_branch=$1 + ;; + esac + shift + git push $@ ssh://$user@$review:29418/$project \ + $local_branch:refs/for/$remote_branch || return 1 + ;; + changes|for) + if [ "$FUNCNAME" = "cmgerrit" ]; then + echo >&2 "'$FUNCNAME $command' is deprecated." + fi + ;; + __cmg_err_no_arg) + if [ $# -lt 2 ]; then + echo >&2 "'$FUNCNAME $command' missing argument." + elif [ $2 -eq 0 ]; then + if [ -n "$3" ]; then + $FUNCNAME help $1 + else + echo >&2 "'$FUNCNAME $1' missing argument." + fi + else + return 1 + fi + ;; + __cmg_err_not_repo) + if [ -z "$review" -o -z "$project" ]; then + echo >&2 "Not currently in any reviewable repository." + else + return 1 + fi + ;; + __cmg_err_not_supported) + $FUNCNAME __cmg_err_no_arg $command $# && return + case $1 in + #TODO: filter more git commands that don't use refname + init|add|rm|mv|status|clone|remote|bisect|config|stash) + echo >&2 "'$FUNCNAME $1' is not supported." + ;; + *) return 1 ;; + esac + ;; + #TODO: other special cases? + *) + $FUNCNAME __cmg_err_not_supported $command && return 1 + $FUNCNAME __cmg_err_no_arg $command $# help && return 1 + $FUNCNAME __cmg_err_not_repo && return 1 + local args="$@" + local change pre_args refs_arg post_args + case "$args" in + *--\ *) + pre_args=${args%%-- *} + post_args="-- ${args#*-- }" + ;; + *) pre_args="$args" ;; + esac + args=($pre_args) + pre_args= + if [ ${#args[@]} -gt 0 ]; then + change=${args[${#args[@]}-1]} + fi + if [ ${#args[@]} -gt 1 ]; then + pre_args=${args[0]} + for ((i=1; i<${#args[@]}-1; i++)); do + pre_args="$pre_args ${args[$i]}" + done + fi + while ((1)); do + case $change in + ""|--) + $FUNCNAME help $command + return 1 + ;; + *@*) + if [ -z "$refs_arg" ]; then + refs_arg="@${change#*@}" + change=${change%%@*} + fi + ;; + *~*) + if [ -z "$refs_arg" ]; then + refs_arg="~${change#*~}" + change=${change%%~*} + fi + ;; + *^*) + if [ -z "$refs_arg" ]; then + refs_arg="^${change#*^}" + change=${change%%^*} + fi + ;; + *:*) + if [ -z "$refs_arg" ]; then + refs_arg=":${change#*:}" + change=${change%%:*} + fi + ;; + *) break ;; + esac + done + $FUNCNAME fetch $change \ + && git $command $pre_args FETCH_HEAD$refs_arg $post_args \ + || return 1 + ;; + esac +} + +function cmrebase() { + local repo=$1 + local refs=$2 + local pwd="$(pwd)" + local dir="$(gettop)/$repo" + + if [ -z $repo ] || [ -z $refs ]; then + echo "CyanogenMod Gerrit Rebase Usage: " + echo " cmrebase " + echo " The patch IDs appear on the Gerrit commands that are offered." + echo " They consist on a series of numbers and slashes, after the text" + echo " refs/changes. For example, the ID in the following command is 26/8126/2" + echo "" + echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD" + echo "" + return + fi + + if [ ! -d $dir ]; then + echo "Directory $dir doesn't exist in tree." + return + fi + cd $dir + repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g) + echo "Starting branch..." + repo start tmprebase . + echo "Bringing it up to date..." + repo sync . + echo "Fetching change..." + git fetch "http://review.cyanogenmod.org/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD + if [ "$?" != "0" ]; then + echo "Error cherry-picking. Not uploading!" + return + fi + echo "Uploading..." + repo upload . + echo "Cleaning up..." + repo abandon tmprebase . + cd $pwd +} + +function mka() { + local T=$(gettop) + if [ "$T" ]; then + case `uname -s` in + Darwin) + make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@" + ;; + *) + mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@" + ;; + esac + + else + echo "Couldn't locate the top of the tree. Try setting TOP." + fi +} + +function cmka() { + if [ ! -z "$1" ]; then + for i in "$@"; do + case $i in + bacon|otapackage|systemimage) + mka installclean + mka $i + ;; + *) + mka clean-$i + mka $i + ;; + esac + done + else + mka clean + mka + fi +} + +function mms() { + local T=$(gettop) + if [ -z "$T" ] + then + echo "Couldn't locate the top of the tree. Try setting TOP." + return 1 + fi + + case `uname -s` in + Darwin) + local NUM_CPUS=$(sysctl hw.ncpu|cut -d" " -f2) + ONE_SHOT_MAKEFILE="__none__" \ + make -C $T -j $NUM_CPUS "$@" + ;; + *) + local NUM_CPUS=$(cat /proc/cpuinfo | grep "^processor" | wc -l) + ONE_SHOT_MAKEFILE="__none__" \ + mk_timer schedtool -B -n 1 -e ionice -n 1 \ + make -C $T -j $NUM_CPUS "$@" + ;; + esac +} + + +function repolastsync() { + RLSPATH="$ANDROID_BUILD_TOP/.repo/.repo_fetchtimes.json" + RLSLOCAL=$(date -d "$(stat -c %z $RLSPATH)" +"%e %b %Y, %T %Z") + RLSUTC=$(date -d "$(stat -c %z $RLSPATH)" -u +"%e %b %Y, %T %Z") + echo "Last repo sync: $RLSLOCAL / $RLSUTC" +} + +function reposync() { + case `uname -s` in + Darwin) + repo sync -j 4 "$@" + ;; + *) + schedtool -B -n 1 -e ionice -n 1 `which repo` sync -j 4 "$@" + ;; + esac +} + +function repodiff() { + if [ -z "$*" ]; then + echo "Usage: repodiff [[ref-to] [--numstat]]" + return + fi + diffopts=$* repo forall -c \ + 'echo "$REPO_PATH ($REPO_REMOTE)"; git diff ${diffopts} 2>/dev/null ;' +} + +# Return success if adb is up and not in recovery +function _adb_connected { + { + if [[ "$(adb get-state)" == device && + "$(adb shell test -e /sbin/recovery; echo $?)" == 0 ]] + then + return 0 + fi + } 2>/dev/null + + return 1 +}; + +# Credit for color strip sed: http://goo.gl/BoIcm +function dopush() +{ + local func=$1 + shift + + adb start-server # Prevent unexpected starting server message from adb get-state in the next line + if ! _adb_connected; then + echo "No device is online. Waiting for one..." + echo "Please connect USB and/or enable USB debugging" + until _adb_connected; do + sleep 1 + done + echo "Device Found." + fi + + if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD") || [ "$FORCE_PUSH" = "true" ]; + then + # retrieve IP and PORT info if we're using a TCP connection + TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ + | head -1 | awk '{print $1}') + adb root &> /dev/null + sleep 0.3 + if [ -n "$TCPIPPORT" ] + then + # adb root just killed our connection + # so reconnect... + adb connect "$TCPIPPORT" + fi + adb wait-for-device &> /dev/null + sleep 0.3 + adb remount &> /dev/null + + mkdir -p $OUT + ($func $*|tee $OUT/.log;return ${PIPESTATUS[0]}) + ret=$?; + if [ $ret -ne 0 ]; then + rm -f $OUT/.log;return $ret + fi + + # Install: + if [ `uname` = "Linux" ]; then + LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" + else + LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Install: ' | cut -d ':' -f 2)" + fi + + # Copy: + if [ `uname` = "Linux" ]; then + LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + else + LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Copy: ' | cut -d ':' -f 2)" + fi + + # If any files are going to /data, push an octal file permissions reader to device + if [ -n "$(echo $LOC | egrep '(^|\s)/data')" ]; then + CHKPERM="/data/local/tmp/chkfileperm.sh" +( +cat <<'EOF' +#!/system/xbin/sh +FILE=$@ +if [ -e $FILE ]; then + ls -l $FILE | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' | cut -d ' ' -f1 +fi +EOF +) > $OUT/.chkfileperm.sh + echo "Pushing file permissions checker to device" + adb push $OUT/.chkfileperm.sh $CHKPERM + adb shell chmod 755 $CHKPERM + rm -f $OUT/.chkfileperm.sh + fi + + stop_n_start=false + for FILE in $(echo $LOC | tr " " "\n"); do + # Make sure file is in $OUT/system or $OUT/data + case $FILE in + $OUT/system/*|$OUT/data/*) + # Get target file name (i.e. /system/bin/adb) + TARGET=$(echo $FILE | sed "s#$OUT##") + ;; + *) continue ;; + esac + + case $TARGET in + /data/*) + # fs_config only sets permissions and se labels for files pushed to /system + if [ -n "$CHKPERM" ]; then + OLDPERM=$(adb shell $CHKPERM $TARGET) + OLDPERM=$(echo $OLDPERM | tr -d '\r' | tr -d '\n') + OLDOWN=$(adb shell ls -al $TARGET | awk '{print $2}') + OLDGRP=$(adb shell ls -al $TARGET | awk '{print $3}') + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + if [ -n "$OLDPERM" ]; then + echo "Setting file permissions: $OLDPERM, $OLDOWN":"$OLDGRP" + adb shell chown "$OLDOWN":"$OLDGRP" $TARGET + adb shell chmod "$OLDPERM" $TARGET + else + echo "$TARGET did not exist previously, you should set file permissions manually" + fi + adb shell restorecon "$TARGET" + ;; + /system/priv-app/SystemUI/SystemUI.apk|/system/framework/*) + # Only need to stop services once + if ! $stop_n_start; then + adb shell stop + stop_n_start=true + fi + echo "Pushing: $TARGET" + adb push $FILE $TARGET + ;; + *) + echo "Pushing: $TARGET" + adb push $FILE $TARGET + ;; + esac + done + if [ -n "$CHKPERM" ]; then + adb shell rm $CHKPERM + fi + if $stop_n_start; then + adb shell start + fi + rm -f $OUT/.log + return 0 + else + echo "The connected device does not appear to be $AICP_BUILD, run away!" + fi +} + +alias mmp='dopush mm' +alias mmmp='dopush mmm' +alias mmap='dopush mma' +alias mkap='dopush mka' +alias cmkap='dopush cmka' + +function repopick() { + T=$(gettop) + $T/build/tools/repopick.py $@ +} + +function fixup_common_out_dir() { + common_out_dir=$(get_build_var OUT_DIR)/target/common + target_device=$(get_build_var TARGET_DEVICE) + if [ ! -z $AICP_FIXUP_COMMON_OUT ]; then + if [ -d ${common_out_dir} ] && [ ! -L ${common_out_dir} ]; then + mv ${common_out_dir} ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir}-${target_device} + ln -s ${common_out_dir}-${target_device} ${common_out_dir} + fi + else + [ -L ${common_out_dir} ] && rm ${common_out_dir} + mkdir -p ${common_out_dir} + fi +} + # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set. function set_java_home() { # Clear the existing JAVA_HOME value if we set it ourselves, so that @@ -1716,5 +2653,3 @@ check_bash_version && { } export ANDROID_BUILD_TOP=$(gettop) - -. vendor/aicp/build/envsetup.sh diff --git a/target/product/security/aicp-devkey.x509.pem b/target/product/security/aicp-devkey.x509.pem new file mode 100644 index 00000000000..b7a6ae404b0 --- /dev/null +++ b/target/product/security/aicp-devkey.x509.pem @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIJANO67t8hIti6MA0GCSqGSIb3DQEBBQUAMIGAMQswCQYD +VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEX +MBUGA1UECgwOQ3lhbm9nZW4sIEluYy4xGzAZBgNVBAsMElJlbGVhc2UgTWFuYWdl +bWVudDEUMBIGA1UEAwwLRGV2ZWxvcG1lbnQwHhcNMTQwNDI4MjAyODM3WhcNNDEw +OTEzMjAyODM3WjCBgDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24x +EDAOBgNVBAcMB1NlYXR0bGUxFzAVBgNVBAoMDkN5YW5vZ2VuLCBJbmMuMRswGQYD +VQQLDBJSZWxlYXNlIE1hbmFnZW1lbnQxFDASBgNVBAMMC0RldmVsb3BtZW50MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz/V9RvYnr18fraPWNeQEZNeg +Kc0A3QskImQyGY22EGBZ63KUxa6zAfAug0OYSjofVJRaTtdvBXjO/C71XZRh4wun +xhOUAJt8zIJ0lRx8GMC0GHzePEnEVvoiu3zSAPHCNf5lmdhyhccMOtC18J+evPf4 +EVBb3cis+F1m6ZoZKPgSFBR5A9CV5Tai8iiZluGGg15Wt12Rp2vmbmQxiOJZxBs4 +Ps40XR5gjO1q4R3HiGnFyql9qeecwaTUWXAd76lhNiLUr7K8IRs+96i+t5vSKajB +M8O99BtYyBtf8ItMnHSZJxtsMw+TFXNLmMtaQarpsjp0LLGuHb/vsrjgBPvzsQID +AQABo1AwTjAdBgNVHQ4EFgQUTpNgXBqV7j+33bi8B80YLQq6EL8wHwYDVR0jBBgw +FoAUTpNgXBqV7j+33bi8B80YLQq6EL8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B +AQUFAAOCAQEAVlVBNksK+1C3J8uQ9kVemYMozfbboV9c4PLbtVzNSO8vwZ3X5E4T +2zfQPcFsfSMIa51a1tETBcDA6k+72xHZ+xEQJQNrX+o1F1RIIrXp0OKAz/k5cXyk +OS0+nd0EXP/A1EW0m8N/X6E9wpRkIhfqtEsqeCf8GH7O9Ua2qHZ9zkTBpbAVH0oe +ZWorHBdo3GdMJ5vcjFqnDdRs8F0BnZmjS+NrgXRLhLb6ZARS/bkUQyr5TX82dgG6 +vzvKsdKyX34gsKAsjxwLWo7XXgehFfjY+SGjjilJtardr+y/KlHNEw9s9aLe+Xny +Qoa9j9Ut6/KwRaC6lSEQ7HZk6SdzFsdugA== +-----END CERTIFICATE----- diff --git a/target/product/security/aicp.x509.pem b/target/product/security/aicp.x509.pem new file mode 100644 index 00000000000..5ff19db7213 --- /dev/null +++ b/target/product/security/aicp.x509.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZDCCAkygAwIBAgIEUfbexjANBgkqhkiG9w0BAQUFADB0MQswCQYDVQQGEwJV +UzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoTDUN5YW5v +Z2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMTDUN5YW5v +Z2VuIEluYy4wHhcNMTMwNzI5MjEyOTQyWhcNNDAxMjE0MjEyOTQyWjB0MQswCQYD +VQQGEwJVUzELMAkGA1UECBMCV0ExEDAOBgNVBAcTB1NlYXR0bGUxFjAUBgNVBAoT +DUN5YW5vZ2VuIEluYy4xFjAUBgNVBAsTDUN5YW5vZ2VuIEluYy4xFjAUBgNVBAMT +DUN5YW5vZ2VuIEluYy4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCP ++K2NPqdZ6UmexXQ8tsc2TkLXYhiuEsifO66qlpwsTTw1522HcbKPVoPRr/JBXqOv +E3K0HuZ/IsYYGsP/wJWWvpaWs+5xC+YkLkittK2uUzTqndpLFiDRAeICKpvDJI57 +Z0DkzVYXBPn+yw+x8ttjT/vWcJ3PEVYuew8MYPUOgKpdZlQtUBeoEBDSL8JPGViq +e6jWOlSAWekhlgb+wb9RoXhu/v2HYzp89GG0sIrAgj7vZCior5XuFmm8eWhqUhTp +TUBv/nNI/ORYt3G8IQyI2pJN1GNPAAv1uA5i4y/deX1x4GCWyN9feiD9fOj2oc3z +Hwf5Frs9BjOb9XMXecbNAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAGudhFe9VnES +fWynTYO4kWNlMC++yB6qD3pHW6HtBiaANj9wxrLCTFzf+boHNPeZ8HDkW01zAaQK +fd9/fnGmHf4q/QvxrvGbnb3Fqhw+2hknbbMUoAa+Qp+2ouf9oJaNRquZ+rHEHX8g +Rx8wGyvjaWYfQrwyZRgXj/Jrc/NXxQCmSJeexHVNXgQD6aOLHJYrJ+s+U/hwVNiM +5L+psOh89itwt8DGGSLW16HjQKmPPbWbqxgnfRbOlxWrLDq3agcrskYpDP2aGGBA +5STq/bvh9yZkrNYvMGzrXDhcJ44QRS8e1Jw/ZtfFvJD192e7KKVdy7CJWmOckCNK +gl0KCQ3MBx4= +-----END CERTIFICATE----- diff --git a/tools/repopick.py b/tools/repopick.py new file mode 100755 index 00000000000..9bf26bd18de --- /dev/null +++ b/tools/repopick.py @@ -0,0 +1,407 @@ +#!/usr/bin/env python +# +# Copyright (C) 2013-15 The CyanogenMod 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. +# + +# +# Run repopick.py -h for a description of this utility. +# + +from __future__ import print_function + +import sys +import json +import os +import subprocess +import re +import argparse +import textwrap +from xml.etree import ElementTree + +try: + # For python3 + import urllib.error + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.request = urllib2 + + +# Verifies whether pathA is a subdirectory (or the same) as pathB +def is_subdir(a, b): + a = os.path.realpath(a) + '/' + b = os.path.realpath(b) + '/' + return b == a[:len(b)] + + +def fetch_query_via_ssh(remote_url, query): + """Given a remote_url and a query, return the list of changes that fit it + This function is slightly messy - the ssh api does not return data in the same structure as the HTTP REST API + We have to get the data, then transform it to match what we're expecting from the HTTP RESET API""" + if remote_url.count(':') == 2: + (uri, userhost, port) = remote_url.split(':') + userhost = userhost[2:] + elif remote_url.count(':') == 1: + (uri, userhost) = remote_url.split(':') + userhost = userhost[2:] + port = 29418 + else: + raise Exception('Malformed URI: Expecting ssh://[user@]host[:port]') + + + out = subprocess.check_output(['ssh', '-x', '-p{0}'.format(port), userhost, 'gerrit', 'query', '--format=JSON --patch-sets --current-patch-set', query]) + if not hasattr(out, 'encode'): + out = out.decode() + reviews = [] + for line in out.split('\n'): + try: + data = json.loads(line) + # make our data look like the http rest api data + review = { + 'branch': data['branch'], + 'change_id': data['id'], + 'current_revision': data['currentPatchSet']['revision'], + 'number': int(data['number']), + 'revisions': {patch_set['revision']: { + 'number': int(patch_set['number']), + 'fetch': { + 'ssh': { + 'ref': patch_set['ref'], + 'url': 'ssh://{0}:{1}/{2}'.format(userhost, port, data['project']) + } + } + } for patch_set in data['patchSets']}, + 'subject': data['subject'], + 'project': data['project'], + 'status': data['status'] + } + reviews.append(review) + except: + pass + args.quiet or print('Found {0} reviews'.format(len(reviews))) + return reviews + + +def fetch_query_via_http(remote_url, query): + + """Given a query, fetch the change numbers via http""" + url = '{0}/changes/?q={1}&o=CURRENT_REVISION&o=ALL_REVISIONS'.format(remote_url, query) + data = urllib.request.urlopen(url).read().decode('utf-8') + reviews = json.loads(data[5:]) + + for review in reviews: + review['number'] = review.pop('_number') + + return reviews + + +def fetch_query(remote_url, query): + """Wrapper for fetch_query_via_proto functions""" + if remote_url[0:3] == 'ssh': + return fetch_query_via_ssh(remote_url, query) + elif remote_url[0:4] == 'http': + return fetch_query_via_http(remote_url, query.replace(' ', '+')) + else: + raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]') + +if __name__ == '__main__': + # Default to CyanogenMod Gerrit + default_gerrit = 'http://review.cyanogenmod.org' + + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\ + repopick.py is a utility to simplify the process of cherry picking + patches from CyanogenMod's Gerrit instance (or any gerrit instance of your choosing) + + Given a list of change numbers, repopick will cd into the project path + and cherry pick the latest patch available. + + With the --start-branch argument, the user can specify that a branch + should be created before cherry picking. This is useful for + cherry-picking many patches into a common branch which can be easily + abandoned later (good for testing other's changes.) + + The --abandon-first argument, when used in conjunction with the + --start-branch option, will cause repopick to abandon the specified + branch in all repos first before performing any cherry picks.''')) + parser.add_argument('change_number', nargs='*', help='change number to cherry pick. Use {change number}/{patchset number} to get a specific revision.') + parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory') + parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking') + parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch') + parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"') + parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible') + parser.add_argument('-v', '--verbose', action='store_true', help='print extra information to aid in debug') + parser.add_argument('-f', '--force', action='store_true', help='force cherry pick even if change is closed') + parser.add_argument('-p', '--pull', action='store_true', help='execute pull instead of cherry-pick') + parser.add_argument('-P', '--path', help='use the specified path for the change') + parser.add_argument('-t', '--topic', help='pick all commits from a specified topic') + parser.add_argument('-Q', '--query', help='pick all commits using the specified query') + parser.add_argument('-g', '--gerrit', default=default_gerrit, help='Gerrit Instance to use. Form proto://[user@]host[:port]') + parser.add_argument('-e', '--exclude', nargs=1, help='exclude a list of commit numbers separated by a ,') + args = parser.parse_args() + if not args.start_branch and args.abandon_first: + parser.error('if --abandon-first is set, you must also give the branch name with --start-branch') + if args.auto_branch: + args.abandon_first = True + args.ignore_missing = True + if not args.start_branch: + args.start_branch = ['auto'] + if args.quiet and args.verbose: + parser.error('--quiet and --verbose cannot be specified together') + + if (1 << bool(args.change_number) << bool(args.topic) << bool(args.query)) != 2: + parser.error('One (and only one) of change_number, topic, and query are allowed') + + # Change current directory to the top of the tree + if 'ANDROID_BUILD_TOP' in os.environ: + top = os.environ['ANDROID_BUILD_TOP'] + + if not is_subdir(os.getcwd(), top): + sys.stderr.write('ERROR: You must run this tool from within $ANDROID_BUILD_TOP!\n') + sys.exit(1) + os.chdir(os.environ['ANDROID_BUILD_TOP']) + + # Sanity check that we are being run from the top level of the tree + if not os.path.isdir('.repo'): + sys.stderr.write('ERROR: No .repo directory found. Please run this from the top of your tree.\n') + sys.exit(1) + + # If --abandon-first is given, abandon the branch before starting + if args.abandon_first: + # Determine if the branch already exists; skip the abandon if it does not + plist = subprocess.check_output(['repo', 'info']) + if not hasattr(plist, 'encode'): + plist = plist.decode() + needs_abandon = False + for pline in plist.splitlines(): + matchObj = re.match(r'Local Branches.*\[(.*)\]', pline) + if matchObj: + local_branches = re.split('\s*,\s*', matchObj.group(1)) + if any(args.start_branch[0] in s for s in local_branches): + needs_abandon = True + + if needs_abandon: + # Perform the abandon only if the branch already exists + if not args.quiet: + print('Abandoning branch: %s' % args.start_branch[0]) + subprocess.check_output(['repo', 'abandon', args.start_branch[0]]) + if not args.quiet: + print('') + + # Get the master manifest from repo + # - convert project name and revision to a path + project_name_to_data = {} + manifest = subprocess.check_output(['repo', 'manifest']) + xml_root = ElementTree.fromstring(manifest) + projects = xml_root.findall('project') + remotes = xml_root.findall('remote') + default_revision = xml_root.findall('default')[0].get('revision') + + #dump project data into the a list of dicts with the following data: + #{project: {path, revision}} + + for project in projects: + name = project.get('name') + path = project.get('path') + revision = project.get('revision') + if revision is None: + for remote in remotes: + if remote.get('name') == project.get('remote'): + revision = remote.get('revision') + if revision is None: + revision = default_revision + + if not name in project_name_to_data: + project_name_to_data[name] = {} + revision = revision.split('refs/heads/')[-1] + project_name_to_data[name][revision] = path + + # get data on requested changes + reviews = [] + change_numbers = [] + if args.topic: + reviews = fetch_query(args.gerrit, 'topic:{0}'.format(args.topic)) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.query: + reviews = fetch_query(args.gerrit, args.query) + change_numbers = sorted([str(r['number']) for r in reviews]) + if args.change_number: + for c in args.change_number: + if '-' in c: + templist = c.split('-') + for i in range(int(templist[0]), int(templist[1]) + 1): + change_numbers.append(str(i)) + else: + change_numbers.append(c) + reviews = fetch_query(args.gerrit, ' OR '.join('change:{0}'.format(x.split('/')[0]) for x in change_numbers)) + + # make list of things to actually merge + mergables = [] + + # If --exclude is given, create the list of commits to ignore + exclude = [] + if args.exclude: + exclude = args.exclude[0].split(',') + + for change in change_numbers: + patchset = None + if '/' in change: + (change, patchset) = change.split('/') + + if change in exclude: + continue + + change = int(change) + review = next((x for x in reviews if x['number'] == change), None) + if review is None: + print('Change %d not found, skipping' % change) + continue + + mergables.append({ + 'subject': review['subject'], + 'project': review['project'], + 'branch': review['branch'], + 'change_id': review['change_id'], + 'change_number': review['number'], + 'status': review['status'], + 'fetch': None + }) + mergables[-1]['fetch'] = review['revisions'][review['current_revision']]['fetch'] + mergables[-1]['id'] = change + if patchset: + try: + mergables[-1]['fetch'] = [x['fetch'] for x in review['revisions'] if x['_number'] == patchset][0] + mergables[-1]['id'] = '{0}/{1}'.format(change, patchset) + except (IndexError, ValueError): + args.quiet or print('ERROR: The patch set {0}/{1} could not be found, using CURRENT_REVISION instead.'.format(change, patchset)) + + for item in mergables: + args.quiet or print('Applying change number {0}...'.format(item['id'])) + # Check if change is open and exit if it's not, unless -f is specified + if (item['status'] != 'OPEN' and item['status'] != 'NEW') and not args.query: + if args.force: + print('!! Force-picking a closed change !!\n') + else: + print('Change status is ' + item['status'] + '. Skipping the cherry pick.\nUse -f to force this pick.') + continue + + # Convert the project name to a project path + # - check that the project path exists + project_path = None + + if item['project'] in project_name_to_data and item['branch'] in project_name_to_data[item['project']]: + project_path = project_name_to_data[item['project']][item['branch']] + elif args.path: + project_path = args.path + elif args.ignore_missing: + print('WARNING: Skipping {0} since there is no project directory for: {1}\n'.format(item['id'], item['project'])) + continue + else: + sys.stderr.write('ERROR: For {0}, could not determine the project path for project {1}\n'.format(item['id'], item['project'])) + sys.exit(1) + + # If --start-branch is given, create the branch (more than once per path is okay; repo ignores gracefully) + if args.start_branch: + subprocess.check_output(['repo', 'start', args.start_branch[0], project_path]) + + # Determine the maximum commits to check already picked changes + check_picked_count = 10 + branch_commits_count = int(subprocess.check_output(['git', 'rev-list', '--count', 'HEAD'], cwd=project_path)) + if branch_commits_count <= check_picked_count: + check_picked_count = branch_commits_count - 1 + + # Check if change is already picked to HEAD...HEAD~check_picked_count + found_change = False + for i in range(0, check_picked_count): + output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split() + if 'Change-Id:' in output: + head_change_id = '' + for j,t in enumerate(reversed(output)): + if t == 'Change-Id:': + head_change_id = output[len(output) - j] + break + if head_change_id.strip() == item['change_id']: + print('Skipping {0} - already picked in {1} as HEAD~{2}'.format(item['id'], project_path, i)) + found_change = True + break + if found_change: + continue + + # Print out some useful info + if not args.quiet: + print('--> Subject: "{0}"'.format(item['subject'])) + print('--> Project path: {0}'.format(project_path)) + print('--> Change number: {0} (Patch Set {0})'.format(item['id'])) + + if 'anonymous http' in item['fetch']: + method = 'anonymous http' + else: + method = 'ssh' + + # Try fetching from GitHub first if using default gerrit + if args.gerrit == default_gerrit: + if args.verbose: + print('Trying to fetch the change from GitHub') + + if args.pull: + cmd = ['git pull --no-edit github', item['fetch'][method]['ref']] + else: + cmd = ['git fetch github', item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + FETCH_HEAD = '{0}/.git/FETCH_HEAD'.format(project_path) + if result != 0 and os.stat(FETCH_HEAD).st_size != 0: + print('ERROR: git command failed') + sys.exit(result) + # Check if it worked + if args.gerrit != default_gerrit or os.stat(FETCH_HEAD).st_size == 0: + # If not using the default gerrit or github failed, fetch from gerrit. + if args.verbose: + if args.gerrit == default_gerrit: + print('Fetching from GitHub didn\'t work, trying to fetch the change from Gerrit') + else: + print('Fetching from {0}'.format(args.gerrit)) + + if args.pull: + cmd = ['git pull --no-edit', item['fetch'][method]['url'], item['fetch'][method]['ref']] + else: + cmd = ['git fetch', item['fetch'][method]['url'], item['fetch'][method]['ref']] + if args.quiet: + cmd.append('--quiet') + else: + print(cmd) + result = subprocess.call([' '.join(cmd)], cwd=project_path, shell=True) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + # Perform the cherry-pick + if not args.pull: + cmd = ['git cherry-pick FETCH_HEAD'] + if args.quiet: + cmd_out = open(os.devnull, 'wb') + else: + cmd_out = None + result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out) + if result != 0: + print('ERROR: git command failed') + sys.exit(result) + if not args.quiet: + print('') diff --git a/tools/roomservice.py b/tools/roomservice.py new file mode 100755 index 00000000000..110c7b5d261 --- /dev/null +++ b/tools/roomservice.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python +# Copyright (C) 2012 The CyanogenMod Project +# Copyright (C) 2012-2014 AICP 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. + +from __future__ import print_function + +import base64 +import json +import netrc +import os +import re +import sys +try: + # For python3 + import urllib.error + import urllib.parse + import urllib.request +except ImportError: + # For python2 + import imp + import urllib2 + import urlparse + urllib = imp.new_module('urllib') + urllib.error = urllib2 + urllib.parse = urlparse + urllib.request = urllib2 + +from xml.etree import ElementTree + +product = sys.argv[1] + +if len(sys.argv) > 2: + depsonly = sys.argv[2] +else: + depsonly = None + +try: + device = product[product.index("_") + 1:] +except: + device = product + +if not depsonly: + print("Device %s not found. Attempting to retrieve device repository from AICP Github (http://github.com/AICP)." % device) + +repositories = [] + +page = 1 +while not depsonly: + result = json.loads(urllib.request.urlopen("https://api.github.com/users/AICP/repos?page=%d" % page).read().decode()) + if len(result) == 0: + break + for res in result: + repositories.append(res) + page = page + 1 + +local_manifests = r'.repo/local_manifests' +if not os.path.exists(local_manifests): os.makedirs(local_manifests) + +def exists_in_tree(lm, repository): + for child in lm.getchildren(): + if child.attrib['path'].endswith(repository): + return child + return None + +def exists_in_tree_device(lm, repository): + for child in lm.getchildren(): + if child.attrib['name'].endswith(repository): + return child + return None + +# in-place prettyprint formatter +def indent(elem, level=0): + i = "\n" + level*" " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + indent(elem, level+1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + +def get_from_manifest(devicename): + try: + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if re.search("device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + # Devices originally from AOSP are in the main manifest... + try: + mm = ElementTree.parse(".repo/manifest.xml") + mm = mm.getroot() + except: + mm = ElementTree.Element("manifest") + + for localpath in mm.findall("project"): + if re.search("device_.*_%s$" % device, localpath.get("name")): + return localpath.get("path") + + return None + +def is_in_manifest(projectname, branch): + try: + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for localpath in lm.findall("project"): + if localpath.get("name") == projectname and localpath.get("revision") == branch: + return 1 + + return None + +def add_to_manifest_dependencies(repositories): + try: + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for repository in repositories: + repo_name = repository['repository'] + repo_target = repository['target_path'] + existing_project = exists_in_tree(lm, repo_target) + if existing_project != None: + if existing_project.attrib['name'] != repository['repository']: + print ('Updating dependency %s' % (repo_name)) + existing_project.set('name', repository['repository']) + if existing_project.attrib['revision'] == repository['branch']: + print ('AICP/%s already exists' % (repo_name)) + else: + print ('updating branch for %s to %s' % (repo_name, repository['branch'])) + existing_project.set('revision', repository['branch']) + continue + + print ('Adding dependency: %s -> %s' % (repo_name, repo_target)) + project = ElementTree.Element("project", attrib = { "path": repo_target, + "remote": "aicp", "name": repo_name, "revision": "n7.0" }) + + if 'branch' in repository: + project.set('revision',repository['branch']) + + lm.append(project) + + indent(lm, 0) + raw_xml = ElementTree.tostring(lm).decode() + raw_xml = '\n' + raw_xml + + f = open('.repo/local_manifests/aicp_manifest.xml', 'w') + f.write(raw_xml) + f.close() + +def add_to_manifest(repositories): + try: + lm = ElementTree.parse(".repo/local_manifests/aicp_manifest.xml") + lm = lm.getroot() + except: + lm = ElementTree.Element("manifest") + + for repository in repositories: + repo_name = repository['repository'] + repo_target = repository['target_path'] + if exists_in_tree(lm, repo_name): + print('AICP/%s already exists' % (repo_name)) + continue + + print('Adding dependency: AICP/%s -> %s' % (repo_name, repo_target)) + project = ElementTree.Element("project", attrib = { "path": repo_target, + "remote": "aicp", "name": "AICP/%s" % repo_name, "revision": "n7.0" }) + + if 'branch' in repository: + project.set('revision',repository['branch']) + elif fallback_branch: + print("Using fallback branch %s for %s" % (fallback_branch, repo_name)) + project.set('revision', fallback_branch) + else: + print("Using default branch for %s" % repo_name) + + lm.append(project) + + indent(lm, 0) + raw_xml = ElementTree.tostring(lm).decode() + raw_xml = '\n' + raw_xml + + f = open('.repo/local_manifests/aicp_manifest.xml', 'w') + f.write(raw_xml) + f.close() + +def fetch_dependencies(repo_path, fallback_branch = None): + print('Looking for dependencies') + dependencies_path = repo_path + '/aicp.dependencies' + syncable_repos = [] + + if os.path.exists(dependencies_path): + dependencies_file = open(dependencies_path, 'r') + dependencies = json.loads(dependencies_file.read()) + fetch_list = [] + + for dependency in dependencies: + if not is_in_manifest("%s" % dependency['repository'], "%s" % dependency['branch']): + fetch_list.append(dependency) + syncable_repos.append(dependency['target_path']) + + dependencies_file.close() + + if len(fetch_list) > 0: + print('Adding dependencies to manifest') + add_to_manifest_dependencies(fetch_list) + else: + print('Dependencies file not found, bailing out.') + + if len(syncable_repos) > 0: + print('Syncing dependencies') + os.system('repo sync --force-sync %s' % ' '.join(syncable_repos)) + + for deprepo in syncable_repos: + fetch_dependencies(deprepo) + +def has_branch(branches, revision): + return revision in [branch['name'] for branch in branches] + + +if depsonly: + repo_path = get_from_manifest(device) + if repo_path: + fetch_dependencies(repo_path) + else: + print("Trying dependencies-only mode on a non-existing device tree?") + + sys.exit() + +else: + for repository in repositories: + repo_name = repository['name'] + if repo_name.startswith("device_") and repo_name.endswith("_" + device): + print("Found repository: %s" % repository['name']) + + manufacturer = repo_name.replace("device_", "").replace("_" + device, "") + + repo_path = "device/%s/%s" % (manufacturer, device) + + add_to_manifest([{'repository':repo_name,'target_path':repo_path,'branch':'n7.0'}]) + + print("Syncing repository to retrieve project.") + os.system('repo sync --force-sync %s' % repo_path) + print("Repository synced!") + + fetch_dependencies(repo_path) + print("Done") + sys.exit() + +print("Repository for %s not found in the AICP Github repository list. If this is in error, you may need to manually add it to your local_manifests/aicp_manifest.xml." % device) From 3ef40be4a4816ce3f6fff7ac854e9a697dca6b61 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 29 Sep 2016 16:37:22 +0200 Subject: [PATCH 324/502] kernel: Default to androidkernel toochains * androidkernel is a set of toolchain symlinks for kernel builds that point to the regular toolchain binaries, except with ld pointing to bfd instead of gold. Change-Id: Id1e2d3b1c50db581bff13cfa00b5b35d5badb8ed --- core/tasks/kernel.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index d4a6ab85aea..da36185749f 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -32,9 +32,9 @@ # TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, # optional, defaults to false # TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) -# defaults to arm-linux-androideabi- for arm -# aarch64-linux-android- for arm64 -# x86_64-linux-android- for x86 +# defaults to arm-linux-androidkernel- for arm +# aarch64-linux-androidkernel- for arm64 +# x86_64-linux-androidkernel- for x86 # # BOARD_KERNEL_IMAGE_NAME = Built image name, optional, # defaults to Image.gz on arm64 @@ -215,11 +215,11 @@ TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREF ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) else ifeq ($(TARGET_ARCH),arm64) -KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- +KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-androidkernel- else ifeq ($(TARGET_ARCH),arm) -KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- +KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androidkernel- else ifeq ($(TARGET_ARCH),x86) -KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- +KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-androidkernel- endif ifeq ($(KERNEL_TOOLCHAIN),) From bd596159a7c4237e97f39dbc1f2aab1ff219bcbc Mon Sep 17 00:00:00 2001 From: Davor Bertovic Date: Thu, 29 Sep 2016 19:37:19 +0200 Subject: [PATCH 325/502] Revert "kernel: Default to androidkernel toochains" This reverts commit 3ef40be4a4816ce3f6fff7ac854e9a697dca6b61. Change-Id: Ie73d03be5ce72f9d6b1fe6854fbde35032d04703 --- core/tasks/kernel.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index da36185749f..d4a6ab85aea 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -32,9 +32,9 @@ # TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, # optional, defaults to false # TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) -# defaults to arm-linux-androidkernel- for arm -# aarch64-linux-androidkernel- for arm64 -# x86_64-linux-androidkernel- for x86 +# defaults to arm-linux-androideabi- for arm +# aarch64-linux-android- for arm64 +# x86_64-linux-android- for x86 # # BOARD_KERNEL_IMAGE_NAME = Built image name, optional, # defaults to Image.gz on arm64 @@ -215,11 +215,11 @@ TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREF ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) else ifeq ($(TARGET_ARCH),arm64) -KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-androidkernel- +KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- else ifeq ($(TARGET_ARCH),arm) -KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androidkernel- +KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- else ifeq ($(TARGET_ARCH),x86) -KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-androidkernel- +KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- endif ifeq ($(KERNEL_TOOLCHAIN),) From 0e73423553b75b6bc2f1c87b2b6f4782521cfd67 Mon Sep 17 00:00:00 2001 From: Davor Bertovic Date: Thu, 29 Sep 2016 21:49:16 +0200 Subject: [PATCH 326/502] Revert "Revert "kernel: Default to androidkernel toochains"" This reverts commit bd596159a7c4237e97f39dbc1f2aab1ff219bcbc. Change-Id: Ibb5a9606bf277173ca52432d4d2590415e4203bd --- core/tasks/kernel.mk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk index d4a6ab85aea..da36185749f 100644 --- a/core/tasks/kernel.mk +++ b/core/tasks/kernel.mk @@ -32,9 +32,9 @@ # TARGET_USES_UNCOMPRESSED_KERNEL = 'true' if Kernel is uncompressed, # optional, defaults to false # TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-) -# defaults to arm-linux-androideabi- for arm -# aarch64-linux-android- for arm64 -# x86_64-linux-android- for x86 +# defaults to arm-linux-androidkernel- for arm +# aarch64-linux-androidkernel- for arm64 +# x86_64-linux-androidkernel- for x86 # # BOARD_KERNEL_IMAGE_NAME = Built image name, optional, # defaults to Image.gz on arm64 @@ -215,11 +215,11 @@ TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREF ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) else ifeq ($(TARGET_ARCH),arm64) -KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-android- +KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-androidkernel- else ifeq ($(TARGET_ARCH),arm) -KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androideabi- +KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androidkernel- else ifeq ($(TARGET_ARCH),x86) -KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-android- +KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-androidkernel- endif ifeq ($(KERNEL_TOOLCHAIN),) From b2c9a7266ef665f4850970872136050389a12f37 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Wed, 21 Sep 2016 08:31:42 -0500 Subject: [PATCH 327/502] ninja: use host's ninja if it exists * For whatever reason mainline ninja improves my build significantly * Allow users to bust out of using whatever binary is provided with the build system and use their own copy if they have it installed Change-Id: I14dbb7b9d8a028d1b0f16e136a8310584df329be --- core/ninja.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/ninja.mk b/core/ninja.mk index 9d0ff9a70b2..e7f04133a5c 100644 --- a/core/ninja.mk +++ b/core/ninja.mk @@ -1,4 +1,7 @@ -NINJA ?= prebuilts/ninja/$(HOST_PREBUILT_TAG)/ninja +NINJA ?= $(shell which ninja) +ifeq ($(NINJA),) + NINJA := prebuilts/ninja/$(HOST_PREBUILT_TAG)/ninja +endif ifeq ($(USE_SOONG),true) USE_SOONG_FOR_KATI := true From 73d74fdae2d4983daebcee1ff191763863e8b364 Mon Sep 17 00:00:00 2001 From: Ethan Chen Date: Sat, 1 Oct 2016 16:35:06 +0200 Subject: [PATCH 328/502] qcom: Properly select media hal root AOSP split the media hal into msm8974 and msm8996, better to just add target named symlinks in the media hal than ifdefs here for the sake of cleanliness Change-Id: I87f06b9c1b8939a8a8868ff35fcf6e8f5ec48b51 --- core/qcom_target.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/qcom_target.mk b/core/qcom_target.mk index 29e134a3710..03279825494 100644 --- a/core/qcom_target.mk +++ b/core/qcom_target.mk @@ -118,7 +118,7 @@ else $(call project-set-path,qcom-audio,hardware/qcom/audio/default) $(call project-set-path,qcom-display,hardware/qcom/display/$(TARGET_BOARD_PLATFORM)) -$(call project-set-path,qcom-media,hardware/qcom/media) +$(call project-set-path,qcom-media,hardware/qcom/media/$(TARGET_BOARD_PLATFORM)) $(call project-set-path,qcom-camera,hardware/qcom/camera) $(call project-set-path,qcom-gps,hardware/qcom/gps) From 51eb7dd190cb26f15287ba84b10a6a9b2fa92591 Mon Sep 17 00:00:00 2001 From: LorDClockaN Date: Sun, 2 Oct 2016 17:59:44 +0200 Subject: [PATCH 329/502] build: Add back AICP flash script output Change-Id: Id05b92454c716cbed2faa26c24f2980a148464a0 --- tools/releasetools/ota_from_target_files.py | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index ae34d9cca45..eec13c7b11c 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -664,6 +664,40 @@ def WriteFullOTAPackage(input_zip, output_zip): system_progress = 0.75 + script.Print("*********************************************"); + script.Print("* ___ __ ___ ___ *") + script.Print("* /\ \ /\ \ /\ \ /\ \ *") + script.Print("* /::\ \ _\:\ \ /::\ \ /::\ \ *") + script.Print("* /::\:\__\ /\/::\__\ /:/\:\__\ /::\:\__\ *") + script.Print("* \/\::/ / \::/\/__/ \:\ \/__/ \/\::/ / *") + script.Print("* /:/ / \:\__\ \:\__\ \/__/ *") + script.Print("* \/__/ \/__/ \/__/ *") + script.Print("* *"); + script.Print("*********************************************"); + + + aicpv = GetBuildProp("ro.aicp.version", OPTIONS.info_dict) + if os.getenv("AICP_BUILDTYPE") is not None: + build = ' '.join(aicpv.split('_')[3].split('-')).title() + script.Print("* Version: %s"%(build)); + elif os.getenv("AICP_NIGHTLY") is not None: + build = ' '.join(aicpv.split('_')[2:]).title() + script.Print("* Version: %s"%(build)); + else: + build = GetBuildProp("ro.build.date", OPTIONS.info_dict) + script.Print("*********************************************"); + script.Print("************* AICP BUILD *************"); + script.Print("*********************************************"); + script.Print("* Compiled: %s"%(build)); + + device = GetBuildProp("ro.product.device", OPTIONS.info_dict) + if GetBuildProp("ro.product.model", OPTIONS.info_dict) is not None: + model = GetBuildProp("ro.product.model", OPTIONS.info_dict) + script.Print("* Device: %s (%s)"%(model, device)); + else: + script.Print("* Device: %s"%(device)); + script.Print("*********************************************"); + if OPTIONS.wipe_user_data: system_progress -= 0.1 if HasVendorPartition(input_zip): From 307c0d6f07873a3a4e77288e524509eba7dce792 Mon Sep 17 00:00:00 2001 From: HashBang Date: Mon, 3 Oct 2016 22:48:47 +0300 Subject: [PATCH 330/502] build: Add back missing part from fix for unified devices Original change: https://github.com/AICP/build/commit/df574f3e6ae115425b2c25e5b5e6772503ca0f65 This part was missed during AICPfication of build repo... Change-Id: I38423e7094eb52949b9eadeea8ba388e6715713a --- tools/releasetools/ota_from_target_files.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index eec13c7b11c..a2b1f1c2b8d 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -856,7 +856,8 @@ def GetBuildProp(prop, info_dict): try: return info_dict.get("build.prop", {})[prop] except KeyError: - raise common.ExternalError("couldn't find %s in build.prop" % (prop,)) + print ("WARNING: could not find %s in build.prop" % (prop,)) + return None def AddToKnownPaths(filename, known_paths): From 9ea29dfdc10352318b33debc7df72e9f4311a019 Mon Sep 17 00:00:00 2001 From: Brian Larsen Date: Tue, 4 Oct 2016 23:19:35 +0530 Subject: [PATCH 331/502] randomly generate aicp logo colors in build output Change-Id: If483cbfd22aef29b46df9640e972427aa60064ee --- core/Makefile | 101 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/core/Makefile b/core/Makefile index af1ba0c0bbe..f351491b26d 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1,5 +1,76 @@ # Put some miscellaneous rules here +ifneq ($(BUILD_WITH_COLORS),0) + CL_RED="\033[31m" + CL_GRN="\033[32m" + CL_YLW="\033[33m" + CL_BLU="\033[34m" + CL_MAG="\033[35m" + CL_CYN="\033[36m" + CL_RST="\033[0m" + + # Let's be paranoid and make sure the 'bc' command is available. + # It would be silly to have an unimportant make error for this + # after a long build has completed successfully. If this check + # fails then all the CL_CHARn variables will be null, which will + # cause the default system color to be used. + + CHECK_BC := $(shell which bc > /dev/null; echo $$?) + ifeq ($(CHECK_BC),0) + # RANDOM_VAL gets a psuedo random based on the Linux $RANDOM + # environment variable. If that returns an empty value then we + # assume it is not supported and just use the current number of + # seconds, which works, but is not as interesting. + + ifeq ($(shell echo $${RANDOM}),) + RANDOM_VAL := $(shell echo `date +%s`) + else + RANDOM_VAL = $(shell echo $${RANDOM}) + endif + + # Random colors for use when displaying the completion logo + # that says "AICP ROM" (7 characters, excluding white space). + # In each definition we use RANDOM_VAL twice + # - The 1st gives 0 or 1 (normal or highlighted) + # - The 2nd gives 31..36 (RED, GRN, YLW, BLU, MAG, CYN) + + # Calculate the 2 random values (highlight and color) for each + # of the 7 character we will write. The only reason for the + # first mod (%) is in case we are using seconds instead of RANDOM. + # That at least makes things slightly more interesting. + CL_RANDOM_01 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_02 := $(shell echo ${RANDOM_VAL} % 11 % 6 + 31 | bc ) + + CL_RANDOM_03 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_04 := $(shell echo ${RANDOM_VAL} % 19 % 6 + 31 | bc ) + + CL_RANDOM_05 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_06 := $(shell echo ${RANDOM_VAL} % 31 % 6 + 31 | bc ) + + CL_RANDOM_07 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_08 := $(shell echo ${RANDOM_VAL} % 43 % 6 + 31 | bc ) + + CL_RANDOM_09 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_10 := $(shell echo ${RANDOM_VAL} % 59 % 6 + 31 | bc ) + + CL_RANDOM_11 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_12 := $(shell echo ${RANDOM_VAL} % 71 % 6 + 31 | bc ) + + CL_RANDOM_13 := $(shell echo ${RANDOM_VAL} % 2 | bc) + CL_RANDOM_14 := $(shell echo ${RANDOM_VAL} % 83 % 6 + 31 | bc ) + + + # Now we finally define the color codes for each character. + CL_CHAR1 := "\033[$(CL_RANDOM_01);$(CL_RANDOM_02)m" + CL_CHAR2 := "\033[$(CL_RANDOM_03);$(CL_RANDOM_04)m" + CL_CHAR3 := "\033[$(CL_RANDOM_05);$(CL_RANDOM_06)m" + CL_CHAR4 := "\033[$(CL_RANDOM_07);$(CL_RANDOM_08)m" + CL_CHAR5 := "\033[$(CL_RANDOM_09);$(CL_RANDOM_10)m" + CL_CHAR6 := "\033[$(CL_RANDOM_11);$(CL_RANDOM_12)m" + CL_CHAR7 := "\033[$(CL_RANDOM_13);$(CL_RANDOM_14)m" + endif +endif + # HACK: clear LOCAL_PATH from including last build target before calling # intermedites-dir-for LOCAL_PATH := $(BUILD_SYSTEM) @@ -2145,23 +2216,23 @@ bacon: otapackage $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(AICP_TARGET_PACKAGE) $(hide) $(MD5SUM) $(AICP_TARGET_PACKAGE) > $(AICP_TARGET_PACKAGE).md5sum @echo "" - @echo -e " ▄▄▄· "" ▪ "" ▄▄· "" ▄▄▄· " - @echo -e "▐█ ▀█ "" ██ "" ▐█ ▌▪ "" ▐█ ▄█ " - @echo -e "▄█▀▀█ "" ▐█· "" ██ ▄▄ "" ██▀· " - @echo -e "▐█ ▪▐▌ "" ▐█▌ "" ▐███▌ "" ▐█▪·• " - @echo -e " ▀ ▀ "" ▀▀▀ "" ▀▀▀ "" .▀ " + @echo -e $(CL_CHAR1)" ▄▄▄· "${CL_CHAR2}" ▪ "${CL_CHAR3}" ▄▄· "${CL_CHAR4}" ▄▄▄· "${CL_RST} + @echo -e $(CL_CHAR1)"▐█ ▀█ "${CL_CHAR2}" ██ "${CL_CHAR3}" ▐█ ▌▪ "${CL_CHAR4}" ▐█ ▄█ "${CL_RST} + @echo -e $(CL_CHAR1)"▄█▀▀█ "${CL_CHAR2}" ▐█· "${CL_CHAR3}" ██ ▄▄ "${CL_CHAR4}" ██▀· "${CL_RST} + @echo -e $(CL_CHAR1)"▐█ ▪▐▌ "${CL_CHAR2}" ▐█▌ "${CL_CHAR3}" ▐███▌ "${CL_CHAR4}" ▐█▪·• "${CL_RST} + @echo -e $(CL_CHAR1)" ▀ ▀ "${CL_CHAR2}" ▀▀▀ "${CL_CHAR3}" ▀▀▀ "${CL_CHAR4}" .▀ "${CL_RST} @echo "" - @echo -e "▄▄▄ "" ""• ▌ ▄ ·. " - @echo -e "▀▄ █· ""▪ ""·██ ▐███▪ " - @echo -e "▐▀▀▄ "" ▄█▀▄ ""▐█ ▌▐▌▐█· " - @echo -e "▐█•█▌ ""▐█▌.▐▌ ""██ ██▌▐█▌ " - @echo -e ".▀ ▀ "" ▀█▄▀▪ ""▀▀ █▪▀▀▀ " + @echo -e ${CL_CHAR5}"▄▄▄ "${CL_CHAR6}" "${CL_CHAR7}"• ▌ ▄ ·. "${CL_RST} + @echo -e ${CL_CHAR5}"▀▄ █· "${CL_CHAR6}"▪ "${CL_CHAR7}"·██ ▐███▪ "${CL_RST} + @echo -e ${CL_CHAR5}"▐▀▀▄ "${CL_CHAR6}" ▄█▀▄ "${CL_CHAR7}"▐█ ▌▐▌▐█· "${CL_RST} + @echo -e ${CL_CHAR5}"▐█•█▌ "${CL_CHAR6}"▐█▌.▐▌ "${CL_CHAR7}"██ ██▌▐█▌ "${CL_RST} + @echo -e ${CL_CHAR5}".▀ ▀ "${CL_CHAR6}" ▀█▄▀▪ "${CL_CHAR7}"▀▀ █▪▀▀▀ "${CL_RST} @echo "" - @echo -e "===========-Package complete-===========" - @echo -e "zip: " $(AICP_TARGET_PACKAGE) - @echo -e "md5: "" `cat $(AICP_TARGET_PACKAGE).md5sum | cut -d ' ' -f 1`" - @echo -e "size:"" `ls -lah $(AICP_TARGET_PACKAGE) | cut -d ' ' -f 5`" - @echo -e "========================================" + @echo -e ${CL_CYN}"===========-Package complete-==========="${CL_RST} + @echo -e ${CL_CYN}"zip: "${CL_MAG} $(AICP_TARGET_PACKAGE)${CL_RST} + @echo -e ${CL_CYN}"md5: "${CL_MAG}" `cat $(AICP_TARGET_PACKAGE).md5sum | cut -d ' ' -f 1`"${CL_RST} + @echo -e ${CL_CYN}"size:"${CL_MAG}" `ls -lah $(AICP_TARGET_PACKAGE) | cut -d ' ' -f 5`"${CL_RST} + @echo -e ${CL_CYN}"========================================"${CL_RST} @echo -e "" endif # build_ota_package From 7abcbd7ad496d30e8bc842a593edec0d52080c31 Mon Sep 17 00:00:00 2001 From: SteadyQuad Date: Tue, 4 Oct 2016 11:36:18 +0200 Subject: [PATCH 332/502] Show complete command with args when ComputePatch fails When Difference.ComputePatch() failed for some reason, only the first part of the failed command was show with the error, not all arguments. old (simplified): WARNING: failure running ['imgdiff', '-b', '/tmp/recovery-resource.dat']: new: WARNING: failure running ['imgdiff', '-b', '/tmp/recovery-resource.dat', '/tmp/tmpSsy_kf', '/tmp/tmpOMCXSn', '/tmp/tmpA3FtZw']: Change-Id: Id8b498df3ed7934815430e4b4c2651ef4aa781c6 --- tools/releasetools/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 124be6d174a..9e2b9a368ee 100755 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1390,7 +1390,7 @@ def run(): if err or p.returncode != 0: print("WARNING: failure running %s:\n%s\n" % ( - diff_program, "".join(err))) + cmd, "".join(err))) self.patch = None return None, None, None diff = ptemp.read() From 1e3d9f97df6f859f06a54d1caa63b3bf9c6bf417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quang=20Ng=C3=B4?= Date: Sun, 25 Sep 2016 10:08:49 +0700 Subject: [PATCH 333/502] We want Browser See: https://git.io/viAru Change-Id: I6f68e3e5cb09a8b64a8869396bb43c76e9bc181b --- target/product/core.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/product/core.mk b/target/product/core.mk index 2fe0681cd5f..a5a1dd9be23 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -24,7 +24,7 @@ PRODUCT_PACKAGES += \ BasicDreams \ BlockedNumberProvider \ BookmarkProvider \ - Browser2 \ + Browser \ Calendar \ CalendarProvider \ CaptivePortalLogin \ From 342bc71de0b721cae81f94a90f50686e4bd05a3c Mon Sep 17 00:00:00 2001 From: Luis Vidal Date: Wed, 13 Jul 2016 15:16:08 -0700 Subject: [PATCH 334/502] Add LOCAL_AIDL_FLAGS Allow modules to define custom AIDL flags Change-Id: I5609e6eb0a10d441cea2556179c8496293116dcf --- core/clear_vars.mk | 1 + core/java.mk | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 5ca5fb6d431..2a3201a7ffa 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -106,6 +106,7 @@ LOCAL_RES_LIBRARIES:= LOCAL_MANIFEST_INSTRUMENTATION_FOR:= LOCAL_AIDL_INCLUDES:= LOCAL_VTS_INCLUDES:= +LOCAL_AIDL_FLAGS:= LOCAL_JARJAR_RULES:= LOCAL_ADDITIONAL_JAVA_DIR:= LOCAL_ALLOW_UNDEFINED_SYMBOLS:= diff --git a/core/java.mk b/core/java.mk index a023aa6be8a..5fa1d4b050b 100644 --- a/core/java.mk +++ b/core/java.mk @@ -323,7 +323,7 @@ else # build against the platform. LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS) endif # LOCAL_SDK_VERSION -$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) +$(aidl_java_sources): PRIVATE_AIDL_FLAGS := -b $(addprefix -p,$(aidl_preprocess_import)) -I$(LOCAL_PATH) -I$(LOCAL_PATH)/src $(addprefix -I,$(LOCAL_AIDL_INCLUDES)) $(LOCAL_AIDL_FLAGS) $(aidl_java_sources): $(intermediates.COMMON)/src/%.java: \ $(LOCAL_PATH)/%.aidl \ From 6937d81a264552ea206d5d07343c7f8a76be48ee Mon Sep 17 00:00:00 2001 From: OptX Date: Sun, 9 Oct 2016 09:10:28 +0200 Subject: [PATCH 335/502] Show new Aicp logo during flash Change-Id: If49f4340e1ae61a0fde4d1fb0a305c4eb937f099 --- tools/releasetools/ota_from_target_files.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index a2b1f1c2b8d..39c97d80737 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -665,14 +665,16 @@ def WriteFullOTAPackage(input_zip, output_zip): system_progress = 0.75 script.Print("*********************************************"); - script.Print("* ___ __ ___ ___ *") - script.Print("* /\ \ /\ \ /\ \ /\ \ *") - script.Print("* /::\ \ _\:\ \ /::\ \ /::\ \ *") - script.Print("* /::\:\__\ /\/::\__\ /:/\:\__\ /::\:\__\ *") - script.Print("* \/\::/ / \::/\/__/ \:\ \/__/ \/\::/ / *") - script.Print("* /:/ / \:\__\ \:\__\ \/__/ *") - script.Print("* \/__/ \/__/ \/__/ *") - script.Print("* *"); + script.Print("* ##########**** ########**** *") + script.Print("* ############**** ##########****** *") + script.Print("* #### ####****##### **** **** *") + script.Print("* #### ###****#### **** **** *") + script.Print("* #### ###****#### **** **** *") + script.Print("* #### ####****#### **** **** *") + script.Print("* ############**** ##########****** *") + script.Print("* ##########**** ########**** *") + script.Print("* **** *") + script.Print("* **** *") script.Print("*********************************************"); From b885a1aaf619c636506c247f2c80545a729640ea Mon Sep 17 00:00:00 2001 From: Simon Shields Date: Fri, 7 Oct 2016 17:18:33 +1100 Subject: [PATCH 336/502] ninja: increase maximum suffix length HFS+ and ext4 both support filenames up to 255 characters in length. It should be ok to allow longer suffixes. This fixes mmp in places with long paths (where otherwise the build system defaults to using md5sum for the suffix) Change-Id: I93e39875470417ce1b0febe7a9e0da37b56b5b00 --- core/ninja.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ninja.mk b/core/ninja.mk index e7f04133a5c..109fe77f3c9 100644 --- a/core/ninja.mk +++ b/core/ninja.mk @@ -96,7 +96,7 @@ KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-mmma-$(call replace_space_and_slash,$( endif my_checksum_suffix := -my_ninja_suffix_too_long := $(filter 1, $(shell v='$(KATI_NINJA_SUFFIX)' && echo $$(($${$(pound)v} > 64)))) +my_ninja_suffix_too_long := $(filter 1, $(shell v='$(KATI_NINJA_SUFFIX)' && echo $$(($${$(pound)v} > 240)))) ifneq ($(my_ninja_suffix_too_long),) # Replace the suffix with a checksum if it gets too long. my_checksum_suffix := $(KATI_NINJA_SUFFIX) From 3ce2e9b16c5f4e819a2c128123247e460d105b2c Mon Sep 17 00:00:00 2001 From: LorDClockaN Date: Sun, 9 Oct 2016 20:00:51 +0200 Subject: [PATCH 337/502] Edit letter a in ANSCII flash logo Change-Id: I9485b97fd0df6f8631f2f766ea347f625a6d9dc6 --- tools/releasetools/ota_from_target_files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 39c97d80737..28186dc26ab 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -665,14 +665,14 @@ def WriteFullOTAPackage(input_zip, output_zip): system_progress = 0.75 script.Print("*********************************************"); - script.Print("* ##########**** ########**** *") + script.Print("* ##### ####**** ########**** *") script.Print("* ############**** ##########****** *") script.Print("* #### ####****##### **** **** *") script.Print("* #### ###****#### **** **** *") script.Print("* #### ###****#### **** **** *") script.Print("* #### ####****#### **** **** *") script.Print("* ############**** ##########****** *") - script.Print("* ##########**** ########**** *") + script.Print("* ##### ####**** ########**** *") script.Print("* **** *") script.Print("* **** *") script.Print("*********************************************"); From 44afc08ecbed82347f432d5c9358b6ac0d3e5990 Mon Sep 17 00:00:00 2001 From: OptX Date: Sun, 9 Oct 2016 22:49:20 +0200 Subject: [PATCH 338/502] build: Edit letter a in ANSCII flash logo once more Change-Id: I062431f0a6ec1689d0538a44e02bfb3cd8915bae --- tools/releasetools/ota_from_target_files.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py index 28186dc26ab..08b8dd7cf83 100755 --- a/tools/releasetools/ota_from_target_files.py +++ b/tools/releasetools/ota_from_target_files.py @@ -668,8 +668,8 @@ def WriteFullOTAPackage(input_zip, output_zip): script.Print("* ##### ####**** ########**** *") script.Print("* ############**** ##########****** *") script.Print("* #### ####****##### **** **** *") - script.Print("* #### ###****#### **** **** *") - script.Print("* #### ###****#### **** **** *") + script.Print("* ### ###****#### **** **** *") + script.Print("* ### ###****#### **** **** *") script.Print("* #### ####****#### **** **** *") script.Print("* ############**** ##########****** *") script.Print("* ##### ####**** ########**** *") From 340523184726e74f725059cd52fea49b8b5b7103 Mon Sep 17 00:00:00 2001 From: Raienryu97 Date: Thu, 13 Oct 2016 17:38:53 +0530 Subject: [PATCH 339/502] Revert "build: Don't force checkapi-cm on system image gen." This reverts commit a59d8a41ecb9743f73440d89ccacb60dc1c4ad9c. Change-Id: I2f1e7eb24797ff1398d12d22fbabb9e0afac4609 --- core/Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/Makefile b/core/Makefile index f351491b26d..333dfd69306 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1350,8 +1350,13 @@ endef $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) -ifneq ($(TARGET_DISABLE_CMSDK),true) +ifndef I_WANT_A_QUAIL_STAR +ifneq ($(WITHOUT_CHECK_API),true) $(BUILT_SYSTEMIMAGE): checkapi +ifneq ($(TARGET_DISABLE_CMSDK),true) +$(BUILT_SYSTEMIMAGE): checkapi-cm +endif +endif endif INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img From 6edf41c5f9a0a992e1f615fea7f7002f03fa4512 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Thu, 1 Sep 2016 00:47:46 -0400 Subject: [PATCH 340/502] Add WITHOUT_CHECK_API guard around checkapi * Granted we should never not check the API, the flag was added so we need to account for it Change-Id: Iae58ab6484c5c72904cae30e74f5ea1e89a86618 Signed-off-by: Brandon McAnsh From 9e587246838c3c15f1bedaafe12c532ea3f22806 Mon Sep 17 00:00:00 2001 From: 5x Date: Wed, 19 Oct 2016 13:32:25 +0000 Subject: [PATCH 341/502] easy to port AICP to unoffcial devices. It is troublesome to create device makefile to vendor/aicp/products in each time... Change-Id: I413cb05b9e1dc609412d222e91dea4c4431ef61d --- core/product_config.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/product_config.mk b/core/product_config.mk index 774b342b979..08949881e9f 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -182,6 +182,10 @@ include $(BUILD_SYSTEM)/device.mk # A AICP build needs only the AICP product makefiles. ifneq ($(AICP_BUILD),) all_product_configs := $(shell ls vendor/aicp/products/${AICP_BUILD}.mk) + # easy to port AICP to unoffcial devices. + ifeq ($(strip $(all_product_configs)),) + all_product_configs := $(shell find device -path "*/${AICP_BUILD}/aicp.mk") + endif else ifneq ($(strip $(TARGET_BUILD_APPS)),) # An unbundled app build needs only the core product makefiles. From 2fcb8f199579b3cbee5348976b4f07ab776af266 Mon Sep 17 00:00:00 2001 From: 5x Date: Wed, 19 Oct 2016 13:45:22 +0000 Subject: [PATCH 342/502] do not show the error message when device makefile does not exist. Change-Id: I131a81d174099660702fb1f256bfc12f1639ae4b --- core/product_config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/product_config.mk b/core/product_config.mk index 08949881e9f..6f627deec2f 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -181,7 +181,7 @@ include $(BUILD_SYSTEM)/device.mk # A AICP build needs only the AICP product makefiles. ifneq ($(AICP_BUILD),) - all_product_configs := $(shell ls vendor/aicp/products/${AICP_BUILD}.mk) + all_product_configs := $(shell ls vendor/aicp/products/${AICP_BUILD}.mk 2>/dev/null) # easy to port AICP to unoffcial devices. ifeq ($(strip $(all_product_configs)),) all_product_configs := $(shell find device -path "*/${AICP_BUILD}/aicp.mk") From b4c0040b9c04188c2e53ba28ca69be5d8e6bf7db Mon Sep 17 00:00:00 2001 From: Ralf Luther Date: Sat, 22 Oct 2016 18:28:55 +0200 Subject: [PATCH 343/502] Updated makefile to reflect the new logo Change-Id: I03c704f6462330e7bb2e6a798f104a9077dfab9f Signed-off-by: Ralf Luther --- core/Makefile | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/core/Makefile b/core/Makefile index 333dfd69306..a7ebf3dd605 100644 --- a/core/Makefile +++ b/core/Makefile @@ -2221,17 +2221,21 @@ bacon: otapackage $(hide) ln -f $(INTERNAL_OTA_PACKAGE_TARGET) $(AICP_TARGET_PACKAGE) $(hide) $(MD5SUM) $(AICP_TARGET_PACKAGE) > $(AICP_TARGET_PACKAGE).md5sum @echo "" - @echo -e $(CL_CHAR1)" ▄▄▄· "${CL_CHAR2}" ▪ "${CL_CHAR3}" ▄▄· "${CL_CHAR4}" ▄▄▄· "${CL_RST} - @echo -e $(CL_CHAR1)"▐█ ▀█ "${CL_CHAR2}" ██ "${CL_CHAR3}" ▐█ ▌▪ "${CL_CHAR4}" ▐█ ▄█ "${CL_RST} - @echo -e $(CL_CHAR1)"▄█▀▀█ "${CL_CHAR2}" ▐█· "${CL_CHAR3}" ██ ▄▄ "${CL_CHAR4}" ██▀· "${CL_RST} - @echo -e $(CL_CHAR1)"▐█ ▪▐▌ "${CL_CHAR2}" ▐█▌ "${CL_CHAR3}" ▐███▌ "${CL_CHAR4}" ▐█▪·• "${CL_RST} - @echo -e $(CL_CHAR1)" ▀ ▀ "${CL_CHAR2}" ▀▀▀ "${CL_CHAR3}" ▀▀▀ "${CL_CHAR4}" .▀ "${CL_RST} @echo "" - @echo -e ${CL_CHAR5}"▄▄▄ "${CL_CHAR6}" "${CL_CHAR7}"• ▌ ▄ ·. "${CL_RST} - @echo -e ${CL_CHAR5}"▀▄ █· "${CL_CHAR6}"▪ "${CL_CHAR7}"·██ ▐███▪ "${CL_RST} - @echo -e ${CL_CHAR5}"▐▀▀▄ "${CL_CHAR6}" ▄█▀▄ "${CL_CHAR7}"▐█ ▌▐▌▐█· "${CL_RST} - @echo -e ${CL_CHAR5}"▐█•█▌ "${CL_CHAR6}"▐█▌.▐▌ "${CL_CHAR7}"██ ██▌▐█▌ "${CL_RST} - @echo -e ${CL_CHAR5}".▀ ▀ "${CL_CHAR6}" ▀█▄▀▪ "${CL_CHAR7}"▀▀ █▪▀▀▀ "${CL_RST} + @echo -e $(CL_CHAR3)" ██████ █████▒▒▒▒▒ ███████▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ███████████████▒▒▒▒▒ ██████████▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████████████████▒▒▒▒▒ █████████████▒▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ███████ ███████▒▒▒▒▒ ████████ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████ ██████▒▒▒▒▒ ██████ ▒▒▒▒▒ ▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████ █████▒▒▒▒▒██████ ▒▒▒▒▒ ▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████ ██████▒▒▒▒▒ ██████ ▒▒▒▒▒ ▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ███████ ███████▒▒▒▒▒ ████████ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████████████████▒▒▒▒▒ █████████████▒▒▒▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ███████████████▒▒▒▒▒ ██████████▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ██████ █████▒▒▒▒▒ ███████▒▒▒"${CL_RST} + @echo -e $(CL_CHAR3)" ▒▒▒▒▒"${CL_RST} + @echo -e $(CL_CHAR1)" C U S T O M"${CL_CHAR3}" ▒▒▒▒▒"${CL_CHAR1}" R O M"${CL_RST} + @echo -e $(CL_CHAR3)" ▒▒▒▒▒"${CL_RST} @echo "" @echo -e ${CL_CYN}"===========-Package complete-==========="${CL_RST} @echo -e ${CL_CYN}"zip: "${CL_MAG} $(AICP_TARGET_PACKAGE)${CL_RST} From f004989f25465ecb4730f80cec8f8d6141991595 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 24 Oct 2016 23:11:27 +0200 Subject: [PATCH 344/502] envsetup: Fix cafremote/aospremote for projects with non-standard paths * Fix -caf and -caf- projects * Fix AOSP HALs that are synced in "/default" subfolder Change-Id: I33cc344a3234de6698676c32035622acbec03dd1 --- envsetup.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 5ceb54fbcea..7ad22be3a7e 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1804,7 +1804,7 @@ function aospremote() return 1 fi git remote rm aosp 2> /dev/null - PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") + PROJECT=$(pwd -P | sed -e "s#$ANDROID_BUILD_TOP\/##; s#-caf.*##; s#\/default##") if (echo $PROJECT | grep -qv "^device") then PFX="platform/" @@ -1821,7 +1821,7 @@ function cafremote() return 1 fi git remote rm caf 2> /dev/null - PROJECT=$(pwd -P | sed "s#$ANDROID_BUILD_TOP\/##") + PROJECT=$(pwd -P | sed -e "s#$ANDROID_BUILD_TOP\/##; s#-caf.*##; s#\/default##") if (echo $PROJECT | grep -qv "^device") then PFX="platform/" From 79b9836b33d07b92c9c010db41ec367ad0568b44 Mon Sep 17 00:00:00 2001 From: Marc K Date: Wed, 26 Oct 2016 16:03:07 +0200 Subject: [PATCH 345/502] envsetup: dopush: fix test if device is in recovery Change-Id: I1687b879e00918813886b2c9c54535376aa62d99 Signed-off-by: Marc K --- envsetup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index 7ad22be3a7e..e280e526ccf 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2309,7 +2309,7 @@ function repodiff() { function _adb_connected { { if [[ "$(adb get-state)" == device && - "$(adb shell test -e /sbin/recovery; echo $?)" == 0 ]] + "$(adb shell test -e /sbin/recovery; echo $?)" != 0 ]] then return 0 fi From abe69a7e4d100bacae1784e43c442047652614b3 Mon Sep 17 00:00:00 2001 From: Marc K Date: Wed, 26 Oct 2016 16:04:22 +0200 Subject: [PATCH 346/502] envsetup: dopush: allow (symbolic) host names for adb connect Change-Id: Icfab874abab64b0a3e5e63091cb6c25dd9630737 Signed-off-by: Marc K --- envsetup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/envsetup.sh b/envsetup.sh index e280e526ccf..4d296b169b6 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2337,7 +2337,8 @@ function dopush() if (adb shell getprop ro.aicp.device | grep -q "$AICP_BUILD") || [ "$FORCE_PUSH" = "true" ]; then # retrieve IP and PORT info if we're using a TCP connection - TCPIPPORT=$(adb devices | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+[^0-9]+' \ + TCPIPPORT=$(adb devices \ + | egrep '^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]):[0-9]+[^0-9]+' \ | head -1 | awk '{print $1}') adb root &> /dev/null sleep 0.3 From 19cab52201b2b7abe7170dae3892b5e8e494d432 Mon Sep 17 00:00:00 2001 From: Marc K Date: Wed, 26 Oct 2016 16:05:05 +0200 Subject: [PATCH 347/502] envsetup: dopush: fix finding files to be pushed with ninja Change-Id: I27b4e62d08dcd2a6dc95519197c6284c8c44636d Signed-off-by: Marc K --- envsetup.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/envsetup.sh b/envsetup.sh index 4d296b169b6..a31de1eec94 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -2361,16 +2361,20 @@ function dopush() # Install: if [ `uname` = "Linux" ]; then - LOC="$(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Install: ' | cut -d ':' -f 2)" + LOC="$(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//' \ + | grep '^Install: ' | cut -d ':' -f 2)" else - LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Install: ' | cut -d ':' -f 2)" + LOC="$(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" -E "s/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//" \ + | grep '^Install: ' | cut -d ':' -f 2)" fi # Copy: if [ `uname` = "Linux" ]; then - LOC="$LOC $(cat $OUT/.log | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' | grep '^Copy: ' | cut -d ':' -f 2)" + LOC="$LOC $(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//' \ + | grep '^Copy: ' | cut -d ':' -f 2)" else - LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" | grep '^Copy: ' | cut -d ':' -f 2)" + LOC="$LOC $(cat $OUT/.log | sed -E "s/"$'\E'"\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" -E 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//' \ + | grep '^Copy: ' | cut -d ':' -f 2)" fi # If any files are going to /data, push an octal file permissions reader to device From b11928ea0e465f351b0166eadf3443dd0e5de2e0 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Sun, 6 Mar 2016 22:06:28 +0100 Subject: [PATCH 348/502] Fix a race condition while building the recovery patch (needed for msm8226) RECOVERY_PATCH_INSTALL has a dependency on RECOVERY_FROM_BOOT_PATCH. This is correct, because RECOVERY_PATCH_INSTALL uses make_recovery_patch which needs the imgdiff tool. imgdiff on the other hand is a dependency of RECOVERY_FROM_BOOT_PATCH. This should ensure that all dependencies are met. However, RECOVERY_FROM_BOOT_PATCH is defined after RECOVERY_PATCH_INSTALL, making the dependency effectively non-existant. Moving RECOVERY_FROM_BOOT_PATCH before RECOVERY_PATCH_INSTALL fixes a race-condition where sometimes imgdiff was not build before RECOVERY_PATCH_INSTALL is called. Upstream is not affected by this bug, since it does not contain RECOVERY_PATCH_INSTALL anymore. The following error can be observed whenever someone hits this race condition (which is basically always reproducible when building with -j1): Installing recovery patch to system partition Warning: could not find SYSTEM/build.prop in using prebuilt recovery.img from BOOTABLE_IMAGES... using prebuilt boot.img from BOOTABLE_IMAGES... Traceback (most recent call last): File "./build/tools/releasetools/make_recovery_patch", line 55, in main(sys.argv[1:]) File "./build/tools/releasetools/make_recovery_patch", line 51, in main common.MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img) File "build/tools/releasetools/common.py", line 1461, in MakeRecoveryPatch _, _, patch = d.ComputePatch() File "build/tools/releasetools/common.py", line 1146, in ComputePatch p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) File "build/tools/releasetools/common.py", line 100, in Run return subprocess.Popen(args, **kwargs) File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory build/core/Makefile:1047: recipe for target 'out/target/product/t00n/system/bin/install-recovery.sh' failed Fixes: 3d1c612e5c82 ("Revert "Revert "core: Makefile: Build install-recovery into the system image""") Change-Id: I28e8c845ffc830553ca5177cbe22ae72b185b437 --- core/Makefile | 55 +++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/core/Makefile b/core/Makefile index a7ebf3dd605..f37f382953e 100644 --- a/core/Makefile +++ b/core/Makefile @@ -1201,6 +1201,31 @@ $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_k $(call build-recoveryimage-target, $@) endif # BOARD_CUSTOM_BOOTIMG_MK +# The system partition needs room for the recovery image as well. We +# now store the recovery image as a binary patch using the boot image +# as the source (since they are very similar). Generate the patch so +# we can see how big it's going to be, and include that in the system +# image size check calculation. +ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) +intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) +ifndef BOARD_CANT_BUILD_RECOVERY_FROM_BOOT_PATCH +RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p +else +RECOVERY_FROM_BOOT_PATCH := +endif +$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ + $(INSTALLED_BOOTIMAGE_TARGET) \ + $(HOST_OUT_EXECUTABLES)/imgdiff \ + $(HOST_OUT_EXECUTABLES)/bsdiff + @echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST} + mkdir -p $(dir $@) +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) + PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +else + PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ +endif +endif + ifdef RECOVERY_RESOURCE_ZIP $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME) $(hide) mkdir -p $(dir $@) @@ -1362,36 +1387,6 @@ endif INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) -# The system partition needs room for the recovery image as well. We -# now store the recovery image as a binary patch using the boot image -# as the source (since they are very similar). Generate the patch so -# we can see how big it's going to be, and include that in the system -# image size check calculation. -ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) -ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) -intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) -ifndef BOARD_CANT_BUILD_RECOVERY_FROM_BOOT_PATCH -RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p -else -RECOVERY_FROM_BOOT_PATCH := -endif -$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \ - $(INSTALLED_BOOTIMAGE_TARGET) \ - $(HOST_OUT_EXECUTABLES)/imgdiff \ - $(HOST_OUT_EXECUTABLES)/bsdiff - @echo "Construct recovery from boot" - mkdir -p $(dir $@) -ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true) - PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ -else - PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ -endif -else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true -RECOVERY_FROM_BOOT_PATCH := $(INSTALLED_RECOVERYIMAGE_TARGET) -endif -endif - - $(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH) | $(ACP) @echo "Install system fs image: $@" $(copy-file-to-target) From bba8a65b45e5a5451f8aa468abe8d6555dd89204 Mon Sep 17 00:00:00 2001 From: LorDClockaN Date: Wed, 26 Oct 2016 16:29:07 +0200 Subject: [PATCH 349/502] Merge tag 'android-7.1.0_r4' into n7.1 Change-Id: I702b0643edfd9cb2307b4c43c7f0e940abc37028 --- CleanSpec.mk | 4 + core/Makefile | 119 +- core/binary.mk | 100 +- core/build_id.mk | 2 +- core/cleanbuild.mk | 1 + core/clear_vars.mk | 2 + core/config_sanitizers.mk | 25 + core/definitions.mk | 3 + core/dex_preopt.mk | 4 + core/dex_preopt_libart.mk | 15 + core/dex_preopt_odex_install.mk | 16 +- core/envsetup.mk | 18 +- core/main.mk | 9 +- core/pathmap.mk | 7 +- core/prebuilt_internal.mk | 22 + core/product.mk | 12 + core/product_config.mk | 18 +- core/setup_one_odex.mk | 4 +- core/tasks/vendor_module_check.mk | 1 + core/version_defaults.mk | 8 +- target/product/core.mk | 1 + .../templates-ds/assets/GPL-LICENSE.txt | 278 - .../droiddoc/templates-ds/assets/LICENSE.txt | 20 - .../assets/android-developer-core.css | 1197 --- .../assets/android-developer-docs.css | 1576 --- .../templates-ds/assets/css/default.css | 4459 -------- .../templates-ds/assets/css/fullscreen.css | 200 - .../templates-ds/assets/design/default.js | 188 - .../assets/images/android-developers-logo.png | Bin 3195 -> 0 bytes .../assets/images/android_wrench.png | Bin 3633 -> 0 bytes .../assets/images/arrow-left-develop.png | Bin 3036 -> 0 bytes .../templates-ds/assets/images/arrow-left.png | Bin 3144 -> 0 bytes .../assets/images/arrow-right-develop.png | Bin 2960 -> 0 bytes .../assets/images/arrow-right.png | Bin 2757 -> 0 bytes .../assets/images/arrow_bluelink_down.png | Bin 180 -> 0 bytes .../assets/images/arrow_bluelink_up.png | Bin 181 -> 0 bytes .../assets/images/arrow_left_off.jpg | Bin 592 -> 0 bytes .../assets/images/arrow_left_on.jpg | Bin 692 -> 0 bytes .../assets/images/arrow_right_off.jpg | Bin 592 -> 0 bytes .../assets/images/arrow_right_on.jpg | Bin 692 -> 0 bytes .../assets/images/arrows-up-down.png | Bin 162 -> 0 bytes .../assets/images/bg_community_leftDiv.jpg | Bin 10692 -> 0 bytes .../templates-ds/assets/images/bg_fade.jpg | Bin 300 -> 0 bytes .../assets/images/bg_gradient.jpg | Bin 1376 -> 0 bytes .../assets/images/bg_images_sprite.png | Bin 2008 -> 0 bytes .../templates-ds/assets/images/bg_logo.png | Bin 1525 -> 0 bytes .../assets/images/blog-default.png | Bin 72570 -> 0 bytes .../assets/images/body-gradient-tab.png | Bin 192 -> 0 bytes .../assets/images/body-gradient.png | Bin 146 -> 0 bytes .../templates-ds/assets/images/close.png | Bin 312 -> 0 bytes .../templates-ds/assets/images/dac_logo.png | Bin 2170 -> 0 bytes .../assets/images/developers-logo.png | Bin 10155 -> 0 bytes .../templates-ds/assets/images/fullscreen.png | Bin 1154 -> 0 bytes .../assets/images/grad-rule-qv.png | Bin 249 -> 0 bytes .../assets/images/home/Android_Dev_Lab_l.png | Bin 16512 -> 0 bytes .../assets/images/home/GDC2011.png | Bin 15892 -> 0 bytes .../assets/images/home/GTV_icon_large.png | Bin 7553 -> 0 bytes .../assets/images/home/GTV_icon_small.png | Bin 3576 -> 0 bytes .../assets/images/home/IO-logo-2011.png | Bin 11210 -> 0 bytes .../assets/images/home/IO-logo.png | Bin 3673 -> 0 bytes .../assets/images/home/adc2_l.png | Bin 111790 -> 0 bytes .../assets/images/home/adc2_s.png | Bin 27250 -> 0 bytes .../assets/images/home/android_adc.png | Bin 1849 -> 0 bytes .../images/home/bg_home_announcement.png | Bin 2840 -> 0 bytes .../assets/images/home/bg_home_bottom.jpg | Bin 2180 -> 0 bytes .../assets/images/home/bg_home_carousel.png | Bin 3654 -> 0 bytes .../images/home/bg_home_carousel_board.png | Bin 1902 -> 0 bytes .../images/home/bg_home_carousel_wheel.png | Bin 2041 -> 0 bytes .../images/home/carousel_buttons_sprite.png | Bin 3413 -> 0 bytes .../assets/images/home/devphone-large.png | Bin 16630 -> 0 bytes .../assets/images/home/devphone-small.png | Bin 1944 -> 0 bytes .../assets/images/home/donut-android.png | Bin 9386 -> 0 bytes .../assets/images/home/eclair-android.png | Bin 11311 -> 0 bytes .../assets/images/home/froyo-android.png | Bin 17086 -> 0 bytes .../assets/images/home/gdc-logo.png | Bin 2739 -> 0 bytes .../assets/images/home/gingerdroid.png | Bin 11690 -> 0 bytes .../assets/images/home/google-plus-small.png | Bin 5042 -> 0 bytes .../assets/images/home/google-plus.png | Bin 21315 -> 0 bytes .../assets/images/home/honeycomb-android.png | Bin 13716 -> 0 bytes .../assets/images/home/icon-about.png | Bin 5573 -> 0 bytes .../assets/images/home/icon-design.png | Bin 5739 -> 0 bytes .../assets/images/home/icon-develop.png | Bin 5364 -> 0 bytes .../assets/images/home/icon-distribute.png | Bin 4588 -> 0 bytes .../assets/images/home/ics-android.png | Bin 15002 -> 0 bytes .../assets/images/home/io-large.png | Bin 5522 -> 0 bytes .../assets/images/home/io-small.png | Bin 1427 -> 0 bytes .../assets/images/home/maps-large.png | Bin 39756 -> 0 bytes .../assets/images/home/maps-small.png | Bin 3424 -> 0 bytes .../assets/images/home/market-large.png | Bin 5752 -> 0 bytes .../assets/images/home/market-small.png | Bin 3134 -> 0 bytes .../assets/images/home/sdk-large.png | Bin 1616 -> 0 bytes .../assets/images/home/sdk-small.png | Bin 2381 -> 0 bytes .../assets/images/hr_gray_main.jpg | Bin 378 -> 0 bytes .../assets/images/hr_gray_side.jpg | Bin 344 -> 0 bytes .../assets/images/icon_contribute.jpg | Bin 1021 -> 0 bytes .../assets/images/icon_design.png | Bin 697 -> 0 bytes .../assets/images/icon_download.jpg | Bin 1192 -> 0 bytes .../assets/images/icon_download2.jpg | Bin 653 -> 0 bytes .../assets/images/icon_guidelines_logo.png | Bin 44163 -> 0 bytes .../assets/images/icon_market.jpg | Bin 1022 -> 0 bytes .../templates-ds/assets/images/icon_more.png | Bin 1098 -> 0 bytes .../templates-ds/assets/images/icon_play.png | Bin 10201 -> 0 bytes .../templates-ds/assets/images/icon_robot.jpg | Bin 638 -> 0 bytes .../assets/images/icon_search.png | Bin 1406 -> 0 bytes .../templates-ds/assets/images/icon_world.jpg | Bin 511 -> 0 bytes .../templates-ds/assets/images/left_off.jpg | Bin 592 -> 0 bytes .../templates-ds/assets/images/left_on.jpg | Bin 692 -> 0 bytes .../templates-ds/assets/images/locale.png | Bin 393 -> 0 bytes .../assets/images/logo_breadcrumbz.jpg | Bin 3311 -> 0 bytes .../assets/images/more_bottom.png | Bin 1055 -> 0 bytes .../templates-ds/assets/images/more_check.png | Bin 1014 -> 0 bytes .../templates-ds/assets/images/more_mid.png | Bin 958 -> 0 bytes .../templates-ds/assets/images/more_top.png | Bin 1447 -> 0 bytes .../assets/images/open_source.png | Bin 6340 -> 0 bytes .../assets/images/preliminary.png | Bin 2251 -> 0 bytes .../assets/images/quicknav_arrow.png | Bin 2951 -> 0 bytes .../assets/images/quicknav_btn_bg.png | Bin 1024 -> 0 bytes .../assets/images/resizable-e.gif | Bin 2713 -> 0 bytes .../assets/images/resizable-e2.gif | Bin 2680 -> 0 bytes .../assets/images/resizable-eg.gif | Bin 3075 -> 0 bytes .../assets/images/resizable-s.gif | Bin 2617 -> 0 bytes .../assets/images/resizable-s2.gif | Bin 2618 -> 0 bytes .../assets/images/resizable-s2.png | Bin 966 -> 0 bytes .../assets/images/resizable-sg.gif | Bin 3057 -> 0 bytes .../assets/images/resource-article.png | Bin 889 -> 0 bytes .../assets/images/resource-big-article.png | Bin 2095 -> 0 bytes .../assets/images/resource-big-sample.png | Bin 2480 -> 0 bytes .../assets/images/resource-big-tutorial.png | Bin 2544 -> 0 bytes .../assets/images/resource-big-video.png | Bin 2155 -> 0 bytes .../assets/images/resource-sample.png | Bin 972 -> 0 bytes .../assets/images/resource-tutorial.png | Bin 1001 -> 0 bytes .../assets/images/resource-video.png | Bin 835 -> 0 bytes .../templates-ds/assets/images/right_off.jpg | Bin 592 -> 0 bytes .../templates-ds/assets/images/right_on.jpg | Bin 692 -> 0 bytes .../assets/images/sidenav-rule.png | Bin 258 -> 0 bytes .../templates-ds/assets/images/slide_1.jpg | Bin 3060 -> 0 bytes .../templates-ds/assets/images/slide_2.jpg | Bin 3736 -> 0 bytes .../templates-ds/assets/images/slide_3.jpg | Bin 3151 -> 0 bytes .../assets/images/slide_large_1.jpg | Bin 19240 -> 0 bytes .../assets/images/slide_large_2.jpg | Bin 20188 -> 0 bytes .../assets/images/slide_large_3.jpg | Bin 20202 -> 0 bytes .../templates-ds/assets/images/slide_off.jpg | Bin 676 -> 0 bytes .../templates-ds/assets/images/slide_on.jpg | Bin 733 -> 0 bytes .../templates-ds/assets/images/spacer.gif | Bin 96 -> 0 bytes .../assets/images/styles/callout.png | Bin 1383 -> 0 bytes .../device_galaxynexus_blank_land_span13.png | Bin 64431 -> 0 bytes .../device_galaxynexus_blank_land_span8.png | Bin 30679 -> 0 bytes .../device_galaxynexus_blank_port_span5.png | Bin 39994 -> 0 bytes .../device_galaxynexus_blank_port_span9.png | Bin 75920 -> 0 bytes .../assets/images/styles/disclosure_down.png | Bin 238 -> 0 bytes .../assets/images/styles/disclosure_left.png | Bin 229 -> 0 bytes .../assets/images/styles/disclosure_right.png | Bin 228 -> 0 bytes .../assets/images/styles/disclosure_up.png | Bin 221 -> 0 bytes .../assets/images/styles/gototop.png | Bin 262 -> 0 bytes .../assets/images/styles/ico_action.png | Bin 415 -> 0 bytes .../assets/images/styles/ico_good.png | Bin 318 -> 0 bytes .../assets/images/styles/ico_movie_inline.png | Bin 1040 -> 0 bytes .../assets/images/styles/ico_phone_tablet.png | Bin 302 -> 0 bytes .../assets/images/styles/ico_use.png | Bin 437 -> 0 bytes .../assets/images/styles/ico_web.png | Bin 1037 -> 0 bytes .../assets/images/styles/ico_wrong.png | Bin 286 -> 0 bytes .../assets/images/styles/open_new_page.png | Bin 980 -> 0 bytes .../assets/images/triangle-closed-small.png | Bin 166 -> 0 bytes .../assets/images/triangle-closed.png | Bin 3565 -> 0 bytes .../assets/images/triangle-opened-small.png | Bin 170 -> 0 bytes .../assets/images/triangle-opened.png | Bin 3567 -> 0 bytes .../assets/images/uiguidelines1.png | Bin 5258 -> 0 bytes .../assets/images/video-droid.png | Bin 1614 -> 0 bytes .../templates-ds/assets/jdiff_logo.gif | Bin 390 -> 0 bytes tools/droiddoc/templates-ds/assets/js/docs.js | 2433 ----- .../assets/js/global-libraries-combined.js | 76 - .../assets/js/grid/960.gridder.css | 1 - .../assets/js/grid/960.gridder.js | 271 - .../templates-ds/assets/js/prettify.js | 28 - .../assets/scroller/jquery.jscrollpane.min.js | 11 - .../assets/scroller/jquery.mousewheel.min.js | 12 - .../templates-ds/assets/triangle-none.gif | Bin 240 -> 0 bytes tools/droiddoc/templates-ds/class.cs | 654 -- tools/droiddoc/templates-ds/classes.cs | 47 - .../templates-ds/components/masthead.cs | 231 - tools/droiddoc/templates-ds/customizations.cs | 370 - tools/droiddoc/templates-ds/data.hdf | 4 - tools/droiddoc/templates-ds/designpage.cs | 99 - tools/droiddoc/templates-ds/docpage.cs | 174 - tools/droiddoc/templates-ds/footer.cs | 20 - .../droiddoc/templates-ds/gcm_navtree_data.cs | 3 - .../droiddoc/templates-ds/gms_navtree_data.cs | 3 - tools/droiddoc/templates-ds/head_tag.cs | 53 - tools/droiddoc/templates-ds/header.cs | 3 - tools/droiddoc/templates-ds/header_tabs.cs | 2 - .../droiddoc/templates-ds/jd_lists_unified.cs | 1 - tools/droiddoc/templates-ds/navtree_data.cs | 3 - tools/droiddoc/templates-ds/nosidenavpage.cs | 27 - tools/droiddoc/templates-ds/package.cs | 62 - tools/droiddoc/templates-ds/packages.cs | 43 - tools/droiddoc/templates-ds/sampleindex.cs | 53 - tools/droiddoc/templates-ds/sdkpage.cs | 492 - tools/droiddoc/templates-ds/timestamp.cs | 1 - tools/droiddoc/templates-ds/trailer.cs | 48 - .../templates-sdk-dev/assets/css/default.css | 995 +- .../templates-sdk-dev/assets/js/docs.js | 456 +- .../templates-sdk-dev/components/masthead.cs | 61 +- .../templates-sdk-dev/customizations.cs | 53 +- tools/droiddoc/templates-sdk-dev/docpage.cs | 140 +- tools/droiddoc/templates-sdk-dev/head_tag.cs | 143 +- tools/droiddoc/templates-sdk-dev/header.cs | 2 +- tools/droiddoc/templates-sdk-dev/sdkpage.cs | 385 - .../assets/GPL-LICENSE.txt | 278 - .../templates-sdk-refonly/assets/LICENSE.txt | 20 - .../assets/android-developer-docs.css | 2768 ----- .../assets/css/default.css | 8877 ---------------- .../assets/css/fullscreen.css | 20 - .../assets/design/default.js | 188 - .../assets/images/android-developers-logo.png | Bin 3195 -> 0 bytes .../assets/images/android.png | Bin 4934 -> 0 bytes .../assets/images/android_logo.png | Bin 513 -> 0 bytes .../assets/images/android_logo@2x.png | Bin 860 -> 0 bytes .../assets/images/android_logo_ndk.png | Bin 4712 -> 0 bytes .../assets/images/android_logo_ndk@2x.png | Bin 18596 -> 0 bytes .../assets/images/android_wrench.png | Bin 3633 -> 0 bytes .../assets/images/arrow-left-develop.png | Bin 3036 -> 0 bytes .../assets/images/arrow-left.png | Bin 3144 -> 0 bytes .../assets/images/arrow-right-develop.png | Bin 2960 -> 0 bytes .../assets/images/arrow-right.png | Bin 2757 -> 0 bytes .../assets/images/arrow_bluelink_down.png | Bin 180 -> 0 bytes .../assets/images/arrow_bluelink_up.png | Bin 181 -> 0 bytes .../assets/images/arrow_left_off.jpg | Bin 592 -> 0 bytes .../assets/images/arrow_left_on.jpg | Bin 692 -> 0 bytes .../assets/images/arrow_right_off.jpg | Bin 592 -> 0 bytes .../assets/images/arrow_right_on.jpg | Bin 692 -> 0 bytes .../assets/images/arrows-up-down.png | Bin 162 -> 0 bytes .../assets/images/bg_community_leftDiv.jpg | Bin 10692 -> 0 bytes .../assets/images/bg_fade.jpg | Bin 300 -> 0 bytes .../assets/images/bg_gradient.jpg | Bin 1376 -> 0 bytes .../assets/images/bg_images_sprite.png | Bin 2008 -> 0 bytes .../assets/images/bg_logo.png | Bin 1525 -> 0 bytes .../assets/images/blog-default.png | Bin 72570 -> 0 bytes .../assets/images/body-gradient-tab.png | Bin 192 -> 0 bytes .../assets/images/body-gradient.png | Bin 146 -> 0 bytes .../assets/images/breadcrumb.png | Bin 164 -> 0 bytes .../assets/images/close-grey.png | Bin 379 -> 0 bytes .../assets/images/close-grey_2x.png | Bin 830 -> 0 bytes .../assets/images/close-white.png | Bin 292 -> 0 bytes .../assets/images/close-white_2x.png | Bin 586 -> 0 bytes .../assets/images/close.png | Bin 312 -> 0 bytes .../assets/images/dac_logo.png | Bin 2170 -> 0 bytes .../assets/images/dac_logo@2x.png | Bin 2497 -> 0 bytes .../assets/images/developers-logo.png | Bin 10155 -> 0 bytes .../assets/images/file-generic.png | Bin 224 -> 0 bytes .../assets/images/file-image.png | Bin 511 -> 0 bytes .../assets/images/file-java.png | Bin 299 -> 0 bytes .../assets/images/file-manifest.png | Bin 341 -> 0 bytes .../assets/images/file-xml.png | Bin 301 -> 0 bytes .../assets/images/folder.png | Bin 311 -> 0 bytes .../assets/images/fullscreen.png | Bin 1154 -> 0 bytes .../assets/images/grad-rule-qv.png | Bin 249 -> 0 bytes .../assets/images/home/Android_Dev_Lab_l.png | Bin 16512 -> 0 bytes .../assets/images/home/GDC2011.png | Bin 15892 -> 0 bytes .../assets/images/home/GTV_icon_large.png | Bin 7553 -> 0 bytes .../assets/images/home/GTV_icon_small.png | Bin 3576 -> 0 bytes .../assets/images/home/IO-logo-2011.png | Bin 11210 -> 0 bytes .../assets/images/home/IO-logo.png | Bin 3673 -> 0 bytes .../assets/images/home/adc2_l.png | Bin 111790 -> 0 bytes .../assets/images/home/adc2_s.png | Bin 27250 -> 0 bytes .../assets/images/home/android_adc.png | Bin 1849 -> 0 bytes .../images/home/android_m_hero_1200.jpg | Bin 112883 -> 0 bytes .../images/home/bg_home_announcement.png | Bin 2840 -> 0 bytes .../assets/images/home/bg_home_bottom.jpg | Bin 2180 -> 0 bytes .../assets/images/home/bg_home_carousel.png | Bin 3654 -> 0 bytes .../images/home/bg_home_carousel_board.png | Bin 1902 -> 0 bytes .../images/home/bg_home_carousel_wheel.png | Bin 2041 -> 0 bytes .../images/home/carousel_buttons_sprite.png | Bin 3413 -> 0 bytes .../assets/images/home/devphone-large.png | Bin 16630 -> 0 bytes .../assets/images/home/devphone-small.png | Bin 1944 -> 0 bytes .../assets/images/home/donut-android.png | Bin 9386 -> 0 bytes .../assets/images/home/eclair-android.png | Bin 11311 -> 0 bytes .../assets/images/home/froyo-android.png | Bin 17086 -> 0 bytes .../assets/images/home/gdc-logo.png | Bin 2739 -> 0 bytes .../assets/images/home/gingerdroid.png | Bin 11690 -> 0 bytes .../assets/images/home/google-plus-small.png | Bin 5042 -> 0 bytes .../assets/images/home/google-plus.png | Bin 21315 -> 0 bytes .../assets/images/home/honeycomb-android.png | Bin 13716 -> 0 bytes .../assets/images/home/icon-about.png | Bin 5573 -> 0 bytes .../assets/images/home/icon-design.png | Bin 5739 -> 0 bytes .../assets/images/home/icon-develop.png | Bin 5364 -> 0 bytes .../assets/images/home/icon-distribute.png | Bin 4588 -> 0 bytes .../assets/images/home/ics-android.png | Bin 15002 -> 0 bytes .../assets/images/home/io-large.png | Bin 5522 -> 0 bytes .../assets/images/home/io-small.png | Bin 1427 -> 0 bytes .../assets/images/home/maps-large.png | Bin 39756 -> 0 bytes .../assets/images/home/maps-small.png | Bin 3424 -> 0 bytes .../assets/images/home/market-large.png | Bin 5752 -> 0 bytes .../assets/images/home/market-small.png | Bin 3134 -> 0 bytes .../assets/images/home/sdk-large.png | Bin 1616 -> 0 bytes .../assets/images/home/sdk-small.png | Bin 2381 -> 0 bytes .../assets/images/hr_gray_main.jpg | Bin 378 -> 0 bytes .../assets/images/hr_gray_side.jpg | Bin 344 -> 0 bytes .../assets/images/icon_contribute.jpg | Bin 1021 -> 0 bytes .../assets/images/icon_design.png | Bin 697 -> 0 bytes .../assets/images/icon_download.jpg | Bin 1192 -> 0 bytes .../assets/images/icon_download2.jpg | Bin 653 -> 0 bytes .../assets/images/icon_guidelines_logo.png | Bin 44163 -> 0 bytes .../assets/images/icon_market.jpg | Bin 1022 -> 0 bytes .../assets/images/icon_more.png | Bin 1098 -> 0 bytes .../assets/images/icon_play.png | Bin 10201 -> 0 bytes .../assets/images/icon_robot.jpg | Bin 638 -> 0 bytes .../assets/images/icon_search.png | Bin 1406 -> 0 bytes .../assets/images/icon_world.jpg | Bin 511 -> 0 bytes .../assets/images/left_off.jpg | Bin 592 -> 0 bytes .../assets/images/left_on.jpg | Bin 692 -> 0 bytes .../assets/images/link-out.png | Bin 202 -> 0 bytes .../assets/images/locale.png | Bin 393 -> 0 bytes .../assets/images/logo_breadcrumbz.jpg | Bin 3311 -> 0 bytes .../assets/images/more_bottom.png | Bin 1055 -> 0 bytes .../assets/images/more_check.png | Bin 1014 -> 0 bytes .../assets/images/more_mid.png | Bin 958 -> 0 bytes .../assets/images/more_top.png | Bin 1447 -> 0 bytes .../assets/images/open_source.png | Bin 6340 -> 0 bytes .../assets/images/play-circle-grey.png | Bin 880 -> 0 bytes .../assets/images/play-circle-grey_2x.png | Bin 2280 -> 0 bytes .../assets/images/play-circle-white.png | Bin 670 -> 0 bytes .../assets/images/play-circle-white_2x.png | Bin 1733 -> 0 bytes .../assets/images/preliminary.png | Bin 2251 -> 0 bytes .../assets/images/preview.png | Bin 1664 -> 0 bytes .../assets/images/quicknav_arrow.png | Bin 2951 -> 0 bytes .../assets/images/quicknav_btn_bg.png | Bin 1024 -> 0 bytes .../assets/images/resizable-e.gif | Bin 2713 -> 0 bytes .../assets/images/resizable-e2.gif | Bin 2680 -> 0 bytes .../assets/images/resizable-eg.gif | Bin 3075 -> 0 bytes .../assets/images/resizable-s.gif | Bin 2617 -> 0 bytes .../assets/images/resizable-s2.gif | Bin 2618 -> 0 bytes .../assets/images/resizable-s2.png | Bin 966 -> 0 bytes .../assets/images/resizable-sg.gif | Bin 3057 -> 0 bytes .../assets/images/resource-article.png | Bin 889 -> 0 bytes .../assets/images/resource-big-article.png | Bin 2095 -> 0 bytes .../assets/images/resource-big-sample.png | Bin 2480 -> 0 bytes .../assets/images/resource-big-tutorial.png | Bin 2544 -> 0 bytes .../assets/images/resource-big-video.png | Bin 2155 -> 0 bytes .../images/resource-card-default-android.jpg | Bin 12042 -> 0 bytes .../assets/images/resource-sample.png | Bin 972 -> 0 bytes .../assets/images/resource-tutorial.png | Bin 1001 -> 0 bytes .../assets/images/resource-video.png | Bin 835 -> 0 bytes .../assets/images/right_off.jpg | Bin 592 -> 0 bytes .../assets/images/right_on.jpg | Bin 692 -> 0 bytes .../assets/images/sidenav-rule.png | Bin 258 -> 0 bytes .../assets/images/slide_1.jpg | Bin 3060 -> 0 bytes .../assets/images/slide_2.jpg | Bin 3736 -> 0 bytes .../assets/images/slide_3.jpg | Bin 3151 -> 0 bytes .../assets/images/slide_large_1.jpg | Bin 19240 -> 0 bytes .../assets/images/slide_large_2.jpg | Bin 20188 -> 0 bytes .../assets/images/slide_large_3.jpg | Bin 20202 -> 0 bytes .../assets/images/slide_off.jpg | Bin 676 -> 0 bytes .../assets/images/slide_on.jpg | Bin 733 -> 0 bytes .../assets/images/spacer.gif | Bin 96 -> 0 bytes .../assets/images/sprite-2x.png | Bin 7283 -> 0 bytes .../assets/images/sprite.png | Bin 3121 -> 0 bytes .../assets/images/stack-arrow-right.png | Bin 198 -> 0 bytes .../assets/images/styles/callout.png | Bin 1383 -> 0 bytes .../device_galaxynexus_blank_land_span13.png | Bin 64431 -> 0 bytes .../device_galaxynexus_blank_land_span8.png | Bin 30679 -> 0 bytes .../device_galaxynexus_blank_port_span5.png | Bin 39994 -> 0 bytes .../device_galaxynexus_blank_port_span9.png | Bin 75920 -> 0 bytes .../styles/device_nexus4_blank_port_432.png | Bin 301931 -> 0 bytes .../device_nexus5_blank_land_span13.png | Bin 57247 -> 0 bytes .../styles/device_nexus5_blank_port_span5.png | Bin 33589 -> 0 bytes .../images/styles/device_wear_square.png | Bin 13039 -> 0 bytes .../styles/device_wear_square_small.png | Bin 21525 -> 0 bytes .../assets/images/styles/disclosure_down.png | Bin 238 -> 0 bytes .../assets/images/styles/disclosure_left.png | Bin 229 -> 0 bytes .../assets/images/styles/disclosure_right.png | Bin 228 -> 0 bytes .../assets/images/styles/disclosure_up.png | Bin 221 -> 0 bytes .../assets/images/styles/gototop.png | Bin 262 -> 0 bytes .../assets/images/styles/helpouts-logo-35.png | Bin 1437 -> 0 bytes .../images/styles/helpouts-logo-35_2x.png | Bin 3315 -> 0 bytes .../assets/images/styles/ico_action.png | Bin 415 -> 0 bytes .../assets/images/styles/ico_good.png | Bin 318 -> 0 bytes .../assets/images/styles/ico_movie_inline.png | Bin 1040 -> 0 bytes .../assets/images/styles/ico_phone_tablet.png | Bin 302 -> 0 bytes .../assets/images/styles/ico_use.png | Bin 437 -> 0 bytes .../assets/images/styles/ico_web.png | Bin 1037 -> 0 bytes .../assets/images/styles/ico_wrong.png | Bin 286 -> 0 bytes .../images/styles/notice-designers-video.png | Bin 3338 -> 0 bytes .../styles/notice-designers-video@2x.png | Bin 6019 -> 0 bytes .../assets/images/styles/notice-designers.png | Bin 3208 -> 0 bytes .../images/styles/notice-designers@2x.png | Bin 5877 -> 0 bytes .../images/styles/notice-developers-video.png | Bin 3219 -> 0 bytes .../styles/notice-developers-video@2x.png | Bin 5738 -> 0 bytes .../images/styles/notice-developers.png | Bin 3017 -> 0 bytes .../images/styles/notice-developers@2x.png | Bin 5456 -> 0 bytes .../assets/images/styles/open_new_page.png | Bin 980 -> 0 bytes .../assets/images/triangle-closed-small.png | Bin 166 -> 0 bytes .../assets/images/triangle-closed.png | Bin 3565 -> 0 bytes .../assets/images/triangle-opened-small.png | Bin 170 -> 0 bytes .../assets/images/triangle-opened.png | Bin 3567 -> 0 bytes .../assets/images/uiguidelines1.png | Bin 5258 -> 0 bytes .../assets/images/video-droid.png | Bin 1614 -> 0 bytes .../assets/js/android_3p-bundle.js | 2766 ----- .../templates-sdk-refonly/assets/js/docs.js | 5296 ---------- .../assets/js/prettify.js | 28 - tools/droiddoc/templates-sdk-refonly/class.cs | 676 -- .../droiddoc/templates-sdk-refonly/classes.cs | 54 - .../components/masthead.cs | 174 - .../templates-sdk-refonly/customizations.cs | 620 -- tools/droiddoc/templates-sdk-refonly/data.hdf | 4 - .../templates-sdk-refonly/designpage.cs | 108 - .../droiddoc/templates-sdk-refonly/docpage.cs | 203 - .../droiddoc/templates-sdk-refonly/footer.cs | 174 - .../templates-sdk-refonly/gcm_navtree_data.cs | 3 - .../templates-sdk-refonly/gms_navtree_data.cs | 3 - .../templates-sdk-refonly/head_tag.cs | 101 - .../droiddoc/templates-sdk-refonly/header.cs | 3 - .../templates-sdk-refonly/header_tabs.cs | 2 - .../templates-sdk-refonly/jd_lists_unified.cs | 1 - .../templates-sdk-refonly/macros_override.cs | 41 - .../templates-sdk-refonly/navtree_data.cs | 3 - .../templates-sdk-refonly/nosidenavpage.cs | 28 - .../droiddoc/templates-sdk-refonly/package.cs | 66 - .../templates-sdk-refonly/packages.cs | 46 - .../droiddoc/templates-sdk-refonly/sample.cs | 151 - .../templates-sdk-refonly/sampleindex.cs | 136 - .../samples_navtree_data.cs | 3 - .../droiddoc/templates-sdk-refonly/sdkpage.cs | 588 -- .../templates-sdk-refonly/timestamp.cs | 1 - .../droiddoc/templates-sdk-refonly/trailer.cs | 21 - .../templates-sdk/assets/css/default.css | 5769 ++++++---- .../assets/images/android_logo.png | Bin 513 -> 3095 bytes .../assets/images/android_logo@2x.png | Bin 860 -> 3284 bytes .../assets/images/play-circle-grey.png | Bin 880 -> 0 bytes .../assets/images/play-circle-grey_2x.png | Bin 2280 -> 0 bytes .../assets/images/play-circle-white.png | Bin 670 -> 0 bytes .../assets/images/play-circle-white_2x.png | Bin 1733 -> 0 bytes .../templates-sdk/assets/images/sprite.png | Bin 3121 -> 4928 bytes .../templates-sdk/assets/images/sprite@2x.png | Bin 0 -> 11545 bytes .../assets/js/android_3p-bundle.js | 8 +- .../droiddoc/templates-sdk/assets/js/docs.js | 9359 ++++++++++------- tools/droiddoc/templates-sdk/body_tag.cs | 15 + tools/droiddoc/templates-sdk/class.cs | 838 +- tools/droiddoc/templates-sdk/classes.cs | 59 +- .../templates-sdk/components/masthead.cs | 488 +- .../droiddoc/templates-sdk/customizations.cs | 728 +- tools/droiddoc/templates-sdk/designpage.cs | 20 +- tools/droiddoc/templates-sdk/docpage.cs | 200 +- tools/droiddoc/templates-sdk/footer.cs | 95 +- tools/droiddoc/templates-sdk/head_tag.cs | 220 +- tools/droiddoc/templates-sdk/header.cs | 12 +- .../templates-sdk/jd_lists_unified.cs | 9 + tools/droiddoc/templates-sdk/lists.cs | 8 + .../droiddoc/templates-sdk/macros_override.cs | 19 +- tools/droiddoc/templates-sdk/package.cs | 72 +- tools/droiddoc/templates-sdk/packages.cs | 57 +- tools/droiddoc/templates-sdk/page_info.cs | 109 + tools/droiddoc/templates-sdk/sample.cs | 22 +- tools/droiddoc/templates-sdk/sampleindex.cs | 6 - .../templates-sdk/samples_navtree_data.cs | 11 +- tools/droiddoc/templates-sdk/sdkpage.cs | 443 - tools/droiddoc/templates-sdk/trailer.cs | 19 +- tools/droiddoc/templates-sdk/yaml_navtree.cs | 14 + tools/releasetools/add_img_to_target_files.py | 71 +- tools/releasetools/blockimgdiff.py | 23 +- tools/releasetools/build_image.py | 19 + .../check_target_files_signatures.py | 4 +- tools/releasetools/common.py | 22 +- tools/releasetools/ota_from_target_files.py | 104 +- tools/releasetools/sign_target_files_apks.py | 193 +- 464 files changed, 12407 insertions(+), 45849 deletions(-) delete mode 100644 tools/droiddoc/templates-ds/assets/GPL-LICENSE.txt delete mode 100644 tools/droiddoc/templates-ds/assets/LICENSE.txt delete mode 100644 tools/droiddoc/templates-ds/assets/android-developer-core.css delete mode 100644 tools/droiddoc/templates-ds/assets/android-developer-docs.css delete mode 100644 tools/droiddoc/templates-ds/assets/css/default.css delete mode 100644 tools/droiddoc/templates-ds/assets/css/fullscreen.css delete mode 100644 tools/droiddoc/templates-ds/assets/design/default.js delete mode 100644 tools/droiddoc/templates-ds/assets/images/android-developers-logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/android_wrench.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/arrow-left-develop.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/arrow-left.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/arrow-right-develop.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/arrow-right.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_bluelink_down.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_bluelink_up.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_left_off.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_left_on.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_right_off.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/arrow_right_on.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/arrows-up-down.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/bg_community_leftDiv.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/bg_fade.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/bg_gradient.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/bg_images_sprite.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/bg_logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/blog-default.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/body-gradient-tab.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/body-gradient.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/close.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/dac_logo.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/developers-logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/fullscreen.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/grad-rule-qv.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/Android_Dev_Lab_l.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/GDC2011.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/GTV_icon_large.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/GTV_icon_small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/IO-logo-2011.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/IO-logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/adc2_l.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/adc2_s.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/android_adc.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/bg_home_announcement.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/bg_home_bottom.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_board.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/bg_home_carousel_wheel.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/carousel_buttons_sprite.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/devphone-large.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/devphone-small.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/donut-android.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/eclair-android.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/froyo-android.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/gdc-logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/gingerdroid.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/google-plus-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/google-plus.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/honeycomb-android.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/icon-about.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/icon-design.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/icon-develop.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/icon-distribute.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/ics-android.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/io-large.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/home/io-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/maps-large.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/maps-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/market-large.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/market-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/sdk-large.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/home/sdk-small.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/hr_gray_main.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/hr_gray_side.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/icon_contribute.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_design.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/icon_download.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/icon_download2.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_guidelines_logo.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_market.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_more.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_play.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/icon_robot.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/icon_search.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/icon_world.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/left_off.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/left_on.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/locale.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/logo_breadcrumbz.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/more_bottom.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/more_check.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/more_mid.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/more_top.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/open_source.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/preliminary.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/quicknav_arrow.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/quicknav_btn_bg.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-e.gif delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-e2.gif delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-eg.gif delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-s.gif delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-s2.gif delete mode 100644 tools/droiddoc/templates-ds/assets/images/resizable-s2.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/resizable-sg.gif delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-article.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-big-article.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-big-sample.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-big-tutorial.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-big-video.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-sample.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-tutorial.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/resource-video.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/right_off.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/right_on.jpg delete mode 100644 tools/droiddoc/templates-ds/assets/images/sidenav-rule.png delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_1.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_2.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_3.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_large_1.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_large_2.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_large_3.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_off.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/slide_on.jpg delete mode 100755 tools/droiddoc/templates-ds/assets/images/spacer.gif delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/callout.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span13.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_land_span8.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span5.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/device_galaxynexus_blank_port_span9.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/disclosure_down.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/disclosure_left.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/disclosure_right.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/disclosure_up.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/gototop.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_action.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_good.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_movie_inline.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_phone_tablet.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_use.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_web.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/ico_wrong.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/styles/open_new_page.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/triangle-closed-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/triangle-closed.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/triangle-opened-small.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/triangle-opened.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/uiguidelines1.png delete mode 100644 tools/droiddoc/templates-ds/assets/images/video-droid.png delete mode 100644 tools/droiddoc/templates-ds/assets/jdiff_logo.gif delete mode 100644 tools/droiddoc/templates-ds/assets/js/docs.js delete mode 100644 tools/droiddoc/templates-ds/assets/js/global-libraries-combined.js delete mode 100755 tools/droiddoc/templates-ds/assets/js/grid/960.gridder.css delete mode 100755 tools/droiddoc/templates-ds/assets/js/grid/960.gridder.js delete mode 100644 tools/droiddoc/templates-ds/assets/js/prettify.js delete mode 100644 tools/droiddoc/templates-ds/assets/scroller/jquery.jscrollpane.min.js delete mode 100644 tools/droiddoc/templates-ds/assets/scroller/jquery.mousewheel.min.js delete mode 100644 tools/droiddoc/templates-ds/assets/triangle-none.gif delete mode 100644 tools/droiddoc/templates-ds/class.cs delete mode 100644 tools/droiddoc/templates-ds/classes.cs delete mode 100644 tools/droiddoc/templates-ds/components/masthead.cs delete mode 100644 tools/droiddoc/templates-ds/customizations.cs delete mode 100644 tools/droiddoc/templates-ds/data.hdf delete mode 100644 tools/droiddoc/templates-ds/designpage.cs delete mode 100644 tools/droiddoc/templates-ds/docpage.cs delete mode 100644 tools/droiddoc/templates-ds/footer.cs delete mode 100644 tools/droiddoc/templates-ds/gcm_navtree_data.cs delete mode 100644 tools/droiddoc/templates-ds/gms_navtree_data.cs delete mode 100644 tools/droiddoc/templates-ds/head_tag.cs delete mode 100644 tools/droiddoc/templates-ds/header.cs delete mode 100644 tools/droiddoc/templates-ds/header_tabs.cs delete mode 100644 tools/droiddoc/templates-ds/jd_lists_unified.cs delete mode 100644 tools/droiddoc/templates-ds/navtree_data.cs delete mode 100644 tools/droiddoc/templates-ds/nosidenavpage.cs delete mode 100644 tools/droiddoc/templates-ds/package.cs delete mode 100644 tools/droiddoc/templates-ds/packages.cs delete mode 100644 tools/droiddoc/templates-ds/sampleindex.cs delete mode 100644 tools/droiddoc/templates-ds/sdkpage.cs delete mode 100644 tools/droiddoc/templates-ds/timestamp.cs delete mode 100644 tools/droiddoc/templates-ds/trailer.cs delete mode 100644 tools/droiddoc/templates-sdk-dev/sdkpage.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/LICENSE.txt delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/android-developer-docs.css delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/css/default.css delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/css/fullscreen.css delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/design/default.js delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android-developers-logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android_logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android_logo@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left-develop.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right-develop.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_down.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_up.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_off.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_on.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_off.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_on.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/arrows-up-down.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/bg_community_leftDiv.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/bg_fade.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/bg_images_sprite.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/blog-default.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient-tab.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/close-grey_2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/close-white_2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/close.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo@2x.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/file-generic.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/file-xml.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/folder.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/grad-rule-qv.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/Android_Dev_Lab_l.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_large.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo-2011.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_l.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_s.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/android_adc.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/android_m_hero_1200.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_announcement.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_bottom.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_board.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_wheel.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/carousel_buttons_sprite.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-large.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-small.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/donut-android.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/eclair-android.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/froyo-android.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/gdc-logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/honeycomb-android.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-about.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-design.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-develop.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-distribute.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/ics-android.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/io-large.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/home/io-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-large.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/market-large.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/market-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-large.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-small.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_main.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_side.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_design.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/icon_download2.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_guidelines_logo.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/icon_robot.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/icon_world.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/locale.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/more_top.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey_2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white_2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/preview.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_arrow.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_btn_bg.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.gif delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/resizable-sg.gif delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-article.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-sample.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-tutorial.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-video.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-card-default-android.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/right_off.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/right_on.jpg delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_2.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_1.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_2.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_3.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_off.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/slide_on.jpg delete mode 100755 tools/droiddoc/templates-sdk-refonly/assets/images/spacer.gif delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/stack-arrow-right.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/callout.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span13.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span8.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span5.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span9.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus4_blank_port_432.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_land_span13.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_port_span5.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square_small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_down.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_left.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_right.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_up.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35_2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_action.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_good.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_movie_inline.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_phone_tablet.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_use.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_web.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_wrong.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers@2x.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/styles/open_new_page.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened-small.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/images/video-droid.png delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/js/android_3p-bundle.js delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/js/docs.js delete mode 100644 tools/droiddoc/templates-sdk-refonly/assets/js/prettify.js delete mode 100644 tools/droiddoc/templates-sdk-refonly/class.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/classes.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/components/masthead.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/customizations.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/data.hdf delete mode 100644 tools/droiddoc/templates-sdk-refonly/designpage.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/docpage.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/footer.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/gcm_navtree_data.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/gms_navtree_data.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/head_tag.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/header.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/header_tabs.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/jd_lists_unified.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/macros_override.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/navtree_data.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/nosidenavpage.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/package.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/packages.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/sample.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/sampleindex.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/samples_navtree_data.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/sdkpage.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/timestamp.cs delete mode 100644 tools/droiddoc/templates-sdk-refonly/trailer.cs delete mode 100644 tools/droiddoc/templates-sdk/assets/images/play-circle-grey.png delete mode 100644 tools/droiddoc/templates-sdk/assets/images/play-circle-grey_2x.png delete mode 100644 tools/droiddoc/templates-sdk/assets/images/play-circle-white.png delete mode 100644 tools/droiddoc/templates-sdk/assets/images/play-circle-white_2x.png create mode 100644 tools/droiddoc/templates-sdk/assets/images/sprite@2x.png create mode 100644 tools/droiddoc/templates-sdk/body_tag.cs create mode 100644 tools/droiddoc/templates-sdk/lists.cs create mode 100644 tools/droiddoc/templates-sdk/page_info.cs delete mode 100644 tools/droiddoc/templates-sdk/sdkpage.cs create mode 100644 tools/droiddoc/templates-sdk/yaml_navtree.cs diff --git a/CleanSpec.mk b/CleanSpec.mk index 3c8d6ceb9c4..a97c71a49e0 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -374,6 +374,10 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) # $(PRODUCT_OUT)/recovery/root/sdcard goes from symlink to folder. $(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/sdcard) +# Add BOARD_USES_SYSTEM_OTHER_ODEX +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/*) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/core/Makefile b/core/Makefile index f37f382953e..77115a88c84 100644 --- a/core/Makefile +++ b/core/Makefile @@ -594,11 +594,6 @@ endif INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS)) -BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE)) -ifdef BOARD_KERNEL_CMDLINE - INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" -endif - BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE)) ifdef BOARD_KERNEL_BASE INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) @@ -609,6 +604,18 @@ ifdef BOARD_KERNEL_PAGESIZE INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE) endif +ifeq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),true) +ifeq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true) +VERITY_KEYID := veritykeyid=id:`openssl x509 -in $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem -text \ + | grep keyid | sed 's/://g' | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]' | sed 's/keyid//g'` +endif +endif + +BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID)) +ifdef BOARD_KERNEL_CMDLINE +INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)" +endif + INTERNAL_MKBOOTIMG_VERSION_ARGS := \ --os_version $(PLATFORM_VERSION) \ --os_patch_level $(PLATFORM_SECURITY_PATCH) @@ -819,6 +826,10 @@ $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem: $(addsuffix .x509.pe $(hide) rm -f $@ $(hide) mkdir -p $(dir $@) $(hide) openssl x509 -pubkey -noout -in $< > $@ + +ALL_DEFAULT_INSTALLED_MODULES += $(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem +$(TARGET_RECOVERY_ROOT_OUT)/etc/update_engine/update-payload-key.pub.pem: $(TARGET_OUT_ETC)/update_engine/update-payload-key.pub.pem + $(hide) cp -f $< $@ endif endif @@ -910,6 +921,7 @@ $(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD $(if $(BOARD_HAS_EXT4_RESERVED_BLOCKS),$(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(1)) $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "system_squashfs_compressor=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR)" >> $(1)) $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "system_squashfs_compressor_opt=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "system_squashfs_block_size=$(BOARD_SYSTEMIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1)) $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "system_squashfs_disable_4k_align=$(BOARD_SYSTEMIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH),$(hide) echo "system_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_BASE_FS_PATH)" >> $(1)) $(if $(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "userdata_fs_type=$(BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) @@ -923,6 +935,7 @@ $(if $(BOARD_VENDORIMAGE_PARTITION_SIZE),$(hide) echo "vendor_size=$(BOARD_VENDO $(if $(BOARD_VENDORIMAGE_JOURNAL_SIZE),$(hide) echo "vendor_journal_size=$(BOARD_VENDORIMAGE_JOURNAL_SIZE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "vendor_squashfs_compressor=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR)" >> $(1)) $(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "vendor_squashfs_compressor_opt=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(1)) +$(if $(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE),$(hide) echo "vendor_squashfs_block_size=$(BOARD_VENDORIMAGE_SQUASHFS_BLOCK_SIZE)" >> $(1)) $(if $(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "vendor_squashfs_disable_4k_align=$(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN)" >> $(1)) $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),$(hide) echo "vendor_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH)" >> $(1)) $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1)) @@ -1024,6 +1037,11 @@ recovery_fstab := $(TARGET_RECOVERY_FSTAB) else recovery_fstab := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery.fstab)) endif +ifdef TARGET_RECOVERY_WIPE +recovery_wipe := $(TARGET_RECOVERY_WIPE) +else +recovery_wipe := +endif # Prior to A/B update, we used to have: # boot.img + recovery-from-boot.p + recovery-resource.dat = recovery.img. @@ -1128,10 +1146,13 @@ define build-recoveryramdisk $(hide) $(foreach item,$(TARGET_PRIVATE_RES_DIRS), \ cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/$(newline);) $(hide) $(foreach item,$(recovery_fstab), \ - cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab;) + cp -f $(item) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.fstab) + $(if $(strip $(recovery_wipe)), \ + $(hide) cp -f $(recovery_wipe) $(TARGET_RECOVERY_ROOT_OUT)/etc/recovery.wipe) $(hide) cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys $(hide) cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) \ > $(TARGET_RECOVERY_ROOT_OUT)/default.prop + $(BOARD_RECOVERY_IMAGE_PREPARE) $(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)), \ $(hide) mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/system_root; \ rm -rf $(TARGET_RECOVERY_ROOT_OUT)/system; \ @@ -1145,10 +1166,14 @@ define build-recoveryimage-target $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1).unsigned, \ $(hide) $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(1) --id > $(RECOVERYIMAGE_ID_FILE)) $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)),\ - $(BOOT_SIGNER) /recovery $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1)) + $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\ + $(BOOT_SIGNER) /boot $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1),\ + $(BOOT_SIGNER) /recovery $(1) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).pk8 $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY).x509.pem $(1)\ + )\ + ) $(if $(filter true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT)), \ $(VBOOT_SIGNER) $(FUTILITY) $(1).unsigned $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbpubk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_KEY).vbprivk $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY).vbprivk $(1).keyblock $(1)) - $(if $(filter true,BOARD_USES_RECOVERY_AS_BOOT), \ + $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_BOOTIMAGE_PARTITION_SIZE)), \ $(hide) $(call assert-max-image-size,$(1),$(BOARD_RECOVERYIMAGE_PARTITION_SIZE))) @echo "Made recovery image: $@" @@ -1321,7 +1346,7 @@ systemimage_intermediates := \ BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img # Create symlink /system/vendor to /vendor if necessary. -ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +ifdef BOARD_USES_VENDORIMAGE define create-system-vendor-symlink $(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \ echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \ @@ -1634,9 +1659,65 @@ $(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAG cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) $(build-cacheimage-target) +else # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE +# we need to ignore the broken cache link when doing the rsync +IGNORE_CACHE_LINK := --exclude=cache endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE +# ----------------------------------------------------------------- +# system_other partition image +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +BOARD_USES_SYSTEM_OTHER := true + +# Marker file to identify that odex files are installed +INSTALLED_SYSTEM_OTHER_ODEX_MARKER := $(TARGET_OUT_SYSTEM_OTHER)/system-other-odex-marker +ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SYSTEM_OTHER_ODEX_MARKER) +$(INSTALLED_SYSTEM_OTHER_ODEX_MARKER): + $(hide) touch $@ +endif + +ifdef BOARD_USES_SYSTEM_OTHER +INTERNAL_SYSTEMOTHERIMAGE_FILES := \ + $(filter $(TARGET_OUT_SYSTEM_OTHER)/%,\ + $(ALL_DEFAULT_INSTALLED_MODULES)\ + $(ALL_PDK_FUSION_FILES)) + +INSTALLED_FILES_FILE_SYSTEMOTHER := $(PRODUCT_OUT)/installed-files-system-other.txt +$(INSTALLED_FILES_FILE_SYSTEMOTHER) : $(INTERNAL_SYSTEMOTHERIMAGE_FILES) + @echo Installed file list: $@ + @mkdir -p $(dir $@) + @rm -f $@ + $(hide) build/tools/fileslist.py $(TARGET_OUT_SYSTEM_OTHER) > $@ + +systemotherimage_intermediates := \ + $(call intermediates-dir-for,PACKAGING,system_other) +BUILT_SYSTEMOTHERIMAGE_TARGET := $(PRODUCT_OUT)/system_other.img + +# Note that we assert the size is SYSTEMIMAGE_PARTITION_SIZE since this is the 'b' system image. +define build-systemotherimage-target + $(call pretty,"Target system_other fs image: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_SYSTEM_OTHER) + @mkdir -p $(systemotherimage_intermediates) && rm -rf $(systemotherimage_intermediates)/system_other_image_info.txt + $(call generate-userimage-prop-dictionary, $(systemotherimage_intermediates)/system_other_image_info.txt, skip_fsck=true) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_SYSTEM_OTHER) $(systemotherimage_intermediates)/system_other_image_info.txt $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) $(TARGET_OUT) + $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMOTHERIMAGE_TARGET),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) +endef + +# We just build this directly to the install location. +INSTALLED_SYSTEMOTHERIMAGE_TARGET := $(BUILT_SYSTEMOTHERIMAGE_TARGET) +$(INSTALLED_SYSTEMOTHERIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_SYSTEMOTHERIMAGE_FILES) $(INSTALLED_FILES_FILE_SYSTEMOTHER) + $(build-systemotherimage-target) + +.PHONY: systemotherimage-nodeps +systemotherimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-systemotherimage-target) + +endif # BOARD_USES_SYSTEM_OTHER + + # ----------------------------------------------------------------- # vendor partition image ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE @@ -1679,7 +1760,10 @@ $(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIM vendorimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) $(build-vendorimage-target) -endif # BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +else ifdef BOARD_PREBUILT_VENDORIMAGE +INSTALLED_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img +$(eval $(call copy-one-file,$(BOARD_PREBUILT_VENDORIMAGE),$(INSTALLED_VENDORIMAGE_TARGET))) +endif # ----------------------------------------------------------------- # bring in the installer image generation defines if necessary @@ -1888,6 +1972,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ $(INSTALLED_OEMIMAGE_TARGET) \ + $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(SELINUX_FC) \ $(APKCERTS_FILE) \ @@ -2005,6 +2090,11 @@ ifdef BOARD_OEMIMAGE_FILE_SYSTEM_TYPE @# Contents of the oem image $(call package_files-copy-root, \ $(TARGET_OUT_OEM),$(zip_root)/OEM) +endif +ifdef INSTALLED_SYSTEMOTHERIMAGE_TARGET + @# Contents of the system_other image + $(hide) $(call package_files-copy-root, \ + $(TARGET_OUT_SYSTEM_OTHER),$(zip_root)/SYSTEM_OTHER) endif @# Extra contents of the OTA package $(hide) mkdir -p $(zip_root)/OTA @@ -2119,6 +2209,10 @@ ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE $(hide) build/tools/getb64key.py $(PRODUCT_DEFAULT_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt else $(hide) build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt +endif +ifdef BOARD_PREBUILT_VENDORIMAGE + $(hide) mkdir -p $(zip_root)/IMAGES + $(hide) cp $(INSTALLED_VENDORIMAGE_TARGET) $(zip_root)/IMAGES/ endif @# Zip everything up, preserving symlinks and placing META/ files first to @# help early validation of the .zip file while uploading it. @@ -2135,10 +2229,13 @@ endif $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="BOOT/RAMDISK/" } /^BOOT\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/boot_filesystem_config.txt ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="RECOVERY/RAMDISK/" } /^RECOVERY\/RAMDISK\// {print $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/recovery_filesystem_config.txt +endif +ifdef INSTALLED_SYSTEMOTHERIMAGE_TARGET + $(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM_OTHER/" } /^SYSTEM_OTHER\// { print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/system_other_filesystem_config.txt endif $(hide) (cd $(zip_root) && zip -qX ../$(notdir $@) META/*filesystem_config.txt) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ - ./build/tools/releasetools/add_img_to_target_files -v -p $(HOST_OUT) $@ + ./build/tools/releasetools/add_img_to_target_files -a -v -p $(HOST_OUT) $@ .PHONY: target-files-package target-files-package: $(BUILT_TARGET_FILES_PACKAGE) diff --git a/core/binary.mk b/core/binary.mk index 20a830aaa5a..48a0b23fee1 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -638,32 +638,31 @@ endif ## Compile the .proto files to .cc (or .c) and then to .o ########################################################### proto_sources := $(filter %.proto,$(my_src_files)) -proto_generated_objects := -proto_generated_headers := ifneq ($(proto_sources),) -proto_generated_sources_dir := $(generated_sources_dir)/proto -proto_generated_obj_dir := $(intermediates)/proto +proto_gen_dir := $(generated_sources_dir)/proto +my_rename_cpp_ext := ifneq (,$(filter nanopb-c nanopb-c-enable_malloc, $(LOCAL_PROTOC_OPTIMIZE_TYPE))) my_proto_source_suffix := .c my_proto_c_includes := external/nanopb-c -my_protoc_flags := --nanopb_out=$(proto_generated_sources_dir) \ +my_protoc_flags := --nanopb_out=$(proto_gen_dir) \ --plugin=external/nanopb-c/generator/protoc-gen-nanopb else -my_proto_source_suffix := .cc +my_proto_source_suffix := $(LOCAL_CPP_EXTENSION) +ifneq ($(my_proto_source_suffix),.cc) +# aprotoc is hardcoded to write out only .cc file. +# We need to rename the extension to $(LOCAL_CPP_EXTENSION) if it's not .cc. +my_rename_cpp_ext := true +endif my_proto_c_includes := external/protobuf/src my_cflags += -DGOOGLE_PROTOBUF_NO_RTTI -my_protoc_flags := --cpp_out=$(proto_generated_sources_dir) +my_protoc_flags := --cpp_out=$(proto_gen_dir) endif -my_proto_c_includes += $(proto_generated_sources_dir) +my_proto_c_includes += $(proto_gen_dir) proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources)) -proto_generated_sources := $(addprefix $(proto_generated_sources_dir)/, \ +proto_generated_cpps := $(addprefix $(proto_gen_dir)/, \ $(patsubst %.proto,%.pb$(my_proto_source_suffix),$(proto_sources_fullpath))) -proto_generated_headers := $(patsubst %.pb$(my_proto_source_suffix),%.pb.h, $(proto_generated_sources)) -proto_generated_objects := $(addprefix $(proto_generated_obj_dir)/, \ - $(patsubst %.proto,%.pb.o,$(proto_sources_fullpath))) -$(call track-src-file-obj,$(proto_sources),$(proto_generated_objects)) define copy-proto-files $(if $(PRIVATE_PROTOC_OUTPUT), \ @@ -677,33 +676,29 @@ endef # Ensure the transform-proto-to-cc rule is only defined once in multilib build. -ifndef $(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined -$(proto_generated_sources): PRIVATE_PROTO_INCLUDES := $(TOP) -$(proto_generated_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags) -$(proto_generated_sources): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT) -$(proto_generated_sources): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH) -$(proto_generated_sources): PRIVATE_PROTOC_SUFFIX := $(my_proto_source_suffix) -$(proto_generated_sources): $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix): %.proto $(PROTOC) +ifndef $(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined +$(proto_generated_cpps): PRIVATE_PROTO_INCLUDES := $(TOP) +$(proto_generated_cpps): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags) +$(proto_generated_cpps): PRIVATE_RENAME_CPP_EXT := $(my_rename_cpp_ext) +$(proto_generated_cpps): $(proto_gen_dir)/%.pb$(my_proto_source_suffix): %.proto $(my_protoc_deps) $(PROTOC) $(transform-proto-to-cc) - $(copy-proto-files) - -# This is just a dummy rule to make sure gmake doesn't skip updating the dependents. -$(proto_generated_headers): $(proto_generated_sources_dir)/%.pb.h: $(proto_generated_sources_dir)/%.pb$(my_proto_source_suffix) - @echo "Updated header file $@." - $(hide) touch $@ +$(copy-proto-files) -$(my_prefix)_$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true -endif # transform-proto-to-cc rule included only once - -$(proto_generated_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) -$(proto_generated_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(proto_generated_objects): $(proto_generated_obj_dir)/%.o: $(proto_generated_sources_dir)/%$(my_proto_source_suffix) $(proto_generated_headers) -ifeq ($(my_proto_source_suffix),.c) - $(transform-$(PRIVATE_HOST)c-to-o) -else - $(transform-$(PRIVATE_HOST)cpp-to-o) +$(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true endif -$(call include-depfiles-for-objs, $(proto_generated_objects)) +# Ideally we can generate the source directly into $(intermediates). +# But many Android.mks assume the .pb.hs are in $(generated_sources_dir). +# As a workaround, we make a copy in the $(intermediates). +proto_intermediate_dir := $(intermediates)/proto +proto_intermediate_cpps := $(patsubst $(proto_gen_dir)/%,$(proto_intermediate_dir)/%,\ + $(proto_generated_cpps)) +$(proto_intermediate_cpps) : $(proto_intermediate_dir)/% : $(proto_gen_dir)/% | $(ACP) + @echo "Copy: $@" + $(copy-file-to-target) + $(hide) cp $(basename $<).h $(basename $@).h +$(call track-src-file-gen,$(proto_sources),$(proto_intermediate_cpps)) + +my_generated_sources += $(proto_intermediate_cpps) my_c_includes += $(my_proto_c_includes) # Auto-export the generated proto source dir. @@ -921,7 +916,7 @@ $(call track-src-file-obj,$(patsubst %,%.arm,$(cpp_arm_sources)),$(cpp_arm_objec dotdot_arm_objects := $(foreach s,$(dotdot_arm_sources),\ $(eval $(call compile-dotdot-cpp-file,$(s),\ - $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\ + $(my_additional_dependencies),\ dotdot_arm_objects))) $(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects)) @@ -929,7 +924,7 @@ dotdot_sources := $(filter ../%$(LOCAL_CPP_EXTENSION),$(my_src_files)) dotdot_objects := $(foreach s,$(dotdot_sources),\ $(eval $(call compile-dotdot-cpp-file,$(s),\ - $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\ + $(my_additional_dependencies),\ dotdot_objects))) $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects)) @@ -947,7 +942,6 @@ cpp_objects := $(cpp_arm_objects) $(cpp_normal_objects) ifneq ($(strip $(cpp_objects)),) $(cpp_objects): $(intermediates)/%.o: \ $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \ - $(yacc_cpps) $(proto_generated_headers) \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)cpp-to-o) $(call include-depfiles-for-objs, $(cpp_objects)) @@ -969,8 +963,7 @@ ifneq ($(strip $(gen_cpp_objects)),) $(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) $(gen_cpp_objects): $(intermediates)/%.o: \ - $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) \ - $(proto_generated_headers) \ + $(intermediates)/%$(LOCAL_CPP_EXTENSION) \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)cpp-to-o) $(call include-depfiles-for-objs, $(gen_cpp_objects)) @@ -1025,7 +1018,7 @@ $(call track-src-file-obj,$(patsubst %,%.arm,$(c_arm_sources)),$(c_arm_objects)) dotdot_arm_objects := $(foreach s,$(dotdot_arm_sources),\ $(eval $(call compile-dotdot-c-file,$(s),\ - $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\ + $(my_additional_dependencies),\ dotdot_arm_objects))) $(call track-src-file-obj,$(patsubst %,%.arm,$(dotdot_arm_sources)),$(dotdot_arm_objects)) @@ -1033,7 +1026,7 @@ dotdot_sources := $(filter ../%.c, $(my_src_files)) dotdot_objects := $(foreach s, $(dotdot_sources),\ $(eval $(call compile-dotdot-c-file,$(s),\ - $(yacc_cpps) $(proto_generated_headers) $(my_additional_dependencies),\ + $(my_additional_dependencies),\ dotdot_objects))) $(call track-src-file-obj,$(dotdot_sources),$(dotdot_objects)) @@ -1049,7 +1042,7 @@ $(dotdot_objects) $(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cf c_objects := $(c_arm_objects) $(c_normal_objects) ifneq ($(strip $(c_objects)),) -$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) \ +$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)c-to-o) $(call include-depfiles-for-objs, $(c_objects)) @@ -1070,7 +1063,7 @@ ifneq ($(strip $(gen_c_objects)),) # TODO: support compiling certain generated files as arm. $(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode) $(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags) -$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \ +$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)c-to-o) $(call include-depfiles-for-objs, $(gen_c_objects)) @@ -1085,7 +1078,7 @@ objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o)) $(call track-src-file-obj,$(objc_sources),$(objc_objects)) ifneq ($(strip $(objc_objects)),) -$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) \ +$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)m-to-o) $(call include-depfiles-for-objs, $(objc_objects)) @@ -1100,7 +1093,7 @@ objcpp_objects := $(addprefix $(intermediates)/,$(objcpp_sources:.mm=.o)) $(call track-src-file-obj,$(objcpp_sources),$(objcpp_objects)) ifneq ($(strip $(objcpp_objects)),) -$(objcpp_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.mm $(yacc_cpps) $(proto_generated_headers) \ +$(objcpp_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.mm \ $(my_additional_dependencies) $(transform-$(PRIVATE_HOST)mm-to-o) $(call include-depfiles-for-objs, $(objcpp_objects)) @@ -1230,8 +1223,7 @@ normal_objects := \ $(c_objects) \ $(gen_c_objects) \ $(objc_objects) \ - $(objcpp_objects) \ - $(proto_generated_objects) + $(objcpp_objects) new_order_normal_objects := $(foreach f,$(my_src_files),$(my_src_file_obj_$(f))) new_order_normal_objects += $(foreach f,$(my_gen_src_files),$(my_src_file_obj_$(f))) @@ -1449,11 +1441,9 @@ $(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets) ########################################################### export_includes := $(intermediates)/export_includes $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(my_export_c_include_dirs) -# Make sure .pb.h are already generated before any dependent source files get compiled. -# Similarly, the generated DBus headers need to exist before we export their location. -# People are not going to consume the aidl generated cpp file, but the cpp file is -# generated after the headers, so this is a convenient way to ensure the headers exist. -$(export_includes) : $(LOCAL_MODULE_MAKEFILE_DEP) $(proto_generated_headers) $(dbus_generated_headers) $(aidl_gen_cpp) $(vts_gen_cpp) +# By adding $(my_generated_sources) it makes sure the headers get generated +# before any dependent source files get compiled. +$(export_includes) : $(my_generated_sources) $(export_include_deps) @echo Export includes file: $< -- $@ $(hide) mkdir -p $(dir $@) && rm -f $@.tmp ifdef my_export_c_include_dirs diff --git a/core/build_id.mk b/core/build_id.mk index 77fea5a75ed..006dce65dff 100644 --- a/core/build_id.mk +++ b/core/build_id.mk @@ -18,4 +18,4 @@ # (like "CRB01"). It must be a single word, and is # capitalized by convention. -export BUILD_ID=NBD90Z +export BUILD_ID=NDE63P diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index 45c49f99d29..5c3369a1fdb 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -243,6 +243,7 @@ installclean_files := \ $(PRODUCT_OUT)/recovery \ $(PRODUCT_OUT)/root \ $(PRODUCT_OUT)/system \ + $(PRODUCT_OUT)/system_other \ $(PRODUCT_OUT)/vendor \ $(PRODUCT_OUT)/oem \ $(PRODUCT_OUT)/dex_bootjars \ diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 2a3201a7ffa..6a80a3625c2 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -205,6 +205,8 @@ LOCAL_SHARED_ANDROID_LIBRARIES:= # Used to replace the installed file of a presigned prebuilt apk in PDK fusion build, # to avoid installing the presigned apks with classes.dex unstripped. LOCAL_REPLACE_PREBUILT_APK_INSTALLED:= +LOCAL_EXTRACT_APK:= +LOCAL_EXTRACT_DPI_APK:= # arch specific variables LOCAL_SRC_FILES_$(TARGET_ARCH):= diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk index 6e968808ce9..dbcf276952c 100644 --- a/core/config_sanitizers.mk +++ b/core/config_sanitizers.mk @@ -24,6 +24,31 @@ ifneq ($(my_global_sanitize),) my_sanitize := $(my_global_sanitize) endif +# The sanitizer specified in the product configuration wins over the previous. +ifneq ($(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG),) + my_sanitize := $(SANITIZER.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG) + ifeq ($(my_sanitize),never) + my_sanitize := + endif +endif + +# Add a filter point for 32-bit vs 64-bit sanitization (to lighten the burden). +SANITIZE_ARCH ?= 32 64 +ifeq ($(filter $(SANITIZE_ARCH),$(my_32_64_bit_suffix)),) + my_sanitize := +endif + +# Add a filter point based on module owner (to lighten the burden). The format is a space- or +# colon-separated list of owner names. +ifneq (,$(SANITIZE_NEVER_BY_OWNER)) + ifneq (,$(LOCAL_MODULE_OWNER)) + ifneq (,$(filter $(LOCAL_MODULE_OWNER),$(subst :, ,$(SANITIZE_NEVER_BY_OWNER)))) + $(warning Not sanitizing $(LOCAL_MODULE) based on module owner.) + my_sanitize := + endif + endif +endif + # Don't apply sanitizers to NDK code. ifdef LOCAL_SDK_VERSION my_sanitize := diff --git a/core/definitions.mk b/core/definitions.mk index 31969046b31..62cfe93a34b 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -1173,6 +1173,9 @@ $(hide) $(PROTOC) \ $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ $(PRIVATE_PROTOC_FLAGS) \ $< +@# aprotoc outputs only .cc. Rename it to .cpp if necessary. +$(if $(PRIVATE_RENAME_CPP_EXT),\ + $(hide) mv $(basename $@).cc $@) endef diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index 15a2b2b8009..1150350f0a8 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -19,6 +19,10 @@ DEXPREOPT_BOOT_JAR_DIR_FULL_PATH := $(DEXPREOPT_PRODUCT_DIR_FULL_PATH)/$(DEXPREO # The default value for LOCAL_DEX_PREOPT DEX_PREOPT_DEFAULT ?= true +# The default filter for which files go into the system_other image (if it is +# being used). To bundle everything one should set this to '%' +SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/% + # The default values for pre-opting: always preopt PIC. # Conditional to building on linux, as dex2oat currently does not work on darwin. #ifeq ($(HOST_OS),linux) diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk index 2f994aa200c..1275e486191 100644 --- a/core/dex_preopt_libart.mk +++ b/core/dex_preopt_libart.mk @@ -64,6 +64,21 @@ define get-odex-file-path $(dir $(2))oat/$(1)/$(basename $(notdir $(2))).odex endef +# Returns the full path to the installed .odex file. +# This handles BOARD_USES_SYSTEM_OTHER_ODEX to install odex files into another +# partition. +# $(1): the arch name. +# $(2): the full install path (including file name) of the corresponding .apk. +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +define get-odex-installed-file-path +$(if $(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(2)), + $(call get-odex-file-path,$(1),$(patsubst $(TARGET_OUT)/%,$(TARGET_OUT_SYSTEM_OTHER)/%,$(2))), + $(call get-odex-file-path,$(1),$(2))) +endef +else +get-odex-installed-file-path = $(get-odex-file-path) +endif + # Returns the path to the image file (such as "/system/framework//boot.art" # $(1): the arch name (such as "arm") # $(2): the image location (such as "/system/framework/boot.art") diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk index 4e486d52a10..b05d4da3d77 100644 --- a/core/dex_preopt_odex_install.mk +++ b/core/dex_preopt_odex_install.mk @@ -39,6 +39,14 @@ ifeq ($(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),) LOCAL_DEX_PREOPT := endif endif +# if installing into system, and odex are being installed into system_other, don't strip +ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true) +ifeq ($(LOCAL_DEX_PREOPT),true) +ifneq ($(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(my_module_path)),) +LOCAL_DEX_PREOPT := nostripping +endif +endif +endif built_odex := installed_odex := @@ -100,14 +108,6 @@ endif endif $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS) - -# Use pattern rule - we may have multiple installed odex files. -# Ugly syntax - See the definition get-odex-file-path. -$(installed_odex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_odex))) \ - : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_odex))) \ - | $(ACP) - @echo "Install: $@" - $(copy-file-to-target) endif # Add the installed_odex to the list of installed files for this module. diff --git a/core/envsetup.mk b/core/envsetup.mk index fe4cfa15d5d..1e07d8ac9a5 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -109,6 +109,7 @@ HOST_PREBUILT_TAG := $(BUILD_OS)-$(HOST_PREBUILT_ARCH) # TARGET_COPY_OUT_* are all relative to the staging directory, ie PRODUCT_OUT. # Define them here so they can be used in product config files. TARGET_COPY_OUT_SYSTEM := system +TARGET_COPY_OUT_SYSTEM_OTHER := system_other TARGET_COPY_OUT_DATA := data TARGET_COPY_OUT_OEM := oem TARGET_COPY_OUT_ODM := odm @@ -172,6 +173,19 @@ else ifeq ($(filter vendor system/vendor system,$(TARGET_COPY_OUT_VENDOR)),) $(error TARGET_COPY_OUT_VENDOR must be either 'vendor', 'system/vendor' or 'system', seeing '$(TARGET_COPY_OUT_VENDOR)'.) endif PRODUCT_COPY_FILES := $(subst $(_vendor_path_placeholder),$(TARGET_COPY_OUT_VENDOR),$(PRODUCT_COPY_FILES)) + +BOARD_USES_VENDORIMAGE := +ifdef BOARD_PREBUILT_VENDORIMAGE +BOARD_USES_VENDORIMAGE := true +endif +ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE +BOARD_USES_VENDORIMAGE := true +endif +ifeq ($(TARGET_COPY_OUT_VENDOR),vendor) +BOARD_USES_VENDORIMAGE := true +else ifdef BOARD_USES_VENDORIMAGE +$(error TARGET_COPY_OUT_VENDOR must be set to 'vendor' to use a vendor image) +endif ########################################### @@ -326,6 +340,8 @@ TARGET_OUT_ETC := $(TARGET_OUT)/etc TARGET_OUT_NOTICE_FILES := $(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages +TARGET_OUT_SYSTEM_OTHER := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM_OTHER) + # Out for TARGET_2ND_ARCH TARGET_2ND_ARCH_VAR_PREFIX := $(HOST_2ND_ARCH_VAR_PREFIX) TARGET_2ND_ARCH_MODULE_SUFFIX := $(HOST_2ND_ARCH_MODULE_SUFFIX) @@ -381,7 +397,7 @@ TARGET_OUT_VENDOR_APPS := $(TARGET_OUT_VENDOR)/app TARGET_OUT_VENDOR_ETC := $(TARGET_OUT_VENDOR)/etc $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_EXECUTABLES := $(TARGET_OUT_VENDOR_EXECUTABLES) -$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(TARGET_OUT_VENDOR)/lib +$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES := $(target_out_vendor_shared_libraries_base)/lib $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_APPS := $(TARGET_OUT_VENDOR_APPS) TARGET_OUT_OEM := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_OEM) diff --git a/core/main.mk b/core/main.mk index 85b02fbe131..e415775924a 100644 --- a/core/main.mk +++ b/core/main.mk @@ -81,6 +81,7 @@ dont_bother_goals := clean clobber dataclean installclean \ userdataimage-nodeps userdatatarball-nodeps \ cacheimage-nodeps \ vendorimage-nodeps \ + systemotherimage-nodeps \ ramdisk-nodeps \ bootimage-nodeps \ recoveryimage-nodeps \ @@ -940,6 +941,9 @@ cacheimage: $(INSTALLED_CACHEIMAGE_TARGET) .PHONY: vendorimage vendorimage: $(INSTALLED_VENDORIMAGE_TARGET) +.PHONY: systemotherimage +systemotherimage: $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) + .PHONY: bootimage bootimage: $(INSTALLED_BOOTIMAGE_TARGET) @@ -967,8 +971,10 @@ droidcore: files \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ + $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \ $(INSTALLED_FILES_FILE) \ - $(INSTALLED_FILES_FILE_VENDOR) + $(INSTALLED_FILES_FILE_VENDOR) \ + $(INSTALLED_FILES_FILE_SYSTEMOTHER) # dist_files only for putting your library into the dist directory with a full build. .PHONY: dist_files @@ -1029,6 +1035,7 @@ else # TARGET_BUILD_APPS $(SYMBOLS_ZIP) \ $(INSTALLED_FILES_FILE) \ $(INSTALLED_FILES_FILE_VENDOR) \ + $(INSTALLED_FILES_FILE_SYSTEMOTHER) \ $(INSTALLED_BUILD_PROP_TARGET) \ $(BUILT_TARGET_FILES_PACKAGE) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ diff --git a/core/pathmap.mk b/core/pathmap.mk index fb9515cd13d..5e5ad40bc5e 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -135,7 +135,11 @@ FRAMEWORKS_BASE_JAVA_SRC_DIRS := \ # FRAMEWORKS_SUPPORT_SUBDIRS := \ annotations \ - v4 \ + compat \ + media-compat \ + fragment \ + core-ui \ + core-utils \ v7/gridlayout \ v7/cardview \ v7/mediarouter \ @@ -176,6 +180,7 @@ FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS := \ # FRAMEWORKS_SUPPORT_JAVA_LIBRARIES := \ $(foreach dir,$(FRAMEWORKS_SUPPORT_SUBDIRS),android-support-$(subst /,-,$(dir))) \ + android-support-v4 \ android-support-vectordrawable \ android-support-animatedvectordrawable \ android-support-v7-appcompat \ diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk index 961f8aa1415..507ef22813b 100644 --- a/core/prebuilt_internal.mk +++ b/core/prebuilt_internal.mk @@ -85,8 +85,10 @@ endif ifeq ($(LOCAL_MODULE_CLASS),APPS) LOCAL_BUILT_MODULE_STEM := package.apk +ifndef LOCAL_INSTALLED_MODULE_STEM LOCAL_INSTALLED_MODULE_STEM := $(LOCAL_MODULE).apk endif +endif ifneq ($(filter true no_debuglink,$(my_strip_module) $(my_pack_module_relocations)),) ifdef LOCAL_IS_HOST_MODULE @@ -152,6 +154,8 @@ endif # my_strip_module not true ifeq ($(LOCAL_MODULE_CLASS),APPS) PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES)) +my_extract_apk := $(strip $(LOCAL_EXTRACT_APK)) + # Select dpi-specific source ifdef LOCAL_DPI_VARIANTS my_dpi := $(firstword $(filter $(LOCAL_DPI_VARIANTS),$(PRODUCT_AAPT_PREF_CONFIG) $(PRODUCT_AAPT_PREBUILT_DPI))) @@ -162,9 +166,27 @@ else my_prebuilt_dpi_file_stem := $(LOCAL_MODULE)_%.apk endif my_prebuilt_src_file := $(dir $(my_prebuilt_src_file))$(subst %,$(my_dpi),$(my_prebuilt_dpi_file_stem)) + +ifneq ($(strip $(LOCAL_EXTRACT_DPI_APK)),) +my_extract_apk := $(subst %,$(my_dpi),$(LOCAL_EXTRACT_DPI_APK)) +endif # LOCAL_EXTRACT_DPI_APK endif # my_dpi endif # LOCAL_DPI_VARIANTS +ifdef my_extract_apk +my_extracted_apk := $(intermediates)/extracted.apk + +$(my_extracted_apk): PRIVATE_EXTRACT := $(my_extract_apk) +$(my_extracted_apk): $(my_prebuilt_src_file) + @echo Extract APK: $@ + $(hide) mkdir -p $(dir $@) && rm -f $@ + $(hide) unzip -p $< $(PRIVATE_EXTRACT) >$@ + +my_prebuilt_src_file := $(my_extracted_apk) +my_extracted_apk := +my_extract_apk := +endif + rs_compatibility_jni_libs := include $(BUILD_SYSTEM)/install_jni_libs.mk diff --git a/core/product.mk b/core/product.mk index 23df6a22aa7..82214141ba1 100644 --- a/core/product.mk +++ b/core/product.mk @@ -123,6 +123,7 @@ _product_var_list := \ PRODUCT_DEX_PREOPT_MODULE_CONFIGS \ PRODUCT_DEX_PREOPT_DEFAULT_FLAGS \ PRODUCT_DEX_PREOPT_BOOT_FLAGS \ + PRODUCT_SANITIZER_MODULE_CONFIGS \ PRODUCT_SYSTEM_BASE_FS_PATH \ PRODUCT_VENDOR_BASE_FS_PATH \ PRODUCT_SHIPPING_API_LEVEL \ @@ -393,3 +394,14 @@ $(eval _c := $(subst $(space),$(_PDPMC_SP_PLACE_HOLDER),$(strip $(2))))\ $(eval PRODUCT_DEX_PREOPT_MODULE_CONFIGS += \ $(foreach m,$(1),$(m)=$(_c))) endef + +# whitespace placeholder when we record module's sanitizer config. +_PSMC_SP_PLACE_HOLDER := |@SP@| +# Set up sanitizer config for a module. +# $(1) list of module names +# $(2) the modules' sanitizer config +define add-product-sanitizer-module-config +$(eval _c := $(subst $(space),$(_PSMC_SP_PLACE_HOLDER),$(strip $(2))))\ +$(eval PRODUCT_SANITIZER_MODULE_CONFIGS += \ + $(foreach m,$(1),$(m)=$(_c))) +endef diff --git a/core/product_config.mk b/core/product_config.mk index 6f627deec2f..954eb4108df 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -74,7 +74,7 @@ endif ########################################################### define find-copy-subdir-files -$(shell find $(2) -name "$(1)" | $(SED_EXTENDED) "s:($(2)/?(.*)):\\1\\:$(3)/\\2:" | sed "s://:/:g") +$(sort $(shell find $(2) -name "$(1)" -type f | $(SED_EXTENDED) "s:($(2)/?(.*)):\\1\\:$(3)/\\2:" | sed "s://:/:g")) endef # --------------------------------------------------------------- @@ -432,7 +432,7 @@ PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_DEFAULT_FLAGS)) PRODUCT_DEX_PREOPT_BOOT_FLAGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_BOOT_FLAGS)) -# Resolve and setup per-module dex-preopot configs. +# Resolve and setup per-module dex-preopt configs. PRODUCT_DEX_PREOPT_MODULE_CONFIGS := \ $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEX_PREOPT_MODULE_CONFIGS)) # If a module has multiple setups, the first takes precedence. @@ -445,3 +445,17 @@ $(foreach c,$(PRODUCT_DEX_PREOPT_MODULE_CONFIGS),\ $(eval cf := $(subst $(_PDPMC_SP_PLACE_HOLDER),$(space),$(cf)))\ $(eval DEXPREOPT.$(TARGET_PRODUCT).$(m).CONFIG := $(cf)))) _pdpmc_modules := + +# Resolve and setup per-module sanitizer configs. +PRODUCT_SANITIZER_MODULE_CONFIGS := \ + $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SANITIZER_MODULE_CONFIGS)) +# If a module has multiple setups, the first takes precedence. +_psmc_modules := +$(foreach c,$(PRODUCT_SANITIZER_MODULE_CONFIGS),\ + $(eval m := $(firstword $(subst =,$(space),$(c))))\ + $(if $(filter $(_psmc_modules),$(m)),,\ + $(eval _psmc_modules += $(m))\ + $(eval cf := $(patsubst $(m)=%,%,$(c)))\ + $(eval cf := $(subst $(_PSMC_SP_PLACE_HOLDER),$(space),$(cf)))\ + $(eval SANITIZER.$(TARGET_PRODUCT).$(m).CONFIG := $(cf)))) +_psmc_modules := diff --git a/core/setup_one_odex.mk b/core/setup_one_odex.mk index ec8a28a5bd8..36b68171b85 100644 --- a/core/setup_one_odex.mk +++ b/core/setup_one_odex.mk @@ -32,7 +32,9 @@ $(my_built_odex) : $($(my_2nd_arch_prefix)DEXPREOPT_ONE_FILE_DEPENDENCY_BUILT_BO $(DEXPREOPT_ONE_FILE_DEPENDENCY_TOOLS) \ $(my_dex_preopt_image_filename) -my_installed_odex := $(call get-odex-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) +my_installed_odex := $(call get-odex-installed-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE)) + +$(eval $(call copy-one-file,$(my_built_odex),$(my_installed_odex))) built_odex += $(my_built_odex) installed_odex += $(my_installed_odex) diff --git a/core/tasks/vendor_module_check.mk b/core/tasks/vendor_module_check.mk index 910c8b73ee0..e3761aec532 100644 --- a/core/tasks/vendor_module_check.mk +++ b/core/tasks/vendor_module_check.mk @@ -43,6 +43,7 @@ _vendor_owner_whitelist := \ synaptics \ ti \ trusted_logic \ + verizon \ widevine diff --git a/core/version_defaults.mk b/core/version_defaults.mk index 181a1c83588..31fb679b4c0 100644 --- a/core/version_defaults.mk +++ b/core/version_defaults.mk @@ -25,7 +25,7 @@ # BUILD_ID # BUILD_NUMBER # BUILD_DATETIME -# SECURITY_PATCH +# PLATFORM_SECURITY_PATCH # # Look for an optional file containing overrides of the defaults, @@ -43,7 +43,7 @@ ifeq "" "$(PLATFORM_VERSION)" # which is the version that we reveal to the end user. # Update this value when the platform version changes (rather # than overriding it somewhere else). Can be an arbitrary string. - PLATFORM_VERSION := 7.0 + PLATFORM_VERSION := 7.1 endif ifeq "" "$(PLATFORM_SDK_VERSION)" @@ -55,7 +55,7 @@ ifeq "" "$(PLATFORM_SDK_VERSION)" # intermediate builds). During development, this number remains at the # SDK version the branch is based on and PLATFORM_VERSION_CODENAME holds # the code-name of the new development work. - PLATFORM_SDK_VERSION := 24 + PLATFORM_SDK_VERSION := 25 endif ifeq "" "$(PLATFORM_JACK_MIN_SDK_VERSION)" @@ -64,7 +64,7 @@ ifeq "" "$(PLATFORM_JACK_MIN_SDK_VERSION)" # PLATFORM_SDK_VERSION. During development, this number may be incremented # before PLATFORM_SDK_VERSION if the plateform starts to add new java # language supports. - PLATFORM_JACK_MIN_SDK_VERSION := 24 + PLATFORM_JACK_MIN_SDK_VERSION := 25 endif ifeq "" "$(PLATFORM_VERSION_CODENAME)" diff --git a/target/product/core.mk b/target/product/core.mk index a5a1dd9be23..db65defbe7c 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -52,6 +52,7 @@ PRODUCT_PACKAGES += \ QuickSearchBox \ Settings \ SharedStorageBackup \ + StorageManager \ Telecom \ TeleService \ VpnDialogs \ diff --git a/tools/droiddoc/templates-ds/assets/GPL-LICENSE.txt b/tools/droiddoc/templates-ds/assets/GPL-LICENSE.txt deleted file mode 100644 index 66a0f18dbf5..00000000000 --- a/tools/droiddoc/templates-ds/assets/GPL-LICENSE.txt +++ /dev/null @@ -1,278 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/tools/droiddoc/templates-ds/assets/LICENSE.txt b/tools/droiddoc/templates-ds/assets/LICENSE.txt deleted file mode 100644 index e84328beda3..00000000000 --- a/tools/droiddoc/templates-ds/assets/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 John Resig, http://jquery.com/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/tools/droiddoc/templates-ds/assets/android-developer-core.css b/tools/droiddoc/templates-ds/assets/android-developer-core.css deleted file mode 100644 index f548a6cbde0..00000000000 --- a/tools/droiddoc/templates-ds/assets/android-developer-core.css +++ /dev/null @@ -1,1197 +0,0 @@ -/* file: android-developer-core.css - author: smain - date: september 2008 - info: core developer styles (developer.android.com) -*/ - - -/* RESET STYLES */ - -html,body,div,h1,h2,h3,h4,h5,h6,p,img, -dl,dt,dd,ol,ul,li,table,caption,tbody, -tfoot,thead,tr,th,td,form,fieldset, -embed,object,applet { - margin: 0; - padding: 0; - border: 0; -} - -/* BASICS */ - -html, body { - overflow:hidden; /* keeps scrollbar off IE */ - background-color:#fff; -} - -body { - font-family:arial,sans-serif; - color:#000; - font-size:13px; - color:#333; - background-image:url(images/bg_fade.jpg); - background-repeat:repeat-x; -} - -a, a code { - color:#006699; -} - -a:active, -a:active code { - color:#f00; -} - -a:visited, -a:visited code { - color:#006699; -} - -input, select, -textarea, option, label { - font-family:inherit; - font-size:inherit; - padding:0; - margin:0; - vertical-align:middle; -} - -option { - padding:0 4px; -} - -p, form { - padding:0; - margin:0 0 1em; -} - -code, pre { - color:#007000; - font-family:monospace; - line-height:1em; -} - -var { - color:#007000; - font-style:italic; -} - -pre { - border:1px solid #ccc; - background-color:#fafafa; - padding:10px; - margin:0 0 1em 1em; - overflow:auto; - line-height:inherit; /* fixes vertical scrolling in webkit */ -} - -h1,h2,h3,h4,h5 { - margin:1em 0; - padding:0; -} - -p,ul,ol,dl,dd,dt,li { - line-height:1.3em; -} - -ul,ol { - margin:0 0 .8em; - padding:0 0 0 2em; -} - -li { - padding:0 0 .5em; -} - -dl { - margin:0 0 1em 0; - padding:0; -} - -dt { - margin:0; - padding:0; -} - -dd { - margin:0 0 1em; - padding:0 0 0 2em; -} - -li p { - margin:.5em 0 0; -} - -dd p { - margin:1em 0 0; -} - -li pre, li table, li img { - margin:.5em 0 0 1em; -} - -dd pre, -#jd-content dd table, -#jd-content dd img { - margin:1em 0 0 1em; -} - -li ul, -li ol, -dd ul, -dd ol { - margin:0; - padding: 0 0 0 2em; -} - -li li, -dd li { - margin:0; - padding:.5em 0 0; -} - -dl dl, -ol dl, -ul dl { - margin:0 0 1em; - padding:0; -} - -table { - font-size:1em; - margin:0 0 1em; - padding:0; - border-collapse:collapse; - border-width:0; - empty-cells:show; -} - -td,th { - border:1px solid #ccc; - padding:6px 12px; - text-align:left; - vertical-align:top; - background-color:inherit; -} - -th { - background-color:#dee8f1; -} - -td > p:last-child { - margin:0; -} - -hr.blue { - background-color:#DDF0F2; - border:none; - height:5px; - margin:20px 0 10px; -} - -blockquote { - margin: 0 0 1em 1em; - padding: 0 4em 0 1em; - border-left:2px solid #eee; -} -/* LAYOUT */ - -#body-content { - /* "Preliminary" watermark for preview releases and interim builds. - background:transparent url(images/preliminary.png) repeat scroll 0 0; */ - margin:0; - position:relative; - width:100%; -} - -#header { - height: 114px; - position:relative; - z-index:100; - min-width:675px; /* min width for the tabs, before they wrap */ - padding:0 10px; - border-bottom:3px solid #94b922; -} - -#headerLeft{ - padding: 25px 0 0; -} - -#headerLeft img{ - height:50px; - width:180px; -} - -#headerRight { - position:absolute; - right:0; - top:0; - text-align:right; -} - -/* Tabs in the header */ - -#header ul { - list-style: none; - margin: 7px 0 0; - padding: 0; - height: 29px; -} - -#header li { - float: left; - margin: 0px 2px 0px 0px; - padding:0; -} - -#header li a { - text-decoration: none; - display: block; - background-image: url(images/bg_images_sprite.png); - background-position: 0 -58px; - background-repeat: no-repeat; - color: #666; - font-size: 13px; - font-weight: bold; - width: 94px; - height: 29px; - text-align: center; - margin: 0px; -} - -#header li a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 -29px; - background-repeat: no-repeat; -} - -#header li a span { - position:relative; - top:7px; -} - -#header li a span+span { - display:none; -} - -/* tab highlighting */ - -.home #home-link a, -.guide #guide-link a, -.reference #reference-link a, -.sdk #sdk-link a, -.resources #resources-link a, -.videos #videos-link a { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; - background-repeat: no-repeat; - color: #fff; - font-weight: bold; - cursor:default; -} - -.home #home-link a:hover, -.guide #guide-link a:hover, -.reference #reference-link a:hover, -.sdk #sdk-link a:hover, -.resources #resources-link a:hover, -.videos #videos-link a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; -} - -#headerLinks { - margin:10px 10px 0 0; - height:13px; - font-size: 11px; - vertical-align: top; -} - -#headerLinks a { - color: #7FA9B5; -} - -#headerLinks img { - vertical-align:middle; -} - -#language { - margin:0 10px 0 4px; -} - -#search { - height:45px; - margin:15px 10px 0 0; -} - -/* MAIN BODY */ - -#mainBodyFluid { - margin: 20px 10px; - color:#333; -} - -#mainBodyFixed { - margin: 20px 10px; - color: #333; - width:930px; - position:relative; -} - -#mainBodyFixed h3, -#mainBodyFluid h3 { - color:#336666; - font-size:1.25em; - margin: 0em 0em 0em 0em; - padding-bottom:.5em; -} - -#mainBodyFixed h2, -#mainBodyFluid h2 { - color:#336666; - font-size:1.25em; - margin: 0; - padding-bottom:.5em; -} - -#mainBodyFixed h1, -#mainBodyFluid h1 { - color:#435A6E; - font-size:1.7em; - margin: 1em 0; -} - -#mainBodyFixed .green, -#mainBodyFluid .green, -#jd-content .green { - color:#7BB026; - background-color:none; -} - -#mainBodyLeft { - float: left; - width: 600px; - margin-right: 20px; - color: #333; - position:relative; -} - -div.indent { - margin-left: 40px; - margin-right: 70px; -} - -#mainBodyLeft p { - color: #333; - font-size: 13px; -} - -#mainBodyLeft p.blue { - color: #669999; -} - -#mainBodyLeft #communityDiv { - float: left; - background-image:url(images/bg_community_leftDiv.jpg); - background-repeat: no-repeat; - width: 581px; - height: 347px; - padding: 20px 0px 0px 20px; -} - -#mainBodyRight { - float: left; - width: 300px; - color: #333; -} - -#mainBodyRight p { - padding-right: 50px; - color: #333; -} - -#mainBodyRight table { - width: 100%; -} - -#mainBodyRight td { - border:0px solid #666; - padding:0px 5px; - text-align:left; -} - -#mainBodyRight td p { - margin:0 0 1em 0; -} - -#mainBodyRight .blueBorderBox { - border:5px solid #ddf0f2; - padding:18px 18px 18px 18px; - text-align:left; -} - -#mainBodyFixed .seperator { - background-image:url(images/hr_gray_side.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -#mainBodyBottom { - float: left; - width: 100%; - clear:both; - color: #333; -} - -#mainBodyBottom .seperator { - background-image:url(images/hr_gray_main.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -/* FOOTER */ - -#footer { - float: left; - width:90%; - margin: 20px; - color: #aaa; - font-size: 11px; -} - -#footer a { - color: #aaa; - font-size: 11px; -} - -#footer a:hover { - text-decoration: underline; - color:#aaa; -} - -#footerlinks { - margin-top:2px; -} - -#footerlinks a, -#footerlinks a:visited { - color:#006699; -} - -/* SEARCH FILTER */ - -#search_autocomplete { - color:#aaa; -} - -#search-button { - display:inline; -} - -#search_filtered_div { - position:absolute; - margin-top:-1px; - z-index:101; - border:1px solid #BCCDF0; - background-color:#fff; -} - -#search_filtered { - min-width:100%; -} -#search_filtered td{ - background-color:#fff; - border-bottom: 1px solid #669999; - line-height:1.5em; -} - -#search_filtered .jd-selected { - background-color: #94b922; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#fff; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - font-family: Arial, sans-serif; - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-row { - display: table-row; -} -.hide-row { - display: hidden; -} - -/* SEARCH */ - -/* restrict global search form width */ -#searchForm { - width:350px; -} - -#searchTxt { - width:200px; -} - -/* disable twiddle and size selectors for left column */ -#leftSearchControl div { - width: 100%; -} - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - -#search-button { - margin:0 0 0 2px; - font-size:11px; -} - -/* search result tabs */ - -#doc-content .gsc-control { - position:relative; -} - -#doc-content .gsc-tabsArea { - position:relative; - white-space:nowrap; -} - -#doc-content .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; -} - -#doc-content .gsc-tabHeader.gsc-tabhActive { - border-top: 2px solid #94B922; -} - -#doc-content h2#searchTitle { - padding:0; -} - -#doc-content .gsc-resultsbox-visible { - padding:1em 0 0 6px; -} - -/* CAROUSEL */ - -#homeMiddle { - padding: 0px 0px 0px 0px; - float: left; - width: 584px; - height: 627px; - position:relative; -} - -#topAnnouncement { - background:url(images/home/bg_home_announcement.png) no-repeat 0 0; -} - -#homeTitle { - padding:15px 15px 0; - height:30px; -} - -#homeTitle h2 { - padding:0; -} - -#announcement-block { - padding:0 15px 0; - overflow:hidden; - background: url(images/hr_gray_side.jpg) no-repeat 15px 0; - zoom:1; -} - -#announcement-block>* { - padding:15px 0 0; -} - -#announcement-block img { - float:left; - margin:0 30px 0 0; -} - -#announcement { - float:left; - margin:0; -} - -#carousel { - background:url(images/home/bg_home_carousel.png) no-repeat 0 0; - position:relative; - height:400px; -} - -#carouselMain { - background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat; - height:auto; - padding: 25px 21px 0; - overflow:hidden; - position:relative; - zoom:1; /*IE6*/ -} - -#carouselMain img { - margin:0; -} - -#carouselMain .bulletinDesc h3 { - margin:0; - padding:0; -} - -#carouselMain .bulletinDesc p { - margin:0; - padding:0.7em 0 0; -} - -#carouselWheel { - background: url(images/home/bg_home_carousel_wheel.png) 0 0 no-repeat; - padding-top:40px; - height:150px; -} - -.clearer { clear:both; } - -a#arrow-left, a#arrow-right { - float:left; - width:42px; - height:42px; - background-image:url(images/home/carousel_buttons_sprite.png); - background-repeat:no-repeat; -} -a#arrow-left { - margin:35px 3px 0 10px; -} -a#arrow-right { - margin:35px 10px 0 0; -} -a.arrow-left-off, -a#arrow-left.arrow-left-off:hover { - background-position:0 0; -} -a.arrow-right-off, -a#arrow-right.arrow-right-off:hover { - background-position:-42px 0; -} -a#arrow-left:hover { - background-position:0 -42px; -} -a#arrow-right:hover { - background-position:-42px -42px; -} -a.arrow-left-on { - background-position:0 0; -} -a.arrow-right-on { - background-position:-42px 0; -} -a.arrow-right-off, -a.arrow-left-off { - cursor:default; -} - -.app-list-container { - margin:0 20px; - position:relative; - width:100%; -} - -div#list-clip { - height:110px; - width:438px; - overflow:hidden; - position:relative; - float:left; -} - -div#app-list { - left:0; - z-index:1; - position:absolute; - margin:11px 0 0; - _margin-top:13px; - width:1000%; -} - -#app-list a { - display:block; - float:left; - height:90px; - width:90px; - margin:0 24px 0; - padding:3px; - background:#99cccc; - -webkit-border-radius:7px; - -moz-border-radius:7px; - border-radius:7px; - text-decoration:none; - text-align:center; - font-size:11px; - line-height:11px; -} - -#app-list a span { - position:relative; - top:-4px; -} - -#app-list img { - width:90px; - height:70px; - margin:0; -} - -#app-list a.selected, -#app-list a:active.selected, -#app-list a:hover.selected { - background:#A4C639; - color:#fff; - cursor:default; - text-decoration:none; -} - -#app-list a:hover, -#app-list a:active { - background:#ff9900; -} - -#app-list a:hover span, -#app-list a:active span { - text-decoration:underline; -} - -#droid-name { - padding-top:.5em; - color:#666; - padding-bottom:.25em; -} - -/*IE6*/ -* html #app-list a { zoom: 1; margin:0 24px 0 15px;} - -* html #list-clip { - width:430px !important; -} - -/*carousel bulletin layouts*/ -/*460px width*/ -/*185px height*/ -.img-left { - float:left; - width:230px; - overflow:hidden; - padding:8px 0 8px 8px; -} -.desc-right { - float:left; - width:270px; - padding:10px; -} -.img-right { - float:right; - width:220px; - overflow:hidden; - padding:8px 8px 8px 0; -} -.desc-left { - float:right; - width:280px; - padding:10px; - text-align:right; -} -.img-top { - padding:20px 20px 0; -} -.desc-bottom { - padding:10px; -} - - -/* VIDEO PAGE */ - -#mainBodyLeft.videoPlayer { - width:570px; -} - -#mainBodyRight.videoPlayer { - width:330px; -} - -/* player */ - -#videoPlayerBox { - background-color: #DAF3FC; - border-radius:7px; - -moz-border-radius:7px; - -webkit-border-radius:7px; - width:530px; - padding:20px; - border:1px solid #d3ecf5; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videoBorder { - background-color: #FFF; - min-height:399px; - height:auto !important; - border:1px solid #ccdada; - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; -} - -#videoPlayerTitle { - width:500px; - padding:15px 15px 0; -} - -#videoPlayerTitle h2 { - font-weight:bold; - font-size:1.2em; - color:#336666; - margin:0; - padding:0; -} - -#objectWrapper { - padding:15px 15px; - height:334px; - width:500px; -} - -/* playlist tabs */ - -ul#videoTabs { - list-style-type:none; - padding:0; - clear:both; - margin:0; - padding: 20px 0 0 15px; - zoom:1; /* IE7/8, otherwise top-padding is double */ -} - -ul#videoTabs li { - display:inline; - padding:0; - margin:0 3px 0 0; - line-height:2em; -} - -ul#videoTabs li a { - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; - background:#95c0d0; - color:#fff; - text-decoration:none; - padding:.45em 1.5em; - font-weight:bold; -} - -ul#videoTabs li.selected a { - font-weight:bold; - text-decoration:none; - color:#555; - background:#daf3fc; - border-bottom:1px solid #daf3fc; -} - -ul#videoTabs li:hover a { - background:#85acba; -} - -ul#videoTabs li.selected:hover a { - background:#daf3fc; -} - -/* playlists */ - -#videos { - background:#daf3fc; - margin-bottom:1.5em; - padding:15px; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videos div { - display:none; -} - -#videos div.selected { - display:block; -} - -ul.videoPreviews { - list-style:none; - padding:0; - margin:0; - zoom:1; /* IE, otherwise, layout doesn't update when showing 'more' */ -} - -ul.videoPreviews li { - margin:0 0 5px; - padding:0; - overflow:hidden; - position:relative; -} - -#mainBodyFixed ul.videoPreviews h3 { - font-size: 12px; - margin:0 0 1em 130px; - padding:0; - font-weight:bold; - color:inherit; -} - -ul.videoPreviews a { - margin:1px; - padding:10px; - text-decoration:none; - height:90px; - display:block; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - background-color:transparent; -} - -ul.videoPreviews a:hover { - background-color:#FFF; - border:none; /* IE8, otherwise, bg doesn't work */ -} - -ul.videoPreviews a.selected { - background-color: #FF9900; -} - -ul.videoPreviews img { - float:left; - clear:left; - margin:0; -} - -ul.videoPreviews h3 { - font-size:12px; - font-weight:bold; - text-decoration:none; - margin:0 0 1em 130px; - padding:0; -} - -ul.videoPreviews p { - font-size: 12px; - text-decoration:none; - margin:0 0 1.2em 130px; -} - -ul.videoPreviews p.full { - display:none; -} - -ul.videoPreviews span.more { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_down.png) 0 2px no-repeat; -} - -ul.videoPreviews span.less { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_up.png) 0 2px no-repeat; - display:none; -} - -ul.videoPreviews p.toggle { - position:absolute; - margin:0; - margin-top:-23px; /* instead of bottom:23px, because IE won't do it correctly */ - left:140px; -} - -ul.videoPreviews p.toggle a { - height:auto; - margin:0; - padding:0; - zoom:1; /* IE6, otherwise the margin considers the img on redraws */ -} - -ul.videoPreviews p.toggle a:hover { - text-decoration:underline; - background:transparent; /* IE6, otherwise it inherits white */ -} - -/* featured videos */ - -#mainBodyRight h2 { - padding:0 0 5px; -} - -#mainBodyRight ul.videoPreviews { - margin:10px 0 0; -} - -#mainBodyRight ul.videoPreviews li { - font-size:11px; - line-height:13px; - margin:0 0 5px; - padding:0; -} - -#mainBodyRight ul.videoPreviews h3 { - padding:0; - margin:0; - font-size:100%; -} - -#mainBodyRight ul.videoPreviews a { - text-decoration:none; - height:108px; - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews a:hover { - border:1px solid #CCDADA; -} - -#mainBodyRight ul.videoPreviews a.selected { - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews p { - line-height:1.2em; - padding:0; - margin:4px 0 0 130px; -} - -#mainBodyRight ul.videoPreviews img { - margin-top:5px; -} - -/* Pretty printing styles. Used with prettify.js. */ - -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -dl.tag-list dt code, -.tag { color: #008; } -dl.atn-list dt code, -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -@media print { - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} diff --git a/tools/droiddoc/templates-ds/assets/android-developer-docs.css b/tools/droiddoc/templates-ds/assets/android-developer-docs.css deleted file mode 100644 index b8b9c71caae..00000000000 --- a/tools/droiddoc/templates-ds/assets/android-developer-docs.css +++ /dev/null @@ -1,1576 +0,0 @@ -/* file: android-developer-docs.css - author: smain - date: september 2008 - info: developer doc styles (developer.android.com) -*/ - -@import url("android-developer-core.css"); - -#title { - border-bottom: 4px solid #ccc; - display:none; -} - -#title h1 { - color:#336666; - margin:0; - padding: 5px 10px; - font-size: 1em; - line-height: 15px; -} - -#title h1 .small{ - color:#000; - margin:0; - font-size: 13px; - padding:0 0 0 15px; -} - -/* SIDE NAVIGATION */ - -#side-nav { - padding:0 6px 0 0; - background-color: #fff; - font-size:12px; -} - -#resize-packages-nav { -/* keeps the resize handle below the h-scroll handle */ - height:270px; - overflow:hidden; - max-height:100%; -} - -#packages-nav { - height:270px; - max-height:inherit; - position:relative; - overflow:auto; -} - -#classes-nav, -#devdoc-nav { - overflow:auto; - position:relative; -} - -#side-nav ul { - list-style: none; - margin: 0; - padding:5px 0; -} - -#side-nav ul ul { - margin: .5em 0 0 0; - padding: 0; -} - -#side-nav li { - padding:0; - padding:1px 0 1px 0; - zoom:1; -} - -#side-nav li span.heading, -#side-nav li h2 { - display:block; - font-size:12px; - font-weight: bold; - margin:.5em 0 0 0; - padding: 3px 0 1px 9px; -} - -#side-nav li a { - display: inline-block; /* needed to apply padding to line-wraps */ - text-decoration:none; - padding: 0 0 0 18px; - zoom:1; -} - -#side-nav li a span+span { - display:none; -} - -#side-nav li a:hover { - text-decoration:underline; -} - -#side-nav li a+a { - padding: 0; -} -/*second level (nested) list*/ -#side-nav li li li a { - padding: 0 0 0 28px; -} -/*third level (nested) list*/ -#side-nav li li li li a { - padding: 0 0 0 38px; -} - -#side-nav .selected { - background-color: #435a6e; - color: #fff; - font-weight:bold; -} - -#side-nav .selected a { - color: #fff; - text-decoration:none; -} - -#side-nav strong { - display:block; -} - -#side-nav .toggle-list .toggle-img { - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - height:16px; - width:15px; - outline-style:none; -} -/* second-level toggle */ -#side-nav .toggle-list .toggle-list .toggle-img { - left:10px; -} - -#side-nav .closed .toggle-img, -#side-nav .open .closed .toggle-img { - background:url('images/triangle-closed-small.png') 7px 4px no-repeat; -} -#side-nav .open .toggle-img { - background:url('images/triangle-opened-small.png') 7px 4px no-repeat; -} - -#side-nav .toggle-list { - position:relative; -} - -#side-nav .toggle-list ul { - margin:0; - display:none; -} - -#side-nav .toggle-list div { - display:block; -} - -#index-links .selected { - background-color: #fff; - color: #000; - font-weight:normal; - text-decoration:none; -} - -#index-links { - padding:7px 0 4px 10px; -} - -/* nav tree */ - -#nav-tree ul { - padding:5px 0 1.5em; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0 0 0 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - margin:0; -} - -#nav-tree a.nolink { - color: black; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; -} - -#nav-swap { - font-size:10px; - line-height:10px; - margin-left:1em; - text-decoration:none; - display:block; -} - -#tree-link { - -} - -/* DOCUMENT BODY */ - -#doc-content { - overflow:auto; -} - -#jd-header { - background-color: #E2E2E2; - padding: 7px 15px; -} - -#jd-header h1 { - margin: 0 0 10px; - font-size:1.7em; -} - -#jd-header .crumb { - font-size:.9em; - line-height:1em; - color:#777; -} - -#jd-header .crumb a, -#jd-header .crumb a:visited { - text-decoration:none; - color:#777; -} - -#jd-header .crumb a:hover { - text-decoration:underline; -} - -#jd-header table { - margin:0; - padding:0; -} - -#jd-header td { - border:none; - padding:0; - vertical-align:top; -} - -#jd-header.guide-header { - background-color:#fff; - color:#435a6e; - height:50px; -} - -#jd-descr { - position:relative; -} - -/* summary tables for reference pages */ -.jd-sumtable { - margin: .5em 1em 1em 1em; - width:95%; /* consistent table widths; within IE's quirks */ - font-size:.9em; -} - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:.8em; - padding:6px 10px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-level-toggle { - padding:0 10px; - font-size:11px; - float:right; -} - -#api-level-toggle label.disabled { - color:#999; -} - -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 7px 0; - margin-top:-25px; -} - -#api-info-block div.api-level { - font-size:1.3em; - font-weight:bold; - float:none; - color:#444; - padding:0; - margin:0; -} - -/* Force link colors for IE6 */ -div.api-level a { - color:#999; -} -#api-info-block div.api-level a:link { - color:#444; -} -#api-level-toggle a { - color:#999; -} - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} - -#api-level-toggle a, -.api-level a { - color:inherit; - text-decoration:none; -} - -#api-level-toggle a:hover, -.api-level a:hover { - color:inherit; - text-decoration:underline !important; - cursor:pointer !important; -} - -#side-nav li.absent.selected, -#side-nav li.absent.selected *, -#side-nav div.label.absent.selected, -#side-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -/* IE6 quirk (won't chain classes, so just keep background blue) */ -* html #side-nav li.selected, -* html #side-nav li.selected *, -* html #side-nav div.label.selected, -* html #side-nav div.label.selected * { - background-color: #435a6e !important; -} - - -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} - -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - -/* applies to a div containing links to summary tables */ -.sum-details-links { - padding:0; - font-weight:normal; -} - -.sum-details-links a { - text-decoration:none; -} - -.sum-details-links a:hover { - text-decoration:underline; -} - - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:.9em; -} -.jd-inheritance-table td { - border: none; - margin: 0; - padding: 0; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - -#jd-content { - padding: 18px 15px; -} - -hr { - background-color:#ccc; - border-color:#fff; - margin:2em 0 1em; -} - -/* DOC CLASSES */ - -#jd-content h1 { -/*sdk page*/ - font-size:1.6em; - color:#336666; - margin:0 0 .5em; -} - -#jd-content h2 { - font-size:1.45em; - color:#111; - border-top:2px solid #ccc; - padding: .5em 0 0; - margin: 2em 0 1em 0; -} - -#jd-content h3 { - font-size:1.3em; - color:#3a3a3a; - padding: 0; - margin: 1.5em 0 .65em 0; -} - -#jd-content h4 { - font-size:1.1em; - color:#3a3a3a; - padding: 0; - margin: 1.25em 0 .65em 0; -} - -#jd-content h5 { - font-size:1.0em; - color:#3a3a3a; - padding: 0; - margin: 1em 0 .65em 0; -} - -#jd-content .small-header { - font-size:1em; - color:#000; - font-weight:bold; - border:none; - padding:0; - margin:1em 0 .5em; - position:inherit; -} - -#jd-content table { - margin: 0 0 1em 1em; -} - -#jd-content img { - margin: 0 0 1em 1em; -} - -#jd-content li img, -#jd-content dd img { - margin:.5em 0 .5em 1em; -} - -.nolist { - list-style:none; - padding:0; - margin:0 0 1em 1em; -} - -.nolist li { - padding:0 0 2px; - margin:0; -} - -h4 .normal { - font-size:.9em; - font-weight:normal; -} - -.caps { - font-variant:small-caps; - font-size:1.2em; -} - -dl.tag-list dl.atn-list { - padding:0 0 0 2em; -} - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; - line-height:1em; -} - -.jd-tagdescr p { - margin:.5em 0; - padding:0; - -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} - -h4.jd-tagtitle { - margin:0; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -#jd-content table h2 { - background-color: #d6d6d6; - font-size: 1.1em; - margin:0 0 10px; - padding:5px; - left:0; - width:auto; -} - -div.design-announce { - border-top:1px solid #33B5E5; - border-bottom:1px solid #33B5E5; - padding:5px 10px 10px 55px; - margin:2em 0; - background:url('images/icon_design.png') 5px 13px no-repeat; -} - -div.design-announce p { - margin: .5em 0 0 0; -} - -div.special { - padding: .5em 1em 1em 1em; - margin: 0 0 1em; - background-color: #DAF3FC; - border:1px solid #d3ecf5; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; -} - -div.special p { - margin: .5em 0 0 0; -} - -div.special ol { - margin: 0; -} - -div.special ol li { - margin: 0; - padding: 0; -} - -#jd-content div.special h2, -#jd-content div.special h3 { - color:#669999; - font-size:1.2em; - border:none; - margin:0 0 .5em; - padding:0; -} - -#jd-content div.special.reference h2, -#jd-content div.special.reference h3, -#jd-content div.special.reference h4 { - color:#000; - font-size:1em; - border:none; - font-weight:bold; - margin:.5em 0; - padding:0; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - margin: 1em; - padding: 0 0 0 .5em; - border-left: 4px solid; -} - -p.special-note, -div.special-note { - background-color:#EBF3DB; - padding:10px 20px; - margin:0 0 1em; -} - -p.note, -div.note { - border-color: #99aacc; -} - -p.warning, -div.warning { - border-color: #aa0033; -} - -p.caution, -div.caution { - border-color: #ffcf00; -} - -li .note, -li .caution, -li .warning { - margin: .5em 0 0 0; - padding: .2em .5em .2em .9em; -} - -/* Makes sure the first paragraph does not add top-whitespace within the box*/ -li .note>p:first-child, -li .caution>p:first-child, -li .warning>p:first-child { - margin-top:0; - padding-top:0; -} - -dl.xml dt { - font-variant:small-caps; - font-size:1.2em; -} - -dl.xml dl { - padding:0; -} - -dl.xml dl dt { - font-variant:normal; - font-size:1em; -} - -.listhead li { - font-weight: bold; -} - -.listhead li *, /*ie*/.listhead li li { - font-weight: normal; -} - -ol.no-style, -ul.no-style { - list-style:none; - padding-left:1em; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - text-decoration: none; - vertical-align:top; - line-height:.9em; - white-space:nowrap; -} - -.toggle-list.open .new-child { - display:none; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -0.5em 0 1em 1em; /* matches default img left-margin */ -} - -div.figure { - float:right; - clear:right; - margin:1em 0 0 0; - padding:0 0 0 3em; - background-color:#fff; - /* width must be defined w/ an inline style matching the image width */ -} - -#jd-content -div.figure img { - margin: 0 0 1em; -} - -div.figure p.img-caption { - margin: -0.5em 0 1em 0; -} - -p.table-caption { - margin: 0 0 0.5em 1em; /* matches default table left-margin */ -} - - -/* toggle for misc content (such as long sample code) - see toggleContent() script in android-developer-docs.js */ -.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -.toggle-content a[href="#"] { - text-decoration:none; - color:inherit; -} - -.toggle-content-toggleme { - padding-bottom:1px; /* fixes animation bounce due to margins */ -} - -#jd-content .toggle-content img.toggle-content-img { - margin:0; -} - - -/* BEGIN quickview sidebar element styles */ - -#qv-wrapper { - float: right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:-48px 0 2px 0; - padding:0 0 20px 35px; -} - -#qv { - background-color:#fff; - border:4px solid #dee8f1; - margin:0; - padding:0 5px 5px; - width:292px; /* +10px padding; +8px border */ - font-size:.9em; -} - -#qv ol { - list-style:none; - padding: 0; -} - -#qv ol ol{ - list-style:none; - padding: 0 0 0 12px; - margin:0; -} - -#qv ul { - padding: 0 10px 0 2em; -} - -#qv li { - padding: 0 10px 3px; - line-height: 1.2em; -} - -#qv li li { - padding: 3px 10px 0; -} - -#qv ul li { - padding: 0 10px 0 0; -} - -#qv li.selected a { - color:#555; - text-decoration:none; -} - -#qv a, -#qv a code { - color:#cc6600; -} - -#qv p { - margin:8px 0 0; - padding:0 10px; -} - -#jd-content #qv h2 { - font-size:1.05em; - font-weight:bold; - margin:12px 0 .25em 0; - padding:0 10px; - background-color:transparent; - color:#7BB026; - border:none; - left:0; - z-index:1; -} - -#qv-extra #rule { - padding: 0 10px; - margin: 0; -} - -#qv-sub-rule { - padding: 5px 15px 10px; - margin: 0; -} - -#jd-content -#qv-sub-rule h2 { - margin: 0 0 .5em 0; -} - -/* END quickview sidebar element styles */ - -/* Begin sidebox sidebar element styles */ - -.sidebox-wrapper { - float:right; - clear:right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:0; - padding:0 0 20px 35px; -} - -.sidebox { - border-left:1px solid #dee8f1; - background-color:#ffffee; - margin:0; - padding:8px 12px; - font-size:0.9em; - width:285px; /* +24px padding; +1px border */ -} - -.sidebox p { - margin-bottom: .75em; -} - -.sidebox ul { - padding: 0 0 0 1.5em; -} - -.sidebox li ul { - margin-top:0; - margin-bottom:.1em; -} - -.sidebox li { -padding:0 0 0 0em; -} - -#jd-content .sidebox h2, -#jd-content .sidebox h3, -#jd-content .sidebox h4, -#jd-content .sidebox h5 { - border:none; - font-size:1em; - margin:0; - padding:0 0 8px; - left:0; - z-index:0; -} - -.sidebox hr { - background-color:#ccc; - border:none; -} - -/* End sidebox sidebar element styles */ - -/* BEGIN developer training bar styles */ - -div#tb-wrapper { - float: right; - clear:right; - width:380px; /* +25px padding = 405 */ - background-color:#fff; - margin:0 0 2px 0; - padding:0 0 20px 25px; -} - -div#tb { - margin:0; - padding:0 15px; - width:350px; /* +15px padding = 380 */ - font-size:.9em; - background:#e9e9e9; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - overflow:auto; -} - -div#tb h2 { - font-size:1.3em; - font-weight:bold; - margin:1em 0; - padding:0; - background-color:transparent; - border:none; - clear:both; -} - -div.download-box a.button { - color: #069; - font-size:1.1em; - font-weight:bold; - text-decoration:none; - height:27px; - line-height:27px; - text-align:center; - padding:5px 8px; - background-color: #fff; - border: 1px solid #aaa; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -div.download-box a.button:hover { - border-color: #09C; - background-color: #4CADCB; - background-image: -webkit-gradient(linear,left top,left bottom,from(#5dbcd9),to(#4cadcb)); - background-image: -webkit-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -moz-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -ms-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -o-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: linear-gradient(top,#5dbcd9,#4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9',EndColorStr='#4cadcb'); - color: #fff; -} - -div.download-box a.button:active { - background-color: #1E799A; - background-image: none; - border-color: #30B7E6; -} - -div.download-box p.filename { - font-size:0.85em; - color:#888; - margin:4px 0 1em 10px; -} - -/* End developer training bar */ - -/* Training nav bar (previous/next) */ - -div.training-nav-top { - float: right; - width:380px; /* +25px padding = 405 */ - margin:-58px 0 0 0; - padding:0 0 20px 25px; -} - -div.training-nav-bottom { - padding:1px; /* for weird FF bug (scrollbar appears) */ - margin:3em 0; - overflow:auto; -} - -div.training-nav-button-next a, -div.training-nav-button-previous a { - display:block; - width:160px; - height:55px; - padding:4px 7px; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - text-decoration:none; - font-weight:bold; -} - -div.training-nav-button-next a:hover, -div.training-nav-button-previous a:hover { - border:1px solid #069; /* match link color */ -} - -div.training-nav-button-next a:active, -div.training-nav-button-previous a:active { - border:1px solid #f00; /* match link color */ -} - -div.training-nav-button-previous { - float:left; - text-align:left; -} - -div.training-nav-button-next { - float:right; - text-align:right; -} - -span.training-nav-button-title { - display:block; - font-size:.85em; - font-weight:normal; - line-height:1.3em; - margin:.5em 0 0; -} - -/* End training nav bar */ - -/* BEGIN image and caption styles (originally for UI Guidelines docs) */ - -table.image-caption { - padding:0; - margin:.5em 0; - border:0; -} - -td.image-caption-i { - font-size:92%; - padding:0 5px; - margin:0; - border:0; -} - -td.image-caption-i img { - padding:0 1em; - margin:0; -} - -.image-list { - width:24px; - text-align:center; -} - -td.image-caption-c { - font-size:92%; - padding:1em 2px 2px 2px; - margin:0; - border:0; - width:350px; -} - -.grad-rule-top { -background-image:url(images/grad-rule-qv.png); -background-repeat:no-repeat; -padding-top:1em; -margin-top:0; -} - -.image-caption-nested { - margin-top:0; - padding:0 0 0 1em; -} - -.image-caption-nested td { - padding:0 4px 2px 0; - margin:0; - border:0; -} - -/* END image and caption styles */ - -/* table of contents */ - -ol.toc { - margin: 0 0 1em 0; - padding: 0; - list-style: none; - font-size:95%; -} - -ol.toc li { - font-weight: bold; - margin: 0 0 .5em 1em; - padding: 0; -} - -ol.toc li p { - font-weight: normal; -} - -ol.toc li ol { - margin: 0; - padding: 0; -} - -ol.toc li li { - padding: 0; - margin: 0 0 0 1em; - font-weight: normal; - list-style: none; -} - -table ol.toc { - margin-left: 0; -} - -.columns td { - padding:0 5px; - border:none; -} - -/* link table */ -.jd-linktable { - margin: 0 0 1em; - border-bottom: 1px solid #888; -} -.jd-linktable th, -.jd-linktable td { - padding: 3px 5px; - vertical-align: top; - text-align: left; - border:none; -} -.jd-linktable tr { - background-color: #fff; -} -.jd-linktable td { - border-top: 1px solid #888; - background-color: inherit; -} -.jd-linktable td p { - padding: 0 0 5px; -} -.jd-linktable .jd-linkcol { -} -.jd-linktable .jd-descrcol { -} -.jd-linktable .jd-typecol { - text-align:right; -} -.jd-linktable .jd-valcol { -} -.jd-linktable .jd-commentrow { - border-top:none; - padding-left:25px; -} -.jd-deprecated-warning { - margin-top: 0; - margin-bottom: 10px; -} - -tr.alt-color { - background-color: #f6f6f6; -} - -/* expando trigger */ -#jd-content .jd-expando-trigger-img { - margin:0; -} - -/* jd-expando */ -.jd-inheritedlinks { - padding:0 0 0 13px -} - -/* SDK PAGE */ -table.download tr { - background-color:#d9d9d9; -} - -table.download tr.alt-color { - background-color:#ededed; -} - -table.download td, -table.download th { - border:2px solid #fff; - padding:10px 5px; -} - -table.download th { - background-color:#6d8293; - color:#fff; -} - -/* INLAY 180 COPY and 240PX EXTENSION */ -/* modified to 43px so that all browsers eliminate the package panel h-scroll */ -.g-tpl-240 .g-unit, -.g-unit .g-tpl-240 .g-unit, -.g-unit .g-unit .g-tpl-240 .g-unit { - display: block; - margin: 0 0 0 243px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240 .g-first, -.g-unit .g-tpl-240 .g-first, -.g-tpl-240 .g-first { - display: block; - margin: 0; - width: 243px; - float: left; -} -/* 240px alt */ -.g-tpl-240-alt .g-unit, -.g-unit .g-tpl-240-alt .g-unit, -.g-unit .g-unit .g-tpl-240-alt .g-unit { - display: block; - margin: 0 243px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240-alt .g-first, -.g-unit .g-tpl-240-alt .g-first, -.g-tpl-240-alt .g-first { - display: block; - margin: 0; - width: 243px; - float: right; -} - -/* 200px */ -.g-tpl-200 .g-unit, -.g-unit .g-tpl-200 .g-unit, -.g-unit .g-unit .g-tpl-200 .g-unit { - display: block; - margin: 0 0 0 200px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200 .g-first, -.g-unit .g-tpl-200 .g-first, -.g-tpl-200 .g-first { - display: block; - margin: 0; - width: 200px; - float: left; -} -/* 200px alt */ -.g-tpl-200-alt .g-unit, -.g-unit .g-tpl-200-alt .g-unit, -.g-unit .g-unit .g-tpl-200-alt .g-unit { - display: block; - margin: 0 200px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200-alt .g-first, -.g-unit .g-tpl-200-alt .g-first, -.g-tpl-200-alt .g-first { - display: block; - margin: 0; - width: 200px; - float: right; -} - -/* 190px */ -.g-tpl-190 .g-unit, -.g-unit .g-tpl-190 .g-unit, -.g-unit .g-unit .g-tpl-190 .g-unit { - display: block; - margin: 0 0 0 190px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190 .g-first, -.g-unit .g-tpl-190 .g-first, -.g-tpl-190 .g-first { - display: block; - margin: 0; - width: 190px; - float: left; -} -/* 190px alt */ -.g-tpl-190-alt .g-unit, -.g-unit .g-tpl-190-alt .g-unit, -.g-unit .g-unit .g-tpl-190-alt .g-unit { - display: block; - margin: 0 190px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190-alt .g-first, -.g-unit .g-tpl-190-alt .g-first, -.g-tpl-190-alt .g-first { - display: block; - margin: 0; - width: 190px; - float: right; -} - -/* 180px */ -.g-tpl-180 .g-unit, -.g-unit .g-tpl-180 .g-unit, -.g-unit .g-unit .g-tpl-180 .g-unit { - display: block; - margin: 0 0 0 180px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180 .g-first, -.g-unit .g-tpl-180 .g-first, -.g-tpl-180 .g-first { - display: block; - margin: 0; - width: 180px; - float: left; -} -/* 180px alt */ -.g-tpl-180-alt .g-unit, -.g-unit .g-tpl-180-alt .g-unit, -.g-unit .g-unit .g-tpl-180-alt .g-unit { - display: block; - margin: 0 180px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180-alt .g-first, -.g-unit .g-tpl-180-alt .g-first, -.g-tpl-180-alt .g-first { - display: block; - margin: 0; - width: 180px; - float: right; -} - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; } -body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; - background: transparent url("images/resizable-s2.gif") repeat scroll center top; } -.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; - background: transparent url("images/resizable-e2.gif") repeat scroll right center; } - -@media print { - - body { - overflow:visible; - } - - #header { - height:60px; - } - - #headerLeft { - padding:0; - } - - #header-tabs, - #headerRight, - #side-nav, - #api-info-block { - display:none; - } - - #body-content { - position:inherit; - } - - #doc-content { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } - - #jd-header { - padding:10px 0; - } - - #jd-content { - padding:15px 0 0; - } - - #footer { - float:none; - margin:2em 0 0; - } - - h4.jd-details-title { - border-bottom:1px solid #666; - } - - pre { - /* these allow lines to break (if there's a white space) */ - overflow: visible; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - } - - h1, h2, h3, h4, h5, h6 { - page-break-after: avoid; - } - - table, img { - page-break-inside: avoid; - } -} diff --git a/tools/droiddoc/templates-ds/assets/css/default.css b/tools/droiddoc/templates-ds/assets/css/default.css deleted file mode 100644 index 5bd95a8dc7a..00000000000 --- a/tools/droiddoc/templates-ds/assets/css/default.css +++ /dev/null @@ -1,4459 +0,0 @@ -/* color definitions */ -/* 16 column layout */ -/* clearfix idiom */ -/* common mixins */ -/* page layout + top-level styles */ -::-webkit-selection, -::-moz-selection, -::selection { - background-color: #0099cc; - color: #fff; } - -html, body { - height: 100%; - margin: 0; - padding: 0; - background-color:#F9F9F9; - -webkit-font-smoothing: antialiased; - /* prevent subpixel antialiasing, which thickens the text */ - /* text-rendering: optimizeLegibility; */ - /* turned off ligatures due to bug 5945455 */ } - -body { - color: #222; - font: 14px/19px Roboto, sans-serif; - font-weight: 400; - letter-spacing:.1; - padding:0 10px; } - -#page-container { - width: 940px; - margin: 0 40px; } - -#page-header { - height: 80px; - margin-bottom: 20px; - font-size: 48px; - line-height: 48px; - font-weight: 100; - padding-left: 10px; } - #page-header a { - display: block; - position: relative; - top: 20px; - text-decoration: none; - color: #555555 !important; } - -#main-row { - display: inline-block; } - #main-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html #main-row { - height: 1px; } - -#page-footer { - margin-left: 190px; - margin-top: 80px; - color: #999999; - padding-bottom: 40px; - font-size: 12px; - line-height: 15px; } - #page-footer a { - color: #777777; } - #page-footer #copyright { - margin-bottom: 10px; } - -#nav-container { - width: 160px; - min-height: 10px; - margin-right: 20px; - float: left; } - -#nav { - margin:0; - padding:0 0 30px; -} - -#side-nav { - min-height:5px; /* silly way to avoid doc floating left when nav goes fixed */ - margin-bottom:1px; -} -#devdoc-nav { - outline:none; - width:auto; - margin: 20px 0 0; } - -#devdoc-nav h2 { - border:0; -} - -#devdoc-nav.fixed { - position: fixed; - margin:0; - top: 20px; } - -#devdoc-nav span.small { - font-size:12px; - font-weight:normal; -} - -#content { - width: 760px; - float: left; } - -a:hover, -acronym:hover { - color: #7aa1b0 !important; } - -a:focus, -a:active { - color: #33b5e5 !important; } - -a.external-link { - background:url('../images/styles/open_new_page.png') no-repeat 100% 50%; - padding-right:16px; -} - -img { - border: none; } -#jd-content img { - margin-bottom:15px; -} - -ul { - margin: 0; - padding: 0; } - -strong { - font-weight: 500; } - -em { - font-style: italic; } - -acronym, -.tooltip-link { - border-bottom: 1px dotted #555555; - cursor: help; } - -acronym:hover, -.tooltip-link:hover { - color: #7aa1b0; - border-bottom-color: #7aa1b0; } - -img.with-shadow, -video.with-shadow { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); } - -/* disclosures mixin */ -/* content layout */ -.layout-content-row { - display: inline-block; - margin-bottom: 10px; } - .layout-content-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html .layout-content-row { - height: 1px; } - -.layout-content-col { - float: left; - margin-left: 20px; } - .layout-content-col:first-child { - margin-left: 0; } - .layout-content-col h3, - .layout-content-col h4 { - margin-top:0; } - -.layout-content-col.span-1 { - width: 40px; } - -.layout-content-col.span-2 { - width: 100px; } - -.layout-content-col.span-3 { - width: 160px; } - -.layout-content-col.span-4 { - width: 220px; } - -.layout-content-col.span-5 { - width: 280px; } - -.layout-content-col.span-6 { - width: 340px; } - -.layout-content-col.span-7 { - width: 400px; } - -.layout-content-col.span-8 { - width: 460px; } - -.layout-content-col.span-9 { - width: 520px; } - -.layout-content-col.span-10 { - width: 580px; } - -.layout-content-col.span-11 { - width: 640px; } - -.layout-content-col.span-12 { - width: 700px; } - -.layout-content-col.span-13 { - width: 760px; } - -.vspace.size-1 { - height: 10px; } - -.vspace.size-2 { - height: 20px; } - -.vspace.size-3 { - height: 30px; } - -.vspace.size-4 { - height: 40px; } - -.vspace.size-5 { - height: 50px; } - -.vspace.size-6 { - height: 60px; } - -.vspace.size-7 { - height: 70px; } - -.vspace.size-8 { - height: 80px; } - -.vspace.size-9 { - height: 90px; } - -.vspace.size-10 { - height: 100px; } - -.vspace.size-11 { - height: 110px; } - -.vspace.size-12 { - height: 120px; } - -.vspace.size-13 { - height: 130px; } - -.vspace.size-14 { - height: 140px; } - -.vspace.size-15 { - height: 150px; } - -.vspace.size-16 { - height: 160px; } - -/* nav */ -#nav { - /* section header divs */ - /* expanded section header divs */ - /* sublinks */ } - #nav li { - list-style-type: none; - font-size: 14px; - margin:0; - padding:0; - line-height: 15px; } - #nav a { - color: #555555; - text-decoration: none; - word-wrap:break-word; } - #nav .nav-section-header { - position: relative; - margin-bottom: 1px; - padding: 0 30px 0 0; } - #nav li.selected a, #nav li.selected > .nav-section-header > a { - color: #09C; - } - #nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } - #nav .nav-section .nav-section .nav-section-header { - /* no white line between second level sections */ - margin-bottom: 0; } - /* section header links */ - #nav > li > div > a { - display: block; - color: #333333; - font-weight: 500; - padding: 10px 0 10px 10px; } - #nav .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; - display: block; - position: absolute; - top: 0; - right: 0; } - #nav .nav-section-header.empty:after { - display: none; } - /* nested nav headers */ - #nav .nav-section .nav-section { - position: relative; - padding: 0; - margin: 0; } - #nav .nav-section li a { - /* first gen child (2nd level li) */ - display:block; - font-weight: normal; - text-transform: none; - padding: 7px 5px 7px 10px; - } - #nav .nav-section li li a { - /* second gen child (3rd level li) */ - padding: 5px 5px 5px 10px; - } - #nav li.expanded .nav-section-header { - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); } - #nav li.expanded li .nav-section-header { - background: transparent; } - #nav li.expanded li ul { - /* 3rd level ul */ - padding:0 0 0 10px; - } - #nav li.expanded > .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; } - #nav li.expanded li ul.tree-list-children { - padding:0; - } - #nav li.expanded li ul.tree-list-children .tree-list-children { - padding:0 0 0 10px; - } - #nav li span.tree-list-subtitle { - display:inline-block; - padding:5px 0 0 10px; - color:#555; - text-transform:uppercase; - font-size:12px; - } - #nav li span.tree-list-subtitle:before { - content: '—'; - } - #nav li span.tree-list-subtitle:after { - content: '—'; - } - #nav li ul { - display:none; - overflow: hidden; - margin: 0; } - #nav li ul.animate-height-in { - -webkit-transition: height 0.25s ease-in; - -moz-transition: height 0.25s ease-in; - transition: height 0.25s ease-in; } - #nav li ul.animate-height-out { - -webkit-transition: height 0.25s ease-out; - -moz-transition: height 0.25s ease-out; - transition: height 0.25s ease-out; } - #nav li ul li { - padding: 0; } - #nav li li li { - padding: 0; } - #nav li.expanded ul { - } - #nav li ul > li { - padding:0; - } - #nav li ul > li:last-child { - padding-bottom:5px; - } - #nav li ul.tree-list-children > li:last-child { - padding-bottom:0; - } - #nav li.expanded ul > li { - background:#efefef; - background: rgba(0, 0, 0, 0.03); } - #nav li.expanded ul > li li { - background:inherit; } - #nav li ul.tree-list-children ul { - display:block; } - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - vertical-align:top; - white-space:nowrap; -} - -/* content header */ -.content-header { - height: 30px; - margin:20px 0 25px; - padding:0 0 10px;} -.content-header.just-links { - margin-bottom:0; - padding-bottom:0;} - -.content-header h1 { - color:#000; - margin:0; - border-bottom:0; - padding:0; -} - -.content-footer { - border-top: 1px solid #ccc; - margin-top: 10px; - padding-top:10px; - height: 30px; } - -.content-footer .col-9 { - margin-left:0; -} -.content-footer .col-4 { - margin-right:0; -} -.content-footer.wrap { - width:940px; -} - -.paging-links { - position: relative; } - .paging-links a { - position: absolute; } - .paging-links a, - .training-nav-top a { - font-size: 14px; - line-height: 30px; - color: #555555; - text-decoration: none; - text-transform: uppercase; } - .paging-links .prev-page-link:before, - .training-nav-top .prev-page-link:before { - content: ''; - background: transparent url(../images/styles/disclosure_left.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-right: 5px; } - .training-nav-top .next-page-link, - .training-nav-top .start-class-link, - .training-nav-top .start-course-link { - right: 10px; } - .paging-links .prev-page-link { - left: -15px; } - .paging-links .next-page-link { - right: 0px; } - .next-page-link:after, - .start-class-link:after, - .start-course-link:after, - .next-class-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - - - .training-nav-top a { - display:block; - float:left; - width:122px; - height:28px; - padding: 8px; - line-height:28px; - text-align:center; - border:1px solid #DADADA; - border-bottom:0; - } - - .training-nav-top a.next-page-link { - border-left:0; - width:123px; - } - - .paging-links a.disabled, - .training-nav-top a.disabled, - .content-footer a.disabled { - color:#bbb; - } - - .paging-links a.disabled:hover, - .training-nav-top a.disabled:hover, - .content-footer a.disabled:hover { - cursor:default; - color:#bbb !important; - } - - .training-nav-top a.start-class-link, - .training-nav-top a.start-course-link { - width:262px; - } - - /* list of classes on course landing page */ - ol.class-list { - list-style:none; - margin-left:0; - } - ol.class-list>li { - margin:0 0 15px; - padding:5px 0 0; - overflow:hidden; - border-top:1px solid #ccc; - } - ol.class-list li a.title { - font-size:16px; - margin:0; - clear:left; - display:block; - height:32px; - padding:0 4px; - } - ol.class-list li a.title h2 { - color:inherit; - margin:0 0 10px; - display:block; - float:left; - width:675px; - } - ol.class-list li a.title span { - display:none; - float:left; - font-size:18px; - font-weight:bold; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 32px; - } - ol.class-list li a.title:hover { - background:#ddd; - color:#258AAF !important; - } - ol.class-list li a.title:hover span { - display:block; - } - - #jd-content - ol.class-list li img { - float:left; - clear:left; - width:64px; - margin:0 20px 0 0; - } - ol.class-list li p.description { - float:left; - display:block; - width:250px; - margin:0; - } - ol.class-list li p.description.article { - width: 550px; - } - ol.class-list ol { - float:left; - width:320px; - margin:0 0 0 30px; - list-style:none; - margin:0 0 0 20px; - } - ol.class-list div.lessons li { - margin:0 0 6px; - line-height:16px; - } - - - .hide { - display:none !important; - } - - .content-footer.next-class { - display:block; - border:0; - margin-top:0; - padding-top:0; - } - - .content-footer.next-class a.next-class-link { - display:block; - float:right; - text-transform:uppercase; - } - - - - /* inner-doc tabs w/ title */ - -div#title-tabs-wrapper { - border-bottom:1px solid #ccc; - margin:20px 0 30px; -} -h1.with-title-tabs { - display:inline-block; - margin:0 0 -1px 0; - padding:0 60px 0 0; - border-bottom:1px solid #F9F9F9; -} -ul#title-tabs { - list-style:none; - padding:0; - height:29px; - margin:0; - font-size:16px; - line-height:26px; - display:inline-block; - vertical-align:bottom; -} -ul#title-tabs li { - display:block; - float:left; - margin-right:40px; - border-bottom: 3px solid transparent; -} -ul#title-tabs li.selected { - border-bottom: 3px solid #93C; -} -ul#title-tabs li a { - color:#333; -} -ul#title-tabs li a:hover, -ul#title-tabs li a:active { - color:#93C !important; -} - - - -/* content body */ -@-webkit-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@-moz-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -h2:target, -h3:target { - -webkit-animation-name: glowheader; - -moz-animation-name: glowheader; - animation-name: glowheader; - -webkit-animation-duration: 0.7s; - -moz-animation-duration: 0.7s; - animation-duration: 0.7s; - -webkit-animation-timing-function: ease-out; - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - -.design ol h4 { - margin-bottom:0; -} -.design ol { - counter-reset: item; } - .design ol>li { - font-size: 14px; - line-height: 20px; - list-style-type: none; - position: relative; } - .design ol>li:before { - content: counter(item) ". "; - counter-increment: item; - position: absolute; - left: -20px; - top: 0; } - .design ol li.value-1:before { - content: "1. "; } - .design ol li.value-2:before { - content: "2. "; } - .design ol li.value-3:before { - content: "3. "; } - .design ol li.value-4:before { - content: "4. "; } - .design ol li.value-5:before { - content: "5. "; } - .design ol li.value-6:before { - content: "6. "; } - .design ol li.value-7:before { - content: "7. "; } - .design ol li.value-8:before { - content: "8. "; } - .design ol li.value-9:before { - content: "9. "; } - .design ol li.value-10:before { - content: "10. "; } -.design .with-callouts ol>li { - list-style-position: inside; - margin-left: 0; } - .design .with-callouts ol>li:before { - display: inline; - left: -20px; - float: left; - width: 17px; - color: #33b5e5; - font-weight: 500; } -.design .with-callouts ul>li { - list-style-position: outside; } - -/* special list items */ -li.no-bullet { - list-style-type: none !important; } -li.no-bullet *{ - margin:0; } - -.design li.with-icon { - position: relative; - margin-left: 20px; - min-height: 30px; } - .design li.with-icon p { - margin-left: 0 !important; } - .design li.with-icon:before { - position: absolute; - left: -40px; - top: 0; - content: ''; - width: 30px; - height: 30px; } - .design li.with-icon.tablet:before { - background-image: url(../images/styles/ico_phone_tablet.png); } - .design li.with-icon.web:before { - background-image: url(../images/styles/ico_web.png); } - .design li.with-icon.action:before { - background-image: url(../images/styles/ico_action.png); } - .design li.with-icon.use:before { - background-image: url(../images/styles/ico_use.png); } - -/* figures and callouts */ -.figure { - position: relative; } - .figure.pad-below { - margin-bottom: 20px; } - .figure .figure-callout { - position: absolute; - color: #fff; - font-weight: 500; - font-size: 16px; - line-height: 23px; - text-align: center; - background: transparent url(../images/styles/callout.png) no-repeat scroll 50% 50%; - padding-right: 2px; - width: 30px; - height: 29px; - z-index: 1000; } - .figure .figure-callout.top { - top: -9px; } - .figure .figure-callout.right { - right: -5px; } - -.figure-caption { - margin: 0 10px 20px 0; - font-size: 14px; - line-height: 20px; - font-style: italic; } - -/* rows of figures */ -.figure-row { - font-size: 0; - line-height: 0; - /* to prevent space between figures */ } - .figure-row .figure { - display: inline-block; - vertical-align: top; } - .figure-row .figure + .figure { - margin-left: 10px; - /* reintroduce space between figures */ } - -/* video containers */ -.framed-galaxynexus-land-span-13 { - background: transparent url(../images/styles/device_galaxynexus_blank_land_span13.png) no-repeat -scroll top left; - padding: 42px 122px 62px 126px; - overflow: hidden; } - .framed-galaxynexus-land-span-13, .framed-galaxynexus-land-span-13 video, -.framed-galaxynexus-land-span-13 img { - width: 512px; - height: 286px; } - - -.framed-galaxynexus-land-span-8{ - background: transparent url(../images/styles/device_galaxynexus_blank_land_span8.png) no-repeat -scroll top left; - padding: 26px 68px 38px 72px; - overflow: hidden; } - .framed-galaxynexus-land-span-8, .framed-galaxynexus-land-span-8 video, -.framed-galaxynexus-land-span-8 img { - width: 320px; - height: 180px; } - -.framed-galaxynexus-port-span-9 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span9.png) no-repeat -scroll top left; - padding: 95px 122px 107px 124px; - overflow: hidden; } - .framed-galaxynexus-port-span-9, .framed-galaxynexus-port-span-9 video, -.framed-galaxynexus-port-span-9 img { - width: 274px; - height: 488px; } - -.framed-galaxynexus-port-span-5 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span5.png) no-repeat -scroll top left; - padding: 75px 31px 76px 33px; - overflow: hidden; } - .framed-galaxynexus-port-span-5, .framed-galaxynexus-port-span-5 video, -.framed-galaxynexus-port-span-5 img { - width: 216px; - height: 384px; } - -/* landing page disclosures */ -.landing-page-link { - text-decoration: none; - font-weight: 500; - color: #333333; } - .landing-page-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - -/* tooltips */ -.tooltip-box { - position: absolute; - background-color: rgba(0, 0, 0, 0.9); - border-radius: 2px; - font-size: 14px; - line-height: 20px; - color: #fff; - padding: 6px 10px; - max-width: 250px; - z-index: 10000; } - .tooltip-box.below:after { - position: absolute; - content: ''; - line-height: 0; - display: block; - top: -10px; - left: 5px; - border: 5px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.9); } - -/* video note */ -.video-instructions { - margin-top: 10px; - margin-bottom: 10px; } - .video-instructions:before { - content: ''; - background: transparent url(../images/styles/ico_movie_inline.png) no-repeat scroll top left; - display: inline-block; - width: 12px; - height: 12px; - margin-right: 8px; } - .video-instructions:after { - content: 'Click device screen to replay movie.'; } - -/* download buttons */ -.download-button { - display: block; - margin-bottom: 5px; - text-decoration: none; - background-color: #33b5e5; - color: #fff !important; - font-weight: 500; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12); - padding: 6px 12px; - border-radius: 2px; } - .download-button:hover, .download-button:focus { - background-color: #0099cc; - color: #fff !important; } - .download-button:active { - background-color: #006699; } - -/* UI tables and other things found in Writing style and Settings pattern */ -.ui-table { - width: 100%; - background-color: #282828; - color: #fff; - border-radius: 2px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); - border-collapse: separate; } - .ui-table th, - .ui-table td { - padding: 5px 10px; - background-color: inherit; - border:0;} - .ui-table thead th { - font-weight: bold; } - .ui-table tfoot td { - border-top: 1px solid #494949; - border-right: 1px solid #494949; - text-align: center; } - .ui-table tfoot td:last-child { - border-right: 0; } - -.layout-with-list-item-margins { - margin-left: 30px !important; } - -.emulate-content-left-padding { - margin-left: 10px; } - -.do-dont-label { - margin-bottom: 10px; - padding-left: 20px; - background: transparent none no-repeat scroll 0px 3px; } - .do-dont-label.bad { - background-image: url(../images/styles/ico_wrong.png); } - .do-dont-label.good { - background-image: url(../images/styles/ico_good.png); } - - - - - - - - - - - - - - - - - - - -/***** PREVIOUSLY style.css ******************/ - - - - - -@media screen, projection, print { -[dir='rtl'] { - direction: rtl; -} -html { - line-height: 20px; -} -pre, table, input, textarea, code { - font-size: 1em; -} -address, abbr, cite { - font-style: normal; -} -[dir='rtl'] th { - text-align: right; -} -html[lang^=ja] blockquote, html[lang^=ja] q, html[lang^=ko] blockquote, html[lang^=ko] q, -html[lang^=zh] blockquote, html[lang^=zh] q { - font-style: normal; -} -q { - font-style: italic; -} -fieldset, iframe, img { - border: 0; -} -img { - -ms-interpolation-mode: bicubic; - vertical-align: middle; - max-width: 100%; -} -q { - quotes: none; -} -sup, sub { - font-size: 11px; - line-height: 0; -} -} - -@media screen, projection { - -table, fieldset { - margin: 0; -} -h1 { - color:#333; - font-size: 22px; - margin: 20px 0 20px; - padding:0 0 10px; -} -h1, h2 { - line-height: 32px; -} -h1.short { - margin-right:320px; -} -h1.short { - margin-right:320px; -} -h1.super { - font-size: 37px; -} -h2 { - color:#333; - font-size: 20px; - margin: 20px 0 20px; - padding:0; -} -h3 { - color:#333; - font-size: 18px; -} -h3, h4 { - color:#333; - line-height: 20px; - margin: 10px 0; -} -h4 { - font-size: 16px; -} -h5 { - font-size: 14px; -} -h5, h6 { - margin: 5px 0; -} -h6 { - font-size: 12px; -} -hr { /* applied to the bottom of h2 elements */ - height: 1px; - margin: 5px 0 20px; - border: 0; - background: #ccc; -} -p, pre, table, form { - margin: 0 0 15px; -} -small { - font-size: 11.5px; - color: #000; -} -ul, ol { - margin: 0 0 15px 18px; - padding: 0; -} -[dir='rtl'] ul, [dir='rtl'] ol { - margin: 10px 30px 10px 10px; -} -ul ul, ul ol, ol ul, ol ol { - margin-bottom: 0; - margin-top: 0; -} -li { - margin:0 0 5px; -} -dd { - margin:0 0 10px 30px; -} -dd p { - margin:10px 0 0; -} -li p, -li pre, -li ul, -li ol { - margin-top:5px; - margin-bottom:5px; -} -pre strong, pre b, a strong, a b, a code { - color: inherit; -} -pre, code { - color: #060; - font: 14px/1.5 'courier new', courier, monospace; -} -code { - font-weight:bold; -} - -legend { - display: none; -} -a:link, a:visited { - color: #258aaf; - text-decoration: none; -} -a:focus, a:hover, a:active { - color: #33B5E5; - text-decoration: none; -} -strong, b { - font-weight:bold; - color: #222; -} -table { - border-collapse: collapse; - border-spacing: 0; - border:0; - margin: .5em 1em 1em 0; - width:100%; /* consistent table widths; within IE's quirks */ - background-color:#f7f7f7; -} -th, td { - padding: 4px 12px; - vertical-align: top; - text-align: left; -} -td { - background-color:inherit; - border:solid 1px #DDD; -} -td *:last-child { - margin-bottom:0; -} -th { - background-color: #999; - color: #fff; - border:solid 1px #DDD; - font-weight: normal; -} -tr:first-of-type th:first-of-type:empty { - visibility: hidden; -} -/* -------------------------------------------------------------------------- -Footer -*/ -.line { - clear: both; - background: #acbc00; - background: -moz-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #acbc00), -color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00)); - background: -webkit-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -o-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -ms-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - height: 2px; - margin-top: 150px; - position: relative; - z-index: 11; -} -#footer { - font-size:11px; - clear: both; - color: #999; - padding: 15px 0; - margin-top:10px; - width:auto; -} -#footer-local ul { - list-style: none; - margin: 5px 0 30px 0; -} -#footer-local li { - display: inline; -} -#footer-local li+li:before { - content: '|'; - padding: 0 3px; - color: #e5e5e5; -} -#footer-global { - padding: 10px 15px; - background: #f5f5f5; -} -#footer-global { - border-top: 1px solid #ebebeb; - font-size: 11.5px; - line-height: 1.8; - list-style: none; -} -#footer-global ul { - margin: 0; -} -#footer-global li { - display: inline; - font-weight: bold; -} -#footer-global li+li:before { - content: '¬?'; - padding: 0 3px; -} -* html #footer-global li { - margin: 0 13px 0 0; -} -* [dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -*+html #footer-global li { - margin: 0 13px 0 0; -} -*+[dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -#footer-global li a { - font-weight: normal; -} -.locales { - margin: 10px 0 0 0px; -} -[dir='rtl'] .locales { - background-position: right center; - float: left; - padding: 0 24px 0 0; -} -.locales form { - margin: 0; -} -.locales select, .sites select { - line-height: 3.08; - margin: 0px 0; - border: solid 1px #EBEBEB; - -webkit-appearance: none; - background: white url('../images/arrows-up-down.png') right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 230px; -} -} - -/* ============================================================================= - Print Only - ========================================================================== */ -@media print { - /* configure printed page */ - @page { - margin: 0.75in 1in; - widows: 4; - orphans: 4; - } - - /* reset spacing metrics */ - html, body, .wrap { - margin: 0 !important; - padding: 0 !important; - width: auto !important; - } - - /* leave enough space on the left for bullets */ - body { - padding-left: 20px !important; - } - #doc-col { - margin-left: 0; - } - - /* hide a bunch of non-content elements */ - #header, #footer, #nav-x, #side-nav, - .training-nav-top, .training-nav-bottom, - #doc-col .content-footer, - .nav-x, .nav-y, - .paging-links, - a.totop { - display: none !important; - } - - /* remove extra space above page titles */ - #doc-col .content-header { - margin-top: 0; - } - - /* bump up spacing above subheadings */ - h2 { - margin-top: 40px !important; - } - - /* print link URLs where possible and give links default text color */ - p a:after { - content: " (" attr(href) ")"; - font-size: 80%; - } - p a { - word-wrap: break-word; - } - a { - color: inherit; - } - - /* syntax highlighting rules */ - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - -/* ============================================================================= - Columns - ========================================================================== */ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 940px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} -/* -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12 { - margin: 0; - padding: 0 1.4% 20px; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -*/ -.col-1 { width: 40px } -.col-2 { width: 100px } -.col-3 { width: 160px } -.col-4 { width: 220px } -.col-5 { width: 280px } -.col-6 { width: 340px } -.col-7 { width: 400px } -.col-8 { width: 460px } -.col-9 { width: 520px } -.col-10 { width: 580px } -.col-11 { width: 640px } -.col-12 { width: 700px } -.col-13 { width: 760px } -.col-14 { width: 820px } -.col-15 { width: 880px } -.col-16 { width: 940px } -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -} - -/* ============================================================================= - Layout - ========================================================================== */ -@media screen, projection, print { - -/* -------------------------------------------------------------------------- -Header, Login, Nav-X, Search -*/ -#header { - padding: 2.2em 0 0.2em 0; -} -#header:before, #header:after { - content: ""; - display: table; - clear: both -} -.logo, .nav-x { - float: left; -} -.nav-x { - margin-top: -2px; - list-style-type: none; -} -.nav-x a { - color: #333; - font-size: 16px; -} -.design a.selected { - color: #33b5e5; -} -.develop a.selected { - color: #F80; -} -.distribute a.selected { - color: #9C0; -} - - - -.nav-x li { - display: inline; - margin-right: 45px; -} -.search { - float: right; - position: relative; - width: 220px -} -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a3a3a3; -} -.search .bottom { - width: 220px; - height: 1px; - top: 24px; - left: 0 -} -.search .left, .search .right { - height: 5px; - width: 1px -} -.search .left { top: 19px; left: 0 } -.search .right { top: 19px; right: 0 } -.search form { - float: left; - margin-top: 2px; - width: inherit; -} -.search .close, -#player-frame .close { - position: absolute; - right: 8px; - bottom: 4px; - width: 16px; - height: 16px; - margin: 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; - z-index:9999; -} -.search .close:hover, .search .close:focus, -#player-frame .close:hover, #player-frame .close:focus { - background-position: -16px 0; - cursor:pointer; -} -#player-frame .close { - top: 6px; -} -.search form input { - color: #999; - font-size: 1em; - width: inherit; - border: none; - margin: 0; - padding:0 0 0 6px; - z-index: 1500; - background-color: transparent -} -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #33b5e5; -} -.search:hover .icon { - background-position: -8px 0 -} -.search form input:focus { - color: #222; - font-weight: bold; - outline:0; -} -/* Search Dropdown */ -.search-dropdown { - padding: 15px; - width: 192px; - border: solid 1px #c5c5c5; - background: #fff; - position: absolute; - top: 35px; - left: 0; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.2); - box-shadow: 0 0 10px rgba(0,0,0,0.2) -} -.search-dropdown ul, .search-dropdown ul li { - list-style-type: none; - margin: 0; - padding: 0 -} -.search-dropdown ul li { - clear: both -} -.search-dropdown img { - float: left; - margin: 0 10px 10px 0 -} -.search-dropdown h6 { - color: #222; - margin: 0; - line-height: normal -} -.search-dropdown .desc { - color: #999; - font-size: 11.5px; - line-height: normal; - margin: 0; -} -.search-dropdown li a:hover h6, .search-dropdown li a:hover .desc { - color: #33b5e5 -} -/* -------------------------------------------------------------------------- -Buttons -*/ -.button, a.button, .button-secondary, a.button-secondary { - border-image: initial; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - cursor: pointer; -} -.button, a.button { - display:inline-block; - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#0099cc',GradientType=0); - border: 1px solid #3990ab; - color: #fff; -} -.button-secondary, a.button-secondary { - background-color: #f3f3f3; - border: 1px solid #dcdcdc; - color: #444; -} -a.button, a.button:visited, a.button-secondary, a.button-secondary:visited { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 8px 15px; - text-align: center; -} -.button, .button-secondary { - margin-right: 16px; - font-weight: 400; - min-width: 54px; - outline: 0; - padding: 0 15px; - text-align: center; -} -.button:hover, a.button:hover { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, left bottom, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(top, #5dbcd9, #4cadcb); - background-image: linear-gradient(top, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', -EndColorStr='#4cadcb',GradientType=0); - color: #fff !important; -} -.button:active, a.button:active { - background-color: #1e799a; - background-image: none; - border-color: #30b7e6; -} -a.button.big.subtitle { - line-height:18px; -} -.button-secondary:hover, a.button-secondary:hover { - border-color: #dbdbdb; - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5 !important; -} -.button-secondary:active, a.button-secondary:active { - border-color: #dadada; - background: #ebebeb; /* Old browsers */ - /* IE9 SVG, needs conditional override of 'filter' to 'none' */ - background: -url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/ -Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0Jv -eD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+ -CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIg -eDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ViZWJl -YiIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2ZhZmFmYSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjkwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+ -CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNmY2ZjYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFy -R3JhZGllbnQ+ -CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIg -Lz4KPC9zdmc+); - background: -moz-linear-gradient(top, #ebebeb 0%, #f9f9f9 5%, #fafafa 50%, #f9f9f9 90%, -#ffffff 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), -color-stop(5%,#f9f9f9), color-stop(50%,#fafafa), color-stop(90%,#f9f9f9), color-stop(100%,#ffffff)); -/* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 -90%,#ffffff 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* IE10+ */ - background: linear-gradient(top, #ebebeb 0%,#f9f9f9 5%,#fafafa 50%,#f9f9f9 90%,#ffffff -100%); /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ebebeb', -endColorstr='#ffffff',GradientType=0 ); /* IE6-8 */ - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - color: #258AAF !important; -} -.button.big { - font-size:20px; - display:inline-block; -} -.button.big span.small { - font-size:14px; -} -.button-caption { - margin-top:10px; - font-size:12px; - font-style:italic; -} - -.button.disabled, -.button.disabled:hover, -.button.disabled:active { - background:#ebebeb; - color:#999 !important; - border-color:#999; - cursor:default; -} - -.training-nav-top a.button-secondary, -.training-nav-bottom a.button-secondary { - display:block; - float:left; - margin:0; - width:130px; - text-transform:uppercase; - font-weight:bold; - - background-color: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#ececec)); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ececec); - background-image: -moz-linear-gradient(top, #f9f9f9, #ececec); - background-image: -ms-linear-gradient(top, #f9f9f9, #ececec); - background-image: -o-linear-gradient(top, #f9f9f9, #ececec); - background-image: linear-gradient(top, #f9f9f9, #ececec); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5; -} - -.training-nav-top a.button-secondary:hover, -.training-nav-bottom a.button-secondary:hover { - background-color: #09c; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2faddb), to(#09c)); - background-image: -webkit-linear-gradient(top, #2faddb, #09c); - background-image: -moz-linear-gradient(top, #2faddb, #09c); - background-image: -ms-linear-gradient(top, #2faddb, #09c); - background-image: -o-linear-gradient(top, #2faddb, #09c); - background-image: linear-gradient(top, #2faddb, #09c); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990ab; - color: #fff !important; -} - -.training-nav-top a.button-secondary.last, -.training-nav-bottom a.button-secondary.last { - border-left:0; -} - -.training-nav-top a.button-secondary.double-size, -.training-nav-bottom a.button-secondary.double-size { - width:291px; -} - -.training-nav-top, -.training-nav-bottom { - float:right; - margin:0 0 0 20px; -} - -.training-nav-bottom { - padding:0 0 20px; -} - -#tb-wrapper, -#qv-wrapper { - float:right; - clear:right; - margin:-27px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */ - padding:0 0 20px; -} - -#tb, -#qv { - font-size:13px; - line-height:18px; - width:238px; - border:1px solid #ccc; - float:right; -} - -#tb { - width:278px; -} - -#tb h2, -#qv h2 { - margin:10px 15px; - padding:0; - text-transform:uppercase; - border-bottom:1px solid gainsboro; -} - -#tb *, -#qv * { - font-size:inherit; -} - -#tb .download-box { - padding:0 0 0 15px; -} - -#tb .download-box .filename { - font-size:11px; - margin:4px 4px 10px; - color:#666; -} - - -/* Dev guide quicknav */ - -.sidebox-wrapper { - float:right; - clear:right; - margin:0 0 0 20px; - padding:0 0 20px; -} - -.sidebox { - width:226px; - font-size:13px; - line-height:18px; - border-left:4px solid #99CC00; - float:right; - padding:0 0 0 10px; - margin:0 0 1em 20px; -} - -.sidebox h2, -.sidebox h3, -.sidebox h4, -.sidebox h5 { - font-weight:bold; - margin:0 0 10px; -} - -.sidebox * { - font-size:inherit; -} - -#tb ol, -#tb ul, -#qv ul { - margin:0 15px 10px 35px; -} - -#qv ol { - list-style:none; - margin:0 15px 15px; - font-size:inherit; - line-height:inherit; -} - -#tb ol ol, -#tb ul ul, -#qv ol ol, -#qv ul ul, -.sidebox ol ol, -.sidebox ul ul { - margin-bottom:0; -} - -#qv ol ol { - margin:3px 0 3px 15px; -} - -.sidebox p, -#qv p, -#tb p { - margin: 0 0 10px; -} - - -/* -------------------------------------------------------------------------- -Form -*/ -.article form { - margin: 0 0 20px; -} -.article form .form-required { - color: #dd4b39; -} -.article form fieldset { - margin: 0 0 20px; - padding: 0; -} -.article form legend { - display: block; - line-height: 1.5; - margin: 0; - padding: 0; -} -/* -.article form ol, .article form ul { - margin: 0 0 0 1em; - padding: 0 0 0 1em; -} -[dir='rtl'] .article form ol, [dir='rtl'] .article form ul { - margin: 0 1em 0 0; - padding: 0 1em 0 0; -} -.article form ol ul, .article form ul ul, [dir='rtl'] .article form ol ul, [dir='rtl'] .article form -ul ul { - list-style: none; - margin: 0; - padding: 0; -} -.article form li { - margin: 0 0 20px; -} -.article form li li { - margin: 0 0 5px; -} -*/ -.article form label { - display: block; - margin: 0 0 5px; - padding: 0; -} -.article form input[type='text'], .article form select, .article form textarea, .article form -.checkbox-group, .article form .radio-group { - margin-bottom: 15px; -} -.checkbox-group input { - width: 13px; - height: 13px; - background: #fff; - border: solid 1px #c6c6c6; - float: left; -} -.article form .checkbox-group, .article form .radio-group { - display: block -} -.article form select { - border: solid 1px #ebebeb; - border-top-color: #ddd; - -webkit-appearance: none; - background: #f3f3f3 url(../images/arrows-up-down.png) right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 130px; -} - -.article form .browse .browse-msg { - font-size: 11.5px; -} -.article form .browse .button-secondary { - height: auto; - line-height: 25px; - font-size: 11px; - padding: 0 8px; - margin: 0 10px 15px 0; -} -.article form input[type='text'], .article form textarea { - border: 1px solid #ebebeb; - border-top-color: #dcdcdc; - color: #222; - line-height: normal; - padding: 6px 10px; - width: 300px; -} -.article form textarea { - height: 150px; -} -.article form input[type='text']:focus, .article form textarea:focus { - border-color: #33B5E5; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -o-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - outline: 0; -} -.article form input[disabled], .article form textarea[disabled], .article form label.form-disabled { - color: #999; -} -.article form input[type='text'][disabled], .article form textarea[disabled] { - background-color: #ebebeb; -} -form .form-error input[type='text'], form .form-error textarea { - border-color: #dd4b39; - margin-right: 20px; -} -.aside { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 20px; - color: #666; - position: relative; - background: #f9f9f9; -} -/* -.aside, .notification, .promo { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 10px; - position: relative; -} -.aside>:first-child, .notification>:first-child, .promo>:first-child { - margin-top: 0; -} -.aside>:last-child, .notification>:last-child, .promo>:last-child { - margin-bottom: 0; -} -.aside { - background: #f9f9f9; -} -.notification { - background: #fffbe4; - border-color: #f8f6e6; -} -.promo { - background: #f6f9ff; - border-color: #eff2f9; -} -*/ - -/* SDK TOS styles */ - -div.sdk-terms { - white-space: pre-wrap; - word-wrap: break-word; - font-family: inherit; - font-size: inherit; - padding: 10px; - height: 370px; - width: 738px; - border: 1px solid #444; - background: transparent; - overflow:auto; - margin:0 0 10px; -} - -div.sdk-terms.fullsize { - padding: 0; - height: auto; - width: auto; - border:none; -} - -div.sdk-terms h3, -div.sdk-terms h2 { - margin:0; -} - -div#sdk-terms-form { - padding:0 0 0 10px; -} - -div#sdk-terms-form input { - display:inline; - margin:4px 4px 4px 0; -} - - -/* -------------------------------------------------------------------------- -Code Style -*/ -pre { - margin:0 0 1em 0; - padding: 1em; - overflow: auto; - border: solid 1px #ddd; - background: #f7f7f7; -} -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; } -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -/* -------------------------------------------------------------------------- -Three-Pane -*/ -/* Package Nav & Classes Nav */ -.three-pane { - position: relative; - border-top: solid 1px #ebebeb; -} -#packages-nav .js-pane, -#classes-nav .js-pane { - overflow:visible; -} -#packages-nav { - height:270px; - max-height: inherit; - overflow: hidden; - position: relative; -} -#classes-nav { - overflow: hidden; - position: relative; -} -#packages-nav ul, #classes-nav ul { - list-style-type: none; - margin: 10px 0 20px 0; - padding: 0; -} -#classes-nav li { - font-weight: bold; - margin: 5px 0; -} -#packages-nav li, -#classes-nav li li { - margin: 0; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li a, #classes-nav li a:active, #classes-nav li a:visited { - padding: 0 0 0 4px; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited, -#nav-tree li a, #nav-tree li a:active, #nav-tree li a:visited { - color: #222; - font-weight: normal; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited { - display: block; -} -#packages-nav li.selected a, #packages-nav li.selected a:active, #packages-nav li.selected -a:visited, -#classes-nav li li.selected a, #classes-nav li li.selected a:active, #classes-nav li li.selected -a:visited, -#nav-tree li div.selected { - font-weight: 500; - color: #0099cc; - background-color:#fff; } - #packages-nav li.selected ul li a, - #classes-nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } -#nav-tree li div.selected a { - font-weight: 500; - color: #0099cc; -} -#nav-swap { - height:30px; - border-top:1px solid #ccc; -} -#nav-swap a { - display:inline-block; - height:100%; - color: #222; - font-size: 12px; - padding: 5px 0 5px 5px; -} - -#nav-swap .fullscreen { - float: right; - width: 24px; - height: 24px; - text-indent: -1000em; - padding:0; - margin:3px 5px 0; - background: url(../images/fullscreen.png) no-repeat -24px 0; -} -#nav-swap .fullscreen.disabled { - background-position: 0 0; -} -#nav-swap .fullscreen:hover, -#nav-swap .fullscreen:focus { - cursor:pointer; -} - - -/* nav tree */ -#side-nav, #devdoc-nav, #swapper, -#nav-tree, #tree-list { - overflow:hidden; - margin-left:0; -} - -#nav-tree ul { - list-style:none; - padding:0; - margin:10px 0; -} - -#nav-tree ul li div { - padding:0 0 0 4px; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - padding:0; - margin:0; -} -#nav-tree .children_ul li div { - padding:0 0 0 10px; -} -#nav-tree .children_ul .children_ul li div { - padding:0 0 0 20px; -} - -#nav-tree a.nolink { - color: #222; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; - outline:0; -} - - -/* Content */ -#doc-col { - margin-right:0; -} -#doc-content-container { - margin-left: 291px -} -#doc-header, #doc-content { - padding: 1em 2em; -} -#doc-header { - background: #f7f7f7; -} -#doc-header h1 { - line-height: 0; - margin-bottom: 15px; -} -#api-info-block { - float: right; - font-weight: bold; -} -#api-info-block a, #api-info-block a:active, #api-info-block a:visited { - color: #222; -} -#api-info-block a:hover, #api-info-block a:focus { - color: #33B5E5; -} -#api-nav-header { - height:19px; /* plus 16px padding = 35; same as #nav li */ - font-size:14px; - padding: 8px 0; - margin: 0; - border-bottom: 1px solid #CCC; - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); /* matches #nav li.expanded */ - -} -#api-nav-title { - padding:0 5px; - white-space:nowrap; -} - -#api-level-toggle { - float:right; - padding:0 5px; -} - -#api-level-toggle label { - margin:0; - vertical-align:top; - line-height: 19px; - font-size:13px; - height: 19px; -} - -#api-level-toggle .select-wrapper { - width: 35px; - display: inline-block; - overflow: hidden; -} -#api-level-toggle select { - border: 0; - appearance:none; - -moz-appearance:none; - -webkit-appearance: none; - background: transparent url(../images/arrows-up-down.png) 23px 5px no-repeat; - color: #222; - height: 19px; - line-height: 19px; - padding: 0; - margin:1px 0 0 0; - width:150%; - font-size:13px; - vertical-align:top; - outline:0; -} - - -/* Toggle for revision notes and stuff */ -div.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -#jd-content img.toggle-content-img { - margin:0 5px 5px 0; -} -div.toggle-content p { - margin:10px 0 0; -} -div.toggle-content-toggleme { - padding:0 0 0 15px; -} - - -/* API LEVEL FILTERED MEMBERS */ - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} -#devdoc-nav li.absent.selected, -#devdoc-nav li.absent.selected *, -#devdoc-nav div.label.absent.selected, -#devdoc-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - - - - - - - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; border-bottom: 1px solid #e4e4e4; } -/*body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; }*/ -.ui-resizable-s { cursor: s-resize; height: 10px; width: 100% !important; bottom: -11px; left: 0; -border-bottom: solid 1px #ededed; - background: #f7f7f7 url("../images/resizable-s2.png") no-repeat scroll center center; } -/* -.ui-resizable-e { -cursor: e-resize; width: 10px; right: 0; top: 0; height: 100%; border-right: solid -1px #ededed;background: #f7f7f7 url("../images/resizable-e2.png") no-repeat scroll center center; } -*/ - -/* -------------------------------------------------------------------------- -Lightbox -*/ -.lightbox { - width: 769px; - padding: 1.5em; - margin: 0 auto; - border: solid 1px #dcdcdc; - background: #fff; - -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - box-shadow: 1px 1px 5px rgba(0,0,0,0.1) -} -.lightbox .header { - float: left; - width: 720px; - margin: -10px 20px 10px 0; -} -.lightbox .close { - float: right; - width: 10px; - height: 10px; - margin: -10px -10px 10px 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; -} -.lightbox .close:hover, .lightbox .close:focus { - background-position: -10px 0; -} - -/* -------------------------------------------------------------------------- -Butterbar -*/ -#butterbar-wrapper { - position:absolute; - top:0; - left:0; - width:100%; -} -#butterbar { - width:940px; - margin:0 auto; -} -#butterbar-message { - background-color:#f80; - float:right; - font-size:12px; - font-weight:bold; - padding:0 10px; - border-radius: 0 0 5px 5px; -} -#butterbar-message a {color:#fff !important} -#butterbar-message a:hover {text-decoration:underline;} - -/* -------------------------------------------------------------------------- -Misc -*/ - - -.clearfix:before, .clearfix:after { - content: ""; - display: table -} -.clearfix:after { - clear: both -} -.clearfix { - *zoom: 1 -} -table.blank th, table.blank td { - border: 0; - background: none -} -.caption { - margin: 0.5em 0 2em 0; - color: #000; - font-size: 11.5px; -} - -.nolist { - list-style:none; - margin-left:0; -} -#tb .nolist { - margin-left:15px; -} - - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -10px 0 20px; - font-size:13px; - color:#666; -} - -div.figure { - float:right; - clear:right; - margin:10px 0 0 0; - padding:0 0 0 20px; - /* width must be defined w/ an inline style matching the image width */ -} - -p.table-caption { - margin: 0 0 4px 0; - font-size:13px; - color:#666; -} - -p.code-caption { - margin: 0 0 4px 0; - font: 13px/1.5 'courier new', courier, monospace; - color:#666; -} - -div.note, -div.caution, -div.warning { - margin: 0 0 15px; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - padding: 0 0 0 10px; - border-left: 4px solid; -} - -p.note, div.note { - border-color: #258AAF; -} - -p.caution, div.caution { - border-color: #FF8800; -} - -p.warning, div.warning { - border-color: #ff4443; -} - -div.note.design { - border-left: 4px solid #33B5E5; -} - -div.note.develop { - border-left: 4px solid #F80; -} - -div.note.distribute { - border-left: 4px solid #9C0; -} - -.note p, .caution p, .warning p { - margin:0 0 5px; -} - -.note p:last-child, .caution p:last-child, .warning p:last-child { - margin-bottom:0; -} - -body.about blockquote { - display:block; - float:right; - width:280px; - font-size:20px; - font-style:italic; - line-height:24px; - color:#33B5E5; - margin:0 0 20px 30px; -} - -div.design-announce p { - margin:0 0 10px; -} - -#devdoc-nav a.totop { - display:block; - top:0; - width:inherit; - background: transparent url(../images/styles/gototop.png) no-repeat scroll 50% 50%; - text-indent:-9999em; -} -#devdoc-nav a.totop { - position:fixed; - display:none; -} -#devdoc-nav a.totop:hover { - background-color:#33B5E5; -} - -.content-footer a.totop { - text-transform:uppercase; - line-height:30px; -} - -.expandable { - height:34px; - padding-left:20px; - position:relative; -} -.expandable:before { - content: ''; - background-image: url(../images/styles/disclosure_down.png); - background-repeat:no-repeat; - background-position: -12px -9px; - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - top: 0; - left: 0; } -} -.expandable.expanded:before { - background-image: url(../images/styles/disclosure_up.png); -} - - - -/* ----------------------------------------------- -Dialog box for popup messages -*/ - -div.dialog { - height:0; - margin:0 auto; -} - -div.dialog>div { - z-index:99; - position:fixed; - margin:70px 0; - width: 391px; - height: 200px; - background: #F7F7F7; --moz-box-shadow: 0 0 15px rgba(0,0,0,0.5); --webkit-box-shadow: 0 0 15px rgba(0,0,0,0.5); -box-shadow: 0 0 15px rgba(0,0,0,0.5); -} -/* IE6 can't position fixed */ -* html div.dialog div { position:absolute; } - - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #999; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - - -/* -------------------------------------------------------------------------- -Slideshow Controls & Next/Prev -*/ -.slideshow-next, .slideshow-prev { - width: 20px; - height: 36px; - text-indent: -1000em; -} -.slideshow-container { - margin: 2em 0; -} -.slideshow-container:before, .slideshow-container:after { - content: ""; - display: table; - clear: both; -} -a.slideshow-next, a.slideshow-next:visited { - - float: right; - - background: url(../images/arrow-right.png) no-repeat 0 0 - -} - -a.slideshow-prev, a.slideshow-prev:visited { - - float: left; - - background: url(../images/arrow-left.png) no-repeat 0 0 - -} - -.slideshow-next:hover, .slideshow-prev:hover, .slideshow-next:focus, .slideshow-prev:focus { - - background-position: 0 -36px - -} - -.slideshow-next:active, .slideshow-prev:active { - - background-position: 0 -72px - -} -.slideshow-nav { - width: 74px; - margin: 0 auto; -} -.slideshow-nav a, .slideshow-nav a:visited { - display: inline-block; - width: 12px; - height: 12px; - margin: 0 2px 20px 2px; - background: #ccc; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} -.slideshow-nav a:hover, .slideshow-nav a:focus { - - background: #33B5E5 -} - -.slideshow-nav a:active { - - background: #1e799a; - background: #ebebeb; - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); -} -.slideshow-nav a.active, .slideshow-nav a.active:active, .slideshow-nav a.active:visited { - background: #33B5E5 -} -/* -------------------------------------------------------------------------- -Tabs -*/ -ul.tabs { - padding: 0; - margin: 2em 0 0 0; -} -ul.tabs:before, ul.tabs:after { - content: ""; - display: table; - clear: both; -} -ul.tabs li { - list-style-type: none; - float: left; -} -ul.tabs li a, ul.tabs li a:active, ul.tabs li a:visited { - display: block; - height: 36px; - line-height: 36px; - padding: 0 15px; - margin-right: 2px; - color: #222; - -moz-border-radius-topleft: 2px; - -moz-border-radius-topright: 2px; - -moz-border-radius-bottomright: px; - -moz-border-radius-bottomleft: px; - -webkit-border-radius: 2px 2px px px; - border-radius: 2px 2px px px; - border-top: solid 1px #ebebeb; - border-left: solid 1px #ebebeb; - border-right: solid 1px #ebebeb; - background-color: #fff; - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#fafafa)); - background-image: -webkit-linear-gradient(top, #ffffff, #fafafa); - background-image: -moz-linear-gradient(top, #ffffff, #fafafa); - background-image: -ms-linear-gradient(top, #ffffff, #fafafa); - background-image: -o-linear-gradient(top, #ffffff, #fafafa); - background-image: linear-gradient(top, #ffffff, #fafafa); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', -EndColorStr='#fafafa'); -} -ul.tabs li a:hover { - color: #33B5E5; -} -ul.tabs li a.selected { - height: 37px; - color: #33B5E5; - background-color: #f7f7f7; - background-image: none; - border-color: #ddd; -} -.tab-content { - padding: 1.2em; - margin: -1px 0 2em 0; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - border: solid 1px #ddd; - background: #f7f7f7; -} -/* -------------------------------------------------------------------------- -Feature Boxes -*/ -.feature-box { - width: 291px; - height: 200px; - position: relative; - background: #F7F7F7; -} -.box-border .top, .box-border .bottom, .box-border .left, .box-border .right { - z-index: 100; - position: absolute; - background-color: #aaa; -} -.box-border .top, .box-border .bottom { - width: 291px; - height: 1px; -} -.dialog .box-border .top, -.dialog .box-border .bottom { width:391px; } - -.box-border .left, .box-border .right { - width: 1px; - height: 8px; -} -.box-border .top { top: 0; left: 0 } -.box-border .top .left { top: 1px; left: 0 } -.box-border .top .right { top: 1px; right: 0 } -.box-border .bottom .left { top: -8px; left: 0 } -.box-border .bottom { top: 200px; left: 0 } -.box-border .bottom .right { top: -8px; right: 0 } - -.feature-box h4, -.dialog h4 { - margin: 15px 18px 10px; - padding:0; -} - -.feature-box p, -.dialog p { - margin: 10px 18px; - padding:0; -} -.feature-box .link, -.dialog .link { - border-top: 1px solid #dedede; - bottom: 0; - position: absolute; - width: inherit; -} -.feature-box a, .feature-box h4, -.dialog a, .dialog h4 { - -webkit-transition: color .4s ease; - -moz-transition: color .4s ease; - -o-transition: color .4s ease; - transition: color .4s ease; -} -.feature-box:hover { - cursor: pointer; -} -.feature-box:hover .box-border .top, .feature-box:hover .box-border .bottom, .feature-box:hover -.left, .feature-box:hover .right { - background-color: #33B5E5; -} -.feature-box:hover h4, .feature-box:hover a { - color: #33B5E5; -} -/* -------------------------------------------------------------------------- -Page-Specific Styles -*/ -.colors { - position: relative; - float: left; - width: 92px; - margin: 40px 0 20px; -} -.colors div { - color: #fff; - font-size: 11.5px; - width: 82px; - height: 82px; - margin-top:-30px; - line-height: 82px; - text-align: center; - border: solid 5px #fff; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} - - - - - - - - - - - - - - -/* ########### REFERENCE DOCS ################## */ - -#packages-nav h2, -#classes-nav h2 { - font-size:18px; - margin:0; - padding:0 0 0 4px; -} - -#jd-header { - padding: 0 0 5px; - margin: 20px 0 10px; - font-size:13px; - border-bottom:solid 1px #ccc; -} - -#jd-header h1 { - margin:0; - padding:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:13px; - margin:20px 0 0; - padding:0 10px 6px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-info-block div.api-level { - font-weight:bold; - font-size:inherit; - float:none; - color:#222; - padding:0; - margin:0; -} - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:13px; - background-color:transparent; -} -.jd-inheritance-table tr td { - border: none; - margin: 0; - padding: 0; - background-color:transparent; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - - - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; - background-color:transparent; - font-size:13px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -#jd-content img.jd-expando-trigger-img { - padding:0 4px 4px 0; - margin:0; -} - -.jd-sumtable-subclasses div#subclasses-direct, -.jd-sumtable-subclasses div#subclasses-indirect { - margin:0 0 0 13px; -} - - - -/********* MEMBER REF *************/ - - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} -body.google h4.jd-details-title { - background-color: #FFF; - padding-top:5px; - border-top: 1px solid #ccc; -} -body.google table.jd-sumtable th { - background-color: #FFF; - color:#000; -} - -h4.jd-tagtitle { - margin:0; -} - -h4 .normal { - font-weight:normal; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; - background-color:transparent; - width:auto; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -/* Inline api level indicator for methods */ -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 8px 0; - margin-top:-30px; -} - -table.jd-tagtable td, -table.jd-tagtable th { - background-color:transparent; -} - -table.jd-tagtable th { - color:inherit; -} - - - - - - - - - - - - - - - - - - - - - - - -/* SEARCH FILTER */ - -#search_autocomplete { - font-weight:normal; -} - -#search_filtered_wrapper { - width: 193px; - float: right; -} -#search_filtered_div { - position:absolute; - z-index:9999; - min-width:171px; /* +padding and border makes this match input width */ - padding:5px; - border: solid 1px #C5C5C5; - background: white; - top: 35px; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} - -ul#search_filtered { - min-width:100%; - margin:0; - list-style: none; - margin: 0; - padding: 0; -} - - -#search_filtered li{ - line-height:1.5em; - margin: 0 0 2px; - padding: 0; -} - -#search_filtered li a { - padding:0 5px; - color:#222 !important; -} - -#search_filtered .jd-selected { - background-color: #33B5E5; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#f7f7f7 !important; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-item { - display: table-row; -} -.hide-item { - display: hidden; -} - - - - - -/* SEARCH RESULTS */ - - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; - padding:0; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -#leftSearchControl .gsc-webResult { - padding:0 0 20px 0; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - - -#searchResults { - overflow:hidden; /* because the repositioned page links makes the section think it needs to scroll -(it doesn't) */ - height:auto; -} - -#searchResults .gsc-control { - position:relative; - width:auto; - padding:0 0 10px; -} - -#searchResults .gsc-tabsArea { - position:relative; - white-space:nowrap; - float:left; - width:200px; -} - -#searchResults .gsc-above-wrapper-area { - display:none; -} - -#searchResults .gsc-resultsbox-visible { - float:left; - width:720px; - margin-left:20px; -} - -#searchResults .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; - display:block; -} - -#searchResults h2#searchTitle { - padding:0; - margin:5px 0; - border:none; -} - -#searchResults h2#searchTitle em { - font-style:normal; - color:#33B5E5; -} - -#searchResults .gsc-table-result { - margin:5px 0 10px 0; - background-color:transparent; -} -#searchResults .gs-web-image-box, .gs-promotion-image-box { - width:120px; -} -#searchResults .gs-web-image-box img.gs-image, .gs-promotion-image-box img.gs-promotion-image { - max-width:120px; -} - -#searchResults .gsc-table-result .gsc-thumbnail { - padding:0 20px 0 0; -} - -#searchResults td { - background-color:transparent; -} - -#searchResults .gsc-expansionArea { - position:relative; -} -#searchResults .gsc-tabsArea .gsc-cursor-box { - width:200px; - padding:20px 0 0 1px; -} -#searchResults .gsc-cursor-page { - display:inline-block; - float:left; - margin:-1px 0 0 -1px; - padding:0; - height:27px; - width:27px; - text-align:center; - line-height:2; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive, -#searchResults .gsc-cursor-page { - text-decoration:none; - color:#258AAF; - border: solid 1px #DADADA; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive:hover, -#searchResults .gsc-cursor-page:hover { - border-color: #DBDBDB; - background-color: #F3F3F3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#F9F9F9), to(#ECECEC)); - background-image: -webkit-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -moz-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -ms-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: -o-linear-gradient(top, #F9F9F9, #ECECEC); - background-image: linear-gradient(top, #F9F9F9, #ECECEC); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f9f9f9', -EndColorStr='#ececec'); - color: #33B5E5; -} - -#searchResults .gsc-tabHeader.gsc-tabhActive, -#searchResults .gsc-tabHeader.gsc-tabhActive:hover, -#searchResults .gsc-cursor-page.gsc-cursor-current-page, -#searchResults .gsc-cursor-page.gsc-cursor-current-page:hover { - color:#fff; - background-color: #09C; - background-image: -webkit-gradient(linear, left top, left bottom, from(#2FADDB), to(#09C)); - background-image: -webkit-linear-gradient(top, #2FADDB, #09C); - background-image: -moz-linear-gradient(top, #2FADDB, #09C); - background-image: -ms-linear-gradient(top, #2FADDB, #09C); - background-image: -o-linear-gradient(top, #2FADDB, #09C); - background-image: linear-gradient(top, #2FADDB, #09C); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#2faddb', EndColorStr='#09c'); - border: 1px solid #3990AB; - z-index:100; -} - -} - - - - - - - - - - - - - -/*********** PREVIOUSLY dac-styles.css ***************/ - - - - - -::-webkit-selection, -::-moz-selection, -::selection { - background-color: #0099cc; - color: #fff; } - -#header { - border-bottom:0; -} - -#header .wrap { - max-width:940px; - height:41px; - border-bottom:1px solid; - border-color: #ccc; - position:relative; -} - -.about #header .wrap { - border-color: #9933CC; -} - -.design #header .wrap { - border-color: #33b5e5; -} - -.develop #header .wrap { - border-color: #F80; -} - -.distribute #header .wrap { - border-color: #9C0; -} - -.logo a { - width:123px; - float:left; -} - -#header .logo { - margin-top: -6px; - margin-left: 0px; - margin-bottom:0px; - width: 160px; - padding-right:10px; -} - -.search { - height:25px; - margin-top: -3px; - margin-bottom: 0px; -} - - - -/* Quicknav */ -.btn-quicknav { - width:20px; - height:28px; - float:left; - margin-left:6px; - padding-right:10px; - position:relative; - cursor:pointer; - border-right:1px solid #CCC; -} - -.btn-quicknav a { - zoom:1; - position:absolute; - top:13px; - left:5px; - display:block; - text-indent:-9999em; - width:10px; - height:5px; - background:url(../images/quicknav_arrow.png) no-repeat; -} - -.btn-quicknav a.arrow-active { - background-position: 0 -5px; - display:none; -} - -#header-wrap.quicknav a.arrow-inactive { - display:none; -} - -.btn-quicknav.active a.arrow-active { - display:block; -} - -.nav-x li { - display:block; - float:left; - margin-right:45px; - -webkit-transition: all 0.25s linear; - -moz-transition: all 0.25s linear; - -ms-transition: all 0.25s linear; - -o-transition: all 0.25s linear; - transition: all 0.25s linear; -} - -#header-wrap.quicknav .nav-x li { - min-width:160px; - margin-right:20px; -} - -#header-wrap.quicknav li.last { - margin-right:0px; -} - -#quicknav { - float:none; - clear:both; - margin-left:180px; - margin-top:-30px; - display:none; - overflow:hidden; -} - -#header-wrap.quicknav #quicknav { - -} - -#quicknav ul { - margin:10px 0; - padding:0; -} - -#quicknav ul li.design { - border-top:1px solid #33b5e5; -} - -#quicknav ul li.develop { - border-top:1px solid #FF8800; -} - -#quicknav ul li.distribute { - border-top:1px solid #99cc00; -} - -#quicknav ul li { - display:block; - float:left; - margin:0 20px 0 0; - min-width:140px; -} - -#quicknav ul li.last { - margin-right:0px; -} - -#quicknav ul li ul li { - float:none; -} - -#quicknav ul li ul li a { - color:#222; -} - -#quicknav ul li li ul, -#quicknav ul li li ul li { - margin:0; -} - -#quicknav ul li li ul li:before { - content:"\21B3"; -} - -#header-wrap { - -webkit-transition: all 0.25s ease-out; - -moz-transition: all 0.25s ease-out; - -ms-transition: all 0.25s ease-out; - -o-transition: all 0.25s ease-out; - transition: all 0.25s ease-out; - -} - -#header-wrap.quicknav { - height:196px; - -} - -/* SEARCH AND MORE */ -.search { - position: absolute; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - z-index:100; - right:54px; - -webkit-transition: width 0.4s ease; - -moz-transition: width 0.4s ease; - -o-transition: width 0.4s ease; - transition: width 0.4s ease; -} - -.search #search-btn { - width:50px; - height:28px; - background:url(../images/icon_search.png) no-repeat; - float:left; -} - -.search-inner { - width:245px; -} - -.search:hover, .search.active { - width:245px; -} - -.search .bottom, .search .left, .search .right { - position: absolute; - background-color: #a2a2a2 -} - -.search .bottom { - width: 214px; - height: 1px; - top: 24px; - left: 0 -} - -.search .left, .search .right { - height: 5px; - width: 1px -} - -.search .left { - top: 22px; - left: 56px; - background-color:#CCC; -} - -.search .right { - top: 22px; - left: 238px; - background-color:#CCC; -} - -.search form { - margin-top: 2px; - width: 162px; - float:left; -} - -.search form input { - color: #2f2f2f; - font-size: 0.95em; - width: 178px; - border: none; - margin-left: 6px; - z-index: 1500; - position: relative; - background-color: transparent; - border-bottom:1px solid #CCC; - padding:0 0 0 4px; - outline:none; - height:24px; -} - -.search:hover form input { - border-bottom:1px solid #33B5E5; -} - -.search:hover .bottom, .search:hover .left, .search:hover .right { - background-color: #33b5e5; -} - -.search:hover #search-btn { - background-position: 0 -28px -} - -.search form input:focus { - color: #222; - font-weight: bold -} - -.moremenu { - float: right; - position: relative; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - -webkit-transition: width 0.25s ease; - -moz-transition: width 0.25s ease; - -o-transition: width 0.25s ease; - transition: width 0.25s ease; -} - -.moremenu #more-btn { - width:40px; - height:28px; - background:url(../images/icon_more.png) no-repeat; - border-left:1px solid #CCC; - float:left; - cursor:pointer; -} - -.moremenu:hover #more-btn { - background-position:0 -28px; -} - -.morehover { - position:absolute; - right:6px; - top:-9px; - width:40px; - height:35px; - z-index:99; - overflow:hidden; - - -webkit-opacity:0; - -moz-opacity:0; - -o-opacity:0; - opacity:0; - - -webkit-transform-origin:100% 0%; - -moz-transform-origin:100% 0%; - -o-transform-origin:100% 0%; - transform-origin:100% 0%; - - -webkit-transition-property: -webkit-opacity; - -webkit-transition-duration: .25s; - -webkit-transition-timing-function:ease; - - -moz-transition-property: -webkit-opacity; - -moz-transition-duration: .25s; - -moz-transition-timing-function:ease; - - -o-transition-property: -webkit-opacity; - -o-transition-duration: .25s; - -o-transition-timing-function:ease; - - -transition-property: -webkit-opacity; - -transition-duration: .25s; - -transition-timing-function:ease; -} - -.morehover:hover, -.morehover.hover { - opacity:1; - height:385px; - width:268px; - -webkit-transition-property:height, -webkit-opacity; -} - -.morehover .top { - width:268px; - height:39px; - background:url(../images/more_top.png) no-repeat; -} - -.morehover .mid { - width:228px; - background:url(../images/more_mid.png) repeat-y; - padding:10px 20px 0 20px; -} - -.morehover .mid .header { - border-bottom:1px solid #ccc; - font-weight:bold; -} - -.morehover .bottom { - width:268px; - height:6px; - background:url(../images/more_bottom.png) no-repeat; -} - -.morehover ul { - margin:10px 10px 20px 0; -} - -.morehover ul li { - list-style:none; -} - -.morehover ul li.active a, -.morehover ul li.active a:hover { - color:#222 !important; -} - -.morehover ul li.active img { - margin-right:4px; -} - - - - -/* MARQUEE */ -.slideshow-container { - width:100%; - overflow:hidden; - position:relative; -} -.slideshow-container .slideshow-prev { - position:absolute; - top:50%; - left:0px; - margin-top:-36px; - z-index:99; -} -.slideshow-container .slideshow-next { - position:absolute; - top:50%; - margin-top:-36px; - z-index:99; - right:0px; -} - -.slideshow-container .pagination { - position:absolute; - bottom:20px; - width:100%; - text-align:center; - z-index:99; -} -.slideshow-container .pagination ul { - margin:0; -} -.slideshow-container .pagination ul li{ - display: inline-block; - width:12px; - height:12px; - text-indent:-8000px; - list-style:none; - margin: 0 2px; - border-radius:6px; - background-color:#ccc; - cursor:pointer; - -webkit-transition:color .5s ease-in; - -moz-transition:color .5s ease-in; - -o-transition:color .5s ease-in; - transition:color .5s ease-in; -} -.slideshow-container .pagination ul li:hover { - background-color:#999; -} -.slideshow-container .pagination ul li.active { - background-color:#33b5e5; -} -.slideshow-container .pagination ul li.active:hover { - background-color:#33b5e5; -} -.slideshow-container ul li { - display:inline; - list-style:none; -} - - - - -a.download-sdk { - float:right; - margin:-10px 0; - height:30px; - padding-top:4px; - padding-bottom:0px; -} - -#nav-x { - padding-top: 14px; -} - -#nav-x .wrap { - min-height:34px; -} - -#nav-x .wrap, -#searchResults.wrap { - max-width:940px; - border-bottom:1px solid #CCC; -} - -#searchResults.wrap #leftSearchControl { - min-height:700px -} -.nav-x { - margin-left:0; - margin-bottom:0; -} - - - - - - - - - - -/* - * CSS Styles that are needed by jScrollPane for it to operate correctly. - */ - -.jspContainer { - overflow: hidden; - position: relative; -} - -.jspPane { - position: absolute; - overflow: hidden; - width:auto !important; /* to avoid cut-off api names in reference in horiz scroll */ -} - -.jspVerticalBar { - position: absolute; - top: 0; - right: 0; - width: 4px; - height: 100%; - background: #f5f5f5; -} - -.jspHorizontalBar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 4px; - background: #f5f5f5; -} - -.jspVerticalBar *, -.jspHorizontalBar * { - margin: 0; - padding: 0; -} -.jspCap { - display: block; -} - -.jspVerticalBar .jspCap { - height: 4px; -} - -.jspHorizontalBar .jspCap { - width: 0; - height: 100%; -} - -.jspHorizontalBar .jspCap { - float: left; -} - -.jspTrack { - position: relative; -} - -.jspDrag { - background: #bbb; - position: relative; - top: 0; - left: 0; - cursor: pointer; -} - -.jspDrag:hover, -.jspDrag:active { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, right top, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: linear-gradient(left, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', EndColorStr='#4cadcb'); -} - -.jspHorizontalBar .jspTrack, -.jspHorizontalBar .jspDrag { - float: left; - height: 100%; -} - -.jspArrow { - background: #999; - text-indent: -20000px; - display: block; - cursor: pointer; -} - -.jspArrow.jspDisabled { - cursor: default; - background: #ccc; -} - -.jspVerticalBar .jspArrow { - height: 16px; -} - -.jspHorizontalBar .jspArrow { - width: 16px; - float: left; - height: 100%; -} - -.jspVerticalBar .jspArrow:focus { - outline: none; -} - -.jspCorner { - float: left; - height: 100%; -} - -/* Yuk! CSS Hack for IE6 3 pixel bug :( */ -* html .jspCorner { - margin: 0 -3px 0 0; -} -/******* end of jscrollpane *********/ - - - - - -/************ DEVELOP HOMEPAGE ******************/ - -/* Slideshow */ -.slideshow-develop { - height: 300px; - width: 940px; - position: relative; - overflow:hidden; -} -.slideshow-develop .frame { - width: 940px; - height: 300px; -} -.slideshow-develop img.play { - max-width:350px; - max-height:240px; - margin:20px 0 0 90px; - -webkit-transform: perspective(800px ) rotateY( 35deg ); - box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -moz-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); -} -.slideshow-develop img.play.no-shadow { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} -.slideshow-develop img.play.no-transform { - -webkit-transform: none; -} -.slideshow-develop a.slideshow-next { - background: url(../images/arrow-right-develop.png); -} -.slideshow-develop a.slideshow-prev { - background: url(../images/arrow-left-develop.png); -} -.slideshow-develop .content-right { - float: left; -} -.slideshow-develop .content-right h2 { - padding:0; - margin-bottom:10px; - border:none; -} -.slideshow-develop .item { - height: 300px; - width: 940px; -} -.slideshow-develop .pagination ul li.active { - background-color: #F80; -} -.slideshow-develop .pagination ul li.active:hover { - background-color: #F80; -} -.slideshow-develop .item hr { - margin:5px 0 10px; -} -.slideshow-develop .item p { - margin:10px 0; -} -.slideshow-develop .item p.title-intro { - position:absolute; - margin:0; -} - -/* Feeds */ -.feed ul { - margin: 0; -} -.feed .feed-nav { - height: 25px; - border-bottom: 1px solid #CCC; -} -.feed .feed-nav li { - list-style: none; - float: left; - height: 21px; /* +4px bottom border = 25px; same as .feed-nav */ - margin-right: 25px; - cursor: pointer; -} -.feed .feed-nav li.active { - color: #000; - border-bottom: 4px solid #F80; -} -.feed .feed-container { - overflow: hidden; - width: 460px; -} -.feed .feed-container .feed-frame { - width: 1000px; -} -.feed .feed-container .feed-frame ul { - float: left; - width:460px; -} -.feed .feed-container .feed-frame ul ul { - float: none; - margin:10px 0 0 30px; -} -.feed .feed-container .feed-frame li { - list-style: none; - margin: 20px 0 20px 0; - width: 460px; - height:93px; -} -.feed .feed-container .feed-frame li.playlist { - height:auto; -} -.feed .feed-container .feed-frame li.playlist a { - height:93px; - display:block; -} -.feed .feed-container .feed-frame li.more { - height:20px; - margin:10px 0 5px 5px; -} -.feed .feed-container .feed-frame li.more a { - height:inherit; -} -.feed .feed-container .feed-frame li.playlist-video { - list-style: none; - margin: 0; - width: 460px; - height:55px; - font-size:12px; -} -.feed .feed-container .feed-frame li.playlist-video a { - height:45px; - padding:5px; -} -.feed .feed-container .feed-frame li.playlist-video h5 { - font-size:12px; - line-height:13px; - margin:0; -} -.feed .feed-container .feed-frame li.playlist-video p { - margin:5px 0 0; - line-height:15px; -} -.feed-container .feed-frame div.feed-image { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; - background:url('../images/blog-default.png') no-repeat 0 0; - background-size:180px; -} -#jd-content .feed .feed-container .feed-frame li img { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; -} -#jd-content .feed .feed-container .feed-frame li.playlist-video img { - width:inherit; - height:inherit; -} - -.feed .feed-container .feed-frame li a, -.feed .feed-container .feed-frame li a:active { - color:#555 !important; -} - -.feed .feed-container .feed-frame li a:hover, -.feed .feed-container .feed-frame li a:hover * { - color:#7AA1B0 !important; -} - -/* Video player */ -#player-wrapper { - display:none; - margin: -1px auto 0; - position: relative; - width: 940px; - height: 0px; -} -#player-frame { - background: #EFEFEF; - border: 1px solid #CCC; - padding: 0px 207px; - z-index: 10; /* stay above marque, but below search suggestions */ - width: 525px; - height: 330px; - position: relative; -} - - - -/************ DISTRIBUTE HOMEPAGE ***************/ - -.marquee { - width: 760px; -} -.marquee .main-img { - float: left; - margin-top: 20px; - width: 490px; -} -.marquee .copy { - width: 270px; - float: left; - margin-top: 30px; -} -.distribute-features { - margin: 0; -} -.distribute-features ul { - margin: 0; -} -.distribute-features ul li { - list-style: none; - float: left; - border-top: 1px solid #9C0; - width: 220px; - margin-right: 50px; -} -.distribute-features ul li.last { - margin-right: 0px; -} - - - -/************ DEVELOP TOPIC CONTAINERS ************/ - -.landing-banner, -.landing-docs { - margin:20px 0 0; -} -.landing-banner div:first-child, -.landing-docs div:first-child, -.landing-docs .col-12 { - margin-left:0; - min-height:280px; -} -.landing-banner div:last-child, -.landing-docs div:last-child, -.landing-docs .col-12 { - margin-right:0; -} - -.landing-banner h1 { - margin-top:0; -} -.landing-docs { - clear:left; - overflow:hidden; -} -.landing-docs h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - margin:0 0 20px; -} -.landing-docs a { - color:#333 !important; -} - -.landing-docs a:hover, -.landing-docs a:hover * { - color:#7AA1B0 !important -} - -.landing-docs .normal-links a { - color:#258aaf !important; -} - -.plusone { - float:right; -} - - - -/************* HOME/LANDING PAGE *****************/ - -.slideshow-home { - height: 500px; - width: 940px; - border-bottom: 1px solid #CCC; - position: relative; - margin: 0; -} -.slideshow-home .frame { - width: 940px; - height: 500px; -} -.slideshow-home .content-left { - float: left; - text-align: center; - vertical-align: center; - margin: 0 0 0 35px; -} -.slideshow-home .content-right { - margin: 80px 0 0 0; -} -.slideshow-home .content-right p { - margin-bottom: 10px; -} -.slideshow-home .content-right p:last-child { - margin-top: 15px; -} -.slideshow-home .content-right h1 { - padding:0; -} -.slideshow-home .item { - height: 500px; - width: 940px; -} -.home-sections { - padding: 30px 20px 20px; - margin: 20px 0; - background: -webkit-linear-gradient(top, #F6F6F6,#F9F9F9); -} -.home-sections ul { - margin: 0; -} -.home-sections ul li { - float: left; - display: block; - list-style: none; - width: 170px; - height: 35px; - border: 1px solid #ccc; - background: white; - margin-right: 10px; - border-radius: 1px; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - box-shadow: 1px 1px 5px #EEE; - -webkit-box-shadow: 1px 1px 5px #EEE; - -moz-box-shadow: 1px 1px 5px #EEE; - background: white; -} -.home-sections ul li:hover { - background: #F9F9F9; - border: 1px solid #CCC; -} -.home-sections ul li a, -.home-sections ul li a:hover { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width: 100%; - text-align: center; - color: #09c !important; -} -.home-sections ul li a { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width:100%; - text-align:center; -} -.home-sections ul li img { - float: left; - margin: -8px 0 0 10px; -} -.home-sections ul li.last { - margin-right: 0px; -} -.fullpage #footer { - margin-top: -40px; -} diff --git a/tools/droiddoc/templates-ds/assets/css/fullscreen.css b/tools/droiddoc/templates-ds/assets/css/fullscreen.css deleted file mode 100644 index 71cf65b129e..00000000000 --- a/tools/droiddoc/templates-ds/assets/css/fullscreen.css +++ /dev/null @@ -1,200 +0,0 @@ - -/* ============================================================================= - Columns - ========================================================================== */ -/* Applied to body to debug layout alignments -.grid { - width:100%; - height:100%; - background:url(../images/grid.png) center repeat-y; - top:0px; - margin:auto; - position:absolute; -} -*/ - -@media screen, projection, print { -.full { - padding: 2.5em 0; - border-top: solid 1px #ddd; - border-bottom: solid 1px #ddd; - background: #f7f7f7; -} -.wrap { - margin: 0 auto; - width: 100%; - min-width:600px; - clear: both; -} -.cols { - height: 1%; - margin: 0 -1.533742331288343558282%; - width: 103.06748466257669%} -*+html .cols { - margin-bottom: 20px; -} -.cols:after { - clear: both; - content: ' '; - display: block; - height: 0; - visibility: hidden; -} -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, -.col-13, .col-14, .col-15, .col-16 { - float: left; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -* html .col-1, * html .col-2, * html .col-3, * html .col-4, * html .col-5, * html .col-6, * html -.col-7, * html .col-8, * html .col-9, * html .col-10, * html .col-11, * html .col-12, * html -.col-13, * html .col-14, * html .col-15, * html .col-16 { - margin: 0; - margin: 0 1.063829787234% 20px 1.063829787234%; -} -[dir='rtl'] .col-1, [dir='rtl'] .col-2, [dir='rtl'] .col-3, [dir='rtl'] .col-4, [dir='rtl'] .col-5, -[dir='rtl'] .col-6, [dir='rtl'] .col-7, [dir='rtl'] .col-8, [dir='rtl'] .col-9, [dir='rtl'] .col-10, -[dir='rtl'] .col-11, [dir='rtl'] .col-12 { - float: right; -} -.col-1 { - width: 4.16666666666667%; -} -.col-2 { - width: 10.4166666666667%; -} -.col-3 { - width: 16.6666666666667%; -} -.col-4 { - width: 22.9166666666667%; -} -.col-5 { - width: 29.1666666666667%; -} -.col-6 { - width: 35.4166666666667%; -} -.col-7 { - width: 41.6666666666667%; -} -.col-8 { - width: 47.9166666666667%; -} -.col-9 { - width: 55.3333333333333%; -} -.col-10 { - width: 60.4166666666667%; -} -.col-11 { - width: 66.6666666666667%; -} -.col-12 { - width: 72.9166666666667%; -} -.col-13 { - width: 79.1666666666667%; -} -.col-14 { - width: 85.4166666666667%; -} -.col-15 { - width: 91.6666666666667%; -} -.col-16 { - width: 97.9166666666667%; -} - - - - - - - -#header .col-1, -#nav-x .col-1 { width: 40px } -#header .col-2, -#nav-x .col-2 { width: 100px } -#header .col-3, -#nav-x .col-3 { width: 160px } -#header .col-4, -#nav-x .col-4 { width: 220px } -#header .col-5, -#nav-x .col-5 { width: 280px } -#header .col-6, -#nav-x .col-6 { width: 340px } -#header .col-7, -#nav-x .col-7 { width: 400px } -#header .col-8, -#nav-x .col-8 { width: 460px } -#header .col-9, -#nav-x .col-9 { width: 520px } -#header .col-10, -#nav-x .col-10 { width: 580px } -#header .col-11, -#nav-x .col-11 { width: 640px } -#header .col-12, -#nav-x .col-12 { width: 700px } -#header .col-13, -#nav-x .col-13 { width: 760px } -#header .col-14, -#nav-x .col-14 { width: 820px } -#header .col-15, -#nav-x .col-15 { width: 880px } -#header .col-16, -#nav-x .col-16 { width: 940px } - - - -body { - padding:0 20px; -} -#header, -#searchResults, -#nav-x { - margin:0; -} -#body-content { - margin:0; -} -#body-content > .col-12 { - width:77.9804965%; - margin:0 0 0 0.97%; /* this percentage chosen to make IE9 happy */ -} -#side-nav { - width: 19.9804965%; - margin:0 1.063829787234% 0 0; -} - -#header .wrap { - max-width: 100%; -} - -#nav-x .wrap, -#searchResults.wrap { - max-width:100%; -} - -.nav-x { - margin:-2px 0 0 0; -} - -#devdoc-nav.fixed, -#devdoc-nav.fixed a.totop { - left:20px; /* !important ... for IE i think */ -} - - - - -} - -.col-right { - margin-right:0px; -} - -@media screen and (max-width:772px) { -.col-5, .col-6, .col-7 { - clear: both; - width: 97.0238096%} -} \ No newline at end of file diff --git a/tools/droiddoc/templates-ds/assets/design/default.js b/tools/droiddoc/templates-ds/assets/design/default.js deleted file mode 100644 index 3ba8486860a..00000000000 --- a/tools/droiddoc/templates-ds/assets/design/default.js +++ /dev/null @@ -1,188 +0,0 @@ -$(document).ready(function() { - // prep nav expandos - var pagePath = document.location.pathname; - if (pagePath.indexOf(SITE_ROOT) == 0) { - pagePath = pagePath.substr(SITE_ROOT.length); - if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { - pagePath += 'index.html'; - } - } - - if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { - // If running locally, SITE_ROOT will be a relative path, so account for that by - // finding the relative URL to this page. This will allow us to find links on the page - // leading back to this page. - var pathParts = pagePath.split('/'); - var relativePagePathParts = []; - var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push('..'); - } - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); - } - relativePagePathParts.push(pathParts[pathParts.length - 1]); - pagePath = relativePagePathParts.join('/'); - } else { - // Otherwise the page path should be an absolute URL. - pagePath = SITE_ROOT + pagePath; - } - - // select current page in sidenav and set up prev/next links if they exist - var $selNavLink = $('.nav-y').find('a[href="' + pagePath + '"]'); - if ($selNavLink.length) { - $selListItem = $selNavLink.closest('li'); - - $selListItem.addClass('selected'); - $selListItem.closest('li>ul').addClass('expanded'); - - // set up prev links - var $prevLink = []; - var $prevListItem = $selListItem.prev('li'); - if ($prevListItem.length) { - if ($prevListItem.hasClass('nav-section')) { - // jump to last topic of previous section - $prevLink = $prevListItem.find('a:last'); - } else { - // jump to previous topic in this section - $prevLink = $prevListItem.find('a:eq(0)'); - } - } else { - // jump to this section's index page (if it exists) - $prevLink = $selListItem.parents('li').find('a'); - } - - if ($prevLink.length) { - var prevHref = $prevLink.attr('href'); - if (prevHref == SITE_ROOT + 'index.html') { - // Don't show Previous when it leads to the homepage - $('.prev-page-link').hide(); - } else { - $('.prev-page-link').attr('href', prevHref).show(); - } - } else { - $('.prev-page-link').hide(); - } - - // set up next links - var $nextLink = []; - if ($selListItem.hasClass('nav-section')) { - // we're on an index page, jump to the first topic - $nextLink = $selListItem.find('ul').find('a:eq(0)') - } else { - // jump to the next topic in this section (if it exists) - $nextLink = $selListItem.next('li').find('a:eq(0)'); - if (!$nextLink.length) { - // no more topics in this section, jump to the first topic in the next section - $nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)'); - } - } - if ($nextLink.length) { - $('.next-page-link').attr('href', $nextLink.attr('href')).show(); - } else { - $('.next-page-link').hide(); - } - } - - // Set up expand/collapse behavior - $('.nav-y li').has('ul').click(function() { - if ($(this).hasClass('expanded')) { - return; - } - - // hide other - var $old = $('.nav-y li.expanded'); - if ($old.length) { - var $oldUl = $old.children('ul'); - $oldUl.css('height', $oldUl.height() + 'px'); - window.setTimeout(function() { - $oldUl - .addClass('animate-height') - .css('height', ''); - }, 0); - $old.removeClass('expanded'); - } - - // show me - $(this).addClass('expanded'); - var $ul = $(this).children('ul'); - var expandedHeight = $ul.height(); - $ul - .removeClass('animate-height') - .css('height', 0); - window.setTimeout(function() { - $ul - .addClass('animate-height') - .css('height', expandedHeight + 'px'); - }, 0); - }); - - // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away - // from the page) - $('.nav-y li').has('ul').find('a:eq(0)').click(function(evt) { - window.location.href = $(this).attr('href'); - return false; - }); - - // Set up play-on-hover
","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); - -/*! jQuery UI - v1.8.21 - 2012-06-05 -* https://github.com/jquery/jquery-ui -* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.effects.core.js, jquery.effects.blind.js, jquery.effects.bounce.js, jquery.effects.clip.js, jquery.effects.drop.js, jquery.effects.explode.js, jquery.effects.fade.js, jquery.effects.fold.js, jquery.effects.highlight.js, jquery.effects.pulsate.js, jquery.effects.scale.js, jquery.effects.shake.js, jquery.effects.slide.js, jquery.effects.transfer.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.tabs.js -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */ -(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.21",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})}(jQuery),function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.lefth[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.toph[3]?j-this.offset.click.toph[2]?k-this.offset.click.left=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f=k&&g<=l||h>=k&&h<=l||gl)&&(e>=i&&e<=j||f>=i&&f<=j||ej);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),ea.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.21"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}}(jQuery),function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("
")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.righth||i.bottome&&i.rightf&&i.bottom *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+jf&&b+ka[this.floating?"width":"height"]?l:f0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.leftthis.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.topthis.containment[3]?h-this.offset.click.topthis.containment[2]?i-this.offset.click.left=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}}),a.easing.jswing=a.easing.swing,a.extend(a.easing,{def:"easeOutQuad",swing:function(b,c,d,e,f){return a.easing[a.easing.def](b,c,d,e,f)},easeInQuad:function(a,b,c,d,e){return d*(b/=e)*b+c},easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c},easeInOutQuad:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},easeInCubic:function(a,b,c,d,e){return d*(b/=e)*b*b+c},easeOutCubic:function(a,b,c,d,e){return d*((b=b/e-1)*b*b+1)+c},easeInOutCubic:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c},easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c},easeOutQuart:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},easeInOutQuart:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b+c:-d/2*((b-=2)*b*b*b-2)+c},easeInQuint:function(a,b,c,d,e){return d*(b/=e)*b*b*b*b+c},easeOutQuint:function(a,b,c,d,e){return d*((b=b/e-1)*b*b*b*b+1)+c},easeInOutQuint:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b*b*b*b+c:d/2*((b-=2)*b*b*b*b+2)+c},easeInSine:function(a,b,c,d,e){return-d*Math.cos(b/e*(Math.PI/2))+d+c},easeOutSine:function(a,b,c,d,e){return d*Math.sin(b/e*(Math.PI/2))+c},easeInOutSine:function(a,b,c,d,e){return-d/2*(Math.cos(Math.PI*b/e)-1)+c},easeInExpo:function(a,b,c,d,e){return b==0?c:d*Math.pow(2,10*(b/e-1))+c},easeOutExpo:function(a,b,c,d,e){return b==e?c+d:d*(-Math.pow(2,-10*b/e)+1)+c},easeInOutExpo:function(a,b,c,d,e){return b==0?c:b==e?c+d:(b/=e/2)<1?d/2*Math.pow(2,10*(b-1))+c:d/2*(-Math.pow(2,-10*--b)+2)+c},easeInCirc:function(a,b,c,d,e){return-d*(Math.sqrt(1-(b/=e)*b)-1)+c},easeOutCirc:function(a,b,c,d,e){return d*Math.sqrt(1-(b=b/e-1)*b)+c},easeInOutCirc:function(a,b,c,d,e){return(b/=e/2)<1?-d/2*(Math.sqrt(1-b*b)-1)+c:d/2*(Math.sqrt(1-(b-=2)*b)+1)+c},easeInElastic:function(a,b,c,d,e){var f=1.70158,g=0,h=d;if(b==0)return c;if((b/=e)==1)return c+d;g||(g=e*.3);if(h").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}}(jQuery),function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}}(jQuery),function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}}(jQuery),function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}}(jQuery),function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}}(jQuery),function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.21",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})}(jQuery),function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("
    ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})}(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend(""),d.secondary&&b.append(""),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})}(jQuery),function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('
    '))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.21"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
    ')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?''+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
    '+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
    ":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
    '+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
    '+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
    "+(j?""+(g[0]>0&&N==g[1]-1?'
    ':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
    ',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
    ",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.21",window["DP_jQuery_"+dpuuid]=$}(jQuery),function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},f=a.attrFn||{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0,click:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||" ",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("
    ")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=a("
    ").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(g);a.each(d,function(a,b){if(a==="click")return;a in f?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||" "))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.21",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()}(jQuery),function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("
    ").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.21"})}(jQuery),function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("
    ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;ic&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.21"})}(jQuery),function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.21"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p').css("padding",aH).append(D.children());al=b('
    ').css({width:aj+"px",height:v+"px"}).append(Y).appendTo(D)}else{D.css("width","");aO=ay.stickToBottom&&K();aK=ay.stickToRight&&B();aJ=D.innerWidth()+f!=aj||D.outerHeight()!=v;if(aJ){aj=D.innerWidth()+f;v=D.innerHeight();al.css({width:aj+"px",height:v+"px"})}if(!aJ&&L==T&&Y.outerHeight()==Z){D.width(aj);return}L=T;Y.css("width","");D.width(aj);al.find(">.jspVerticalBar,>.jspHorizontalBar").remove().end()}Y.css("overflow","auto");if(aQ.contentWidth){T=aQ.contentWidth}else{T=Y[0].scrollWidth}Z=Y[0].scrollHeight;Y.css("overflow","");y=T/aj;q=Z/v;az=q>1;aE=y>1;if(!(aE||az)){D.removeClass("jspScrollable");Y.css({top:0,width:al.width()-f});n();E();R();w()}else{D.addClass("jspScrollable");aL=ay.maintainPosition&&(I||aa);if(aL){aN=aC();aM=aA()}aF();z();F();if(aL){N(aK?(T-aj):aN,false);M(aO?(Z-v):aM,false)}J();ag();an();if(ay.enableKeyboardNavigation){S()}if(ay.clickOnTrack){p()}C();if(ay.hijackInternalLinks){m()}}if(ay.autoReinitialise&&!av){av=setInterval(function(){ar(ay)},ay.autoReinitialiseDelay)}else{if(!ay.autoReinitialise&&av){clearInterval(av)}}aI&&D.scrollTop(0)&&M(aI,false);aP&&D.scrollLeft(0)&&N(aP,false);D.trigger("jsp-initialised",[aE||az])}function aF(){if(az){al.append(b('
    ').append(b('
    '),b('
    ').append(b('
    ').append(b('
    '),b('
    '))),b('
    ')));U=al.find(">.jspVerticalBar");ap=U.find(">.jspTrack");au=ap.find(">.jspDrag");if(ay.showArrows){aq=b('').bind("mousedown.jsp",aD(0,-1)).bind("click.jsp",aB);af=b('').bind("mousedown.jsp",aD(0,1)).bind("click.jsp",aB);if(ay.arrowScrollOnHover){aq.bind("mouseover.jsp",aD(0,-1,aq));af.bind("mouseover.jsp",aD(0,1,af))}ak(ap,ay.verticalArrowPositions,aq,af)}t=v;al.find(">.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow").each(function(){t-=b(this).outerHeight()});au.hover(function(){au.addClass("jspHover")},function(){au.removeClass("jspHover")}).bind("mousedown.jsp",function(aI){b("html").bind("dragstart.jsp selectstart.jsp",aB);au.addClass("jspActive");var s=aI.pageY-au.position().top;b("html").bind("mousemove.jsp",function(aJ){V(aJ.pageY-s,false)}).bind("mouseup.jsp mouseleave.jsp",aw);return false});o()}}function o(){ap.height(t+"px");I=0;X=ay.verticalGutter+ap.outerWidth();Y.width(aj-X-f);try{if(U.position().left===0){Y.css("margin-left",X+"px")}}catch(s){}}function z(){if(aE){al.append(b('
    ').append(b('
    '),b('
    ').append(b('
    ').append(b('
    '),b('
    '))),b('
    ')));am=al.find(">.jspHorizontalBar");G=am.find(">.jspTrack");h=G.find(">.jspDrag");if(ay.showArrows){ax=b('').bind("mousedown.jsp",aD(-1,0)).bind("click.jsp",aB);x=b('').bind("mousedown.jsp",aD(1,0)).bind("click.jsp",aB); -if(ay.arrowScrollOnHover){ax.bind("mouseover.jsp",aD(-1,0,ax));x.bind("mouseover.jsp",aD(1,0,x))}ak(G,ay.horizontalArrowPositions,ax,x)}h.hover(function(){h.addClass("jspHover")},function(){h.removeClass("jspHover")}).bind("mousedown.jsp",function(aI){b("html").bind("dragstart.jsp selectstart.jsp",aB);h.addClass("jspActive");var s=aI.pageX-h.position().left;b("html").bind("mousemove.jsp",function(aJ){W(aJ.pageX-s,false)}).bind("mouseup.jsp mouseleave.jsp",aw);return false});l=al.innerWidth();ah()}}function ah(){al.find(">.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow").each(function(){l-=b(this).outerWidth()});G.width(l+"px");aa=0}function F(){if(aE&&az){var aI=G.outerHeight(),s=ap.outerWidth();t-=aI;b(am).find(">.jspCap:visible,>.jspArrow").each(function(){l+=b(this).outerWidth()});l-=s;v-=s;aj-=aI;G.parent().append(b('
    ').css("width",aI+"px"));o();ah()}if(aE){Y.width((al.outerWidth()-f)+"px")}Z=Y.outerHeight();q=Z/v;if(aE){at=Math.ceil(1/y*l);if(at>ay.horizontalDragMaxWidth){at=ay.horizontalDragMaxWidth}else{if(atay.verticalDragMaxHeight){A=ay.verticalDragMaxHeight}else{if(AaS){Q.scrollByY(-aP)}else{V(aS)}}else{if(aM>0){if(I+aQaS){Q.scrollByX(-aP)}else{W(aS)}}else{if(aM>0){if(aa+aQi){s=i}}if(aI===c){aI=ay.animateScroll}if(aI){Q.animate(au,"top",s,ad)}else{au.css("top",s);ad(s)}}function ad(aI){if(aI===c){aI=au.position().top}al.scrollTop(0);I=aI;var aL=I===0,aJ=I==i,aK=aI/i,s=-aK*(Z-v);if(ai!=aL||aG!=aJ){ai=aL;aG=aJ;D.trigger("jsp-arrow-change",[ai,aG,P,k])}u(aL,aJ);Y.css("top",s);D.trigger("jsp-scroll-y",[-s,aL,aJ]).trigger("scroll")}function W(aI,s){if(!aE){return}if(aI<0){aI=0}else{if(aI>j){aI=j}}if(s===c){s=ay.animateScroll}if(s){Q.animate(h,"left",aI,ae) -}else{h.css("left",aI);ae(aI)}}function ae(aI){if(aI===c){aI=h.position().left}al.scrollTop(0);aa=aI;var aL=aa===0,aK=aa==j,aJ=aI/j,s=-aJ*(T-aj);if(P!=aL||k!=aK){P=aL;k=aK;D.trigger("jsp-arrow-change",[ai,aG,P,k])}r(aL,aK);Y.css("left",s);D.trigger("jsp-scroll-x",[-s,aL,aK]).trigger("scroll")}function u(aI,s){if(ay.showArrows){aq[aI?"addClass":"removeClass"]("jspDisabled");af[s?"addClass":"removeClass"]("jspDisabled")}}function r(aI,s){if(ay.showArrows){ax[aI?"addClass":"removeClass"]("jspDisabled");x[s?"addClass":"removeClass"]("jspDisabled")}}function M(s,aI){var aJ=s/(Z-v);V(aJ*i,aI)}function N(aI,s){var aJ=aI/(T-aj);W(aJ*j,s)}function ab(aV,aQ,aJ){var aN,aK,aL,s=0,aU=0,aI,aP,aO,aS,aR,aT;try{aN=b(aV)}catch(aM){return}aK=aN.outerHeight();aL=aN.outerWidth();al.scrollTop(0);al.scrollLeft(0);while(!aN.is(".jspPane")){s+=aN.position().top;aU+=aN.position().left;aN=aN.offsetParent();if(/^body|html$/i.test(aN[0].nodeName)){return}}aI=aA();aO=aI+v;if(saO){aR=s-v+aK+ay.verticalGutter}}if(aR){M(aR,aJ)}aP=aC();aS=aP+aj;if(aUaS){aT=aU-aj+aL+ay.horizontalGutter}}if(aT){N(aT,aJ)}}function aC(){return -Y.position().left}function aA(){return -Y.position().top}function K(){var s=Z-v;return(s>20)&&(s-aA()<10)}function B(){var s=T-aj;return(s>20)&&(s-aC()<10)}function ag(){al.unbind(ac).bind(ac,function(aL,aM,aK,aI){var aJ=aa,s=I;Q.scrollBy(aK*ay.mouseWheelSpeed,-aI*ay.mouseWheelSpeed,false);return aJ==aa&&s==I})}function n(){al.unbind(ac)}function aB(){return false}function J(){Y.find(":input,a").unbind("focus.jsp").bind("focus.jsp",function(s){ab(s.target,false)})}function E(){Y.find(":input,a").unbind("focus.jsp")}function S(){var s,aI,aK=[];aE&&aK.push(am[0]);az&&aK.push(U[0]);Y.focus(function(){D.focus()});D.attr("tabindex",0).unbind("keydown.jsp keypress.jsp").bind("keydown.jsp",function(aN){if(aN.target!==this&&!(aK.length&&b(aN.target).closest(aK).length)){return}var aM=aa,aL=I;switch(aN.keyCode){case 40:case 38:case 34:case 32:case 33:case 39:case 37:s=aN.keyCode;aJ();break;case 35:M(Z-v);s=null;break;case 36:M(0);s=null;break}aI=aN.keyCode==s&&aM!=aa||aL!=I;return !aI}).bind("keypress.jsp",function(aL){if(aL.keyCode==s){aJ()}return !aI});if(ay.hideFocus){D.css("outline","none");if("hideFocus" in al[0]){D.attr("hideFocus",true)}}else{D.css("outline","");if("hideFocus" in al[0]){D.attr("hideFocus",false)}}function aJ(){var aM=aa,aL=I;switch(s){case 40:Q.scrollByY(ay.keyboardSpeed,false);break;case 38:Q.scrollByY(-ay.keyboardSpeed,false);break;case 34:case 32:Q.scrollByY(v*ay.scrollPagePercent,false);break;case 33:Q.scrollByY(-v*ay.scrollPagePercent,false);break;case 39:Q.scrollByX(ay.keyboardSpeed,false);break;case 37:Q.scrollByX(-ay.keyboardSpeed,false);break}aI=aM!=aa||aL!=I;return aI}}function R(){D.attr("tabindex","-1").removeAttr("tabindex").unbind("keydown.jsp keypress.jsp")}function C(){if(location.hash&&location.hash.length>1){var aK,aI,aJ=escape(location.hash.substr(1));try{aK=b("#"+aJ+', a[name="'+aJ+'"]')}catch(s){return}if(aK.length&&Y.find(aJ)){if(al.scrollTop()===0){aI=setInterval(function(){if(al.scrollTop()>0){ab(aK,true);b(document).scrollTop(al.position().top);clearInterval(aI)}},50)}else{ab(aK,true);b(document).scrollTop(al.position().top)}}}}function m(){if(b(document.body).data("jspHijack")){return}b(document.body).data("jspHijack",true);b(document.body).delegate("a[href*=#]","click",function(s){var aI=this.href.substr(0,this.href.indexOf("#")),aK=location.href,aO,aP,aJ,aM,aL,aN;if(location.href.indexOf("#")!==-1){aK=location.href.substr(0,location.href.indexOf("#"))}if(aI!==aK){return}aO=escape(this.href.substr(this.href.indexOf("#")+1));aP;try{aP=b("#"+aO+', a[name="'+aO+'"]')}catch(aQ){return}if(!aP.length){return}aJ=aP.closest(".jspScrollable");aM=aJ.data("jsp");aM.scrollToElement(aP,true);if(aJ[0].scrollIntoView){aL=b(a).scrollTop();aN=aP.offset().top;if(aNaL+b(a).height()){aJ[0].scrollIntoView()}}s.preventDefault() -})}function an(){var aJ,aI,aL,aK,aM,s=false;al.unbind("touchstart.jsp touchmove.jsp touchend.jsp click.jsp-touchclick").bind("touchstart.jsp",function(aN){var aO=aN.originalEvent.touches[0];aJ=aC();aI=aA();aL=aO.pageX;aK=aO.pageY;aM=false;s=true}).bind("touchmove.jsp",function(aQ){if(!s){return}var aP=aQ.originalEvent.touches[0],aO=aa,aN=I;Q.scrollTo(aJ+aL-aP.pageX,aI+aK-aP.pageY);aM=aM||Math.abs(aL-aP.pageX)>5||Math.abs(aK-aP.pageY)>5;return aO==aa&&aN==I}).bind("touchend.jsp",function(aN){s=false}).bind("click.jsp-touchclick",function(aN){if(aM){aM=false;return false}})}function g(){var s=aA(),aI=aC();D.removeClass("jspScrollable").unbind(".jsp");D.replaceWith(ao.append(Y.children()));ao.scrollTop(s);ao.scrollLeft(aI);if(av){clearInterval(av)}}b.extend(Q,{reinitialise:function(aI){aI=b.extend({},ay,aI);ar(aI)},scrollToElement:function(aJ,aI,s){ab(aJ,aI,s)},scrollTo:function(aJ,s,aI){N(aJ,aI);M(s,aI)},scrollToX:function(aI,s){N(aI,s)},scrollToY:function(s,aI){M(s,aI)},scrollToPercentX:function(aI,s){N(aI*(T-aj),s)},scrollToPercentY:function(aI,s){M(aI*(Z-v),s)},scrollBy:function(aI,s,aJ){Q.scrollByX(aI,aJ);Q.scrollByY(s,aJ)},scrollByX:function(s,aJ){var aI=aC()+Math[s<0?"floor":"ceil"](s),aK=aI/(T-aj);W(aK*j,aJ)},scrollByY:function(s,aJ){var aI=aA()+Math[s<0?"floor":"ceil"](s),aK=aI/(Z-v);V(aK*i,aJ)},positionDragX:function(s,aI){W(s,aI)},positionDragY:function(aI,s){V(aI,s)},animate:function(aI,aL,s,aK){var aJ={};aJ[aL]=s;aI.animate(aJ,{duration:ay.animateDuration,easing:ay.animateEase,queue:false,step:aK})},getContentPositionX:function(){return aC()},getContentPositionY:function(){return aA()},getContentWidth:function(){return T},getContentHeight:function(){return Z},getPercentScrolledX:function(){return aC()/(T-aj)},getPercentScrolledY:function(){return aA()/(Z-v)},getIsScrollableH:function(){return aE},getIsScrollableV:function(){return az},getContentPane:function(){return Y},scrollToBottom:function(s){V(i,s)},hijackInternalLinks:b.noop,destroy:function(){g()}});ar(O)}e=b.extend({},b.fn.jScrollPane.defaults,e);b.each(["mouseWheelSpeed","arrowButtonSpeed","trackClickSpeed","keyboardSpeed"],function(){e[this]=e[this]||e.speed});return this.each(function(){var f=b(this),g=f.data("jsp");if(g){g.reinitialise(e)}else{g=new d(f,e);f.data("jsp",g)}})};b.fn.jScrollPane.defaults={showArrows:false,maintainPosition:true,stickToBottom:false,stickToRight:false,clickOnTrack:true,autoReinitialise:false,autoReinitialiseDelay:500,verticalDragMinHeight:0,verticalDragMaxHeight:99999,horizontalDragMinWidth:0,horizontalDragMaxWidth:99999,contentWidth:c,animateScroll:false,animateDuration:300,animateEase:"linear",hijackInternalLinks:false,verticalGutter:4,horizontalGutter:4,mouseWheelSpeed:0,arrowButtonSpeed:0,arrowRepeatFreq:50,arrowScrollOnHover:false,trackClickSpeed:0,trackClickRepeatFreq:70,verticalArrowPositions:"split",horizontalArrowPositions:"split",enableKeyboardNavigation:true,hideFocus:false,keyboardSpeed:0,initialDelay:300,speed:30,scrollPagePercent:0.8}})(jQuery,this); - -/* For search results. - * jQuery hashchange event - v1.3 - 7/21/2010 - * http://benalman.com/projects/jquery-hashchange-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(''); - - - - - diff --git a/tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt b/tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt deleted file mode 100644 index 66a0f18dbf5..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt +++ /dev/null @@ -1,278 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/tools/droiddoc/templates-sdk-refonly/assets/LICENSE.txt b/tools/droiddoc/templates-sdk-refonly/assets/LICENSE.txt deleted file mode 100644 index e84328beda3..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 John Resig, http://jquery.com/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/tools/droiddoc/templates-sdk-refonly/assets/android-developer-docs.css b/tools/droiddoc/templates-sdk-refonly/assets/android-developer-docs.css deleted file mode 100644 index cd610f74e79..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/android-developer-docs.css +++ /dev/null @@ -1,2768 +0,0 @@ -/* file: android-developer-core.css - author: smain - date: september 2008 - info: core developer styles (developer.android.com) - Required by jdiff -*/ - - -/* RESET STYLES */ - -html,body,div,h1,h2,h3,h4,h5,h6,p,img, -dl,dt,dd,ol,ul,li,table,caption,tbody, -tfoot,thead,tr,th,td,form,fieldset, -embed,object,applet { - margin: 0; - padding: 0; - border: 0; -} - -/* BASICS */ - -html, body { - overflow:hidden; /* keeps scrollbar off IE */ - background-color:#fff; -} - -body { - font-family:arial,sans-serif; - color:#000; - font-size:13px; - color:#333; - background-image:url(images/bg_fade.jpg); - background-repeat:repeat-x; -} - -a, a code { - color:#006699; -} - -a:active, -a:active code { - color:#f00; -} - -a:visited, -a:visited code { - color:#006699; -} - -input, select, -textarea, option, label { - font-family:inherit; - font-size:inherit; - padding:0; - margin:0; - vertical-align:middle; -} - -option { - padding:0 4px; -} - -p, form { - padding:0; - margin:0 0 1em; -} - -code, pre { - color:#007000; - font-family:monospace; - line-height:1em; -} - -var { - color:#007000; - font-style:italic; -} - -pre { - border:1px solid #ccc; - background-color:#fafafa; - padding:10px; - margin:0 0 1em 1em; - overflow:auto; - line-height:inherit; /* fixes vertical scrolling in webkit */ -} - -h1,h2,h3,h4,h5 { - margin:1em 0; - padding:0; -} - -p,ul,ol,dl,dd,dt,li { - line-height:1.3em; -} - -ul,ol { - margin:0 0 .8em; - padding:0 0 0 2em; -} - -li { - padding:0 0 .5em; -} - -dl { - margin:0 0 1em 0; - padding:0; -} - -dt { - margin:0; - padding:0; -} - -dd { - margin:0 0 1em; - padding:0 0 0 2em; -} - -li p { - margin:.5em 0 0; -} - -dd p { - margin:1em 0 0; -} - -li pre, li table, li img { - margin:.5em 0 0 1em; -} - -dd pre, -#jd-content dd table, -#jd-content dd img { - margin:1em 0 0 1em; -} - -li ul, -li ol, -dd ul, -dd ol { - margin:0; - padding: 0 0 0 2em; -} - -li li, -dd li { - margin:0; - padding:.5em 0 0; -} - -dl dl, -ol dl, -ul dl { - margin:0 0 1em; - padding:0; -} - -table { - font-size:1em; - margin:0 0 1em; - padding:0; - border-collapse:collapse; - border-width:0; - empty-cells:show; -} - -td,th { - border:1px solid #ccc; - padding:6px 12px; - text-align:left; - vertical-align:top; - background-color:inherit; -} - -th { - background-color:#dee8f1; -} - -td > p:last-child { - margin:0; -} - -hr.blue { - background-color:#DDF0F2; - border:none; - height:5px; - margin:20px 0 10px; -} - -blockquote { - margin: 0 0 1em 1em; - padding: 0 4em 0 1em; - border-left:2px solid #eee; -} -/* LAYOUT */ - -#body-content { - /* "Preliminary" watermark for preview releases and interim builds. - background:transparent url(images/preliminary.png) repeat scroll 0 0; */ - margin:0; - position:relative; - width:100%; -} - -#header { - height: 114px; - position:relative; - z-index:100; - min-width:675px; /* min width for the tabs, before they wrap */ - padding:0 10px; - border-bottom:3px solid #94b922; -} - -#headerLeft{ - padding: 25px 0 0; -} - -#headerLeft img{ - height:50px; - width:180px; -} - -#headerRight { - position:absolute; - right:0; - top:0; - text-align:right; -} - -/* Tabs in the header */ - -#header ul { - list-style: none; - margin: 7px 0 0; - padding: 0; - height: 29px; -} - -#header li { - float: left; - margin: 0px 2px 0px 0px; - padding:0; -} - -#header li a { - text-decoration: none; - display: block; - background-image: url(images/bg_images_sprite.png); - background-position: 0 -58px; - background-repeat: no-repeat; - color: #666; - font-size: 13px; - font-weight: bold; - width: 94px; - height: 29px; - text-align: center; - margin: 0px; -} - -#header li a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 -29px; - background-repeat: no-repeat; -} - -#header li a span { - position:relative; - top:7px; -} - -#header li a span+span { - display:none; -} - -/* tab highlighting */ - -.home #home-link a, -.guide #guide-link a, -.reference #reference-link a, -.sdk #sdk-link a, -.resources #resources-link a, -.videos #videos-link a { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; - background-repeat: no-repeat; - color: #fff; - font-weight: bold; - cursor:default; -} - -.home #home-link a:hover, -.guide #guide-link a:hover, -.reference #reference-link a:hover, -.sdk #sdk-link a:hover, -.resources #resources-link a:hover, -.videos #videos-link a:hover { - background-image: url(images/bg_images_sprite.png); - background-position: 0 0; -} - -#headerLinks { - margin:10px 10px 0 0; - height:13px; - font-size: 11px; - vertical-align: top; -} - -#headerLinks a { - color: #7FA9B5; -} - -#headerLinks img { - vertical-align:middle; -} - -#language { - margin:0 10px 0 4px; -} - -#search { - height:45px; - margin:15px 10px 0 0; -} - -/* MAIN BODY */ - -#mainBodyFluid { - margin: 20px 10px; - color:#333; -} - -#mainBodyFixed { - margin: 20px 10px; - color: #333; - width:930px; - position:relative; -} - -#mainBodyFixed h3, -#mainBodyFluid h3 { - color:#336666; - font-size:1.25em; - margin: 0em 0em 0em 0em; - padding-bottom:.5em; -} - -#mainBodyFixed h2, -#mainBodyFluid h2 { - color:#336666; - font-size:1.25em; - margin: 0; - padding-bottom:.5em; -} - -#mainBodyFixed h1, -#mainBodyFluid h1 { - color:#435A6E; - font-size:1.7em; - margin: 1em 0; -} - -#mainBodyFixed .green, -#mainBodyFluid .green, -#jd-content .green { - color:#7BB026; - background-color:none; -} - -#mainBodyLeft { - float: left; - width: 600px; - margin-right: 20px; - color: #333; - position:relative; -} - -div.indent { - margin-left: 40px; - margin-right: 70px; -} - -#mainBodyLeft p { - color: #333; - font-size: 13px; -} - -#mainBodyLeft p.blue { - color: #669999; -} - -#mainBodyLeft #communityDiv { - float: left; - background-image:url(images/bg_community_leftDiv.jpg); - background-repeat: no-repeat; - width: 581px; - height: 347px; - padding: 20px 0px 0px 20px; -} - -#mainBodyRight { - float: left; - width: 300px; - color: #333; -} - -#mainBodyRight p { - padding-right: 50px; - color: #333; -} - -#mainBodyRight table { - width: 100%; -} - -#mainBodyRight td { - border:0px solid #666; - padding:0px 5px; - text-align:left; -} - -#mainBodyRight td p { - margin:0 0 1em 0; -} - -#mainBodyRight .blueBorderBox { - border:5px solid #ddf0f2; - padding:18px 18px 18px 18px; - text-align:left; -} - -#mainBodyFixed .seperator { - background-image:url(images/hr_gray_side.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -#mainBodyBottom { - float: left; - width: 100%; - clear:both; - color: #333; -} - -#mainBodyBottom .seperator { - background-image:url(images/hr_gray_main.jpg); - background-repeat:no-repeat; - width: 100%; - float: left; - clear: both; -} - -/* FOOTER */ - -#footer { - float: left; - width:90%; - margin: 20px; - color: #aaa; - font-size: 11px; -} - -#footer a { - color: #aaa; - font-size: 11px; -} - -#footer a:hover { - text-decoration: underline; - color:#aaa; -} - -#footerlinks { - margin-top:2px; -} - -#footerlinks a, -#footerlinks a:visited { - color:#006699; -} - -/* SEARCH FILTER */ - -#search_autocomplete { - color:#aaa; -} - -#search-button { - display:inline; -} - -#search_filtered_div { - position:absolute; - margin-top:-1px; - z-index:101; - border:1px solid #BCCDF0; - background-color:#fff; -} - -#search_filtered { - min-width:100%; -} -#search_filtered td{ - background-color:#fff; - border-bottom: 1px solid #669999; - line-height:1.5em; -} - -#search_filtered .jd-selected { - background-color: #94b922; - cursor:pointer; -} -#search_filtered .jd-selected, -#search_filtered .jd-selected a { - color:#fff; -} - -.no-display { - display: none; -} - -.jd-autocomplete { - font-family: Arial, sans-serif; - padding-left: 6px; - padding-right: 6px; - padding-top: 1px; - padding-bottom: 1px; - font-size: 0.81em; - border: none; - margin: 0; - line-height: 1.05em; -} - -.show-row { - display: table-row; -} -.hide-row { - display: hidden; -} - -/* SEARCH */ - -/* restrict global search form width */ -#searchForm { - width:350px; -} - -#searchTxt { - width:200px; -} - -/* disable twiddle and size selectors for left column */ -#leftSearchControl div { - width: 100%; -} - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - -#search-button { - margin:0 0 0 2px; - font-size:11px; -} - -/* search result tabs */ - -#doc-content .gsc-control { - position:relative; -} - -#doc-content .gsc-tabsArea { - position:relative; - white-space:nowrap; -} - -#doc-content .gsc-tabHeader { - padding: 3px 6px; - position:relative; - width:auto; -} - -#doc-content .gsc-tabHeader.gsc-tabhActive { - border-top: 2px solid #94B922; -} - -#doc-content h2#searchTitle { - padding:0; -} - -#doc-content .gsc-resultsbox-visible { - padding:1em 0 0 6px; -} - -/* CAROUSEL */ - -#homeMiddle { - padding: 0px 0px 0px 0px; - float: left; - width: 584px; - height: 627px; - position:relative; -} - -#topAnnouncement { - background:url(images/home/bg_home_announcement.png) no-repeat 0 0; -} - -#homeTitle { - padding:15px 15px 0; - height:30px; -} - -#homeTitle h2 { - padding:0; -} - -#announcement-block { - padding:0 15px 0; - overflow:hidden; - background: url(images/hr_gray_side.jpg) no-repeat 15px 0; - zoom:1; -} - -#announcement-block>* { - padding:15px 0 0; -} - -#announcement-block img { - float:left; - margin:0 30px 0 0; -} - -#announcement { - float:left; - margin:0; -} - -#carousel { - background:url(images/home/bg_home_carousel.png) no-repeat 0 0; - position:relative; - height:400px; -} - -#carouselMain { - background: url(images/home/bg_home_carousel_board.png) 0 0 no-repeat; - height:auto; - padding: 25px 21px 0; - overflow:hidden; - position:relative; - zoom:1; /*IE6*/ -} - -#carouselMain img { - margin:0; -} - -#carouselMain .bulletinDesc h3 { - margin:0; - padding:0; -} - -#carouselMain .bulletinDesc p { - margin:0; - padding:0.7em 0 0; -} - -#carouselWheel { - background: url(images/home/bg_home_carousel_wheel.png) 0 0 no-repeat; - padding-top:40px; - height:150px; -} - -.clearer { clear:both; } - -a#arrow-left, a#arrow-right { - float:left; - width:42px; - height:42px; - background-image:url(images/home/carousel_buttons_sprite.png); - background-repeat:no-repeat; -} -a#arrow-left { - margin:35px 3px 0 10px; -} -a#arrow-right { - margin:35px 10px 0 0; -} -a.arrow-left-off, -a#arrow-left.arrow-left-off:hover { - background-position:0 0; -} -a.arrow-right-off, -a#arrow-right.arrow-right-off:hover { - background-position:-42px 0; -} -a#arrow-left:hover { - background-position:0 -42px; -} -a#arrow-right:hover { - background-position:-42px -42px; -} -a.arrow-left-on { - background-position:0 0; -} -a.arrow-right-on { - background-position:-42px 0; -} -a.arrow-right-off, -a.arrow-left-off { - cursor:default; -} - -.app-list-container { - margin:0 20px; - position:relative; - width:100%; -} - -div#list-clip { - height:110px; - width:438px; - overflow:hidden; - position:relative; - float:left; -} - -div#app-list { - left:0; - z-index:1; - position:absolute; - margin:11px 0 0; - _margin-top:13px; - width:1000%; -} - -#app-list a { - display:block; - float:left; - height:90px; - width:90px; - margin:0 24px 0; - padding:3px; - background:#99cccc; - -webkit-border-radius:7px; - -moz-border-radius:7px; - border-radius:7px; - text-decoration:none; - text-align:center; - font-size:11px; - line-height:11px; -} - -#app-list a span { - position:relative; - top:-4px; -} - -#app-list img { - width:90px; - height:70px; - margin:0; -} - -#app-list a.selected, -#app-list a:active.selected, -#app-list a:hover.selected { - background:#A4C639; - color:#fff; - cursor:default; - text-decoration:none; -} - -#app-list a:hover, -#app-list a:active { - background:#ff9900; -} - -#app-list a:hover span, -#app-list a:active span { - text-decoration:underline; -} - -#droid-name { - padding-top:.5em; - color:#666; - padding-bottom:.25em; -} - -/*IE6*/ -* html #app-list a { zoom: 1; margin:0 24px 0 15px;} - -* html #list-clip { - width:430px !important; -} - -/*carousel bulletin layouts*/ -/*460px width*/ -/*185px height*/ -.img-left { - float:left; - width:230px; - overflow:hidden; - padding:8px 0 8px 8px; -} -.desc-right { - float:left; - width:270px; - padding:10px; -} -.img-right { - float:right; - width:220px; - overflow:hidden; - padding:8px 8px 8px 0; -} -.desc-left { - float:right; - width:280px; - padding:10px; - text-align:right; -} -.img-top { - padding:20px 20px 0; -} -.desc-bottom { - padding:10px; -} - - -/* VIDEO PAGE */ - -#mainBodyLeft.videoPlayer { - width:570px; -} - -#mainBodyRight.videoPlayer { - width:330px; -} - -/* player */ - -#videoPlayerBox { - background-color: #DAF3FC; - border-radius:7px; - -moz-border-radius:7px; - -webkit-border-radius:7px; - width:530px; - padding:20px; - border:1px solid #d3ecf5; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videoBorder { - background-color: #FFF; - min-height:399px; - height:auto !important; - border:1px solid #ccdada; - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; -} - -#videoPlayerTitle { - width:500px; - padding:15px 15px 0; -} - -#videoPlayerTitle h2 { - font-weight:bold; - font-size:1.2em; - color:#336666; - margin:0; - padding:0; -} - -#objectWrapper { - padding:15px 15px; - height:334px; - width:500px; -} - -/* playlist tabs */ - -ul#videoTabs { - list-style-type:none; - padding:0; - clear:both; - margin:0; - padding: 20px 0 0 15px; - zoom:1; /* IE7/8, otherwise top-padding is double */ -} - -ul#videoTabs li { - display:inline; - padding:0; - margin:0 3px 0 0; - line-height:2em; -} - -ul#videoTabs li a { - border-radius:7px 7px 0 0; - -moz-border-radius:7px 7px 0 0; - -webkit-border-top-left-radius:7px; - -webkit-border-top-right-radius:7px; - background:#95c0d0; - color:#fff; - text-decoration:none; - padding:.45em 1.5em; - font-weight:bold; -} - -ul#videoTabs li.selected a { - font-weight:bold; - text-decoration:none; - color:#555; - background:#daf3fc; - border-bottom:1px solid #daf3fc; -} - -ul#videoTabs li:hover a { - background:#85acba; -} - -ul#videoTabs li.selected:hover a { - background:#daf3fc; -} - -/* playlists */ - -#videos { - background:#daf3fc; - margin-bottom:1.5em; - padding:15px; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - box-shadow:2px 3px 1px #eee; - -moz-box-shadow:2px 3px 1px #eee; - -webkit-box-shadow:2px 3px 1px #eee; -} - -#videos div { - display:none; -} - -#videos div.selected { - display:block; -} - -ul.videoPreviews { - list-style:none; - padding:0; - margin:0; - zoom:1; /* IE, otherwise, layout doesn't update when showing 'more' */ -} - -ul.videoPreviews li { - margin:0 0 5px; - padding:0; - overflow:hidden; - position:relative; -} - -#mainBodyFixed ul.videoPreviews h3 { - font-size: 12px; - margin:0 0 1em 130px; - padding:0; - font-weight:bold; - color:inherit; -} - -ul.videoPreviews a { - margin:1px; - padding:10px; - text-decoration:none; - height:90px; - display:block; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - background-color:transparent; -} - -ul.videoPreviews a:hover { - background-color:#FFF; - border:none; /* IE8, otherwise, bg doesn't work */ -} - -ul.videoPreviews a.selected { - background-color: #FF9900; -} - -ul.videoPreviews img { - float:left; - clear:left; - margin:0; -} - -ul.videoPreviews h3 { - font-size:12px; - font-weight:bold; - text-decoration:none; - margin:0 0 1em 130px; - padding:0; -} - -ul.videoPreviews p { - font-size: 12px; - text-decoration:none; - margin:0 0 1.2em 130px; -} - -ul.videoPreviews p.full { - display:none; -} - -ul.videoPreviews span.more { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_down.png) 0 2px no-repeat; -} - -ul.videoPreviews span.less { - padding:0 0 0 12px; - background:url(images/arrow_bluelink_up.png) 0 2px no-repeat; - display:none; -} - -ul.videoPreviews p.toggle { - position:absolute; - margin:0; - margin-top:-23px; /* instead of bottom:23px, because IE won't do it correctly */ - left:140px; -} - -ul.videoPreviews p.toggle a { - height:auto; - margin:0; - padding:0; - zoom:1; /* IE6, otherwise the margin considers the img on redraws */ -} - -ul.videoPreviews p.toggle a:hover { - text-decoration:underline; - background:transparent; /* IE6, otherwise it inherits white */ -} - -/* featured videos */ - -#mainBodyRight h2 { - padding:0 0 5px; -} - -#mainBodyRight ul.videoPreviews { - margin:10px 0 0; -} - -#mainBodyRight ul.videoPreviews li { - font-size:11px; - line-height:13px; - margin:0 0 5px; - padding:0; -} - -#mainBodyRight ul.videoPreviews h3 { - padding:0; - margin:0; - font-size:100%; -} - -#mainBodyRight ul.videoPreviews a { - text-decoration:none; - height:108px; - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews a:hover { - border:1px solid #CCDADA; -} - -#mainBodyRight ul.videoPreviews a.selected { - border:1px solid #FFF; -} - -#mainBodyRight ul.videoPreviews p { - line-height:1.2em; - padding:0; - margin:4px 0 0 130px; -} - -#mainBodyRight ul.videoPreviews img { - margin-top:5px; -} - -/* Pretty printing styles. Used with prettify.js. */ - -.str { color: #080; } -.kwd { color: #008; } -.com { color: #800; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -dl.tag-list dt code, -.tag { color: #008; } -dl.atn-list dt code, -.atn { color: #828; } -.atv { color: #080; } -.dec { color: #606; } - -@media print { - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - - -#title { - border-bottom: 4px solid #ccc; - display:none; -} - -#title h1 { - color:#336666; - margin:0; - padding: 5px 10px; - font-size: 1em; - line-height: 15px; -} - -#title h1 .small{ - color:#000; - margin:0; - font-size: 13px; - padding:0 0 0 15px; -} - -/* SIDE NAVIGATION */ - -#side-nav { - padding:0 6px 0 0; - background-color: #fff; - font-size:12px; -} - -#resize-packages-nav { -/* keeps the resize handle below the h-scroll handle */ - height:270px; - overflow:hidden; - max-height:100%; -} - -#packages-nav { - height:270px; - max-height:inherit; - position:relative; - overflow:auto; -} - -#classes-nav, -#devdoc-nav { - overflow:auto; - position:relative; -} - -#side-nav ul { - list-style: none; - margin: 0; - padding:5px 0; -} - -#side-nav ul ul { - margin: .5em 0 0 0; - padding: 0; -} - -#side-nav li { - padding:0; - padding:1px 0 1px 0; - zoom:1; -} - -#side-nav li span.heading, -#side-nav li h2 { - display:block; - font-size:12px; - font-weight: bold; - margin:.5em 0 0 0; - padding: 3px 0 1px 9px; -} - -#side-nav li a { - display: inline-block; /* needed to apply padding to line-wraps */ - text-decoration:none; - padding: 0 0 0 18px; - zoom:1; -} - -#side-nav li a span+span { - display:none; -} - -#side-nav li a:hover { - text-decoration:underline; -} - -#side-nav li a+a { - padding: 0; -} -/*second level (nested) list*/ -#side-nav li li li a { - padding: 0 0 0 28px; -} -/*third level (nested) list*/ -#side-nav li li li li a { - padding: 0 0 0 38px; -} - -#side-nav .selected { - background-color: #435a6e; - color: #fff; - font-weight:bold; -} - -#side-nav .selected a { - color: #fff; - text-decoration:none; -} - -#side-nav strong { - display:block; -} - -#side-nav .toggle-list .toggle-img { - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - height:16px; - width:15px; - outline-style:none; -} -/* second-level toggle */ -#side-nav .toggle-list .toggle-list .toggle-img { - left:10px; -} - -#side-nav .closed .toggle-img, -#side-nav .open .closed .toggle-img { - background:url('images/triangle-closed-small.png') 7px 4px no-repeat; -} -#side-nav .open .toggle-img { - background:url('images/triangle-opened-small.png') 7px 4px no-repeat; -} - -#side-nav .toggle-list { - position:relative; -} - -#side-nav .toggle-list ul { - margin:0; - display:none; -} - -#side-nav .toggle-list div { - display:block; -} - -#index-links .selected { - background-color: #fff; - color: #000; - font-weight:normal; - text-decoration:none; -} - -#index-links { - padding:7px 0 4px 10px; -} - -/* nav tree */ - -#nav-tree ul { - padding:5px 0 1.5em; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0 0 0 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - margin:0; -} - -#nav-tree a.nolink { - color: black; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; -} - -#nav-swap { - font-size:10px; - line-height:10px; - margin-left:1em; - text-decoration:none; - display:block; -} - -#tree-link { - -} - -/* DOCUMENT BODY */ - -#doc-content { - overflow:auto; -} - -#jd-header { - background-color: #E2E2E2; - padding: 7px 15px; -} - -#jd-header h1 { - margin: 0 0 10px; - font-size:1.7em; -} - -#jd-header .crumb { - font-size:.9em; - line-height:1em; - color:#777; -} - -#jd-header .crumb a, -#jd-header .crumb a:visited { - text-decoration:none; - color:#777; -} - -#jd-header .crumb a:hover { - text-decoration:underline; -} - -#jd-header table { - margin:0; - padding:0; -} - -#jd-header td { - border:none; - padding:0; - vertical-align:top; -} - -#jd-header.guide-header { - background-color:#fff; - color:#435a6e; - height:50px; -} - -#jd-descr { - position:relative; -} - -/* summary tables for reference pages */ -.jd-sumtable { - margin: .5em 1em 1em 1em; - width:95%; /* consistent table widths; within IE's quirks */ - font-size:.9em; -} - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:.8em; - padding:6px 10px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:70%; -} - -#api-level-toggle { - padding:0 10px; - font-size:11px; - float:right; -} - -#api-level-toggle label.disabled { - color:#999; -} - -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 7px 0; - margin-top:-25px; -} - -#api-info-block div.api-level { - font-size:1.3em; - font-weight:bold; - float:none; - color:#444; - padding:0; - margin:0; -} - -/* Force link colors for IE6 */ -div.api-level a { - color:#999; -} -#api-info-block div.api-level a:link { - color:#444; -} -#api-level-toggle a { - color:#999; -} - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} - -#api-level-toggle a, -.api-level a { - color:inherit; - text-decoration:none; -} - -#api-level-toggle a:hover, -.api-level a:hover { - color:inherit; - text-decoration:underline !important; - cursor:pointer !important; -} - -#side-nav li.absent.selected, -#side-nav li.absent.selected *, -#side-nav div.label.absent.selected, -#side-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -/* IE6 quirk (won't chain classes, so just keep background blue) */ -* html #side-nav li.selected, -* html #side-nav li.selected *, -* html #side-nav div.label.selected, -* html #side-nav div.label.selected * { - background-color: #435a6e !important; -} - - -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} - -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - -/* applies to a div containing links to summary tables */ -.sum-details-links { - padding:0; - font-weight:normal; -} - -.sum-details-links a { - text-decoration:none; -} - -.sum-details-links a:hover { - text-decoration:underline; -} - - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:.9em; -} -.jd-inheritance-table td { - border: none; - margin: 0; - padding: 0; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - -#jd-content { - padding: 18px 15px; -} - -hr { - background-color:#ccc; - border-color:#fff; - margin:2em 0 1em; -} - -/* DOC CLASSES */ - -#jd-content h1 { -/*sdk page*/ - font-size:1.6em; - color:#336666; - margin:0 0 .5em; -} - -#jd-content h2 { - font-size:1.45em; - color:#111; - border-top:2px solid #ccc; - padding: .5em 0 0; - margin: 2em 0 1em 0; -} - -#jd-content h3 { - font-size:1.3em; - color:#3a3a3a; - padding: 0; - margin: 1.5em 0 .65em 0; -} - -#jd-content h4 { - font-size:1.1em; - color:#3a3a3a; - padding: 0; - margin: 1.25em 0 .65em 0; -} - -#jd-content h5 { - font-size:1.0em; - color:#3a3a3a; - padding: 0; - margin: 1em 0 .65em 0; -} - -#jd-content .small-header { - font-size:1em; - color:#000; - font-weight:bold; - border:none; - padding:0; - margin:1em 0 .5em; - position:inherit; -} - -#jd-content table { - margin: 0 0 1em 1em; -} - -#jd-content img { - margin: 0 0 1em 1em; -} - -#jd-content li img, -#jd-content dd img { - margin:.5em 0 .5em 1em; -} - -.nolist { - list-style:none; - padding:0; - margin:0 0 1em 1em; -} - -.nolist li { - padding:0 0 2px; - margin:0; -} - -h4 .normal { - font-size:.9em; - font-weight:normal; -} - -.caps { - font-variant:small-caps; - font-size:1.2em; -} - -dl.tag-list dl.atn-list { - padding:0 0 0 2em; -} - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; - line-height:1em; -} - -.jd-tagdescr p { - margin:.5em 0; - padding:0; - -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:1.5em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} - -h4.jd-tagtitle { - margin:0; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - -#jd-content table h2 { - background-color: #d6d6d6; - font-size: 1.1em; - margin:0 0 10px; - padding:5px; - left:0; - width:auto; -} - -div.design-announce { - border-top:1px solid #33B5E5; - border-bottom:1px solid #33B5E5; - padding:5px 10px 10px 55px; - margin:2em 0; - background:url('images/icon_design.png') 5px 13px no-repeat; -} - -div.design-announce p { - margin: .5em 0 0 0; -} - -div.special { - padding: .5em 1em 1em 1em; - margin: 0 0 1em; - background-color: #DAF3FC; - border:1px solid #d3ecf5; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; -} - -div.special p { - margin: .5em 0 0 0; -} - -div.special ol { - margin: 0; -} - -div.special ol li { - margin: 0; - padding: 0; -} - -#jd-content div.special h2, -#jd-content div.special h3 { - color:#669999; - font-size:1.2em; - border:none; - margin:0 0 .5em; - padding:0; -} - -#jd-content div.special.reference h2, -#jd-content div.special.reference h3, -#jd-content div.special.reference h4 { - color:#000; - font-size:1em; - border:none; - font-weight:bold; - margin:.5em 0; - padding:0; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - margin: 1em; - padding: 0 0 0 .5em; - border-left: 4px solid; -} - -p.special-note, -div.special-note { - background-color:#EBF3DB; - padding:10px 20px; - margin:0 0 1em; -} - -p.note, -div.note { - border-color: #99aacc; -} - -p.warning, -div.warning { - border-color: #aa0033; -} - -p.caution, -div.caution { - border-color: #ffcf00; -} - -li .note, -li .caution, -li .warning { - margin: .5em 0 0 0; - padding: .2em .5em .2em .9em; -} - -/* Makes sure the first paragraph does not add top-whitespace within the box*/ -li .note>p:first-child, -li .caution>p:first-child, -li .warning>p:first-child { - margin-top:0; - padding-top:0; -} - -dl.xml dt { - font-variant:small-caps; - font-size:1.2em; -} - -dl.xml dl { - padding:0; -} - -dl.xml dl dt { - font-variant:normal; - font-size:1em; -} - -.listhead li { - font-weight: bold; -} - -.listhead li *, /*ie*/.listhead li li { - font-weight: normal; -} - -ol.no-style, -ul.no-style { - list-style:none; - padding-left:1em; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - text-decoration: none; - vertical-align:top; - line-height:.9em; - white-space:nowrap; -} - -.toggle-list.open .new-child { - display:none; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -0.5em 0 1em 1em; /* matches default img left-margin */ -} - -div.figure { - float:right; - clear:right; - margin:1em 0 0 0; - padding:0 0 0 3em; - background-color:#fff; - /* width must be defined w/ an inline style matching the image width */ -} - -#jd-content -div.figure img { - margin: 0 0 1em; -} - -div.figure p.img-caption { - margin: -0.5em 0 1em 0; -} - -p.table-caption { - margin: 0 0 0.5em 1em; /* matches default table left-margin */ -} - - -/* toggle for misc content (such as long sample code) - see toggleContent() script in android-developer-docs.js */ -.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -.toggle-content a[href="#"] { - text-decoration:none; - color:inherit; -} - -.toggle-content-toggleme { - padding-bottom:1px; /* fixes animation bounce due to margins */ -} - -#jd-content .toggle-content img.toggle-content-img { - margin:0; -} - - -/* BEGIN quickview sidebar element styles */ - -#qv-wrapper { - float: right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:-48px 0 2px 0; - padding:0 0 20px 35px; -} - -#qv { - background-color:#fff; - border:4px solid #dee8f1; - margin:0; - padding:0 5px 5px; - width:292px; /* +10px padding; +8px border */ - font-size:.9em; -} - -#qv ol { - list-style:none; - padding: 0; -} - -#qv ol ol{ - list-style:none; - padding: 0 0 0 12px; - margin:0; -} - -#qv ul { - padding: 0 10px 0 2em; -} - -#qv li { - padding: 0 10px 3px; - line-height: 1.2em; -} - -#qv li li { - padding: 3px 10px 0; -} - -#qv ul li { - padding: 0 10px 0 0; -} - -#qv li.selected a { - color:#555; - text-decoration:none; -} - -#qv a, -#qv a code { - color:#cc6600; -} - -#qv p { - margin:8px 0 0; - padding:0 10px; -} - -#jd-content #qv h2 { - font-size:1.05em; - font-weight:bold; - margin:12px 0 .25em 0; - padding:0 10px; - background-color:transparent; - color:#7BB026; - border:none; - left:0; - z-index:1; -} - -#qv-extra #rule { - padding: 0 10px; - margin: 0; -} - -#qv-sub-rule { - padding: 5px 15px 10px; - margin: 0; -} - -#jd-content -#qv-sub-rule h2 { - margin: 0 0 .5em 0; -} - -/* END quickview sidebar element styles */ - -/* Begin sidebox sidebar element styles */ - -.sidebox-wrapper { - float:right; - clear:right; - width:310px; /* +35px padding */ - background-color:#fff; - margin:0; - padding:0 0 20px 35px; -} - -.sidebox { - border-left:1px solid #dee8f1; - background-color:#ffffee; - margin:0; - padding:8px 12px; - font-size:0.9em; - width:285px; /* +24px padding; +1px border */ -} - -.sidebox p { - margin-bottom: .75em; -} - -.sidebox ul { - padding: 0 0 0 1.5em; -} - -.sidebox li ul { - margin-top:0; - margin-bottom:.1em; -} - -.sidebox li { -padding:0 0 0 0em; -} - -#jd-content .sidebox h2, -#jd-content .sidebox h3, -#jd-content .sidebox h4, -#jd-content .sidebox h5 { - border:none; - font-size:1em; - margin:0; - padding:0 0 8px; - left:0; - z-index:0; -} - -.sidebox hr { - background-color:#ccc; - border:none; -} - -/* End sidebox sidebar element styles */ - -/* BEGIN developer training bar styles */ - -div#tb-wrapper { - float: right; - clear:right; - width:380px; /* +25px padding = 405 */ - background-color:#fff; - margin:0 0 2px 0; - padding:0 0 20px 25px; -} - -div#tb { - margin:0; - padding:0 15px; - width:350px; /* +15px padding = 380 */ - font-size:.9em; - background:#e9e9e9; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - overflow:auto; -} - -div#tb h2 { - font-size:1.3em; - font-weight:bold; - margin:1em 0; - padding:0; - background-color:transparent; - border:none; - clear:both; -} - -div.download-box a.button { - color: #069; - font-size:1.1em; - font-weight:bold; - text-decoration:none; - height:27px; - line-height:27px; - text-align:center; - padding:5px 8px; - background-color: #fff; - border: 1px solid #aaa; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; -} - -div.download-box a.button:hover { - border-color: #09C; - background-color: #4CADCB; - background-image: -webkit-gradient(linear,left top,left bottom,from(#5dbcd9),to(#4cadcb)); - background-image: -webkit-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -moz-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -ms-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: -o-linear-gradient(top,#5dbcd9,#4cadcb); - background-image: linear-gradient(top,#5dbcd9,#4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9',EndColorStr='#4cadcb'); - color: #fff; -} - -div.download-box a.button:active { - background-color: #1E799A; - background-image: none; - border-color: #30B7E6; -} - -div.download-box p.filename { - font-size:0.85em; - color:#888; - margin:4px 0 1em 10px; -} - -/* End developer training bar */ - -/* Training nav bar (previous/next) */ - -div.training-nav-top { - float: right; - width:380px; /* +25px padding = 405 */ - margin:-58px 0 0 0; - padding:0 0 20px 25px; -} - -div.training-nav-bottom { - padding:1px; /* for weird FF bug (scrollbar appears) */ - margin:3em 0; - overflow:auto; -} - -div.training-nav-button-next a, -div.training-nav-button-previous a { - display:block; - width:160px; - height:55px; - padding:4px 7px; - border:1px solid #aaa; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - text-decoration:none; - font-weight:bold; -} - -div.training-nav-button-next a:hover, -div.training-nav-button-previous a:hover { - border:1px solid #069; /* match link color */ -} - -div.training-nav-button-next a:active, -div.training-nav-button-previous a:active { - border:1px solid #f00; /* match link color */ -} - -div.training-nav-button-previous { - float:left; - text-align:left; -} - -div.training-nav-button-next { - float:right; - text-align:right; -} - -span.training-nav-button-title { - display:block; - font-size:.85em; - font-weight:normal; - line-height:1.3em; - margin:.5em 0 0; -} - -/* End training nav bar */ - -/* BEGIN image and caption styles (originally for UI Guidelines docs) */ - -table.image-caption { - padding:0; - margin:.5em 0; - border:0; -} - -td.image-caption-i { - font-size:92%; - padding:0 5px; - margin:0; - border:0; -} - -td.image-caption-i img { - padding:0 1em; - margin:0; -} - -.image-list { - width:24px; - text-align:center; -} - -td.image-caption-c { - font-size:92%; - padding:1em 2px 2px 2px; - margin:0; - border:0; - width:350px; -} - -.grad-rule-top { -background-image:url(images/grad-rule-qv.png); -background-repeat:no-repeat; -padding-top:1em; -margin-top:0; -} - -.image-caption-nested { - margin-top:0; - padding:0 0 0 1em; -} - -.image-caption-nested td { - padding:0 4px 2px 0; - margin:0; - border:0; -} - -/* END image and caption styles */ - -/* table of contents */ - -ol.toc { - margin: 0 0 1em 0; - padding: 0; - list-style: none; - font-size:95%; -} - -ol.toc li { - font-weight: bold; - margin: 0 0 .5em 1em; - padding: 0; -} - -ol.toc li p { - font-weight: normal; -} - -ol.toc li ol { - margin: 0; - padding: 0; -} - -ol.toc li li { - padding: 0; - margin: 0 0 0 1em; - font-weight: normal; - list-style: none; -} - -table ol.toc { - margin-left: 0; -} - -.columns td { - padding:0 5px; - border:none; -} - -/* link table */ -.jd-linktable { - margin: 0 0 1em; - border-bottom: 1px solid #888; -} -.jd-linktable th, -.jd-linktable td { - padding: 3px 5px; - vertical-align: top; - text-align: left; - border:none; -} -.jd-linktable tr { - background-color: #fff; -} -.jd-linktable td { - border-top: 1px solid #888; - background-color: inherit; -} -.jd-linktable td p { - padding: 0 0 5px; -} -.jd-linktable .jd-linkcol { -} -.jd-linktable .jd-descrcol { -} -.jd-linktable .jd-typecol { - text-align:right; -} -.jd-linktable .jd-valcol { -} -.jd-linktable .jd-commentrow { - border-top:none; - padding-left:25px; -} -.jd-deprecated-warning { - margin-top: 0; - margin-bottom: 10px; -} - -tr.alt-color { - background-color: #f6f6f6; -} - -/* expando trigger */ -#jd-content .jd-expando-trigger-img { - margin:0; -} - -/* jd-expando */ -.jd-inheritedlinks { - padding:0 0 0 13px -} - -/* SDK PAGE */ -table.download tr { - background-color:#d9d9d9; -} - -table.download tr.alt-color { - background-color:#ededed; -} - -table.download td, -table.download th { - border:2px solid #fff; - padding:10px 5px; -} - -table.download th { - background-color:#6d8293; - color:#fff; -} - -/* INLAY 180 COPY and 240PX EXTENSION */ -/* modified to 43px so that all browsers eliminate the package panel h-scroll */ -.g-tpl-240 .g-unit, -.g-unit .g-tpl-240 .g-unit, -.g-unit .g-unit .g-tpl-240 .g-unit { - display: block; - margin: 0 0 0 243px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240 .g-first, -.g-unit .g-tpl-240 .g-first, -.g-tpl-240 .g-first { - display: block; - margin: 0; - width: 243px; - float: left; -} -/* 240px alt */ -.g-tpl-240-alt .g-unit, -.g-unit .g-tpl-240-alt .g-unit, -.g-unit .g-unit .g-tpl-240-alt .g-unit { - display: block; - margin: 0 243px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-240-alt .g-first, -.g-unit .g-tpl-240-alt .g-first, -.g-tpl-240-alt .g-first { - display: block; - margin: 0; - width: 243px; - float: right; -} - -/* 200px */ -.g-tpl-200 .g-unit, -.g-unit .g-tpl-200 .g-unit, -.g-unit .g-unit .g-tpl-200 .g-unit { - display: block; - margin: 0 0 0 200px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200 .g-first, -.g-unit .g-tpl-200 .g-first, -.g-tpl-200 .g-first { - display: block; - margin: 0; - width: 200px; - float: left; -} -/* 200px alt */ -.g-tpl-200-alt .g-unit, -.g-unit .g-tpl-200-alt .g-unit, -.g-unit .g-unit .g-tpl-200-alt .g-unit { - display: block; - margin: 0 200px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-200-alt .g-first, -.g-unit .g-tpl-200-alt .g-first, -.g-tpl-200-alt .g-first { - display: block; - margin: 0; - width: 200px; - float: right; -} - -/* 190px */ -.g-tpl-190 .g-unit, -.g-unit .g-tpl-190 .g-unit, -.g-unit .g-unit .g-tpl-190 .g-unit { - display: block; - margin: 0 0 0 190px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190 .g-first, -.g-unit .g-tpl-190 .g-first, -.g-tpl-190 .g-first { - display: block; - margin: 0; - width: 190px; - float: left; -} -/* 190px alt */ -.g-tpl-190-alt .g-unit, -.g-unit .g-tpl-190-alt .g-unit, -.g-unit .g-unit .g-tpl-190-alt .g-unit { - display: block; - margin: 0 190px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-190-alt .g-first, -.g-unit .g-tpl-190-alt .g-first, -.g-tpl-190-alt .g-first { - display: block; - margin: 0; - width: 190px; - float: right; -} - -/* 180px */ -.g-tpl-180 .g-unit, -.g-unit .g-tpl-180 .g-unit, -.g-unit .g-unit .g-tpl-180 .g-unit { - display: block; - margin: 0 0 0 180px; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180 .g-first, -.g-unit .g-tpl-180 .g-first, -.g-tpl-180 .g-first { - display: block; - margin: 0; - width: 180px; - float: left; -} -/* 180px alt */ -.g-tpl-180-alt .g-unit, -.g-unit .g-tpl-180-alt .g-unit, -.g-unit .g-unit .g-tpl-180-alt .g-unit { - display: block; - margin: 0 180px 0 0; - width: auto; - float: none; -} -.g-unit .g-unit .g-tpl-180-alt .g-first, -.g-unit .g-tpl-180-alt .g-first, -.g-tpl-180-alt .g-first { - display: block; - margin: 0; - width: 180px; - float: right; -} - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; } -body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; - background: transparent url("images/resizable-s2.gif") repeat scroll center top; } -.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; - background: transparent url("images/resizable-e2.gif") repeat scroll right center; } - -@media print { - - body { - overflow:visible; - } - - #header { - height:60px; - } - - #headerLeft { - padding:0; - } - - #header-tabs, - #headerRight, - #side-nav, - #api-info-block { - display:none; - } - - #body-content { - position:inherit; - } - - #doc-content { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } - - #jd-header { - padding:10px 0; - } - - #jd-content { - padding:15px 0 0; - } - - #footer { - float:none; - margin:2em 0 0; - } - - h4.jd-details-title { - border-bottom:1px solid #666; - } - - pre { - /* these allow lines to break (if there's a white space) */ - overflow: visible; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - } - - h1, h2, h3, h4, h5, h6 { - page-break-after: avoid; - } - - table, img { - page-break-inside: avoid; - } -} diff --git a/tools/droiddoc/templates-sdk-refonly/assets/css/default.css b/tools/droiddoc/templates-sdk-refonly/assets/css/default.css deleted file mode 100644 index 106ab2f2405..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/css/default.css +++ /dev/null @@ -1,8877 +0,0 @@ -/* color definitions */ -/* 16 column layout */ -/* clearfix idiom */ -/* common mixins */ -/* page layout + top-level styles */ -::selection { - background-color: #0099cc; - color: #fff; } -::-webkit-selection { - background-color: #0099cc; - color: #fff; } -::-moz-selection { - background-color: #0099cc; - color: #fff; } - -html, body { - height: 100%; - margin: 0; - padding: 0; - background-color: #fff; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* prevent subpixel antialiasing, which thickens the text */ - /* text-rendering: optimizeLegibility; */ - /* turned off ligatures due to bug 5945455 */ } - -body { - color: #515151; - color: rgba(0, 0, 0, .68); - font: 14px/24px Roboto, sans-serif; - font-weight: 400; - letter-spacing:.1; - padding:0 20px; -} - -@media (max-width: 719px) { - html { - /* Disable accidental horizontal overflow. */ - overflow-x: hidden; - } - - body { - padding: 0 10px; - } -} - -#page-container { - width: 940px; - margin: 0 40px; } - -#page-header { - height: 80px; - margin-bottom: 20px; - font-size: 48px; - line-height: 48px; - font-weight: 100; - padding-left: 10px; } - #page-header a { - display: block; - position: relative; - top: 20px; - text-decoration: none; - color: #555555 !important; } - -#main-row { - display: inline-block; } - #main-row:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - * html #main-row { - height: 1px; } - -#page-footer { - margin-left: 190px; - margin-top: 80px; - color: #999999; - padding-bottom: 40px; - font-size: 12px; - line-height: 15px; } - #page-footer a { - color: #777777; } - #page-footer #copyright { - margin-bottom: 10px; } - -#nav-container { - width: 160px; - min-height: 10px; - margin-right: 20px; - float: left; } - -#nav { - margin:0; - padding:0 0 30px; -} - -#side-nav { - padding-top: 20px; -} - -#devdoc-nav h2 { - border:0; -} - -#devdoc-nav.fixed { - position: fixed; - margin:0; - top: 84px; /* sticky-header height + 20px gutter */ -} - -.dac-devdoc-toggle { - cursor: pointer; - padding: 8px 0; -} - -.scroll-pane { - /* Match height of fixed parent. */ - height: 100%; -} - -#content { - width: 760px; - float: left; } - - -/***** PREVIOUSLY style.css ******************/ -/* This should be close to the top, so it is easier to override. */ -[dir='rtl'] { - direction: rtl; -} -html { - line-height: 20px; -} -pre, table, input, textarea, code { - font-size: 1em; -} -address, abbr, cite { - font-style: normal; -} -[dir='rtl'] th { - text-align: right; -} -html[lang^=ja] blockquote, html[lang^=ja] q, html[lang^=ko] blockquote, html[lang^=ko] q, -html[lang^=zh] blockquote, html[lang^=zh] q { - font-style: normal; -} -q { - font-style: italic; -} -fieldset, iframe, img { - border: 0; -} -img { - border: none; - -ms-interpolation-mode: bicubic; - max-width: 100%; - vertical-align: middle; -} -video { - max-width: 100%; - object-fit: cover; -} -q { - quotes: none; -} -sup, sub { - font-size: 11px; - line-height: 0; -} - -table, fieldset { - margin: 0; -} -/* Biggest type */ -.display-1 { - font-size: 56px; - line-height: 68px; -} -@media (max-width: 719px) { - .display-1 { - font-size: 44px; - line-height: 56px; - } -} -h1, h2, h3 { - color: #212121; - color: rgba(0, 0, 0, .87); -} -h1 { - font-size: 44px; - line-height: 56px; - margin: 24px 0 12px; - font-weight: 300; -} -h1.short { - margin-right:320px; -} -@media (max-width: 719px) { - h1 { - font-size: 36px; - line-height: 48px; - } -} -h2 { - clear: left; - font-size: 28px; - font-weight: 400; - line-height: 32px; - margin: 24px 0 16px; -} -h3 { - font-size: 24px; - line-height: 32px; - font-weight: 400; - margin: 16px 0; -} -h4 { - font-size: 18px; - line-height: 24px; - margin: 12px 0; - font-weight: 500; -} -h5, h6 { - font-size: 16px; - line-height: 24px; - margin: 8px 0; -} -hr { /* applied to the bottom of h2 elements */ - height: 1px; - margin: 7px 0 12px; - border: 0; - background: #e5e5e5; -} -p, pre, table, form { - margin: 0 0 12px; -} -small { - font-size: 11.5px; - color: #000; -} -ul, ol { - margin: 0 0 15px 20px; - padding: 0; -} -[dir='rtl'] ul, [dir='rtl'] ol { - margin: 10px 30px 10px 10px; -} -ul ul, ul ol, ol ul, ol ol { - margin-bottom: 0; - margin-top: 0; -} -li { - margin: 0 0 12px; -} -dt { - margin: 24px 0 12px; -} -dd { - margin:0 0 10px 40px; -} -dd p, -dd pre, -dd ul, -dd ol, -dd dl { - margin-top:10px; -} -li p, -li pre, -li ul, -li ol, -li dl { - margin-top: 6px; - margin-bottom: 6px; -} -dl dd dl:first-child { - margin-top: 0; -} -pre strong, pre b, a strong, a b, a code { - color: inherit; -} -pre, code { - color: #060; - font: 13px/18px Consolas, "Liberation Mono", Menlo, Courier, monospace; - -webkit-font-smoothing: subpixel-antialiased; - -moz-osx-font-smoothing: auto; -} -code { - background-color: #f7f7f7; - padding: 3px 5px; -} - -legend { - display: none; -} -a, .link-color { - color: #039BE5; - text-decoration: none; -} -a:focus, a:hover { - color: rgba(3, 155, 229, .7); - text-decoration: none; -} -a.white { - color: #fff; - text-decoration:underline; -} -a.white:hover, a.white:active { - color: #ccc; -} -strong, b { - font-weight: bold; -} -table { - border-collapse: collapse; - border-spacing: 0; - border:0; - margin: .5em 1em 1em 0; - width:100%; /* consistent table widths; within IE's quirks */ - background-color:#f7f7f7; -} -th, td { - padding: 4px 12px; - vertical-align: top; - text-align: left; -} -td { - background-color:inherit; - border:solid 1px #DDD; -} -td *:last-child { - margin-bottom:0; -} -th { - background-color: #999; - color: #fff; - border:solid 1px #DDD; - font-weight: normal; -} -tr:first-of-type th:first-of-type:empty { - visibility: hidden; -} - -a.external-link { - background:url('../images/styles/open_new_page.png') no-repeat 100% 50%; - padding-right:16px; -} - -#jd-content img { - margin-bottom:15px; -} - -em { - font-style: italic; } - -acronym, -.tooltip-link { - border-bottom: 1px dotted #555555; - cursor: help; } - -acronym:hover, -.tooltip-link:hover { - color: #7aa1b0; - border-bottom-color: #7aa1b0; } - -img.with-shadow, -video.with-shadow { - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); } - -/* disclosures mixin */ -/* content layout */ -/* This grid is deprecated in favor of .cols and .col-X */ -.layout-content-row { - display: inline-block; - margin-bottom: 10px; } - * html .layout-content-row { - height: 1px; } - -.layout-content-col { - float: left; - margin-left: 20px; } - .layout-content-col:first-child { - margin-left: 0; } - .layout-content-col h3, - .layout-content-col h4 { - margin-top:0; } - -.layout-content-col.span-1 { - width: 40px; } - -.layout-content-col.span-2 { - width: 100px; } - -.layout-content-col.span-3 { - width: 160px; } - -.layout-content-col.span-4 { - width: 220px; } - -.layout-content-col.span-5 { - width: 280px; } - -.layout-content-col.span-6 { - width: 340px; } - -.layout-content-col.span-7 { - width: 400px; } - -.layout-content-col.span-8 { - width: 460px; } - -.layout-content-col.span-9 { - width: 520px; } - -.layout-content-col.span-10 { - width: 580px; } - -.layout-content-col.span-11 { - width: 640px; } - -.layout-content-col.span-12 { - width: 700px; } - -.layout-content-col.span-13 { - width: 760px; } - -.vspace.size-1 { - height: 10px; } - -.vspace.size-2 { - height: 20px; } - -.vspace.size-3 { - height: 30px; } - -.vspace.size-4 { - height: 40px; } - -.vspace.size-5 { - height: 50px; } - -.vspace.size-6 { - height: 60px; } - -.vspace.size-7 { - height: 70px; } - -.vspace.size-8 { - height: 80px; } - -.vspace.size-9 { - height: 90px; } - -.vspace.size-10 { - height: 100px; } - -.vspace.size-11 { - height: 110px; } - -.vspace.size-12 { - height: 120px; } - -.vspace.size-13 { - height: 130px; } - -.vspace.size-14 { - height: 140px; } - -.vspace.size-15 { - height: 150px; } - -.vspace.size-16 { - height: 160px; } - -/* nav */ -#nav { - /* section header divs */ - /* expanded section header divs */ - /* sublinks */ } - #nav li { - list-style-type: none; - font-size: 12px; - margin:0; - padding:0; - line-height: 18px; } - #nav a { - color: #505050; - text-decoration: none; - word-wrap:break-word; } - #nav .nav-section-header { - position: relative; - margin-bottom: 1px; - padding: 0 30px 0 0; } - #nav li.selected a { - color: #039BE5; - } - #nav li.selected ul li a { - /* don't highlight child items */ - color: #505050; } - #nav .nav-section .nav-section .nav-section-header { - /* no white line between second level sections */ - margin-bottom: 0; } - /* section header links */ - #nav > li > div > a { - display: block; - font-weight: 700; - padding: 13px 0 12px 10px; } - #nav .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; - display: block; - position: absolute; - top: 6px; - right: 0; } - #nav .nav-section-header.empty { - padding:0; } - #nav .nav-section-header.empty:after { - display: none; } - /* nested nav headers */ - #nav .nav-section .nav-section { - position: relative; - padding: 0; - margin: 0; } - #nav .nav-section li a { - /* first gen child (2nd level li) */ - display:block; - font-weight: 700; - text-transform: none; - padding: 13px 5px 13px 10px; - } - #nav .nav-section li li a { - /* second gen child (3rd level li) */ - font-weight: 400; - padding: 7px 5px 7px 10px; - } - #nav li.expanded .nav-section-header { - background: #f0f0f0; } - #nav li.expanded .nav-section-header.empty { - background: none; } - #nav li.expanded li .nav-section-header { - background: none; } - #nav li.expanded li ul { - /* 3rd level ul */ - padding:6px 0 1px 20px; - } - #nav li.expanded > .nav-section-header:after { - content: ''; - background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%; - width: 34px; - height: 34px; } - #nav li.expanded li ul.tree-list-children { - padding: 0; - } - #nav li.expanded li ul.tree-list-children .tree-list-children { - padding:0 0 0 10px; - } - #nav li span.tree-list-subtitle { - display:inline-block; - padding:5px 0 0 10px; - color:#555; - text-transform:uppercase; - font-size:12px; - } - #nav li span.tree-list-subtitle:before { - content: '—'; - } - #nav li span.tree-list-subtitle:after { - content: '—'; - } - #nav li span.tree-list-subtitle.package { - padding-top:15px; - cursor:default; - } - #nav li span.tree-list-subtitle.package:before { - content: ''; - } - #nav li span.tree-list-subtitle.package:after { - content: ''; - } - #nav li ul.tree-list-children.classes { - padding-left:10px; - } - #nav li ul { - display:none; - overflow: hidden; - margin: 0; } - #nav li ul.animate-height-in { - -webkit-transition: height 0.25s ease-in; - -moz-transition: height 0.25s ease-in; - transition: height 0.25s ease-in; } - #nav li ul.animate-height-out { - -webkit-transition: height 0.25s ease-out; - -moz-transition: height 0.25s ease-out; - transition: height 0.25s ease-out; } - #nav li ul li { - padding: 0; } - #nav li li li { - padding: 0; } - #nav li.expanded ul { - } - #nav li ul > li { - padding:0; - } - #nav li ul > li:last-child { - padding-bottom:5px; - } - #nav li ul.tree-list-children > li:last-child { - padding-bottom:0; - } - #nav li.expanded ul > li { - background:#f7f7f7; } - #nav li.expanded ul > li li { - background:inherit; } - #nav li ul.tree-list-children ul { - display:block; } - -#nav.samples-nav li li li a { - padding-top:3px; - padding-bottom:3px; -} -#nav.samples-nav li li ul > li:last-child { - padding-bottom:3px; -} - -.new, -.new-child { - font-size: .78em; - font-weight: bold; - color: #ff3d3d; - vertical-align:top; - white-space:nowrap; -} - -/* content header */ -.content-header { - position: relative; -} -.content-header:before, -.content-header:after { - content: ''; - display: table; - /* Clear heading margins, to make absolutely positioned nav a bit more predictable. */ -} -.content-header.just-links { - margin-bottom:0; - padding-bottom:0;} - -.content-footer { - margin-top: 10px; - padding-top:10px; - width:100%; } - -.content-footer .col-9 { - margin-left:0; -} -.content-footer .col-4 { - margin-right:0; -} -.content-footer.wrap { - max-width:940px; -} -.content-footer .plus-container { - margin:5px 0 0; - text-align:right; - float:right; -} - -a.back-link { - text-decoration: none; - text-transform: uppercase; -} - -.content-header .paging-links { - position: absolute; - right: 0; - top: 8px; - width: 220px; -} -.paging-links { - position: relative; - height:30px; } - .paging-links a { - position: absolute; } - .paging-links a, - .training-nav-top a { - text-decoration: none; } - .paging-links .prev-page-link:before, - .training-nav-top .prev-page-link:before, - a.back-link:before { - content: ''; - background: transparent url(../images/styles/disclosure_left.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-right: 5px; } - .paging-links .prev-page-link { - left: -15px; } - .paging-links .next-page-link { - right: 0; } - .next-page-link:after, - .start-class-link:after, - .start-course-link:after, - .next-class-link:after, - .go-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - .prev-page-link.inline:before { - content: none; } - .next-page-link.inline:after { - content: none; } - - .content-footer .paging-links .next-page-link { - left:0; - } - - .training-nav-top a { - border-bottom:0; - box-sizing: border-box; - color: inherit; - display:block; - float:left; - padding:10px 0; - line-height:30px; - text-align:center; - width: 50%; - } - - .training-nav-top a.prev-page-link { - padding-left: 15px; - text-align: left; - } - - .training-nav-top a.next-page-link { - padding-right: 15px; - text-align: right; - } - - .paging-links a.disabled, - .training-nav-top a.disabled, - .content-footer a.disabled { - color:#bbb; - } - - .paging-links a.disabled:hover, - .training-nav-top a.disabled:hover, - .content-footer a.disabled:hover { - cursor:default; - color:#bbb !important; - } - - .training-nav-top a.start-class-link, - .training-nav-top a.start-course-link, - .paging-links a.start-class-link { - width:100%; - } - - /* list of classes on course landing page */ - ol.class-list { - counter-reset: class; - list-style: none; - margin: 60px 0 0; - } - ol.class-list>li { - box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26); - margin: 0 0 20px; - overflow: hidden; - } - ol.class-list .title { - background: #00bcd4; - color: #fff; - display: block; - font-size: 20px; - font-weight: 500; - height: 32px; - margin: 0; - padding: 52px 16px 12px; - position: relative; - } - ol.class-list .title:before { - border-bottom: 1px solid white; - box-sizing: border-box; - /* Disable the numbers for now, since vert few classes need to be taken in order. */ - /* content: counter(class); */ - counter-increment: class; - height: 40px; - left: 0; - padding: 10px 1px 0 5px; - position: absolute; - top: 0; - text-align: right; - min-width: 30px; - } - ol.class-list .title h2 { - color: currentColor; - font-size: inherit; - font-weight: inherit; - margin:0 0 10px; - display:block; - float:left; - width:675px; - } - ol.class-list .title span { - display:none; - float:left; - font-size:18px; - font-weight:bold; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 32px; - } - - ol.class-list .description { - box-sizing: border-box; - float:left; - display:block; - margin:0; - padding: 16px 10px 16px 16px; - width: 50%; - } - ol.class-list .description.article { - width: 550px; - } - ol.class-list ol { - box-sizing: border-box; - float: left; - list-style: none; - margin: 0; - padding: 16px 16px 16px 10px; - width: 50%; - } - ol.class-list .lessons li { - margin: 0 0 6px; - line-height: 16px; - } - - /* Class colors */ - ol.class-list li:nth-child(10n+1) .title { - background: #00bcd4; - } - ol.class-list li:nth-child(10n+2) .title { - background: #4db6ac; - } - ol.class-list li:nth-child(10n+3) .title { - background: #66bb6a; - } - ol.class-list li:nth-child(10n+4) .title { - background: #7cb342; - } - ol.class-list li:nth-child(10n+5) .title { - background: #afb42b; - } - ol.class-list li:nth-child(10n+6) .title { - background: #ffb300; - } - ol.class-list li:nth-child(10n+7) .title { - background: #ff7043; - } - ol.class-list li:nth-child(10n+8) .title { - background: #ec407a; - } - ol.class-list li:nth-child(10n+9) .title { - background: #ab47bc; - } - ol.class-list li:nth-child(10n+10) .title { - background: #7e57c2; - } - - @media (max-width: 719px) { - ol.class-list ol, - ol.class-list .description { - float: none; - margin: 16px; - padding: 0; - width: auto; - } - } - - - .hide { - display:none !important; - } - - - - /* inner-doc tabs w/ title */ - -div#title-tabs-wrapper { - border-bottom:1px solid #ccc; - margin:20px 0 30px; -} -h1.with-title-tabs { - display:inline-block; - margin:0 0 -1px 0; - padding:0 60px 0 0; - border-bottom:1px solid #F9F9F9; -} -ul#title-tabs { - list-style:none; - padding:0; - height:29px; - margin:0; - font-size:16px; - line-height:26px; - display:inline-block; - vertical-align:bottom; -} -ul#title-tabs li { - display:block; - float:left; - margin-right:40px; - border-bottom: 3px solid transparent; -} -ul#title-tabs li.selected { - border-bottom: 3px solid #93C; -} -ul#title-tabs li a { - color:#333; -} -ul#title-tabs li a:hover, -ul#title-tabs li a:active { - color:#039BE5 !important; -} - - - -/* content body */ -@-webkit-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@-moz-keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -@keyframes glowheader { - from { - background-color: #33b5e5; - color: #000; - border-bottom-color: #000; } - - to { - background-color: transparent; - color: #33b5e5; - border-bottom-color: #33b5e5; } } - -h1:target, -h2:target, -h3:target { - -webkit-animation-name: glowheader; - -moz-animation-name: glowheader; - animation-name: glowheader; - -webkit-animation-duration: 0.7s; - -moz-animation-duration: 0.7s; - animation-duration: 0.7s; - -webkit-animation-timing-function: ease-out; - -moz-animation-timing-function: ease-out; - animation-timing-function: ease-out; } - -.design ol h4 { - margin-bottom:0; -} -.design ol { - counter-reset: item; } - .design ol>li { - font-size: 14px; - line-height: 20px; - list-style-type: none; - position: relative; } - .design ol>li:before { - content: counter(item) ". "; - counter-increment: item; - position: absolute; - left: -20px; - top: 0; } - .design ol li.value-1:before { - content: "1. "; } - .design ol li.value-2:before { - content: "2. "; } - .design ol li.value-3:before { - content: "3. "; } - .design ol li.value-4:before { - content: "4. "; } - .design ol li.value-5:before { - content: "5. "; } - .design ol li.value-6:before { - content: "6. "; } - .design ol li.value-7:before { - content: "7. "; } - .design ol li.value-8:before { - content: "8. "; } - .design ol li.value-9:before { - content: "9. "; } - .design ol li.value-10:before { - content: "10. "; } -.design .with-callouts ol>li { - list-style-position: inside; - margin-left: 0; } - .design .with-callouts ol>li:before { - display: inline; - left: -20px; - float: left; - width: 17px; - color: #33b5e5; - font-weight: 500; } -.design .with-callouts ul>li { - list-style-position: outside; } - -/* special list items */ -li.no-bullet { - list-style-type: none !important; } -li.no-bullet *{ - margin:0; } - -.design li.with-icon { - position: relative; - margin-left: 20px; - min-height: 30px; } - .design li.with-icon p { - margin-left: 0 !important; } - .design li.with-icon:before { - position: absolute; - left: -40px; - top: 0; - content: ''; - width: 30px; - height: 30px; } - .design li.with-icon.tablet:before { - background-image: url(../images/styles/ico_phone_tablet.png); } - .design li.with-icon.web:before { - background-image: url(../images/styles/ico_web.png); } - .design li.with-icon.action:before { - background-image: url(../images/styles/ico_action.png); } - .design li.with-icon.use:before { - background-image: url(../images/styles/ico_use.png); } - -/* video containers */ -.framed-galaxynexus-land-span-13 { - background: transparent url(../images/styles/device_galaxynexus_blank_land_span13.png) no-repeat -scroll top left; - padding: 42px 122px 62px 126px; - overflow: hidden; } - .framed-galaxynexus-land-span-13, .framed-galaxynexus-land-span-13 video, -.framed-galaxynexus-land-span-13 img { - width: 512px; - height: 286px; } - - -.framed-galaxynexus-land-span-8{ - background: transparent url(../images/styles/device_galaxynexus_blank_land_span8.png) no-repeat -scroll top left; - padding: 26px 68px 38px 72px; - overflow: hidden; } - .framed-galaxynexus-land-span-8, .framed-galaxynexus-land-span-8 video, -.framed-galaxynexus-land-span-8 img { - width: 320px; - height: 180px; } - -.framed-galaxynexus-port-span-9 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span9.png) no-repeat -scroll top left; - padding: 95px 122px 107px 124px; - overflow: hidden; } - .framed-galaxynexus-port-span-9, .framed-galaxynexus-port-span-9 video, -.framed-galaxynexus-port-span-9 img { - width: 274px; - height: 488px; } - -.framed-galaxynexus-port-span-5 { - background: transparent url(../images/styles/device_galaxynexus_blank_port_span5.png) no-repeat -scroll top left; - padding: 75px 31px 76px 33px; - overflow: hidden; } - .framed-galaxynexus-port-span-5, .framed-galaxynexus-port-span-5 video, -.framed-galaxynexus-port-span-5 img { - width: 216px; - height: 384px; } - -.framed-nexus4-port-216 { - background: transparent url(../images/styles/device_nexus4_blank_port_432.png) no-repeat -scroll top left; - background-size:240px 465px; - padding: 52px 12px 52px 12px; - overflow: hidden; } - .framed-nexus4-port-216, .framed-nexus4-port-216 video, - .framed-nexus4-port-216 img { - width: 216px; - height: 360px; } - -.framed-nexus5-port-span-5 { - background: transparent url(../images/styles/device_nexus5_blank_port_span5.png) no-repeat - scroll top left; - padding: 52px 33px 69px 31px; - overflow: hidden; -} - -.framed-nexus5-port-span-5, -.framed-nexus5-port-span-5 video, -.framed-nexus5-port-span-5 img { - width: 216px; - height: 384px; -} - -.framed-nexus5-land-span-13 { - background: transparent url(../images/styles/device_nexus5_blank_land_span13.png) no-repeat scroll top left; - padding: 36px 119px 54px 108px; - overflow: hidden; -} - -.framed-nexus5-land-span-13, -.framed-nexus5-land-span-13 video, -.framed-nexus5-land-span-13 img { - width: 533px; - height: 300px; -} - -.framed-nexus5-port-span-5, -.framed-nexus5-port-span-5 video, -.framed-nexus5-port-span-5 img { - width: 216px; - height: 384px; -} - -/* wear device frames */ - -.framed-wear-square { - background: transparent url(../images/styles/device_wear_square.png) no-repeat scroll top left; - background-size: 302px 302px; - height:222px; - width:222px; - padding:40px; - overflow:hidden; -} - -.framed-wear-square-small { - background: transparent url(../images/styles/device_wear_square_small.png) no-repeat scroll top left; - background-size: 169px 200px; - height:147px; - width:147px; - padding:27px 11px; - overflow:hidden; -} - -#jd-content -.framed-wear-square img { - height:222px; - width: 222px; - padding:0; - margin:0; -} - -#jd-content -.framed-wear-square-small img { - height:147px; - width: 147px; - padding:0; - margin:0; -} - - - - - - -/* landing page disclosures */ -.landing-page-link { - text-decoration: none; - font-weight: 500; - color: #333333; } - .landing-page-link:after { - content: ''; - background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%; - width: 10px; - height: 10px; - display: inline-block; - margin-left: 5px; } - -/* tooltips */ -.tooltip-box { - position: absolute; - background-color: rgba(0, 0, 0, 0.9); - border-radius: 2px; - font-size: 14px; - line-height: 20px; - color: #fff; - padding: 6px 10px; - max-width: 250px; - z-index: 10000; } - .tooltip-box.below:after { - position: absolute; - content: ''; - line-height: 0; - display: block; - top: -10px; - left: 5px; - border: 5px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.9); } - -/* video note */ -.video-instructions { - margin-top: 10px; - margin-bottom: 10px; } - .video-instructions:before { - content: ''; - background: transparent url(../images/styles/ico_movie_inline.png) no-repeat scroll top left; - display: inline-block; - width: 12px; - height: 12px; - margin-right: 8px; } - .video-instructions:after { - content: 'Click device screen to replay movie.'; } - -/* download buttons */ -.download-button { - display: block; - margin-bottom: 5px; - text-decoration: none; - background-color: #33b5e5; - color: #fff !important; - font-weight: 500; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12); - padding: 6px 12px; - border-radius: 2px; } - .download-button:hover, .download-button:focus { - background-color: #0099cc; - color: #fff !important; } - .download-button:active { - background-color: #006699; } - -.button.disabled, -.button.disabled:hover, -.button.disabled:active { - background:#ebebeb; - color:#999 !important; - border-color:#999; - cursor:default; -} - -/* UI tables and other things found in Writing style and Settings pattern */ -.ui-table { - width: 100%; - background-color: #282828; - color: #fff; - border-radius: 2px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); - border-collapse: separate; } - .ui-table th, - .ui-table td { - padding: 5px 10px; - background-color: inherit; - border:0;} - .ui-table thead th { - font-weight: bold; } - .ui-table tfoot td { - border-top: 1px solid #494949; - border-right: 1px solid #494949; - text-align: center; } - .ui-table tfoot td:last-child { - border-right: 0; } - -.layout-with-list-item-margins { - margin-left: 30px !important; } - -.emulate-content-left-padding { - margin-left: 10px; } - -.do-dont-label { - margin-bottom: 10px; - padding-left: 20px; - background: transparent none no-repeat scroll 0px 3px; } - .do-dont-label.bad { - background-image: url(../images/styles/ico_wrong.png); } - .do-dont-label.good { - background-image: url(../images/styles/ico_good.png); } - - - - -/* -------------------------------------------------------------------------- -Footer -*/ -.line { - clear: both; - background: #acbc00; - background: -moz-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #acbc00), -color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00)); - background: -webkit-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -o-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: -ms-linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - background: linear-gradient(top, #acbc00 0, #acbc00 50%, #bdde00 50%, #bdde00 100%); - height: 2px; - margin-top: 150px; - position: relative; - z-index: 11; -} -#footer { - font-size:11px; - clear: both; - color: #999; - padding: 15px 0; - margin-top:10px; - width:auto; -} -#footer-local ul { - list-style: none; - margin: 5px 0 30px 0; -} -#footer-local li { - display: inline; -} -#footer-local li+li:before { - content: '|'; - padding: 0 3px; - color: #e5e5e5; -} -#footer-global { - padding: 10px 15px; - background: #f5f5f5; -} -#footer-global { - border-top: 1px solid #ebebeb; - font-size: 11.5px; - line-height: 1.8; - list-style: none; -} -#footer-global ul { - margin: 0; -} -#footer-global li { - display: inline; - font-weight: bold; -} -#footer-global li+li:before { - content: '¬?'; - padding: 0 3px; -} -* html #footer-global li { - margin: 0 13px 0 0; -} -* [dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -*+html #footer-global li { - margin: 0 13px 0 0; -} -*+[dir='rtl'] #footer-global li { - margin: 0 0 0 13px; -} -#footer-global li a { - font-weight: normal; -} -.locales { - margin: 10px 0 0 0px; -} -[dir='rtl'] .locales { - background-position: right center; - float: left; - padding: 0 24px 0 0; -} -.locales form { - margin: 0; -} -.locales select, .sites select { - line-height: 3.08; - margin: 0px 0; - border: solid 1px #EBEBEB; - -webkit-appearance: none; - background: white url('../images/arrows-up-down.png') right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 230px; -} -} - -/* ============================================================================= - Print Only - ========================================================================== */ -@media print { - /* configure printed page */ - @page { - margin: 0.75in 1in; - widows: 4; - orphans: 4; - } - - /* reset spacing metrics */ - html, body, .wrap { - margin: 0 !important; - padding: 0 !important; - width: auto !important; - } - - /* leave enough space on the left for bullets */ - body { - padding-left: 20px !important; - } - #doc-col { - margin-left: 0; - } - - /* hide a bunch of non-content elements */ - #header, #footer, #nav-x, #side-nav, - .training-nav-top, .training-nav-bottom, - #doc-col .content-footer, - .nav-x, .nav-y, - .paging-links { - display: none !important; - } - - /* remove extra space above page titles */ - #doc-col .content-header { - margin-top: 0; - } - - /* bump up spacing above subheadings */ - h2 { - margin-top: 40px !important; - } - - /* print link URLs where possible and give links default text color */ - p a:after { - content: " (" attr(href) ")"; - font-size: 80%; - } - p a { - word-wrap: break-word; - } - a { - color: inherit; - } - - /* syntax highlighting rules */ - .str { color: #060; } - .kwd { color: #006; font-weight: bold; } - .com { color: #600; font-style: italic; } - .typ { color: #404; font-weight: bold; } - .lit { color: #044; } - .pun { color: #440; } - .pln { color: #000; } - .tag { color: #006; font-weight: bold; } - .atn { color: #404; } - .atv { color: #060; } -} - -/* ============================================================================= - Layout - ========================================================================== */ -@media screen, projection, print { - -.training-nav-top { - border:1px solid #e5e5e5; - border-width: 1px 1px 0; - bottom: -56px; - box-sizing: border-box; - position: absolute; - right: 0; - width: 280px; -} - -.training-nav-bottom { - float:right; - margin:0 0 0 20px; - padding:0 0 20px; -} - -#tb-wrapper, -#qv-wrapper { - float:right; - clear:right; - margin:6px 0 0 30px; /* negative top-margin to counter the content-header bottom margin */ - padding:0 0 30px; -} - -#tb-wrapper { - margin:56px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */ -} - -#tb, -#qv { - border: 1px solid #e5e5e5; - box-sizing: border-box; - float: right; - line-height: 16px; - padding: 5px 0; - width: 240px; -} - -#tb { - width:280px; -} - -#tb h2, -#qv h2 { - border-top: 1px solid #e5e5e5; - color: inherit; - font-size: 16px; - line-height: 24px; - margin: 15px 0 4px; - padding: 10px 15px 0; -} - -#tb h2:first-child, -#qv h2:first-child { - border-top: 0; - padding-top: 0; - margin-top: 10px; -} - -#tb .download-box, -#qv .download-box { - padding:0 0 0 15px; -} - -#tb .download-box .filename, -#qv .download-box .filename { - font-size:11px; - margin:4px 4px 10px; -} - -@media (max-width: 719px) { - .training-nav-top { - left: 0; - width: auto; - } - - #tb-wrapper { - clear: none; - float: none; - margin-left: 0; - } - - #tb { - float: none; - width: auto; - } - - #qv-wrapper { - display: none; - } -} - - -/* Dev guide quicknav */ - -.sidebox-wrapper { - float:right; - clear:right; - margin:0 0 0 20px; - padding:0 0 20px; -} - -.sidebox { - width:226px; - font-size:13px; - line-height:18px; - border-left:3px solid #a9e27d; - float:right; - padding:0 0 0 20px; - margin:0 0 1em 20px; -} - -.sidebox h2, -.sidebox h3, -.sidebox h4, -.sidebox h5 { - font-weight:bold; - margin:0 0 10px; - line-height: 16px; -} - -.sidebox * { - font-size:inherit; -} - -.sidebox > *:last-child { - margin-bottom:0; -} - -#tb ol, -#tb ul, -#qv ul { - list-style-type: none; - margin:0 15px 10px 15px; -} - -#tb li, -#qv li { - margin: 8px 0; - padding: 0 0 0 16px; - position: relative; -} - -#tb p { - margin:0 15px 10px; -} - -#qv ol { - list-style:none; - margin:0 15px 15px; - font-size:inherit; - line-height:inherit; -} - -#tb ol ol, -#tb ul ul, -#qv ol ol, -#qv ul ul, -.sidebox ol ol, -.sidebox ul ul { - margin: 8px 0; -} - -.sidebox p, -#qv p, -#tb p { - margin: 0 0 10px; -} - -/* related resources blocks in checklists */ - -/* related resources sections that have dynamic content */ - - - -h3.rel-resources { -margin:1.25em auto; -} - -/* -------------------------------------------------------------------------- -Form -*/ -.article form { - margin: 0 0 20px; -} -.article form .form-required { - color: #dd4b39; -} -.article form fieldset { - margin: 0 0 20px; - padding: 0; -} -.article form legend { - display: block; - line-height: 1.5; - margin: 0; - padding: 0; -} -/* -.article form ol, .article form ul { - margin: 0 0 0 1em; - padding: 0 0 0 1em; -} -[dir='rtl'] .article form ol, [dir='rtl'] .article form ul { - margin: 0 1em 0 0; - padding: 0 1em 0 0; -} -.article form ol ul, .article form ul ul, [dir='rtl'] .article form ol ul, [dir='rtl'] .article form -ul ul { - list-style: none; - margin: 0; - padding: 0; -} -.article form li { - margin: 0 0 20px; -} -.article form li li { - margin: 0 0 5px; -} -*/ -.article form label { - display: block; - margin: 0 0 5px; - padding: 0; -} -.article form input[type='text'], .article form select, .article form textarea, .article form -.checkbox-group, .article form .radio-group { - margin-bottom: 15px; -} -.checkbox-group input { - width: 13px; - height: 13px; - background: #fff; - border: solid 1px #c6c6c6; - float: left; -} -.article form .checkbox-group, .article form .radio-group { - display: block -} -.article form select { - border: solid 1px #ebebeb; - border-top-color: #ddd; - -webkit-appearance: none; - background: #f3f3f3 url(../images/arrows-up-down.png) right center no-repeat; - height: 30px; - color: #222; - line-height: normal; - padding: 5px; - width: 130px; -} - -.article form .browse .browse-msg { - font-size: 11.5px; -} -.article form .browse .button-secondary { - height: auto; - line-height: 25px; - font-size: 11px; - padding: 0 8px; - margin: 0 10px 15px 0; -} -.article form input[type='text'], .article form textarea { - border: 1px solid #ebebeb; - border-top-color: #dcdcdc; - color: #222; - line-height: normal; - padding: 6px 10px; - width: 300px; -} -.article form textarea { - height: 150px; -} -.article form input[type='text']:focus, .article form textarea:focus { - border-color: #33B5E5; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -o-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .2); - outline: 0; -} -.article form input[disabled], .article form textarea[disabled], .article form label.form-disabled { - color: #999; -} -.article form input[type='text'][disabled], .article form textarea[disabled] { - background-color: #ebebeb; -} -form .form-error input[type='text'], form .form-error textarea { - border-color: #dd4b39; - margin-right: 20px; -} -.aside { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 20px; - position: relative; - background: #f9f9f9; -} -/* -.aside, .notification, .promo { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; - margin: 10px 0; - padding: 10px; - position: relative; -} -.aside>:first-child, .notification>:first-child, .promo>:first-child { - margin-top: 0; -} -.aside>:last-child, .notification>:last-child, .promo>:last-child { - margin-bottom: 0; -} -.aside { - background: #f9f9f9; -} -.notification { - background: #fffbe4; - border-color: #f8f6e6; -} -.promo { - background: #f6f9ff; - border-color: #eff2f9; -} -*/ - -/* SDK TOS styles */ - -div.sdk-terms { - white-space: pre-wrap; - word-wrap: break-word; - font-family: inherit; - font-size: inherit; - padding: 10px; - height: 370px; - width: 738px; - border: 1px solid #444; - background: transparent; - overflow:auto; - margin:0 0 10px; -} - -div.sdk-terms.fullsize { - padding: 0; - height: auto; - width: auto; - border:none; -} - -div.sdk-terms h3, -div.sdk-terms h2 { - margin:0; -} - -div#sdk-terms-form { - padding:0 0 0 10px; -} - -div#sdk-terms-form input { - display:inline; - margin:4px 4px 4px 0; -} - - -/* -------------------------------------------------------------------------- -Code Style -*/ -pre { - margin:0 0 1em 0; - padding: 1em; - overflow: auto; - border: solid 1px #ddd; - background: #f7f7f7; -} -.str { color: #800; } /* Code string */ -.kwd { color: #008; } -.typ { color: #606; } -.lit { color: #066; } -.pun { color: #660; } -.pln { color: #000; } -.tag { color: #008; } -.atn { color: #828; } -.atv { color: #800; } /* XML string */ -.dec { color: #606; } - -/* -------------------------------------------------------------------------- -Three-Pane -*/ -/* Package Nav & Classes Nav */ -.three-pane { - position: relative; - border-top: solid 1px #ebebeb; -} -#packages-nav .js-pane, -#classes-nav .js-pane { - overflow:visible; -} -#packages-nav { - height:270px; - max-height: inherit; - overflow: hidden; - position: relative; -} -#classes-nav { - overflow: hidden; - position: relative; -} -#packages-nav ul, #classes-nav ul { - list-style-type: none; - margin: 10px 0 20px 0; - padding: 0; -} -#classes-nav li { - font-weight: bold; - margin: 5px 0; -} -#packages-nav li, -#classes-nav li li { - margin: 0; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li a, #classes-nav li a:active, #classes-nav li a:visited { - padding: 0 0 0 4px; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited, -#nav-tree li a, #nav-tree li a:active, #nav-tree li a:visited { - color: #222; - font-weight: normal; -} -#packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited, -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited { - display: block; -} -#packages-nav li.selected a, #packages-nav li.selected a:active, #packages-nav li.selected -a:visited, -#classes-nav li li.selected a, #classes-nav li li.selected a:active, #classes-nav li li.selected -a:visited, -#nav-tree li div.selected { - font-weight: 500; - color: #0099cc; - background-color:#fff; } - #packages-nav li.selected ul li a, - #classes-nav li.selected ul li a { - /* don't highlight child items */ - color: #555555; } -#nav-tree li div.selected a { - font-weight: 500; - color: #0099cc; -} -#nav-swap { - height:30px; - border-top:1px solid #ccc; -} -#nav-swap a { - display:inline-block; - height:100%; - color: #222; - font-size: 12px; - padding: 5px 0 5px 5px; -} - -#nav-swap .fullscreen { - float: right; - width: 24px; - height: 24px; - text-indent: -1000em; - padding:0; - margin:3px 5px 0; - background: url(../images/fullscreen.png) no-repeat -24px 0; -} -#nav-swap .fullscreen.disabled { - background-position: 0 0; -} -#nav-swap .fullscreen:hover, -#nav-swap .fullscreen:focus { - cursor:pointer; -} - - -/* nav tree */ -#swapper, #nav-tree, #tree-list { - overflow:hidden; - margin-left:0; -} - -#nav-tree ul { - list-style:none; - padding:0; - margin:10px 0; -} - -#nav-tree ul li div { - padding:0 0 0 4px; -} - -#side-nav #nav-tree ul li a, -#side-nav #nav-tree ul li span.no-children { - padding: 0; - margin: 0; -} - -#nav-tree .plus { - margin: 0 3px 0 0; -} - -#nav-tree ul ul { - list-style: none; - margin: 0; - padding: 0 0 0 0; -} - -#nav-tree ul li { - margin: 0; - padding: 0 0 0 0; - white-space: nowrap; -} - -#nav-tree .children_ul { - padding:0; - margin:0; -} -#nav-tree .children_ul li div { - padding:0 0 0 10px; -} -#nav-tree .children_ul .children_ul li div { - padding:0 0 0 20px; -} - -#nav-tree a.nolink { - color: #222; - text-decoration: none; -} - -#nav-tree span.label { - width: 100%; -} - -#nav-tree { - overflow-x: auto; - overflow-y: scroll; - outline:0; -} - - -/* Content */ -#doc-col { - margin-right:0; -} - -/* Uncomment this for preview release watermark -#doc-col { - background: url('../images/preview.png') repeat; -} -*/ - -#doc-content-container { - margin-left: 291px -} -#doc-header, #doc-content { - padding: 1em 2em; -} -#doc-header { - background: #f7f7f7; -} -#doc-header h1 { - line-height: 0; - margin-bottom: 15px; -} -#api-info-block { - float: right; - font-weight: bold; -} -#api-info-block a, #api-info-block a:active, #api-info-block a:visited { - color: #222; -} -#api-info-block a:hover, #api-info-block a:focus { - color: #33B5E5; -} -#api-nav-header { - height:19px; /* plus 16px padding = 35; same as #nav li */ - font-size:14px; - padding: 8px 0; - margin: 0; - border-bottom: 1px solid #CCC; - background:#e9e9e9; - background: rgba(0, 0, 0, 0.05); /* matches #nav li.expanded */ - line-height: 19px; /* Fix regression after page line-height is bumped to 24px */ -} -#api-nav-title { - padding:0 5px; - white-space:nowrap; -} - -#api-level-toggle { - float:right; - padding:0 5px; -} - -#api-level-toggle label { - margin:0; - vertical-align:top; - line-height: 19px; - font-size:13px; - height: 19px; -} - -#api-level-toggle .select-wrapper { - width: 35px; - display: inline-block; - overflow: hidden; -} -#api-level-toggle select { - border: 0; - appearance:none; - -moz-appearance:none; - -webkit-appearance: none; - background: transparent url(../images/arrows-up-down.png) 23px 5px no-repeat; - color: #222; - height: 19px; - line-height: 19px; - padding: 0; - margin:1px 0 0 0; - width:150%; - font-size:13px; - vertical-align:top; - outline:0; -} - - -/* Toggle for revision notes and stuff */ -div.toggle-content.closed .toggle-content-toggleme { - display:none; -} - -#jd-content img.toggle-content-img { - margin:0 5px 5px 0; -} - -div.toggle-content-toggleme { - padding:0 0 0 15px; -} - - -/* API LEVEL FILTERED MEMBERS */ - -.absent, -.absent a:link, -.absent a:visited, -.absent a:hover, -.absent * { - color:#bbb !important; - cursor:default !important; - text-decoration:none !important; -} -#devdoc-nav li.absent.selected, -#devdoc-nav li.absent.selected *, -#devdoc-nav div.label.absent.selected, -#devdoc-nav div.label.absent.selected * { - background-color:#eaeaea !important; -} -.absent h4.jd-details-title, -.absent h4.jd-details-title * { - background-color:#f6f6f6 !important; -} -.absent img { - opacity: .3; - filter: alpha(opacity=30); - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; -} - - - - - - - - - -/* JQUERY RESIZABLE STYLES */ -.ui-resizable { position: relative; } -.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; z-index:1; } -.ui-resizable .ui-resizable-handle { display: block; border-bottom: 1px solid #e4e4e4; } -/*body .ui-resizable-disabled .ui-resizable-handle { display: none; } -body .ui-resizable-autohide .ui-resizable-handle { display: none; }*/ -.ui-resizable-s { cursor: s-resize; height: 10px; width: 100% !important; bottom: -11px; left: 0; -border-bottom: solid 1px #ededed; - background: #f7f7f7 url("../images/resizable-s2.png") no-repeat scroll center center; } -/* -.ui-resizable-e { -cursor: e-resize; width: 10px; right: 0; top: 0; height: 100%; border-right: solid -1px #ededed;background: #f7f7f7 url("../images/resizable-e2.png") no-repeat scroll center center; } -*/ - -/* -------------------------------------------------------------------------- -Lightbox -*/ -.lightbox { - width: 769px; - padding: 1.5em; - margin: 0 auto; - border: solid 1px #dcdcdc; - background: #fff; - -moz-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - -webkit-box-shadow: 1px 1px 5px rgba(0,0,0,0.1); - box-shadow: 1px 1px 5px rgba(0,0,0,0.1) -} -.lightbox .header { - float: left; - width: 720px; - margin: -10px 20px 10px 0; -} -.lightbox .close { - float: right; - width: 10px; - height: 10px; - margin: -10px -10px 10px 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; -} -.lightbox .close:hover, .lightbox .close:focus { - background-position: -10px 0; -} - -/* -------------------------------------------------------------------------- -Styles for samples browser -*/ - -#codesample-wrapper { - width:100000px; /* super wide to contain floats, but doesn't cause scroll */ - overflow:visible; -} -pre#codesample-block { - float:left; - overflow:visible; - background:transparent; - border:none; -} -pre#codesample-block a.number { - display:none; -} -pre#codesample-block .code-line:hover { - background:#e7e7e7; -} -pre#codesample-line-numbers { - float:left; - width:2em; - background:transparent; - border:none; - border-right:1px solid #ccc; - padding-left:0; - font-family:monospace; - text-align:right; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: -moz-none; - -ms-user-select: none; - user-select: none; -} -pre#codesample-line-numbers a { - color:#999; -} -pre#codesample-line-numbers.hidden { - display:none; -} -pre#codesample-block span.code-line { - width:100%; - display:inline-block; -} - -/* -Styles for displaying image or video resources in samples browser. -Resources are marked as no-display if they exceed the size limit. -*/ -div#codesample-resource img, div#codesample-resource video { - border: 1px solid #ececec; -} - -div#codesample-resource.noDisplay div { - border: 1px solid #ececec; - width:120px; - margin-bottom:4px; - padding:20px; -} - -div#codesample-resource .noDisplay-message:after { - font-style:italic; - font-size:12px; - content: 'This resource is not available for browsing. To view it, please download the project.'; -} - -/* -Styles for project structure (treeview) page -*/ -.structure-dir { -background-image:url(../../assets/images/folder.png); -background-repeat:no-repeat; -background-position:16px 2px; - margin:.25em 0 0 0; - padding:0 0 0 0; -} - -.structure-toggleme { - margin:0 0 0 3em; - padding:0 0 0 0; - text-decoration:none; -} - -.structure-java{ -background-image:url(../../assets/images/file-java.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .3em 22px; -} - -.structure-file { -background-image:url(../../assets/images/file-generic.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .3em 22px; -} - -.structure-xml { -background-image:url(../../assets/images/file-xml.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .25em 22px; -} - -.structure-img { -background-image:url(../../assets/images/file-image.png); -background-repeat:no-repeat; -background-position:0px 2px; - margin:.3em 0 0 0; - padding:.3em 0 .25em 22px; -} - -.structure-manifest { -background-image:url(../../assets/images/file-manifest.png); -background-repeat:no-repeat; - margin:.0 0 0 1.25em; - padding:0 0 0 22px; - text-decoration:none; -} - -#jd-content .structure-toggle-img { - margin:.5em 0 0 0; -padding-right:2.1em; -} - -.dirInfo { - margin-left:2em; -} - -.structure-dir a { - text-decoration:none; -} - -.structure-manifest a { - text-decoration: none; -} -.structure-file a { - text-decoration: none; -} - -.sampleEmbed { - background-color:rgb(249, 249, 249); -} - -.sampleEmbed ol.lineNumbers { - list-style-type: decimal; - padding-left:1em; -} - -.sampleEmbed ol.lineNumbers li { -border-left:1px solid #ddd; -border-right:1px solid #ddd; -color:gray; -background-color:#f7f7f7; -margin:0 0 0 24px; -padding: 2px 2px 2px 6px; -} - -.sampleEmbed ol.lineNumbers li:hover { -background: #efefef; -} - -.samples-nav li a { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* -------------------------------------------------------------------------- -Styles for raw formatted line numbers (not used with listformatted version) -div.sampleLine div.lineNumber { - display: inline; -} -div.sampleLine div.lineCode { - display: inline; - padding-left:6px; -} -div.sampleLine { - padding:0; - margin:0; -}*/ - -/* -------------------------------------------------------------------------- -Butterbar -*/ -#butterbar-wrapper { - position:absolute; - top:0; - left:0; - width:100%; -} -#butterbar { - width:100%; - margin:0 auto; -} -#butterbar-message { - background-color:rgba(255, 187, 51, .4); - font-size:13px; - padding: 5px 0; - text-align:center; -} -a#butterbar-message { - cursor:pointer; - display:block; -} -a#butterbar-message:hover { - text-decoration:underline; -} - -/* -------------------------------------------------------------------------- -Misc and article typography -*/ - - -.clearfix:before, .clearfix:after { - content: ""; - display: table -} -.clearfix:after { - clear: both -} -.clearfix { - *zoom: 1 -} -table.blank th, table.blank td { - border: 0; - background: none -} -.caption { - margin: 0.5em 0 2em 0; - color: #000; - font-size: 11.5px; -} - -.nolist, .nolist ul, .nolist ol { - list-style:none; - margin-left:0; -} -#tb .nolist { - margin-left:15px; -} - -dl.xml>dt { - text-transform:uppercase; -} -dl.xml dl.attr { - margin-top:0; -} - -pre.classic { - background-color:transparent; - border:none; - padding:0; -} - -p.img-caption { - margin: -10px 0 20px; - font-size: 13px; -} - -/* figures and callouts */ -.figure { - position: relative; -} - -.figure.pad-below { - margin-bottom: 20px; -} - -.figure .figure-callout { - position: absolute; - color: #fff; - font-weight: 500; - font-size: 16px; - line-height: 23px; - text-align: center; - background: transparent url(../images/styles/callout.png) no-repeat scroll 50% 50%; - padding-right: 2px; - width: 30px; - height: 29px; - z-index: 1000; -} - -.figure .figure-callout.top { - top: -9px; -} - -.figure .figure-callout.right { - right: -5px; -} - -.figure-caption { - margin: 0 10px 20px 0; - font-size: 14px; - line-height: 20px; - font-style: italic; -} - -/* rows of figures */ -.figure-row { - font-size: 0; - line-height: 0; - /* to prevent space between figures */ -} - -.figure-row .figure { - display: inline-block; - vertical-align: top; -} - -.figure-row .figure + .figure { - margin-left: 10px; - /* reintroduce space between figures */ -} - -.border-img { - border: 1px solid #CCC; -} - -.center-img { - margin: auto; - text-align: center; -} -.center-img img { - margin-bottom: 15px; -} - -.figure img, -.figure-right img, -.figure-left img, -.figure-center img, -.border-img { - margin-bottom: 15px; -} - -.figure-center { - margin: 32px auto 24px; - max-width: 100%; -} - -.figure, -.figure-right { - clear: right; - float: right; - margin: 10px 0 0 0; - padding: 0 0 0 20px; - max-width: 50%; - /* width must be defined w/ an inline style matching the image width */ -} - -.figure-left { - clear: left; - float: left; - margin: 10px 0 0 0; - padding: 0 20px 0 0; - max-width: 50%; - /* width must be defined w/ an inline style matching the image width */ -} - -@media (max-width: 719px) { - /* Collapse on mobile. */ - .figure, - .figure-right, - .figure-left { - float: none; - clear: none; - padding: 0; - margin: 32px auto 24px; - max-width: 100%; - } -} - -img.frame { - border:1px solid #DDD; - padding:4px; -} - -p.table-caption { - margin: 0 0 4px 0; - font-size:13px; -} - -p.code-caption { - margin-bottom: 4px; - font: 12px/1.5 monospace; -} - -p.note, div.note, -p.caution, div.caution, -p.warning, div.warning { - padding: 0 0 0 20px; - border-left: 3px solid; - margin: 16px 0; -} - -p.note, div.note { - border-color: #66c2ff; -} - -p.caution, div.caution { - border-color: #f81; -} - -p.warning, div.warning { - border-color: #f55; -} - -div.note.design { - border-left: 4px solid #33B5E5; -} - -div.note.develop { - border-left: 4px solid #F80; -} - -div.note.distribute { - border-left: 4px solid #9C0; -} - -.note p, .caution p, .warning p { - margin:0 0 5px; -} - -.note p:last-child, .caution p:last-child, .warning p:last-child { - margin-bottom:0; -} - -.summary-table { - background-color:#e1e4e6; - padding:1em; - margin-bottom:1.5em; -} -.summary-table p { - font-size:.98em; -} - -.summary-table h5 { - line-height:1em; - font-size:.98em; -} - -body.about blockquote { - display:block; - float:right; - width:280px; - font-size:20px; - font-style:italic; - line-height:24px; - color:#33B5E5; - margin:0 0 20px 30px; -} - -div.design-announce p { - margin:0 0 10px; -} - -.expandable { - height:34px; - padding-left:20px; - position:relative; -} -.expandable:before { - content: ''; - background-image: url(../images/styles/disclosure_down.png); - background-repeat:no-repeat; - background-position: -12px -9px; - width: 20px; - height: 20px; - display: inline-block; - position: absolute; - top: 0; - left: 0; } -} -.expandable.expanded:before { - background-image: url(../images/styles/disclosure_up.png); -} - -/* notice box for cross links between Design/Develop docs */ -a.notice-developers-video, -a.notice-developers, -a.notice-designers-video, -a.notice-designers { - float:right; - clear:right; - width:238px; - min-height:50px; - margin:0 0 20px 20px; - border:1px solid #ddd; -} -a.notice-developers-video.wide, -a.notice-developers.wide, -a.notice-designers-video.wide, -a.notice-designers.wide { - width:278px; -} -a.notice-developers-video div, -a.notice-developers div, -a.notice-designers-video div, -a.notice-designers div { - min-height:40px; - background:url('../images/styles/notice-developers@2x.png') no-repeat 10px 10px; - background-size:40px 40px; - padding:10px 10px 10px 60px; -} -a.notice-designers div { - background:url('../images/styles/notice-designers@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-designers-video div { - background:url('../images/styles/notice-designers-video@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-developers-video div { - background:url('../images/styles/notice-developers-video@2x.png') no-repeat 10px 10px; - background-size:40px 40px; -} -a.notice-developers-video:hover, -a.notice-developers:hover, -a.notice-designers-video:hover, -a.notice-designers:hover { - background:#eee; -} -a.notice-developers-video h3, -a.notice-developers h3, -a.notice-designers-video h3, -a.notice-designers h3 { - font-size:13px; - line-height:18px; - font-weight:bold; - text-transform:uppercase; - color:#000 !important; - margin:0 0 1px; -} -a.notice-developers-video p, -a.notice-developers p, -a.notice-designers-video p, -a.notice-designers p { - margin:0; - line-height:14px; -} -a.notice-developers-video.left, -a.notice-developers.left, -a.notice-designers-video.left, -a.notice-designers.left { - margin-left:0; - float:left; -} - - -/* hide nested list items; companion to hideNestedLists() */ -.hide-nested li ol, -.hide-nested li ul { - display:none; -} - -a.header-toggle { - display:block; - float:right; - text-transform:uppercase; - font-size:.8em !important; - font-weight:normal; - margin-top:2px; -} - - -/* for IDE instruction toggle (Studio/Eclipse/Other) */ -select.ide { - background: transparent; - border: 1px solid #bbb; - border-left: 0; - border-right: 0; - margin: 10px 0; - padding: 10px 0; - color:#666; -} -select.ide, -select.ide option { - font-family: inherit; - font-size:16px; - font-weight:500; -} -/* hide all except studio by default */ -.select-ide.eclipse, -.select-ide.other { - display:none; -} -/* ... unless studio also includes one of the others */ -.select-ide.studio.eclipse, -.select-ide.studio.other { - display:none; -} - - -/* ----------------------------------------------- -good/bad example containers -*/ - -div.example-block { - background-repeat: no-repeat; - background-position:10px 8px; - background-color:#ccc; - padding:4px; - margin:.8em auto 1.5em 2em; - width:260px; - float:right; -} -/* red container */ -.example-block.bad { - background-image: url(/images/example-bad.png); - background-color:#f4cccc; -} -/* green container */ -.example-block.good { - background-image: url(/images/example-good.png); - background-color:#d9ead3; -} -/* container heading div */ -#jd-content .example-block .heading { - font-weight:bold; - margin:6px 0 9px 36px; - padding:6px auto; -} -/* container image (if any) */ -#jd-content .example-block img { - margin:0; - padding:0px; -} - -.example-block table { - margin:0; -} - -/* ----------------------------------------------- -Dialog box for popup messages -*/ - -div.dialog { - height:0; - margin:0 auto; -} - -div.dialog>div { - z-index:99; - position:fixed; - margin:70px 0; - width: 391px; - height: 200px; - background: #F7F7F7; --moz-box-shadow: 0 0 15px rgba(0,0,0,0.5); --webkit-box-shadow: 0 0 15px rgba(0,0,0,0.5); -box-shadow: 0 0 15px rgba(0,0,0,0.5); -} -/* IE6 can't position fixed */ -* html div.dialog div { position:absolute; } - - -div#deprecatedSticker { - display:none; - z-index:99; - position:fixed; - right:15px; - top:114px; - margin:0; - padding:1em; - background:#FFF; - border:1px solid #dddd00; - box-shadow:-5px 5px 10px #ccc; - -moz-box-shadow:-5px 5px 10px #ccc; - -webkit-box-shadow:-5px 5px 10px #ccc; -} - -div#langMessage, -div#naMessage { - display:none; - width:555px; - height:0; - margin:0 auto; -} - - -div#langMessage>div, -div#naMessage div { - z-index:99; - width:450px; - position:fixed; - margin:50px 0; - padding:4em 4em 3em; - background:#FFF; - border:1px solid #999; - box-shadow:-10px 10px 40px #888; - -moz-box-shadow:-10px 10px 40px #888; - -webkit-box-shadow:-10px 10px 40px #888; -} -/* IE6 can't position fixed */ -* html div#langMessage>div, -* html div#naMessage div { position:absolute; } - -div#naMessage strong { - font-size:1.1em; -} - -div#langMessage .lang { - display:none; -} - -/* -------------------------------------------------------------------------- -Slideshow Controls & Next/Prev -*/ -.slideshow-next, .slideshow-prev { - width: 20px; - height: 36px; - text-indent: -1000em; -} -.slideshow-container { - margin: 2em 0; -} -.slideshow-container:before, .slideshow-container:after { - content: ""; - display: table; - clear: both; -} -a.slideshow-next, a.slideshow-next:visited { - - float: right; - - background: url(../images/arrow-right.png) no-repeat 0 0 - -} - -a.slideshow-prev, a.slideshow-prev:visited { - - float: left; - - background: url(../images/arrow-left.png) no-repeat 0 0 - -} - -.slideshow-next:hover, .slideshow-prev:hover, .slideshow-next:focus, .slideshow-prev:focus { - - background-position: 0 -36px - -} - -.slideshow-next:active, .slideshow-prev:active { - - background-position: 0 -72px - -} -.slideshow-nav { - width: 74px; - margin: 0 auto; -} -.slideshow-nav a, .slideshow-nav a:visited { - display: inline-block; - width: 12px; - height: 12px; - margin: 0 2px 20px 2px; - background: #ccc; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} -.slideshow-nav a:hover, .slideshow-nav a:focus { - - background: #33B5E5 -} - -.slideshow-nav a:active { - - background: #1e799a; - background: #ebebeb; - -webkit-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - -moz-box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0px 0px 5px 2px rgba(0, 0, 0, .05); -} -.slideshow-nav a.active, .slideshow-nav a.active:active, .slideshow-nav a.active:visited { - background: #33B5E5 -} -/* -------------------------------------------------------------------------- -Tabs -*/ -ul.tabs { - padding: 0; - margin: 2em 0 0 0; -} -ul.tabs:before, ul.tabs:after { - content: ""; - display: table; - clear: both; -} -ul.tabs li { - list-style-type: none; - float: left; -} -ul.tabs li a, ul.tabs li a:active, ul.tabs li a:visited { - display: block; - height: 36px; - line-height: 36px; - padding: 0 15px; - margin-right: 2px; - color: #222; - -moz-border-radius-topleft: 2px; - -moz-border-radius-topright: 2px; - -moz-border-radius-bottomright: px; - -moz-border-radius-bottomleft: px; - -webkit-border-radius: 2px 2px px px; - border-radius: 2px 2px px px; - border-top: solid 1px #ebebeb; - border-left: solid 1px #ebebeb; - border-right: solid 1px #ebebeb; - background-color: #fff; - background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#fafafa)); - background-image: -webkit-linear-gradient(top, #ffffff, #fafafa); - background-image: -moz-linear-gradient(top, #ffffff, #fafafa); - background-image: -ms-linear-gradient(top, #ffffff, #fafafa); - background-image: -o-linear-gradient(top, #ffffff, #fafafa); - background-image: linear-gradient(top, #ffffff, #fafafa); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', -EndColorStr='#fafafa'); -} -ul.tabs li a:hover { - color: #33B5E5; -} -ul.tabs li a.selected { - height: 37px; - color: #33B5E5; - background-color: #f7f7f7; - background-image: none; - border-color: #ddd; -} -.tab-content { - padding: 1.2em; - margin: -1px 0 2em 0; - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - border: solid 1px #ddd; - background: #f7f7f7; -} -/* -------------------------------------------------------------------------- -Feature Boxes -*/ -.feature-box { - width: 291px; - height: 200px; - position: relative; - background: #F7F7F7; -} -.box-border .top, .box-border .bottom, .box-border .left, .box-border .right { - z-index: 100; - position: absolute; - background-color: #aaa; -} -.box-border .top, .box-border .bottom { - width: 291px; - height: 1px; -} -.dialog .box-border .top, -.dialog .box-border .bottom { width:391px; } - -.box-border .left, .box-border .right { - width: 1px; - height: 8px; -} -.box-border .top { top: 0; left: 0 } -.box-border .top .left { top: 1px; left: 0 } -.box-border .top .right { top: 1px; right: 0 } -.box-border .bottom .left { top: -8px; left: 0 } -.box-border .bottom { top: 200px; left: 0 } -.box-border .bottom .right { top: -8px; right: 0 } - -.feature-box h4, -.dialog h4 { - margin: 15px 18px 10px; - padding:0; -} - -.feature-box p, -.dialog p { - margin: 10px 18px; - padding:0; -} -.feature-box .link, -.dialog .link { - border-top: 1px solid #dedede; - bottom: 0; - position: absolute; - width: inherit; -} -.feature-box a, .feature-box h4, -.dialog a, .dialog h4 { - -webkit-transition: color .4s ease; - -moz-transition: color .4s ease; - -o-transition: color .4s ease; - transition: color .4s ease; -} -.feature-box:hover { - cursor: pointer; -} -.feature-box:hover .box-border .top, .feature-box:hover .box-border .bottom, .feature-box:hover -.left, .feature-box:hover .right { - background-color: #33B5E5; -} -.feature-box:hover h4, .feature-box:hover a { - color: #33B5E5; -} -/* -------------------------------------------------------------------------- -Page-Specific Styles -*/ -.colors { - position: relative; - float: left; - width: 92px; - margin: 40px 0 20px; -} -.colors div { - color: #fff; - font-size: 11.5px; - width: 82px; - height: 82px; - margin-top:-30px; - line-height: 82px; - text-align: center; - border: solid 5px #fff; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; -} - - - - - - - - - - - - - - -/* ########### REFERENCE DOCS ################## */ - -#packages-nav h2, -#classes-nav h2 { - font-size:18px; - margin:0; - padding:0 0 0 4px; -} - -#jd-header { - padding: 0 0 12px; - margin: 20px 0 12px; - font-size:12px; - padding-bottom:12px; - border-bottom:solid 1px #ccc; -} - -#jd-header h1 { - margin:0; - padding:0 0 6px 0; -} - -/* not sure if this is needed in the ref docs, disabling for now -.jd-descr h2 { - margin:16px 0; -} -*/ - -/* First paragraph of a content pages is a bit larger - - note the very specific selector. */ -.jd-descr > p:first-child, -.jd-descr > #tb-wrapper + p, -.jd-descr > #qv-wrapper + p { - font-size: 16px; - margin-bottom: 16px; -} - -/* page-top-right container for reference pages (holds -links to summary tables) */ -#api-info-block { - font-size:12px; - margin:20px 0 0; - padding:0 10px 6px; - font-weight:normal; - float:right; - text-align:right; - color:#999; - max-width:80%; - font-size: 12px; - line-height:14px; -} - -#api-info-block div.api-level { - font-weight:bold; - font-size:inherit; - float:none; - color:#222; - padding:0; - margin:0; -} - -/* inheritance table */ -.jd-inheritance-table { - border-spacing:0; - margin:0; - padding:0; - font-size:12px; - line-height:14px; - background-color:transparent; -} -.jd-inheritance-table tr td { - border: none; - margin: 0; - padding: 0; - background-color:transparent; -} -.jd-inheritance-table .jd-inheritance-space { - font-weight:bold; - width:1em; -} -.jd-inheritance-table .jd-inheritance-interface-cell { - padding-left: 17px; -} - - - -.jd-sumtable a { - text-decoration:none; -} - -.jd-sumtable a:hover { - text-decoration:underline; -} - -/* the link inside a sumtable for "Show All/Hide All" */ -.toggle-all { - display:block; - float:right; - font-weight:normal; - font-size:0.9em; -} - -/* adjustments for in/direct subclasses tables */ -.jd-sumtable.jd-sumtable-subclasses { - margin: 1em 0 0 0; - max-width:968px; - background-color:transparent; - font-size:13px; -} - -/* extra space between end of method name and open-paren */ -.sympad { - margin-right: 2px; -} - -/* right alignment for the return type in sumtable */ -.jd-sumtable .jd-typecol { - text-align:right; -} - -/* adjustments for the expando table-in-table */ -.jd-sumtable-expando { - margin:.5em 0; - padding:0; -} - -/* a div that holds a short description */ -.jd-descrdiv { - padding:3px 1em 0 1em; - margin:0; - border:0; -} - -#jd-content img.jd-expando-trigger-img { - padding:0 4px 4px 0; - margin:0; -} - -.jd-sumtable-subclasses div#subclasses-direct, -.jd-sumtable-subclasses div#subclasses-indirect { - margin:0 0 0 13px; -} - - - -/********* MEMBER REF *************/ - - -.jd-details { -/* border:1px solid #669999; - padding:4px; */ - margin:0 0 1em; -} - -/* API reference: a container for the -.tagdata blocks that make up the detailed -description */ -.jd-details-descr { - padding:0; - margin:.5em .25em; -} - -/* API reference: a block containing -a detailed description, a params table, -seealso list, etc */ -.jd-tagdata { - margin:.5em 1em; -} - -.jd-tagdata p { - margin:0 0 1em 1em; -} - -/* API reference: adjustments to -the detailed description block */ -.jd-tagdescr { - margin:.25em 0 .75em 0; -} - -.jd-tagdescr ol, -.jd-tagdescr ul { - margin:0 2.5em; - padding:0; -} - -.jd-tagdescr table, -.jd-tagdescr img { - margin:.25em 1em; -} - -.jd-tagdescr li { -margin:0 0 .25em 0; -padding:0; -} - -/* API reference: heading marking -the details section for constants, -attrs, methods, etc. */ -h4.jd-details-title { - font-size:1.15em; - background-color: #E2E2E2; - margin:4em 0 .6em; - padding:3px 95px 3px 3px; /* room for api-level */ -} -body.google h4.jd-details-title { - background-color: #FFF; - padding-top:5px; - border-top: 1px solid #ccc; -} -body.google table.jd-sumtable th { - background-color: #FFF; - color:#000; -} - -h4.jd-tagtitle { - margin:0; -} - -h4 .normal { - font-weight:normal; -} - -/* API reference: heading for "Parameters", "See Also", etc., -in details sections */ -h5.jd-tagtitle { - margin:0 0 .25em 0; - font-size:1em; -} - -.jd-tagtable { - margin:0; - background-color:transparent; - width:auto; -} - -.jd-tagtable td, -.jd-tagtable th { - border:none; - background-color:#fff; - vertical-align:top; - font-weight:normal; - padding:2px 10px; -} - -.jd-tagtable th { - font-style:italic; -} - - -/* Inline api level indicator for methods */ -div.api-level { - font-size:.8em; - font-weight:normal; - color:#999; - float:right; - padding:0 8px 0; - margin-top:-30px; -} - -table.jd-tagtable td, -table.jd-tagtable th { - background-color:transparent; -} - -table.jd-tagtable th { - color:inherit; -} - - -/* SEARCH FILTER */ - -.menu-container { - position:relative; -} -#search_autocomplete { - font-weight:normal; -} - -.search_filtered_wrapper { - position: absolute; - right: 18px; - top: 64px; -} -.suggest-card { - float:right; - position:relative; - width:170px; - min-height:90px; - border: solid 1px #C5C5C5; - background: white; - margin-right:-5px; - -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2); - -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} -.suggest-card.reference { - z-index: 998; - width: auto; -} -.suggest-card.develop { - z-index:997; - border-top: solid 4px #ff7043; -} -.suggest-card.design { - z-index:996; - border-top: solid 4px #00bcd4; -} -.suggest-card.distribute { - z-index:995; - border-top: solid 4px #afb42b; -} -.child-card { - width:100%; -} -.suggest-card.dummy { - width:172px; - float:right; - border:0; - background:transparent; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -ul.search_filtered { - min-width:100%; - list-style: none; - margin: 5px 0; - padding: 0; -} -.search_filtered .jd-selected { - background:#efefef; - cursor:pointer; -} -.search_filtered .jd-selected, -.search_filtered .jd-selected a { - color:#039BE5 !important; -} - -.no-display { - display: none; -} - -.search_filtered li.jd-autocomplete { - font-size: 0.81em; - border: none; - margin: 0; - padding: 0; - line-height:1.5em; -} - -.search_filtered li a { - padding: 2px 10px; - color:#222 !important; - display:inline-block; - line-height:12px; -} - -.search_filtered li.header { - font-weight:bold; - color:#444; - border: none; - margin: 0; - padding: 2px 10px; - line-height:1.5em; -} -.search_filtered li.header.small { - font-size:0.85em; -} - -.suggest-card.reference -.search_filtered li.header { - color:#aaa; - font-size: 0.81em; -} - -.search_filtered li.header:first-child { - margin: 0 0 2px; -} - -@media (max-width: 719px) { - .search_filtered_wrapper { - left: 24px; - right: 24px; - top: 44px; - } - - .suggest-card { - box-shadow: 0 2px 1px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1); - float: none; - margin-right: 0; - min-height: 0; - max-height: 204px; - overflow: hidden; - } - - .suggest-card.develop, - .suggest-card.design, - .suggest-card.distribute { - display: none !important; - } - - ul.search_filtered { - margin: 0; - } - - .search_filtered li.jd-autocomplete { - border-top: solid 1px #C5C5C5; - font-size: inherit; - text-align: left; - } - - .search_filtered li.jd-autocomplete:first-child { - border-top: 0; - } - - .search_filtered li a { - display: block; - overflow: hidden; - padding: 14px 10px; - text-overflow: ellipsis; - white-space: nowrap; - } -} - -.show-item { - display: table-row; -} -.hide-item { - display: hidden; -} - - - -/* SEARCH RESULTS */ - - -#leftSearchControl .gsc-twiddle { - background-image : none; -} - -#leftSearchControl td, #searchForm td { - border: 0px solid #000; - padding:0; -} - -#leftSearchControl .gsc-resultsHeader .gsc-title { - padding-left : 0px; - font-weight : bold; - font-size : 13px; - color:#006699; - display : none; -} - -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector { - display : none; -} - -#leftSearchControl .gsc-resultsRoot { - padding-top : 6px; -} - -#leftSearchControl div.gs-visibleUrl-long { - display : block; - color:#006699; -} - -#leftSearchControl .gsc-webResult { - padding:0 0 20px 0; -} - -.gsc-webResult div.gs-visibleUrl-short, -table.gsc-branding, -.gsc-clear-button { - display : none; -} - -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page, -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results, -#leftSearchControl a, -#leftSearchControl a b { - color:#006699; -} - -.gsc-resultsHeader { - display: none; -} - -/* Disable built in search forms */ -.gsc-control form.gsc-search-box { - display : none; -} -table.gsc-search-box { - margin:6px 0 0 0; - border-collapse:collapse; -} - -td.gsc-input { - padding:0 2px; - width:100%; - vertical-align:middle; -} - -input.gsc-input { - border:1px solid #BCCDF0; - width:99%; - padding-left:2px; - font-size:.95em; -} - -td.gsc-search-button { - text-align: right; - padding:0; - vertical-align:top; -} - - -#searchResults { - overflow:hidden; /* because the repositioned page links makes the section think it needs to scroll -(it doesn't) */ - height:auto; -} - -#searchResults .gsc-control { - position:relative; - width:auto; - padding:0 0 10px; -} - -#searchResults .gsc-tabsArea { - position: relative; - white-space: nowrap; - float: left; - width: 25%; -} - -#searchResults .gsc-above-wrapper-area { - display:none; -} - -#searchResults .gsc-resultsbox-visible { - box-sizing: border-box; - float: left; - padding-left:20px; - width: 75%; -} - -@media (max-width: 719px) { - #searchResults .gsc-tabsArea { - display: none; - } - - #searchResults .gsc-resultsbox-visible { - float: none; - padding-left: 0; - width: auto; - } -} - -#searchResults .gsc-tabHeader { - margin-top: 4px; - padding: 3px 6px; - position:relative; - width:auto; - display:block; -} - -#searchResults h2#searchTitle { - padding:0; - margin:30px 0 5px; - border:none; -} - -#searchResults h2#searchTitle em { - font-style:normal; - color:#33B5E5; -} - -#searchResults .gsc-table-result { - margin:5px 0 10px 0; - background-color:transparent; -} -#searchResults .gs-web-image-box, .gs-promotion-image-box { - width:120px; -} -#searchResults .gs-web-image-box img.gs-image, .gs-promotion-image-box img.gs-promotion-image { - max-width:120px; -} - -#searchResults .gsc-table-result .gsc-thumbnail { - padding:0 20px 0 0; -} - -#searchResults td { - background-color:transparent; -} - -#searchResults .gsc-expansionArea { - position:relative; -} -#searchResults .gsc-tabsArea .gsc-cursor-box { - width:200px; - padding:20px 0 0 1px; -} -#searchResults .gsc-cursor-page { - display:inline-block; - float:left; - margin:-1px 0 0 -1px; - padding:0; - height:27px; - width:27px; - text-align:center; - line-height:2; -} - -#searchResults .gsc-tabHeader.gsc-tabhInactive, -#searchResults .gsc-cursor-page { - background: #F0F0F0; - border: 0; - color: #039BE5; -} - -#searchResults .gsc-tabHeader.gsc-tabhActive, -#searchResults .gsc-tabHeader.gsc-tabhActive:hover, -#searchResults .gsc-cursor-page.gsc-cursor-current-page, -#searchResults .gsc-cursor-page.gsc-cursor-current-page:hover { - background-color: #039BE5; - border: 0; - color: #fff; -} - - - - -/************ STICKY NAV BAR ******************/ - -#context { - clear: both; - padding-top: 14px; -} -#context .breadcrumb { - float: left; - margin-bottom: 10px; -} -#context .util { - float: right; - margin-right: 20px; -} - -.breadcrumb { - list-style: none; - margin: 0; - padding: 0; - position: relative; -} -.breadcrumb li { - float: left; - padding: 0 20px 0 0; - color: #000; - white-space: nowrap; -} -.breadcrumb li a { - color: #000; -} -.breadcrumb li:after { - content: url(../images/breadcrumb.png); - position: relative; - top: 1px; - left: 10px; - width: 5px; - height: 10px; -} -.breadcrumb li.current { - font-weight: 700; -} -.breadcrumb li.current:after { - display: none; -} - -/* offset the tags to account for sticky nav */ -body.reference a[name] { - visibility: hidden; - display: block; - position: relative; - top: -56px; -} - - -/* Quicknav */ -.btn-quicknav { - width:20px; - height:28px; - float:left; - margin-left:6px; - padding-right:10px; - position:relative; - cursor:pointer; - border-right:1px solid #CCC; -} - -.btn-quicknav a { - zoom:1; - position:absolute; - top:13px; - left:5px; - display:block; - text-indent:-9999em; - width:10px; - height:5px; - background:url(../images/quicknav_arrow.png) no-repeat; -} - -.btn-quicknav a.arrow-active { - background-position: 0 -5px; - display:none; -} - -#header-wrap.quicknav a.arrow-inactive { - display:none; -} - -.btn-quicknav.active a.arrow-active { - display:block; -} - -#header-wrap.quicknav .nav-x li { - min-width:160px; - margin-right:20px; -} - -#header-wrap.quicknav li.last { - margin-right:0px; -} - -#quicknav { - float:none; - clear:both; - margin-left:0; - margin-top:-30px; - display:none; - overflow:hidden; -} - -#header-wrap.quicknav #quicknav { - -} - -#quicknav ul { - margin:10px 0; - padding:0; -} - -#quicknav ul li.about { - border-top:1px solid #9933CC; -} - -#quicknav ul li.design { - border-top:1px solid #33b5e5; -} - -#quicknav ul li.develop { - border-top:1px solid #FF8800; -} - -#quicknav ul li.distribute { - border-top:1px solid #99cc00; -} - -#quicknav ul li { - display:block; - float:left; - margin:0 20px 0 0; - min-width:140px; -} - -#quicknav ul li.last { - margin-right:0px; -} - -#quicknav ul li ul li { - float:none; -} - -#quicknav ul li ul li a { - color:#222; -} - -#quicknav ul li li ul, -#quicknav ul li li ul li { - margin:0; -} - -#quicknav ul li li ul li:before { - content:"\21B3"; -} - -#header-wrap { - -webkit-transition: all 0.25s ease-out; - -moz-transition: all 0.25s ease-out; - -ms-transition: all 0.25s ease-out; - -o-transition: all 0.25s ease-out; - transition: all 0.25s ease-out; - -} - -#header-wrap.quicknav { - height:216px; - -} - -.moremenu { - float: right; - position: relative; - width: 50px; - height:28px; - display: block; - margin-top:-3px; - margin-bottom:7px; - overflow:hidden; - -webkit-transition: width 0.25s ease; - -moz-transition: width 0.25s ease; - -o-transition: width 0.25s ease; - transition: width 0.25s ease; -} - -.moremenu #more-btn { - width:40px; - height:28px; - background:url(../images/icon_more.png) no-repeat; - border-left:1px solid #CCC; - float:left; - cursor:pointer; -} - -.moremenu:hover #more-btn { - background-position:0 -28px; -} - -.morehover { - position:absolute; - right:6px; - top:-9px; - width:40px; - height:35px; - z-index:99; - overflow:hidden; - - -webkit-opacity:0; - -moz-opacity:0; - -o-opacity:0; - opacity:0; - - -webkit-transform-origin:100% 0%; - -moz-transform-origin:100% 0%; - -o-transform-origin:100% 0%; - transform-origin:100% 0%; - - -webkit-transition-property: -webkit-opacity; - -webkit-transition-duration: .25s; - -webkit-transition-timing-function:ease; - - -moz-transition-property: -moz-opacity; - -moz-transition-duration: .25s; - -moz-transition-timing-function:ease; - - -o-transition-property: -o-opacity; - -o-transition-duration: .25s; - -o-transition-timing-function:ease; - - transition-property: opacity; - transition-duration: .25s; - transition-timing-function:ease; -} - -.morehover:hover, -.morehover.hover { - opacity:1; - height:385px; - width:268px; - -webkit-transition-property:height, -webkit-opacity; -} - -.morehover .top { - width:268px; - height:39px; - background:url(../images/more_top.png) no-repeat; -} - -.morehover .mid { - width:228px; - background:url(../images/more_mid.png) repeat-y; - padding:10px 20px 0 20px; -} - -.morehover .mid .header { - border-bottom:1px solid #ccc; - font-weight:bold; -} - -.morehover .bottom { - width:268px; - height:6px; - background:url(../images/more_bottom.png) no-repeat; -} - -.morehover ul { - margin:10px 10px 20px 0; -} - -.morehover ul li { - list-style:none; -} - -.morehover ul li.active a, -.morehover ul li.active a:hover { - color:#222 !important; -} - -.morehover ul li.active img { - margin-right:4px; -} - - - - -/* MARQUEE */ -.slideshow-container { - width:100%; - overflow:hidden; - position:relative; -} -.slideshow-container .slideshow-prev { - position:absolute; - top:50%; - left:0px; - margin-top:-36px; - z-index:99; -} -.slideshow-container .slideshow-next { - position:absolute; - top:50%; - margin-top:-36px; - z-index:99; - right:0px; -} - -.slideshow-container .pagination { - position:absolute; - bottom:20px; - width:100%; - text-align:center; - z-index:99; -} -.slideshow-container .pagination ul { - margin:0; -} -.slideshow-container .pagination ul li{ - display: inline-block; - width:12px; - height:12px; - text-indent:-8000px; - list-style:none; - margin: 0 3px; - border-radius:6px; - background-color:#ddd; - cursor:pointer; - -webkit-transition:color .5s ease-in; - -moz-transition:color .5s ease-in; - -o-transition:color .5s ease-in; - transition:color .5s ease-in; -} -.slideshow-container .pagination ul li:hover { - background-color:#bbb; -} -.slideshow-container .pagination ul li.active { - background-color:#6ab344; -} -.slideshow-container .pagination ul li.active:hover { - background-color:#6ab344; -} -.slideshow-container ul li { - display:inline; - list-style:none; -} - - -#landing h1 { - margin:17px 0 20px 0 !important; -} - -a.download-sdk { - float:right; - margin:-10px 0; - height:30px; - padding-top:4px; - padding-bottom:0px; -} - -#searchResults.wrap { - max-width:940px; - border-bottom:1px solid #e5e5e5; -} - -#searchResults.wrap #leftSearchControl { - min-height:700px -} - - - - - - - - - - -/* - * CSS Styles that are needed by jScrollPane for it to operate correctly. - */ - -.jspContainer { - overflow: hidden; - position: relative; -} - -.jspPane { - position: absolute; - width:100% !important; /* to avoid cut-off api names in reference in horiz scroll */ -} - -.jspVerticalBar { - position: absolute; - top: 0; - right: 0; - width: 4px; - height: 100%; - background: #f5f5f5; -} - -.jspHorizontalBar { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 4px; - background: #f5f5f5; -} - -.jspVerticalBar *, -.jspHorizontalBar * { - margin: 0; - padding: 0; -} -.jspCap { - display: block; -} - -.jspVerticalBar .jspCap { - height: 4px; -} - -.jspHorizontalBar .jspCap { - width: 0; - height: 100%; -} - -.jspHorizontalBar .jspCap { - float: left; -} - -.jspTrack { - position: relative; -} - -.jspDrag { - background: #ccc; - position: relative; - top: 0; - left: 0; - cursor: pointer; -} - -.jspDrag:hover, -.jspDrag:active { - border-color: #09c; - background-color: #4cadcb; - background-image: -webkit-gradient(linear, left top, right top, from(#5dbcd9), to(#4cadcb)); - background-image: -webkit-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -moz-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -ms-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: -o-linear-gradient(left, #5dbcd9, #4cadcb); - background-image: linear-gradient(left, #5dbcd9, #4cadcb); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#5dbcd9', EndColorStr='#4cadcb'); -} - -.jspHorizontalBar .jspTrack, -.jspHorizontalBar .jspDrag { - float: left; - height: 100%; -} - -.jspArrow { - background: #999; - text-indent: -20000px; - display: block; - cursor: pointer; -} - -.jspArrow.jspDisabled { - cursor: default; - background: #ccc; -} - -.jspVerticalBar .jspArrow { - height: 16px; -} - -.jspHorizontalBar .jspArrow { - width: 16px; - float: left; - height: 100%; -} - -.jspVerticalBar .jspArrow:focus { - outline: none; -} - -.jspCorner { - float: left; - height: 100%; -} - -/* Yuk! CSS Hack for IE6 3 pixel bug :( */ -* html .jspCorner { - margin: 0 -3px 0 0; -} -/******* end of jscrollpane *********/ - - - - - -/************ DEVELOP HOMEPAGE ******************/ - -/* Slideshow */ -.slideshow-develop { - height: 316px; - width: 940px; - position: relative; - overflow:hidden; -} -.slideshow-develop .frame { - width: 940px; - height: 316px; -} -.slideshow-develop img.play { - max-width:350px; - max-height:240px; - margin:20px 0 0 90px; - -webkit-transform: perspective(800px ) rotateY( 35deg ); - box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -moz-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: -16px 20px 40px rgba(0, 0, 0, 0.3); -} -.slideshow-develop img.play.no-shadow { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} -.slideshow-develop img.play.no-transform { - -webkit-transform: none; -} -.slideshow-develop a.slideshow-next { - background: url(../images/arrow-right-develop.png); -} -.slideshow-develop a.slideshow-prev { - background: url(../images/arrow-left-develop.png); -} -.slideshow-develop .content-right { - float: left; -} -.slideshow-develop .content-right h2 { - padding:0; - margin-bottom:10px; - border:none; - font-size:24px; -} -.slideshow-develop .item { - height: 300px; - width: 940px; -} -.slideshow-develop .pagination ul li.active { - background-color: #F80; -} -.slideshow-develop .pagination ul li.active:hover { - background-color: #F80; -} -.slideshow-develop .item hr { - margin:5px 0 10px; -} -.slideshow-develop .item p { - margin:10px 0; -} -.slideshow-develop .item p.title-intro { - position:absolute; - margin:0; -} - -/* Feeds */ -.feed ul { - margin: 0; -} -.feed .feed-nav { - height: 25px; - border-bottom: 1px solid #CCC; -} -.feed .feed-nav li { - list-style: none; - float: left; - height: 21px; /* +4px bottom border = 25px; same as .feed-nav */ - margin-right: 25px; - cursor: pointer; -} -.feed .feed-nav li.active { - color: #000; - border-bottom: 4px solid #F80; -} -.feed .feed-container { - overflow: hidden; - width: 460px; -} -.feed .feed-container .feed-frame { - width: 1000px; -} -.feed .feed-container .feed-frame ul { - float: left; - width:460px; -} -.feed .feed-container .feed-frame ul ul { - float: none; - margin:10px 0 0 30px; -} -.feed .feed-container .feed-frame li { - list-style: none; - margin: 20px 0 20px 0; - width: 460px; - height:93px; -} -.feed .feed-container .feed-frame li.playlist { - height:auto; -} -.feed .feed-container .feed-frame li.playlist a { - height:93px; - display:block; -} -.feed .feed-container .feed-frame li.more { - height:20px; - margin:10px 0 5px 5px; -} -.feed .feed-container .feed-frame li.more a { - height:inherit; -} -.feed .feed-container .feed-frame li.playlist-video { - list-style: none; - margin: 0; - width: 460px; - height:55px; - font-size:12px; -} -.feed .feed-container .feed-frame li.playlist-video a { - height:45px; - padding:5px; -} -.feed .feed-container .feed-frame li.playlist-video h5 { - font-size:12px; - line-height:13px; - margin:0; -} -.feed .feed-container .feed-frame li.playlist-video p { - margin:5px 0 0; - line-height:15px; -} -.feed-container .feed-frame div.feed-image { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; - background:url('../images/blog-default.png') no-repeat 0 0; - background-size:180px; -} -#jd-content .feed .feed-container .feed-frame li img { - float: left; - border: 1px solid #999; - margin:0 20px 0 0; - width:122px; - height:92px; -} -#jd-content .feed .feed-container .feed-frame li.playlist-video img { - width:inherit; - height:inherit; -} - -.feed .feed-container .feed-frame li a, -.feed .feed-container .feed-frame li a:active { - color:#555 !important; -} - -.feed .feed-container .feed-frame li a:hover, -.feed .feed-container .feed-frame li a:hover * { - color:#7AA1B0 !important; -} - -/* Video player */ -#player-wrapper { - display:none; - margin: -1px auto 0; - position: relative; - max-width: 940px; - height: 0px; -} -#player-frame { - background: #EFEFEF; - border: 1px solid #CCC; - padding: 0px 207px; - z-index: 10; /* stay above marque, but below search suggestions */ - width: 525px; - height: 330px; - position: relative; -} -#player-frame .close { - position: absolute; - right: 8px; - bottom: 4px; - width: 16px; - height: 16px; - margin: 0; - text-indent: -1000em; - top: 6px; - background: url(../images/close.png) no-repeat 0 0; - z-index:9999; -} -#player-frame .close:hover, #player-frame .close:focus { - background-position: -16px 0; - cursor:pointer; -} - - - -/************ DEVELOP TOPIC CONTAINERS ************/ - -.landing-banner, -.landing-docs { - margin:20px 0; -} -.landing-banner > div:first-child, -.landing-docs > div:first-child, -.landing-docs > .col-12 { - margin-left:0; - min-height:280px; -} -.landing-banner.short > div { - min-height:50px; -} -.landing-banner > div:last-child, -.landing-docs > div:last-child, -.landing-docs > .col-12 { - margin-right:0; -} - -.landing-banner > div > *:last-child { - margin-bottom:0; -} -.landing-banner h1 { - margin-top:16px; - padding-bottom:24px; -} -.landing-docs, -.landing-banner { - clear:both; - overflow:hidden; -} -.landing-docs h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - margin:0 0 20px; -} -.landing-docs a { - color:#333 !important; -} - -.landing-docs a:hover, -.landing-docs a:hover * { - color:#7AA1B0 !important -} - -.landing-docs .normal-links a { - color:#039BE5 !important; -} - -.plusone { - float:right; -} - - - -.next-docs { - border-top:1px solid #ccc; - margin:40px 0 0; - padding:5px 0 0; - clear:left; - overflow:hidden; -} -.next-docs div:first-child { - margin-left:0; -} -.next-docs div:last-child { - margin-right:0; -} - -.next-docs h2 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:none; - margin:0 0 1em; - padding:5px 0 0; -} - - - -/************* HOME/LANDING PAGE *****************/ - -.slideshow-home { - height: 500px; - width: 940px; - border-bottom: 1px solid #CCC; - position: relative; - margin: 0; -} -.slideshow-home .frame { - width: 940px; - height: 500px; -} -.slideshow-home .content-left { - float: left; - text-align: center; - vertical-align: center; - margin: 0 0 0 35px; -} -.slideshow-home .content-right { - margin: 80px 0 0 0; -} -.slideshow-home .content-right p { - margin-bottom: 10px; -} -.slideshow-home .content-right p:last-child { - margin-top: 15px; -} -.slideshow-home .content-right h1 { - padding:0; -} -.slideshow-home .item { - height: 500px; - width: 940px; -} -.home-sections { - padding: 30px 20px 20px; - margin: 20px 0; - background: -webkit-linear-gradient(top, #F6F6F6,#F9F9F9); -} -.home-sections ul { - margin: 0; -} -.home-sections ul li { - float: left; - display: block; - list-style: none; - width: 170px; - height: 35px; - border: 1px solid #ccc; - background: white; - margin-right: 10px; - border-radius: 1px; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - box-shadow: 1px 1px 5px #EEE; - -webkit-box-shadow: 1px 1px 5px #EEE; - -moz-box-shadow: 1px 1px 5px #EEE; - background: white; -} -.home-sections ul li:hover { - background: #F9F9F9; - border: 1px solid #CCC; -} -.home-sections ul li a, -.home-sections ul li a:hover { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width: 100%; - text-align: center; - color: #039BE5 !important; -} -.home-sections ul li a { - font-weight: bold; - margin-top: 8px; - line-height: 18px; - float: left; - width:100%; - text-align:center; -} -.home-sections ul li img { - float: left; - margin: -8px 0 0 10px; -} -.home-sections ul li.last { - margin-right: 0px; -} - -/************ DISTRIBUTE PAGES ******************/ - -.article-detail #body-content { - padding-top: 10px; -} - -/* A container for grid sets with uppercase h3 and rule */ -.dynamic-grid h3 { - font-size:14px; - line-height:21px; - color:#555; - text-transform:uppercase; - border-bottom:1px solid #CCC; - padding:8px 0 0 1px; - margin-bottom:14px; - clear:both; -} - -.top-right-float { - float: right; -} - -.clearfloat { - float: none; - clear: both; -} - - -/** - * UTILITIES - */ - - -.border-box { - box-sizing: border-box; -} - -.vertical-center-outer { - display: table; - height: 100%; - width: 100%; -} - -.vertical-center-inner { - display: table-cell; - vertical-align: middle; -} - -/** - * TYPE STYLES - */ - -.landing-h1 { - color: #44555d; - font-weight: 300; - font-size: 56px; - line-height: 80px; - text-align: center; - letter-spacing: -1px; - margin-bottom: 6px; -} - -.landing-pre-h1 { - font-weight: 400; - font-size: 28px; - color: #93B73F; - line-height: 36px; - text-align: center; - letter-spacing: -1px; - text-transform: uppercase; -} - -.landing-h1.hero { - text-align: left; - color: #fff; -} - -.landing-h2 { - font-weight: 300; - font-size: 42px; - line-height: 64px; - text-align: center; -} - -.landing-subhead { - color: #78868d; - font-size: 20px; - font-weight: 300; - line-height: 32px; - text-align: center; -} -.landing-subhead.hero { - text-align: left; - color: white; -} - -.landing-hero-description { - text-align: left; - margin: 1em 0; -} - -.landing-hero-description p { - font-weight: 300; - margin: 0; - font-size: 18px; - line-height: 24px; -} - -.landing-body .landing-small { - font-size: 14px; - line-height: 19px; -} - -.landing-body.landing-align-center { - text-align: center; -} - -.landing-align-left { - text-align: left; -} - -/** - * LAYOUT - */ - -.landing-section { - background: #eceff1; - clear: both; - padding: 80px 20px 80px; - margin: 0 -20px; - text-rendering: optimizeLegibility; -} - -@media (max-width: 719px) { - .landing-section { - margin-left: -10px; - margin-right: -10px; - padding-left: 10px; - padding-right: 10px; - } -} - -.landing-short-section { - padding: 40px 10px 28px; -} - -.landing-gray-background { - background-color: #b0bec5; -} - -.landing-white-background { - background-color: white; -} - -.landing-red-background { - color: white; - background-color: hsl(8, 70%, 54%); -} - -.landing-red-background .landing-h1 { - color: white; -} - -.landing-red-background .landing-subhead { - color: hsl(8, 71%, 84%); - text-align: left; -} - - -.preview-hero { - height: calc(100vh - 128px); - min-height: 504px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../preview/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.wear-hero { - height: calc(100vh - 128px); - min-height: 504px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../wear/images/hero.jpg); - background-size: cover; - background-position: top center; - color: white; - position: relative; - overflow: hidden; -} - -.tv-hero { - height: calc(100vh - 128px); - min-height: 504px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../tv/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.auto-hero { - height: calc(100vh - 128px); - min-height: 504px; - padding-top: 0; - padding-bottom: 0; - background-image: url(../../auto/images/hero.jpg); - background-size: cover; - background-position: right center; - color: white; - position: relative; - overflow: hidden; -} - -.landing-hero-scrim { - background: black; - height: 100%; - left: 0; - position: absolute; - opacity: .2; - width: 100%; -} - -.landing-hero-wrap { - margin: 0 auto; - max-width: 940px; - clear: both; - height: 100%; - position: relative; -} - -.landing-section-header { - margin-bottom: 40px; -} - -.landing-hero-wrap .landing-section-header { - margin-bottom: 16px; -} - -.landing-body { - font-size: 18px; - line-height: 24px; -} - -.landing-video-link { - white-space: nowrap; - display: inline-block; - padding: 16px 32px 16px 82px; - font-size: 18px; - font-weight: 400; - line-height: 24px; - cursor: pointer; - color: hsla(0, 0%, 100%, .8); - -webkit-user-select: none; - -moz-user-select: none; - -o-user-select: none; - user-select: none; - -webkit-transition: .2s color ease-in-out; - -moz-transition: .2s color ease-in-out; - -o-transition: .2s color ease-in-out; - transition: .2s color ease-in-out; -} - -.landing-video-link:before { - height: 64px; - width: 64px; - display: inline-block; - background-image: url(data:image/png;base64,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); - background-size: contain; - position: absolute; - content: ""; - opacity: .7; - margin-top: -19px; - margin-left: -64px; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; -} - -.landing-video-link:hover { - color: hsla(0, 0%, 100%, 1); -} - -.landing-video-link:hover:before { - opacity: 1; -} - -.landing-social-image { - float: left; - margin-right: 14px; - height: 64px; - width: 64px; -} - -.landing-social-copy { - padding-left: 78px; -} - -.landing-scroll-down-affordance { - position: absolute; - bottom: 0; - width: 100%; - text-align: center; - z-index: 10; -} - -.landing-down-arrow { - padding: 24px; - display: inline-block; - opacity: .5; - -webkit-transition: .2s opacity ease-in-out; - -moz-transition: .2s opacity ease-in-out; - -o-transition: .2s opacity ease-in-out; - transition: .2s opacity ease-in-out; - - -webkit-animation-name: pulse-opacity; - -webkit-animation-duration: 4s; -} - -.landing-down-arrow:hover { - opacity: 1; -} - -.landing-down-arrow img { - height: 28px; - width: 28px; - margin: 0 auto; - display: block; -} - -.landing-divider { - display: inline-block; - height: 2px; - background-color: white; - position: relative; - margin: 10px 0; -} - -/* 3 CLOLUMN LAYOUT */ - -.landing-breakout { - margin-top: 40px; - margin-bottom: 40px; -} - -.landing-breakout img { - margin-bottom: 20px; -} - -.landing-partners img { - margin-bottom: 20px; -} - -.landing-breakout p { - padding: 0 23px; -} - -.landing-breakout.landing-partners img { - margin-bottom: 20px; -} - -/** - * ANIMATION - */ - -@-webkit-keyframes pulse-opacity { - 0% { - opacity: .5; - } - 20% { - opacity: .5; - } - 40% { - opacity: 1; - } - 60% { - opacity: .5; - } - 80% { - opacity: 1; - } - 100% { - opacity: .5; - } -} - - - -/** - * VIDEO - */ - -#video-container { - display:none; - position:fixed; - top:0; - left:0; - width:100%; - height:100%; - background-color:rgba(0,0,0,0.8); - z-index:9999; -} - -#video-frame { - max-width:940px; - height:100%; - margin:72px auto; - display:none; - position:relative; -} - -.video-close { - cursor: pointer; - position: absolute; - right: -49px; - top: -49px; - pointer-events: all; -} - -#icon-video-close { - background-image: url("../images/close-white.png"); - background-image: -webkit-image-set(url(../images/close-white.png) 1x, url(../images/close-white_2x.png) 2x); - background-repeat: no-repeat; - background-position: 0 0; - background-size: 36px 36px; - height: 36px; - width: 36px; - display:block; -} - -#icon-video-close:hover { - background-image: url("../images/close-grey.png"); - background-image: -webkit-image-set(url(../images/close-grey.png) 1x, url(../images/close-grey_2x.png) 2x); -} - -/* Preload the hover images */ -a.video-shadowbox-button.white:after { - display:none; - content:url("../images/close-grey.png") url("../images/close-grey_2x.png"); -} - -a.video-shadowbox-button.white { - background-image: url("../images/play-circle-white.png"); - background-image: -webkit-image-set(url(../images/play-circle-white.png) 1x, url(../images/play-circle-white_2x.png) 2x); - background-size: 36px 36px; - background-repeat: no-repeat; - background-position: right; - padding: 16px 42px 16px 8px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - color: #fff; - text-decoration:none; -} - -a.video-shadowbox-button.white:hover { - color:#bababa !important; - background-image: url("../images/play-circle-grey.png"); - background-image: -webkit-image-set(url(../images/play-circle-grey.png) 1x, url(../images/play-circle-grey_2x.png) 2x); -} - -/* Preload the hover images */ -a.video-shadowbox-button.white:after { - display:none; - content:url("../images/play-circle-grey.png") url("../images/play-circle-grey_2x.png"); -} - -/* - * Responsive YouTube embeds from DevSite - * - * When applied to a
    that wraps a video, "video-wrapper" forces the video - * to float right at 50% of the column width on desktop, but appear as a block - * element at 100% of the column width on smaller screens. - * "video-wrapper-full-width" works the same but is always 100% width. - */ -.video-wrapper, -.video-wrapper-left { - float: right; - margin: 0 0 40px 40px; - padding-top: calc(((100% - 40px) / 2) / 16 * 9); /* 16:9 including margin */ - position: relative; - width: calc((100% - 40px) / 2); /* 50% including margin */ -} - -/* - * "video-wrapper-left" forces 50% without the float - * This is useful for heading content when you want the video to - * appear next to an element that is already floated right - * (e.g. tb-wrapper
    ) - */ -.video-wrapper-left { - float: none; - margin: 16px 0 20px 0; -} - -.video-wrapper-full-width { - margin: 16px 0; - padding-top: 56.25%; /* Forces div to 16:9 at 100% width */ - position: relative; - width: 100%; -} - -.video-wrapper embed, -.video-wrapper iframe, -.video-wrapper object, -.video-wrapper-full-width embed, -.video-wrapper-full-width iframe, -.video-wrapper-full-width object, -.video-wrapper-left embed, -.video-wrapper-left iframe, -.video-wrapper-left object { - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; -} - -@media screen and (max-width: 1000px) { - - .video-wrapper, - .video-wrapper-left { - float: none; - margin: 16px 0; - padding-top: 56.25%; /* Forces div to 16:9 at 100% width */ - width: 100%; - } -} - - -/****************** -Styles for d.a.c/index: -*******************/ - - - -/* Generic full screen carousel styling to be used across pages. */ -.fullscreen-carousel { - margin: 0 -20px; - overflow: hidden; - position: relative; -} - -.fullscreen-carousel-content { - width: 100%; - height: 100%; - position: relative; - display: table; /* For vertical centering */ -} - -.fullscreen-carousel .vcenter { - display: table-cell; - vertical-align: middle; - position: relative; -} - -.fullscreen-carousel .vcenter > div { - margin: 10px auto; -} - -/* Styles for the full-bleed hero image type. */ -.fullscreen-carousel .hero, .fullscreen-carousel .hero h1 { - color: #fff; -} - -.fullscreen-carousel .hero h1 { - font-weight: 300; - font-size: 60px; - line-height: 68px; - letter-spacing: -1px; - margin-top: 0; -} - -.fullscreen-carousel .hero p { - font-weight: 300; - font-size: 18px; - line-height: 24px; -} - -.fullscreen-carousel .hero .hero-bg { - background-size: cover; - width: 100%; - height: 100%; - position: absolute; - left: 0px; - top: 0px; -} - - -/* Full screen carousel styling for the resource flow layout type of content */ -.fullscreen-carousel .resource-flow-layout:after { - height: 0; /* Dont know why this is set at 10 in default.css */ -} - -.fullscreen-carousel .resource-flow-layout { - margin-bottom: 20px; -} - - - -/* Generic Tab carousel styling to be used across multiple pages. */ - -.tab-carousel .tab-nav { - list-style: none; - position: relative; - text-align: center; -} - -.tab-carousel .tab-nav li { - display: inline-block; - font-size: 22px; - font-weight: 400; - line-height: 50px; - list-style: none; - margin: 0; - padding: 0 25px; - position: relative; -} - -.tab-carousel .tab-nav li a, -.tab-carousel .tab-nav li a:hover { - color: #333 !important; - padding: 10px 10px 13px 10px; - position: relative; - z-index: 1000; -} - -.tab-carousel .tab-nav li:after { - background: #ddd; - bottom: 0; - content: ''; - height: 4px; - left: 0; - position: absolute; - width: 100%; - z-index: 0; -} - -.tab-carousel .tab-nav .highlight { - position: absolute; - height: 4px; - width: 100px; - bottom: 0; - background: #33b5e5; -} - -.tab-carousel .tab-carousel-content { - position: relative; - overflow: hidden; - white-space: nowrap; -} - -.tab-carousel .tab-carousel-content [data-tab] { - display: inline-block; - white-space: normal; -} - - - -/* - Resource styling for the tab carousel. The tab carousel contains either - a 3 column layout of resources or a single full-width resource. The - latter has the 18x12 class applied to it and can be styled differently - that way. -*/ - -.tab-carousel .resource .image { - width: 100%; - height: 250px; - background-repeat: no-repeat; - background-size: contain; - background-position: 50% 50%; -} - -.tab-carousel .resource .info .title { - font-size: 18px; - line-height: 24px; -} - -.tab-carousel .resource .info .summary, -.tab-carousel .resource .info .cta { - line-height: 24px; - font-size: 16px; -} - -.tab-carousel .resource-card-18x12 { - position: relative; - padding-left: 450px; - box-sizing: border-box; - display: table-cell; - vertical-align: middle; -} - -.tab-carousel .resource-card-18x12 .image { - position: absolute; - width: 420px; - height: 100%; - left: 0; - top: 0; -} - -.tab-carousel .resource-card-18x12 .info { - display: inline-block; -} - -.tab-carousel .resource-card-18x12 .info .title { - margin-bottom: 26px; -} - - -/* - Styles for the actions bar. -*/ -.actions-bar { - background: #b0bec5; - text-align: center; -} - -.actions-bar .actions { - padding: 24px 0; - font-size: 0.1px; - line-height: 0.1px; -} - -.actions-bar .actions:after { - content: ''; - width: 100%; - display: inline-block; -} - -.actions-bar .actions > div { - display: inline-block; - margin: 0 16px; -} - -.actions-bar .actions a { - color: #fff; - font-size: 24px; - font-weight: 300; - line-height: 50px; - -webkit-transition: opacity .3s; - transition: opacity .3s; -} - -.actions-bar .actions a:hover { - opacity: .54; -} - -.actions-bar .actions .dac-sprite { - margin: 0 -8px 0 -12px; -} - -@media (max-width: 719px) { - .actions-bar { - text-align: left; - } - - .actions-bar .actions > div { - display: block; - margin: 0; - } -} - - - -/* - Specific styles for new home page layout of the carousels. -*/ - -/* Big blue button */ -a.home-new-cta-btn, -.home-new-carousel-1 .resource-card-18x6 .cta { - white-space: nowrap; - display: inline-block; - padding: 14px 32px; - font-size: 18px; - font-weight: 500; - line-height: 24px; - cursor: pointer; - background: #33b5e6; - border-radius: 4px; - margin-top: 20px; - color: #fff; - transition: 0.2s background-color ease-in-out; -} - -.home-new-carousel-1 .resource-card-18x6 .cta:after { - display: none; /* Hide the entity for this button */ -} - -a.home-new-cta-btn:hover, -.home-new-carousel-1 .resource-card-18x6 .cta:hover { - color: #fff !important; - background: #2d9fca; -} - -.home-new-carousel-1 .resource-card-18x6 .cta { - position: absolute; - bottom: 20px; - left: 16px; -} - -/* Fullscreen carousel. */ -.home-new-carousel-1 { - max-height: 700px; /* Set max height so doesn't get too long */ -} - -.home-new-carousel-1 .fullscreen-carousel-content { - min-height: 450px; /* Set min height for all content */ -} - -.home-new-carousel-1 .hero { - background: #000; -} - -.home-new-carousel-1 .hero-bg { - background-image: url(/home-new/images/hero.jpg); - background-position: right center; - opacity: 0.85; -} - -/* - Styling for special top card of full screen layout resource layout. - We need to specifically style the 18x6 card to adjust its size and layout, - since it's not a standard card, not sure if this is unique to the home page - layout or should be namespaced within the fullscreen-carousel container. -*/ -.home-new-carousel-1 .resource-flow-layout.col-16 .resource-card-18x6 { - height: 320px; - background-color:#F9F9F9; - border-radius: 0px; - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0); - -} - -.home-new-carousel-1 .resource-card-18x6 .card-bg { - width: 636px; - height: 100%; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info { - right: 0px; - left: 636px; - height: 100%; - top: 0px; - padding: 15px 22px; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .util { - display: none; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .title { - font-size: 20px; - font-weight: 500; - margin-top: 15px; - margin-bottom: 15px; -} - -.home-new-carousel-1 .resource-card-18x6 .card-info .text { - font-size: 15px; - line-height: 21px; -} - - -/* Tabbed carousel. */ -.home-new-carousel-2 { - margin: 35px auto 100px auto; -} - -.home-new-carousel-2 h1 { - font-size: 47px; - font-weight: 100; - line-height: 54px; - text-align: center; -} - -.annotation-message { - display: block; - font-style: italic; - color: #F80; -} - - - -/* Helpouts widget */ -.resource-card-6x2.helpouts-card { - width: 255px; - height: 40px; - position:absolute; - z-index:999; - top:-8px; - right:1px; -} - -.resource-card-6x2.helpouts-card > .card-info { - left:35px; - height:35px; - padding:4px 8px 4px 0; -} - -.resource-card-6x2.helpouts-card > .card-info .helpouts-description { - display:block; - overflow:visible; - font-size:12px; - line-height:12px; - text-align:right; - color:#666; -} - -.helpouts-description .link-color { - text-transform: uppercase; -} - -.resource-card-6x2 > .card-bg.helpouts-card-bg { - width:35px; - height:35px; - margin:2px 0 0 0; - background-image: url(../images/styles/helpouts-logo-35_2x.png); - background-image: -webkit-image-set(url(../images/styles/helpouts-logo-35.png) 1x, url(../images/styles/helpouts-logo-35_2x.png) 2x); -} - -.resource-card-6x2 > .card-bg.helpouts-card-bg:after { - display:none; -} - -.dac-visible-mobile-block, .dac-mobile-only, .dac-visible-mobile-inline, .dac-visible-mobile-inline-block, .dac-visible-tablet-block, .dac-visible-tablet-inline, .dac-visible-tablet-inline-block, .dac-visible-desktop-block, .dac-visible-desktop-inline, .dac-visible-desktop-inline-block { - display: none !important; -} - -@media (max-width: 719px) { - .dac-hidden-mobile { - display: none !important; - } - - .dac-visible-mobile-block, .dac-mobile-only { - display: block !important; - } - - .dac-visible-mobile-inline { - display: inline !important; - } - - .dac-visible-mobile-inline-block { - display: inline-block !important; - } -} - -@media (min-width: 720px) and (max-width: 979px) { - .dac-hidden-tablet { - display: none !important; - } - - .dac-visible-tablet-block { - display: block !important; - } - - .dac-visible-tablet-inline { - display: inline !important; - } - - .dac-visible-tablet-inline-block { - display: inline-block !important; - } -} - -@media (min-width: 980px) { - .dac-hidden-desktop { - display: none !important; - } - - .dac-visible-desktop-block { - display: block !important; - } - - .dac-visible-desktop-inline { - display: inline !important; - } - - .dac-visible-desktop-inline-block { - display: inline-block !important; - } -} - -.dac-offset-parent { - position: relative !important; -} - -/** - * Break strings when their length exceeds the width of their container. - */ -.dac-text-break { - word-wrap: break-word !important; -} - -/** - * Horizontal text alignment - */ -.dac-text-center { - text-align: center !important; -} - -.dac-text-left { - text-align: left !important; -} - -.dac-text-right { - text-align: right !important; -} - -/** - * Prevent whitespace wrapping - */ -.dac-text-no-wrap { - white-space: nowrap !important; -} - -/** - * Prevent text from wrapping onto multiple lines, instead truncate with an ellipsis. - */ -.dac-text-truncate { - max-width: 100%; - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - word-wrap: normal !important; -} - -/** - * Floats - */ -.dac-float-left { - float: left !important; -} - -.dac-float-right { - float: right !important; -} - -/** - * New block formatting context - * - * This affords some useful properties to the element. It won't wrap under - * floats. Will also contain any floated children. - * N.B. This will clip overflow. Use the alternative method below if this is - * problematic. - */ -.dac-nbfc { - overflow: hidden !important; } - -/** - * New block formatting context (alternative) - * - * Alternative method when overflow must not be clipped. - * - * N.B. This breaks down in some browsers when elements within this element - * exceed its width. - */ -.dac-nbfc-alt { - display: table-cell !important; - width: 10000px !important; } - -/* New CSS */ -/************ RESOURCE CARDS ******************/ -/* Basic card-styling with shadow */ -.resource-card { - background: #fff; - box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.21); - display: block; - position: relative; } - -/* Play button is only visible on 6by6 cards */ -.play-button { - background-color: #000; - border-radius: 50%; - box-sizing: border-box; - display: none; - height: 70px; - left: 50%; - margin-left: -35px; - line-height: 65px; - padding-left: 4px; - position: absolute; - opacity: .6; - text-align: center; - -webkit-transition: opacity .5s; - transition: opacity .5s; - top: 50px; - width: 70px; - z-index: 1; } - .resource-card-6x6 .play-button { - display: block; } - -/* Styling for background image including tinting and section icons in stacks */ -.card-bg { - bottom: 131px; - display: block; - position: absolute; - vertical-align: top; - width: 100%; - left: 0; - top: 0; - background-size: cover; - background-repeat: no-repeat; - background-position: center; - background-image: url(../images/resource-card-default-android.jpg); } - .card-bg:after { - content: ""; - display: block; - height: 100%; - width: 100%; - opacity: 1; - background: rgba(0, 0, 0, 0.05); - -webkit-transition: opacity 0.5s; - transition: opacity 0.5s; } - .static .card-bg:after { - display: none; } - .card-bg .card-section-icon { - position: absolute; - top: 50%; - width: 100%; - margin-top: -35px; - text-align: center; - padding-top: 65px; - z-index: 100; } - .card-bg .card-section-icon .icon { - position: absolute; - left: 50%; - margin-left: -28px; - top: 0px; - width: 56px; - height: 56px; - background-repeat: no-repeat; - background-position: 50% 50%; - background-image: url(../images/stack-icon.png); } - .card-bg .card-section-icon .section { - text-transform: uppercase; - color: white; - font-size: 14px; } - -.card-info { - position: absolute; - box-sizing: border-box; - height: 131px; - right: 0; - bottom: 0; - left: 0; - overflow: hidden; - background: #fefefe; - padding: 6px 12px; } - .card-info .section { - color: #898989; - font-size: 11px; - font-weight: 700; - letter-spacing: .3px; - line-height: 20px; - text-transform: uppercase; } - .card-info .title { - color: #333; - font-size: 18px; - font-weight: 500; - line-height: 24px; - margin-bottom: 2px; - max-height: 48px; - overflow: hidden; - padding-bottom: 5px; - text-overflow: ellipsis; - white-space: normal; } - .card-info .description { - overflow: hidden; } - .card-info .description .text { - color: #666; - font-size: 14px; - height: 60px; - line-height: 20px; - overflow: hidden; - width: 100%; } - .card-info .description .util { - position: absolute; - right: 5px; - bottom: 70px; - opacity: 0; - -webkit-transition: opacity 0.5s; - transition: opacity 0.5s; } - .card-info.empty-desc .title { - white-space: normal; - overflow: visible; } - .card-info.empty-desc .description { - display: none; } - -/* Truncate card summaries at bounding box and - * and apply ellipsis at lower right */ -.ellipsis { - overflow: hidden; - float: right; - line-height: 15px; - width: 100%; } - .ellipsis:before { - content: ""; - float: left; - width: 5px; - height: 100%; } - .ellipsis > *:first-child.text { - float: right; - width: 100% !important; - margin-left: -5px; } - .ellipsis:after { - content: "\02026"; - height: 17px; - padding-bottom: 4px; - box-sizing: content-box; - float: right; - position: relative; - top: -16px; - left: 100%; - width: 4em; - margin-left: -4em; - padding-right: 5px; - background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), to(white), color-stop(65%, white)); - background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0), white 65%, white); - background: linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white); } - .ellipsis:after { - font-style: normal; - color: #aaa; - font-size: 13px; - text-align: right; } - -.resource-card:hover { - cursor: pointer; } - .static .resource-card:hover { - cursor: auto; } - .resource-card:hover .card-bg:after { - opacity: 0; } - .resource-card:hover .play-button { - opacity: .3; } - .resource-card:hover .card-info .description .util { - opacity: 1; } - -/* Carousel Layout */ -/* Carousel styles for landing page */ -.resource-carousel-layout { - height: 531px; - margin: 20px 0 20px 0; - padding: 0 !important; - position: relative; - overflow: hidden; } - .resource-carousel-layout .slideshow-prev, .resource-carousel-layout .slideshow-next { - display: none; } - .resource-carousel-layout .pagination { - bottom: 97px; - left: auto; - padding-right: 10px; - right: 0; - text-align: right; - width: 16.66666667%; } - .resource-carousel-layout .pagination ul li { - text-indent: 8000px; } - .resource-carousel-layout .frame li { - position: relative; } - .resource-carousel-layout .frame li .card-bg { - bottom: 131px; } - .resource-carousel-layout .frame li .card-info { - height: 131px; - padding: 6px 12px; - top: auto; } - .resource-carousel-layout .frame li .card-info .title { - font-size: 28px; - font-weight: 400; - line-height: 32px; } - .resource-carousel-layout .frame li .card-info .description .text { - height: 40px; } - .resource-carousel-layout .frame li .card-info .description .util { - bottom: 97px; - right: 4px; } - -/* Stack Layout */ -.resource-stack-layout { - display: inline-block; - padding: 0; } - .resource-stack-layout .section-card-menu > .card-info .section, .resource-stack-layout .section-card > .card-info .title { - /*text-transform: uppercase;*/ - color: #898989; - font-size: 17px; - line-height: 24px; - margin-bottom: 6px; } - .resource-stack-layout .section-card { - height: 284px; } - .resource-stack-layout .section-card > .card-bg { - height: 192px; } - .resource-stack-layout .section-card > .card-info { - padding: 4px 12px 6px 12px; - top: 192px; } - .resource-stack-layout .section-card > .card-info .section { - display: none; } - .resource-stack-layout .section-card > .card-info .title { - font-size: 17px; - border-bottom: 1px solid #959595; - padding-bottom: 0px; } - .resource-stack-layout .section-card > .card-info .description { - font-size: 13px; - line-height: 15px; } - .resource-stack-layout .section-card > .card-info .description .text { - height: 30px; } - .resource-stack-layout .related-card { - height: 90px; } - .resource-stack-layout .related-card > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; } - .resource-stack-layout .related-card > .card-info { - left: 90px; - padding: 4px 12px 4px 12px; } - .resource-stack-layout .related-card > .card-info .section { - font-size: 12px; - margin-bottom: 1px; - display: none; } - .resource-stack-layout .related-card > .card-info .title { - font-size: 16px; - margin-bottom: -2px; - white-space: normal; - overflow: visible; - text-overflow: ellipsis; } - .resource-stack-layout .related-card > .card-info .title:after { - content: url(../images/link-out.png); - display: block; } - .resource-stack-layout .related-card > .card-info .description { - display: none; } - .resource-stack-layout .section-card-menu { - /* Flexible height */ - display: block; - height: auto; - width: auto; } - .resource-stack-layout .section-card-menu .card-bg { - height: 155px; - /* Flexible height */ - position: relative; - display: inline-block; - vertical-align: top; } - .resource-stack-layout .section-card-menu .card-info { - padding: 4px 12px 0px 12px; - /* Flexible height */ - position: relative; - left: auto; - top: auto; - right: auto; - bottom: auto; } - .resource-stack-layout .section-card-menu .card-info ul { - list-style: none; - margin: 0; } - .resource-stack-layout .section-card-menu .card-info ul li { - list-style: none; - margin: 0; - padding: 15px 0; - border-top-width: 1px; - border-top-style: solid; - border-top-color: #959595; } - .resource-stack-layout .section-card-menu .card-info ul li a, .resource-stack-layout .section-card-menu .card-info ul li a:focus, .resource-stack-layout .section-card-menu .card-info ul li a:hover { - color: #333 !important; } - .resource-stack-layout .section-card-menu .card-info ul li:first-child { - border-top: none; } - .resource-stack-layout .section-card-menu .card-info ul li:hover .title:after { - opacity: 1; - -webkit-transition: opacity 0.5s; - transition: opacity 0.5s; } - .resource-stack-layout .section-card-menu .card-info ul li:hover .description { - max-height: 30px; - opacity: 1; - -webkit-transition: max-height 0.5s, opacity 1s; - transition: max-height 0.5s, opacity 1s; } - .resource-stack-layout .section-card-menu .card-info .title { - font-size: 16px; - margin-bottom: -2px; - position: relative; } - .resource-stack-layout .section-card-menu .card-info .title:after { - background: url(../images/stack-arrow-right.png); - content: ''; - opacity: 0; - -webkit-transition: opacity 0.25s; - transition: opacity 0.25s; - position: absolute; - right: 0px; - top: 3px; - width: 10px; - height: 15px; } - .resource-stack-layout .section-card-menu .card-info .title.more { - text-transform: uppercase; - color: #898989; - display: inline-block; } - .resource-stack-layout .section-card-menu .card-info .title.more:after { - background: url(../images/stack-arrow-right.png); - content: ''; - display: block; - position: absolute; - right: -20px; - top: 3px; - width: 10px; - height: 15px; } - .resource-stack-layout .section-card-menu .card-info .description { - max-height: 0px; - opacity: 0; - overflow: hidden; - font-size: 13px; - line-height: 15px; - /* Hover off */ - -webkit-transition: max-height 0.5s, opacity 0.5s; - transition: max-height 0.5s, opacity 0.5s; } - .resource-stack-layout .section-card-menu .card-info .description .text { - height: 30px; } - .resource-stack-layout:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; } - -.resource-card, .resource-card-stack { - margin-bottom: 20px; } - -.resource-card-row-stack-last { - margin-bottom: 0px !important; } - -.resource-card-col-stack-last { - margin-bottom: 0px !important; } - -.resource-card-3x6 { - height: 300px; } - -.resource-card-3x12 { - height: 620px; } - -.resource-card-3x18 { - height: 940px; } - -.resource-card-6x6 { - height: 300px; } - -.resource-card-6x12 { - height: 620px; } - -.resource-card-6x18 { - height: 940px; } - -.resource-card-9x6 { - height: 300px; } - -.resource-card-9x12 { - height: 620px; } - -.resource-card-9x18 { - height: 940px; } - -.resource-card-12x6 { - height: 300px; } - -.resource-card-12x12 { - height: 620px; } - -.resource-card-12x18 { - height: 940px; } - -.resource-card-15x6 { - height: 300px; } - -.resource-card-15x12 { - height: 620px; } - -.resource-card-15x18 { - height: 940px; } - -.resource-card-18x6 { - height: 300px; } - -.resource-card-18x12 { - height: 620px; } - -.resource-card-18x18 { - height: 940px; } - -.resource-card-3x2 { - height: 100px; } - -.resource-card-3x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-3x3 { - height: 150px; } - -.resource-card-3x3x2 { - height: 142px; - margin-bottom: 16px; } - -.resource-card-6x2 { - height: 100px; } - -.resource-card-6x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-6x3 { - height: 150px; } - -.resource-card-6x3x2 { - height: 142px; - margin-bottom: 16px; } - -.resource-card-9x2 { - height: 100px; } - -.resource-card-9x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-9x3 { - height: 150px; } - -.resource-card-9x3x2 { - height: 142px; - margin-bottom: 16px; } - -.resource-card-12x2 { - height: 100px; } - -.resource-card-12x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-12x3 { - height: 150px; } - -.resource-card-12x3x2 { - height: 142px; - margin-bottom: 16px; } - -.resource-card-15x2 { - height: 100px; } - -.resource-card-15x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-15x3 { - height: 150px; } - -.resource-card-15x3x2 { - height: 142px; - margin-bottom: 16px; } - -.resource-card-18x2 { - height: 100px; } - -.resource-card-18x2x3 { - height: 90px; - margin-bottom: 15px; } - -.resource-card-18x3 { - height: 150px; } - -.resource-card-18x3x2 { - height: 142px; - margin-bottom: 16px; } - -/* - The following are styles for cards in the flowlayout above, styled by the number of rows they span -*/ -/* Single row, 2 column items. */ -.resource-card-9x6 { - height: 390px; } - -/* Double row, 1 column items. Eg full width video thumbnails. */ -.resource-card-18x12 { - height: 558px; } - -/* 1/3 row items */ -.resource-card-3x2 > .card-bg, .resource-card-6x2 > .card-bg, .resource-card-9x2 > .card-bg, .resource-card-12x2 > .card-bg, .resource-card-15x2 > .card-bg, .resource-card-18x2 > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; } -.resource-card-3x2 > .card-info, .resource-card-6x2 > .card-info, .resource-card-9x2 > .card-info, .resource-card-12x2 > .card-info, .resource-card-15x2 > .card-info, .resource-card-18x2 > .card-info { - height: 100%; - left: 90px; - padding: 6px 12px; - overflow: hidden; } - .resource-card-3x2 > .card-info .title, .resource-card-6x2 > .card-info .title, .resource-card-9x2 > .card-info .title, .resource-card-12x2 > .card-info .title, .resource-card-15x2 > .card-info .title, .resource-card-18x2 > .card-info .title { - max-height: 48px; - white-space: normal; } - .resource-card-3x2 > .card-info .description, .resource-card-6x2 > .card-info .description, .resource-card-9x2 > .card-info .description, .resource-card-12x2 > .card-info .description, .resource-card-15x2 > .card-info .description, .resource-card-18x2 > .card-info .description { - display: none; } - .resource-card-3x2 > .card-info .text, .resource-card-6x2 > .card-info .text, .resource-card-9x2 > .card-info .text, .resource-card-12x2 > .card-info .text, .resource-card-15x2 > .card-info .text, .resource-card-18x2 > .card-info .text { - height: auto; } - -/* Override to show the description instead of the content section */ -.no-section .resource-card-3x2 > .card-info .section, .no-section .resource-card-6x2 > .card-info .section { - display: none; } - -.no-section .resource-card-3x2 > .card-info .description, .no-section .resource-card-6x2 > .card-info .description { - display: block; } - -/* 1/2 row items */ -.resource-card-3x3, .resource-card-6x3, .resource-card-9x3, .resource-card-12x3, .resource-card-15x3, .resource-card-18x3 { - height: 160px; } - .resource-card-3x3 > .card-bg, .resource-card-6x3 > .card-bg, .resource-card-9x3 > .card-bg, .resource-card-12x3 > .card-bg, .resource-card-15x3 > .card-bg, .resource-card-18x3 > .card-bg { - left: 0; - top: 0; - width: 90px; - height: 100%; - position: absolute; - display: block; } - .resource-card-3x3 > .card-info, .resource-card-6x3 > .card-info, .resource-card-9x3 > .card-info, .resource-card-12x3 > .card-info, .resource-card-15x3 > .card-info, .resource-card-18x3 > .card-info { - height: 100%; - left: 90px; - padding: 6px 12px; } - .resource-card-3x3 > .card-info .section, .resource-card-6x3 > .card-info .section, .resource-card-9x3 > .card-info .section, .resource-card-12x3 > .card-info .section, .resource-card-15x3 > .card-info .section, .resource-card-18x3 > .card-info .section { - display: none; } - .resource-card-3x3 > .card-info .title, .resource-card-6x3 > .card-info .title, .resource-card-9x3 > .card-info .title, .resource-card-12x3 > .card-info .title, .resource-card-15x3 > .card-info .title, .resource-card-18x3 > .card-info .title { - max-height: 96px; - white-space: normal; } - .resource-card-3x3 > .card-info .text, .resource-card-6x3 > .card-info .text, .resource-card-9x3 > .card-info .text, .resource-card-12x3 > .card-info .text, .resource-card-15x3 > .card-info .text, .resource-card-18x3 > .card-info .text { - height: auto; } - .resource-card-3x3 > .card-info .util, .resource-card-6x3 > .card-info .util, .resource-card-9x3 > .card-info .util, .resource-card-12x3 > .card-info .util, .resource-card-15x3 > .card-info .util, .resource-card-18x3 > .card-info .util { - display: none; } - -/* placement of plusone */ -.resource-card-6x12 > .card-info .description .util, .resource-card-9x12 > .card-info .description .util, .resource-card-12x12 > .card-info .description .util, .resource-card-15x12 > .card-info .description .util { - bottom: 2px; } - -.resource-card-18x12 > .card-info .description .util { - bottom: 2px; } - -/* Overrides for col-16 6x6 cards linking to local content on landing pages. - Suppresses "section". */ -.landing .card-info .section { - display: none; } - -/* - Generate a resource stack layout for a 3 column widget spanning 16 grid cols -*/ -.resource-stack-layout.col-16 { - margin: 0 -14px 0 0; - width: 954px; } - .resource-stack-layout.col-16 .resource-card-stack { - margin: 0 14px 0 0; - width: 304px; } - -/* Example of card menu tinting */ -.resource-widget[data-section=distribute\/tools] .section-card-menu .card-bg:after { - background: rgba(126, 55, 148, 0.4) !important; } -.resource-widget[data-section=distribute\/tools] .section-card-menu .card-section-icon .icon { - background-color: #7e3794 !important; } -.resource-widget[data-section=distribute\/tools] .section-card-menu .card-info ul li { - border-top-color: #7e3794 !important; } - -/* tinting for stacks */ -div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-menu .card-info ul li { - border-top-color: #7e3794 !important; } - -.dac-fab, .button, .landing-button, .dac-button { - background: transparent; - border: 0; - border-radius: 3px; - box-sizing: border-box; - color: currentColor; - cursor: pointer; - display: inline-block; - font-weight: 500; - font-size: 14px; - font-style: inherit; - font-variant: inherit; - font-family: inherit; - letter-spacing: .5px; - line-height: 24px; - margin: 6px 16px 6px 0; - min-width: 88px; - outline: 0; - padding: 6px 12px; - position: relative; - text-align: center; - text-decoration: none; - text-transform: uppercase; - -webkit-transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); - transition: box-shadow 0.4s cubic-bezier(0.25, 0.8, 0.25, 1), background-color 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; } - -.button, .landing-button, .dac-button.dac-raised { - background-color: #FAFAFA; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.26); } - -.dac-button.dac-raised.dac-primary, .landing-secondary, .button { - background-color: #039bef; } - .dac-button.dac-raised.dac-primary:hover, .landing-secondary:hover, .button:hover { - background-color: #0288d1; - color:#fff; } - .dac-button.dac-raised.dac-primary:active, .landing-secondary:active, .button:active { - background-color: #0277bd; - color:#fff; } - .dac-button.dac-raised.dac-primary.disabled, .button.disabled { - background-color: #bbb; } - -.dac-button.dac-raised.dac-red, .landing-primary { - background-color: #bf3722; } - .dac-button.dac-raised.dac-red:hover, .landing-primary:hover { - background-color: #9c2d1c; } - .dac-button.dac-raised.dac-red:active, .landing-primary:active { - background-color: #822517; } - -.dac-button.dac-raised.dac-green, .landing-button.green { - background-color: #90C653; } - -.dac-button.dac-raised.dac-primary, .landing-secondary, .button, .dac-button.dac-raised.dac-red, .landing-primary, .dac-button.dac-raised.dac-green, .landing-button.green { - color: #fff; } - -.dac-button.dac-large, .landing-button { - padding: 12px 24px; } - -.dac-fab { - background: #fff; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.26); - border-radius: 50%; - font-size: 0; - height: 36px; - line-height: 36px; - min-width: 0; - overflow: hidden; - padding: 0; - vertical-align: middle; - width: 36px; } - .dac-fab:hover, a:hover > .dac-fab { - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.26); } - .dac-fab.dac-primary { - background: #00c7a0; } - .dac-fab.dac-large { - height: 54px; - line-height: 54px; - width: 54px; } - -.dac-scroll-button { - height: 54px; - line-height: 54px; - margin: 0; - position: absolute; - right: 0; - top: -27px; - width: 54px; - z-index: 1; } - @media (max-width: 719px) { - .dac-scroll-button { - display: none; } } - -/* Footer component */ -.dac-footer { - background-color: #fff; - border-top: 1px solid #f0f0f0; - clear: both; - color: #999; - font-size: 12px; - margin-top: 96px; - padding-bottom: 20px; - position: relative; - /* Modifier for landing pages, to snuggle closer to sections. */ } - .dac-footer a { - color: #999; } - .dac-footer p { - margin: 7px 0 0; } - .dac-footer-main { - padding: 30px 0; } - .dac-footer-reachout { - text-align: right; } - .dac-footer-contact, .dac-footer-social { - display: inline-block; } - .dac-footer .dac-footer-getnews, .dac-footer .dac-footer-contact-link { - color: #000; - cursor: pointer; - font-size: 20px; - font-weight: 300; - margin: 8px 0; - vertical-align: middle; } - .dac-footer .dac-footer-contact-link, .dac-footer .dac-footer-social-link { - margin-left: 16px; - margin-right: 0; } - .dac-footer-getnews > .dac-fab { - margin-left: 4px; } - .dac-footer-separator { - background: #f0f0f0; - margin: 0 0 12px; } - .dac-footer-links a + a:before { - content: '|'; - cursor: default; - margin: 0 10px 0 8px; } - .dac-footer .locales { - float: right; - margin: 0; } - .dac-footer .locales select { - background-color: #f0f0f0; - border-radius: 3px; - font-size: 12px; - height: auto; - margin-top: -2px; - padding: 8px 12px; - width: 146px; } - .dac-footer.dac-landing { - margin-top: 0; - border-top: 0; } - @media (max-width: 719px) { - .dac-footer-reachout { - text-align: left; } - .dac-footer-social { - display: block; } - .dac-footer-social-link, .dac-footer-contact-link { - display: inline-block; } - .dac-footer .dac-footer-contact-link, .dac-footer .dac-footer-social-link { - margin-left: 0; - margin-right: 16px; } - .dac-footer .locales { - display: block; - float: none; - margin-top: 15px; } } - -/* ============================================================================= - Columns - ========================================================================== */ -.wrap { - margin: 0 auto; - max-width: 940px; - clear: both; } - -.cols { - margin-left: -10px; - margin-right: -10px; - /** - * For modern browsers - * 1. The space content is one way to avoid an Opera bug when the - * contenteditable attribute is included anywhere else in the document. - * Otherwise it causes space to appear at the top and bottom of elements - * that are clearfixed. - * 2. The use of `table` rather than `block` is only necessary if using - * `:before` to contain the top-margins of child elements. - */ } - .cols:before, .cols:after { - content: ' '; - /* 1 */ - display: table; - /* 2 */ } - .cols:after { - clear: both; } - -[class*=col-] { - box-sizing: border-box; - float: left; - min-height: 1px; - padding-left: 10px; - padding-right: 10px; - position: relative; } - -.col-1 { - width: 6.25%; } - -.col-2 { - width: 12.5%; } - -.col-3 { - width: 18.75%; } - -.col-4 { - width: 25%; } - -.col-5 { - width: 31.25%; } - -.col-6 { - width: 37.5%; } - -.col-7 { - width: 43.75%; } - -.col-8 { - width: 50%; } - -.col-9 { - width: 56.25%; } - -.col-10 { - width: 62.5%; } - -.col-11 { - width: 68.75%; } - -.col-12 { - width: 75%; } - -.col-13 { - width: 81.25%; } - -.col-14 { - width: 87.5%; } - -.col-15 { - width: 93.75%; } - -.col-16 { - width: 100%; } - -.col-13 .col-1 { - width: 7.69230769%; } - -.col-13 .col-2 { - width: 15.38461538%; } - -.col-13 .col-3 { - width: 23.07692308%; } - -.col-13 .col-4 { - width: 30.76923077%; } - -.col-13 .col-5 { - width: 38.46153846%; } - -.col-13 .col-6 { - width: 46.15384615%; } - -.col-13 .col-7 { - width: 53.84615385%; } - -.col-13 .col-8 { - width: 61.53846154%; } - -.col-13 .col-9 { - width: 69.23076923%; } - -.col-13 .col-10 { - width: 76.92307692%; } - -.col-13 .col-11 { - width: 84.61538462%; } - -.col-13 .col-12 { - width: 92.30769231%; } - -.col-13 .col-13 { - width: 100%; } - -.col-12 .col-1 { - width: 8.33333333%; } - -.col-12 .col-2 { - width: 16.66666667%; } - -.col-12 .col-3 { - width: 25%; } - -.col-12 .col-4 { - width: 33.33333333%; } - -.col-12 .col-5 { - width: 41.66666667%; } - -.col-12 .col-6 { - width: 50%; } - -.col-12 .col-7 { - width: 58.33333333%; } - -.col-12 .col-8 { - width: 66.66666667%; } - -.col-12 .col-9 { - width: 75%; } - -.col-12 .col-10 { - width: 83.33333333%; } - -.col-12 .col-11 { - width: 91.66666667%; } - -.col-12 .col-12 { - width: 100%; } - -.col-1of1, .col-2of2, .col-3of3, .col-4of4, .col-5of5, .col-6of6, .col-8of8, .col-10of10, .col-12of12, .col-16of16 { - width: 100%; } - -.col-1of2, .col-2of4, .col-3of6, .col-4of8, .col-5of10, .col-6of12, .col-8of16 { - width: 50%; } - -.col-1of3, .col-2of6, .col-4of12 { - width: 33.33333333%; } - -.col-2of3, .col-4of6, .col-8of12 { - width: 66.66666667%; } - -.col-1of4, .col-2of8, .col-3of12, .col-4of16 { - width: 25%; } - -.col-3of4, .col-6of8, .col-9of12, .col-12of16 { - width: 75%; } - -.col-1of5, .col-2of10 { - width: 20%; } - -.col-2of5, .col-4of10 { - width: 40%; } - -.col-3of5, .col-6of10 { - width: 60%; } - -.col-4of5, .col-8of10 { - width: 80%; } - -.col-1of6, .col-2of12 { - width: 16.66666667%; } - -.col-5of6, .col-10of12 { - width: 83.33333333%; } - -.col-1of8, .col-2of16 { - width: 12.5%; } - -.col-3of8, .col-6of16 { - width: 37.5%; } - -.col-5of8, .col-10of16 { - width: 62.5%; } - -.col-7of8, .col-14of16 { - width: 87.5%; } - -.col-1of10 { - width: 10%; } - -.col-3of10 { - width: 30%; } - -.col-7of10 { - width: 70%; } - -.col-9of10 { - width: 90%; } - -.col-1of12 { - width: 8.33333333%; } - -.col-5of12 { - width: 41.66666667%; } - -.col-7of12 { - width: 58.33333333%; } - -.col-11of12 { - width: 91.66666667%; } - -.col-1of16 { - width: 6.25%; } - -.col-3of16 { - width: 18.75%; } - -.col-5of16 { - width: 31.25%; } - -.col-7of16 { - width: 43.75%; } - -.col-9of16 { - width: 56.25%; } - -.col-11of16 { - width: 68.75%; } - -.col-13of16 { - width: 81.25%; } - -.col-15of16 { - width: 93.75%; } - -.col-pull-1of1, .col-pull-2of2, .col-pull-3of3, .col-pull-4of4, .col-pull-5of5, .col-pull-6of6, .col-pull-8of8, .col-pull-10of10, .col-pull-12of12, .col-pull-16of16 { - left: -100%; } - -.col-pull-1of2, .col-pull-2of4, .col-pull-3of6, .col-pull-4of8, .col-pull-5of10, .col-pull-6of12, .col-pull-8of16 { - left: -50%; } - -.col-pull-1of3, .col-pull-2of6, .col-pull-4of12 { - left: -33.33333333%; } - -.col-pull-2of3, .col-pull-4of6, .col-pull-8of12 { - left: -66.66666667%; } - -.col-pull-1of4, .col-pull-2of8, .col-pull-3of12, .col-pull-4of16 { - left: -25%; } - -.col-pull-3of4, .col-pull-6of8, .col-pull-9of12, .col-pull-12of16 { - left: -75%; } - -.col-pull-1of5, .col-pull-2of10 { - left: -20%; } - -.col-pull-2of5, .col-pull-4of10 { - left: -40%; } - -.col-pull-3of5, .col-pull-6of10 { - left: -60%; } - -.col-pull-4of5, .col-pull-8of10 { - left: -80%; } - -.col-pull-1of6, .col-pull-2of12 { - left: -16.66666667%; } - -.col-pull-5of6, .col-pull-10of12 { - left: -83.33333333%; } - -.col-pull-1of8, .col-pull-2of16 { - left: -12.5%; } - -.col-pull-3of8, .col-pull-6of16 { - left: -37.5%; } - -.col-pull-5of8, .col-pull-10of16 { - left: -62.5%; } - -.col-pull-7of8, .col-pull-14of16 { - left: -87.5%; } - -.col-pull-1of10 { - left: -10%; } - -.col-pull-3of10 { - left: -30%; } - -.col-pull-7of10 { - left: -70%; } - -.col-pull-9of10 { - left: -90%; } - -.col-pull-1of12 { - left: -8.33333333%; } - -.col-pull-5of12 { - left: -41.66666667%; } - -.col-pull-7of12 { - left: -58.33333333%; } - -.col-pull-11of12 { - left: -91.66666667%; } - -.col-pull-1of16 { - left: -6.25%; } - -.col-pull-3of16 { - left: -18.75%; } - -.col-pull-5of16 { - left: -31.25%; } - -.col-pull-7of16 { - left: -43.75%; } - -.col-pull-9of16 { - left: -56.25%; } - -.col-pull-11of16 { - left: -68.75%; } - -.col-pull-13of16 { - left: -81.25%; } - -.col-pull-15of16 { - left: -93.75%; } - -.col-push-1of1, .col-push-2of2, .col-push-3of3, .col-push-4of4, .col-push-5of5, .col-push-6of6, .col-push-8of8, .col-push-10of10, .col-push-12of12, .col-push-16of16 { - left: 100%; } - -.col-push-1of2, .col-push-2of4, .col-push-3of6, .col-push-4of8, .col-push-5of10, .col-push-6of12, .col-push-8of16 { - left: 50%; } - -.col-push-1of3, .col-push-2of6, .col-push-4of12 { - left: 33.33333333%; } - -.col-push-2of3, .col-push-4of6, .col-push-8of12 { - left: 66.66666667%; } - -.col-push-1of4, .col-push-2of8, .col-push-3of12, .col-push-4of16 { - left: 25%; } - -.col-push-3of4, .col-push-6of8, .col-push-9of12, .col-push-12of16 { - left: 75%; } - -.col-push-1of5, .col-push-2of10 { - left: 20%; } - -.col-push-2of5, .col-push-4of10 { - left: 40%; } - -.col-push-3of5, .col-push-6of10 { - left: 60%; } - -.col-push-4of5, .col-push-8of10 { - left: 80%; } - -.col-push-1of6, .col-push-2of12 { - left: 16.66666667%; } - -.col-push-5of6, .col-push-10of12 { - left: 83.33333333%; } - -.col-push-1of8, .col-push-2of16 { - left: 12.5%; } - -.col-push-3of8, .col-push-6of16 { - left: 37.5%; } - -.col-push-5of8, .col-push-10of16 { - left: 62.5%; } - -.col-push-7of8, .col-push-14of16 { - left: 87.5%; } - -.col-push-1of10 { - left: 10%; } - -.col-push-3of10 { - left: 30%; } - -.col-push-7of10 { - left: 70%; } - -.col-push-9of10 { - left: 90%; } - -.col-push-1of12 { - left: 8.33333333%; } - -.col-push-5of12 { - left: 41.66666667%; } - -.col-push-7of12 { - left: 58.33333333%; } - -.col-push-11of12 { - left: 91.66666667%; } - -.col-push-1of16 { - left: 6.25%; } - -.col-push-3of16 { - left: 18.75%; } - -.col-push-5of16 { - left: 31.25%; } - -.col-push-7of16 { - left: 43.75%; } - -.col-push-9of16 { - left: 56.25%; } - -.col-push-11of16 { - left: 68.75%; } - -.col-push-13of16 { - left: 81.25%; } - -.col-push-15of16 { - left: 93.75%; } - -@media (max-width: 960px) and (min-width: 720px) { - .col-tablet-1of1, .col-tablet-2of2, .col-tablet-3of3, .col-tablet-4of4, .col-tablet-5of5, .col-tablet-6of6, .col-tablet-8of8, .col-tablet-10of10, .col-tablet-12of12, .col-tablet-16of16 { - width: 100%; } - .col-tablet-1of2, .col-tablet-2of4, .col-tablet-3of6, .col-tablet-4of8, .col-tablet-5of10, .col-tablet-6of12, .col-tablet-8of16 { - width: 50%; } - .col-tablet-1of3, .col-tablet-2of6, .col-tablet-4of12 { - width: 33.33333333%; } - .col-tablet-2of3, .col-tablet-4of6, .col-tablet-8of12 { - width: 66.66666667%; } - .col-tablet-1of4, .col-tablet-2of8, .col-tablet-3of12, .col-tablet-4of16 { - width: 25%; } - .col-tablet-3of4, .col-tablet-6of8, .col-tablet-9of12, .col-tablet-12of16 { - width: 75%; } - .col-tablet-1of5, .col-tablet-2of10 { - width: 20%; } - .col-tablet-2of5, .col-tablet-4of10 { - width: 40%; } - .col-tablet-3of5, .col-tablet-6of10 { - width: 60%; } - .col-tablet-4of5, .col-tablet-8of10 { - width: 80%; } - .col-tablet-1of6, .col-tablet-2of12 { - width: 16.66666667%; } - .col-tablet-5of6, .col-tablet-10of12 { - width: 83.33333333%; } - .col-tablet-1of8, .col-tablet-2of16 { - width: 12.5%; } - .col-tablet-3of8, .col-tablet-6of16 { - width: 37.5%; } - .col-tablet-5of8, .col-tablet-10of16 { - width: 62.5%; } - .col-tablet-7of8, .col-tablet-14of16 { - width: 87.5%; } - .col-tablet-1of10 { - width: 10%; } - .col-tablet-3of10 { - width: 30%; } - .col-tablet-7of10 { - width: 70%; } - .col-tablet-9of10 { - width: 90%; } - .col-tablet-1of12 { - width: 8.33333333%; } - .col-tablet-5of12 { - width: 41.66666667%; } - .col-tablet-7of12 { - width: 58.33333333%; } - .col-tablet-11of12 { - width: 91.66666667%; } - .col-tablet-1of16 { - width: 6.25%; } - .col-tablet-3of16 { - width: 18.75%; } - .col-tablet-5of16 { - width: 31.25%; } - .col-tablet-7of16 { - width: 43.75%; } - .col-tablet-9of16 { - width: 56.25%; } - .col-tablet-11of16 { - width: 68.75%; } - .col-tablet-13of16 { - width: 81.25%; } - .col-tablet-15of16 { - width: 93.75%; } - .col-tablet-pull-1of1, .col-tablet-pull-2of2, .col-tablet-pull-3of3, .col-tablet-pull-4of4, .col-tablet-pull-5of5, .col-tablet-pull-6of6, .col-tablet-pull-8of8, .col-tablet-pull-10of10, .col-tablet-pull-12of12, .col-tablet-pull-16of16 { - left: -100%; } - .col-tablet-pull-1of2, .col-tablet-pull-2of4, .col-tablet-pull-3of6, .col-tablet-pull-4of8, .col-tablet-pull-5of10, .col-tablet-pull-6of12, .col-tablet-pull-8of16 { - left: -50%; } - .col-tablet-pull-1of3, .col-tablet-pull-2of6, .col-tablet-pull-4of12 { - left: -33.33333333%; } - .col-tablet-pull-2of3, .col-tablet-pull-4of6, .col-tablet-pull-8of12 { - left: -66.66666667%; } - .col-tablet-pull-1of4, .col-tablet-pull-2of8, .col-tablet-pull-3of12, .col-tablet-pull-4of16 { - left: -25%; } - .col-tablet-pull-3of4, .col-tablet-pull-6of8, .col-tablet-pull-9of12, .col-tablet-pull-12of16 { - left: -75%; } - .col-tablet-pull-1of5, .col-tablet-pull-2of10 { - left: -20%; } - .col-tablet-pull-2of5, .col-tablet-pull-4of10 { - left: -40%; } - .col-tablet-pull-3of5, .col-tablet-pull-6of10 { - left: -60%; } - .col-tablet-pull-4of5, .col-tablet-pull-8of10 { - left: -80%; } - .col-tablet-pull-1of6, .col-tablet-pull-2of12 { - left: -16.66666667%; } - .col-tablet-pull-5of6, .col-tablet-pull-10of12 { - left: -83.33333333%; } - .col-tablet-pull-1of8, .col-tablet-pull-2of16 { - left: -12.5%; } - .col-tablet-pull-3of8, .col-tablet-pull-6of16 { - left: -37.5%; } - .col-tablet-pull-5of8, .col-tablet-pull-10of16 { - left: -62.5%; } - .col-tablet-pull-7of8, .col-tablet-pull-14of16 { - left: -87.5%; } - .col-tablet-pull-1of10 { - left: -10%; } - .col-tablet-pull-3of10 { - left: -30%; } - .col-tablet-pull-7of10 { - left: -70%; } - .col-tablet-pull-9of10 { - left: -90%; } - .col-tablet-pull-1of12 { - left: -8.33333333%; } - .col-tablet-pull-5of12 { - left: -41.66666667%; } - .col-tablet-pull-7of12 { - left: -58.33333333%; } - .col-tablet-pull-11of12 { - left: -91.66666667%; } - .col-tablet-pull-1of16 { - left: -6.25%; } - .col-tablet-pull-3of16 { - left: -18.75%; } - .col-tablet-pull-5of16 { - left: -31.25%; } - .col-tablet-pull-7of16 { - left: -43.75%; } - .col-tablet-pull-9of16 { - left: -56.25%; } - .col-tablet-pull-11of16 { - left: -68.75%; } - .col-tablet-pull-13of16 { - left: -81.25%; } - .col-tablet-pull-15of16 { - left: -93.75%; } - .col-tablet-push-1of1, .col-tablet-push-2of2, .col-tablet-push-3of3, .col-tablet-push-4of4, .col-tablet-push-5of5, .col-tablet-push-6of6, .col-tablet-push-8of8, .col-tablet-push-10of10, .col-tablet-push-12of12, .col-tablet-push-16of16 { - left: 100%; } - .col-tablet-push-1of2, .col-tablet-push-2of4, .col-tablet-push-3of6, .col-tablet-push-4of8, .col-tablet-push-5of10, .col-tablet-push-6of12, .col-tablet-push-8of16 { - left: 50%; } - .col-tablet-push-1of3, .col-tablet-push-2of6, .col-tablet-push-4of12 { - left: 33.33333333%; } - .col-tablet-push-2of3, .col-tablet-push-4of6, .col-tablet-push-8of12 { - left: 66.66666667%; } - .col-tablet-push-1of4, .col-tablet-push-2of8, .col-tablet-push-3of12, .col-tablet-push-4of16 { - left: 25%; } - .col-tablet-push-3of4, .col-tablet-push-6of8, .col-tablet-push-9of12, .col-tablet-push-12of16 { - left: 75%; } - .col-tablet-push-1of5, .col-tablet-push-2of10 { - left: 20%; } - .col-tablet-push-2of5, .col-tablet-push-4of10 { - left: 40%; } - .col-tablet-push-3of5, .col-tablet-push-6of10 { - left: 60%; } - .col-tablet-push-4of5, .col-tablet-push-8of10 { - left: 80%; } - .col-tablet-push-1of6, .col-tablet-push-2of12 { - left: 16.66666667%; } - .col-tablet-push-5of6, .col-tablet-push-10of12 { - left: 83.33333333%; } - .col-tablet-push-1of8, .col-tablet-push-2of16 { - left: 12.5%; } - .col-tablet-push-3of8, .col-tablet-push-6of16 { - left: 37.5%; } - .col-tablet-push-5of8, .col-tablet-push-10of16 { - left: 62.5%; } - .col-tablet-push-7of8, .col-tablet-push-14of16 { - left: 87.5%; } - .col-tablet-push-1of10 { - left: 10%; } - .col-tablet-push-3of10 { - left: 30%; } - .col-tablet-push-7of10 { - left: 70%; } - .col-tablet-push-9of10 { - left: 90%; } - .col-tablet-push-1of12 { - left: 8.33333333%; } - .col-tablet-push-5of12 { - left: 41.66666667%; } - .col-tablet-push-7of12 { - left: 58.33333333%; } - .col-tablet-push-11of12 { - left: 91.66666667%; } - .col-tablet-push-1of16 { - left: 6.25%; } - .col-tablet-push-3of16 { - left: 18.75%; } - .col-tablet-push-5of16 { - left: 31.25%; } - .col-tablet-push-7of16 { - left: 43.75%; } - .col-tablet-push-9of16 { - left: 56.25%; } - .col-tablet-push-11of16 { - left: 68.75%; } - .col-tablet-push-13of16 { - left: 81.25%; } - .col-tablet-push-15of16 { - left: 93.75%; } } - -.col-3-wide { - width: 33.33333333%; } - -@media (max-width: 719px) { - /* Remove .col-12 and .col-13 backward compatibility support as soon as it's been removed. */ -[class*=col-], .col-12 [class*=col-], .col-13 [class*=col-] { - float: none; - left: 0; - width: auto; -} } - -/* Header component */ -.dac-header { - background: #fff; - height: 64px; - margin: 0 -20px; -} - -@media (max-width: 719px) { - .dac-header { - margin: 0 -10px; - } -} - -.about .dac-header, .distribute .dac-header, .develop .dac-header { - height: 128px; -} - -.dac-header-inner { - background: #fff; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.07); - box-sizing: border-box; - height: 64px; - left: 0; - right: 0; - top: 0; - z-index: 52; -} - -.dac-header.dac-sub .dac-header-inner { - border-bottom: 1px solid #e5e5e5; - box-shadow: none; -} - -.dac-header.is-sticky .dac-header-inner { - position: fixed; - -webkit-animation: .3s dac-header-show; - animation: .3s dac-header-show; -} - -.dac-header-logo { - border-right: 1px solid #e5e5e5; - display: block; - font-size: 20px; - font-weight: 300; - float: left; - letter-spacing: .3px; - line-height: 36px; - margin-right: 16px; - padding: 14px 24px 14px; -} - -.dac-header-logo, .dac-header-logo:hover, .dac-header-logo:focus { - color: #444; -} - -.dac-header-logo-image { - margin-right: 5px; - vertical-align: top; -} - -.dac-header-console-btn { - border: 1px solid #c5c5c5; - border-radius: 3px; - box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.11); - background: #fff; - float: right; - font-size: 14px; - line-height: 28px; - margin: 17px 30px 17px 10px; - padding: 0 10px; - position: relative; - z-index: 52; -} - -.dac-header-console-btn > .dac-sprite { - margin-right: 5px; -} - -.dac-header-console-btn, .dac-header-console-btn:hover, .dac-header-console-btn:focus { - color: #666; -} - -.dac-header-console-btn:focus { - background: rgba(63, 81, 181, 0.1); - outline: 0; -} - -@media (max-width: 719px) { - .dac-header { - height: 64px !important; - text-align: center; - } - - .dac-header-inner { - position: fixed; - } - - .dac-header-logo { - border-right: 0; - display: inline-block; - margin-right: 0; - float: none; - } - - .dac-header.dac-sub { - display: none; - } - - .dac-header-console-btn { - display: none; - } -} - -@-webkit-keyframes dac-header-show { - 0% { - -webkit-transform: translateY(-64px); - transform: translateY(-64px); - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes dac-header-show { - 0% { - -webkit-transform: translateY(-64px); - transform: translateY(-64px); - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -/* Header Breadcrumbs component */ -.dac-header-crumbs { - display: none; - list-style-type: none; - margin: 0; -} - -.is-sticky .dac-header-crumbs { - display: block; -} - -.dac-header-crumbs-item { - float: left; - position: relative; - margin: 0; - padding-left: 10px; -} - -.dac-header-crumbs-item:before { - color: #444; - content: '>'; - font-weight: 300; - font-size: 20px; - left: 0; - line-height: 28px; - padding: 16px 0; - position: absolute; -} - -.dac-header-crumbs-item:first-child:before { - content: none; -} - -.dac-header-crumbs-link { - color: #444; - display: block; - font-size: 16px; - font-weight: 300; - line-height: 32px; - padding: 16px 16px; - -webkit-transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1); - transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1); -} - -.dac-header-crumbs-link:hover, .dac-header-crumbs-link:focus { - color: rgba(68, 68, 68, 0.7); -} - -.dac-header-crumbs-link:focus { - background: rgba(63, 81, 181, 0.1); - outline: 0; -} - -.dac-header-crumbs-link.current { - color: #6ab344; - font-weight: 400; -} - -.dac-header-crumbs-link.current.ndk { - color: #00BCD4; -} - -@media (max-width: 719px) { - .dac-header-crumbs { - display: none; - } -} - -/* Header site search component */ -.dac-header-search { - background: #fff; - border-left: 1px solid #e5e5e5; - display: block; - float: right; - height: 28px; - padding: 18px 0; - position: relative; - overflow: hidden; - -webkit-transition: width 0.4s ease, left 0.4s ease; - transition: width 0.4s ease, left 0.4s ease; - width: 64px; - z-index: 52; -} - -.dac-header-search:hover, .dac-header-search.active { - width: 228px; -} - -.dac-header-search-inner { - width: 228px; -} - -.dac-header-search-btn { - left: 20px; - position: absolute; - top: 20px; - opacity: .54; -} - -.dac-header-search-form { - left: 54px; - opacity: 0; - position: absolute; - right: 24px; - top: 20px; - -webkit-transition: opacity .4s; - transition: opacity .4s; -} - -.dac-header-search:hover .dac-header-search-form, .dac-header-search.active .dac-header-search-form { - opacity: 1; -} - -.dac-header-search-input { - background-color: transparent; - border: none; - border-bottom: 1px solid #CCC; - border-radius: 0; - box-sizing: border-box; - color: #2f2f2f; - font-size: 14px; - height: 24px; - outline: none; - padding: 4px 20px 4px 0; - width: 100%; - z-index: 1500; -} - -.dac-header-search-input:focus { - color: #222; - font-weight: bold; - outline: 0; -} - -.dac-header-search-close { - position: absolute; - right: 4px; - bottom: 4px; - width: 16px; - height: 16px; - margin: 0; - text-indent: -1000em; - background: url(../images/close.png) no-repeat 0 0; - z-index: 9999; -} - -.dac-header-search-close:hover, .dac-header-search-close:focus { - background-position: -16px 0; - cursor: pointer; -} - -@media (max-width: 719px) { - .dac-header-search { - position: absolute; - left: calc(100% - 64px); - right: 0; - top: 0; - width: auto; - } - - .dac-header-search:hover, .dac-header-search.active { - left: 64px; - width: auto; - } -} - -/* Main navigation component */ -.is-sticky .dac-nav, .dac-nav-head, .dac-nav-toggle { - display: none; -} - -.dac-nav-list { - list-style-type: none; - left: 192px; - margin: 0; - position: absolute; - right: 0; - top: 0; - z-index: 51; -} - -.dac-nav-item { - float: left; - margin: 0; -} - -.dac-nav-head { - margin-bottom: 10px; -} - -.dac-nav-dimmer { - background: #000; - display: none; - height: 100%; - left: 0; - opacity: 0; - position: fixed; - top: 0; - -webkit-transition: visibility 0s linear .3s, opacity .3s linear; - transition: visibility 0s linear .3s, opacity .3s linear; - -webkit-transform: translateZ(0); - transform: translateZ(0); - visibility: hidden; - width: 100%; - z-index: 52; -} - -.dac-nav-hamburger { - display: inline-block; - height: 15px; - width: 16px; -} - -.dac-nav-hamburger-top, .dac-nav-hamburger-mid, .dac-nav-hamburger-bot { - background: #999; - display: block; - height: 3px; - margin: 3px 0 0; - width: 100%; -} - -.dac-nav-link { - color: #444; - display: block; - font-size: 16px; - font-weight: 300; - letter-spacing: .24px; - line-height: 32px; - padding: 18px 16px 14px; - -webkit-transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1); - transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1); -} - -.dac-nav-link:hover, .dac-nav-link:focus { - color: rgba(68, 68, 68, 0.7); -} - -.dac-nav-link:focus { - background: rgba(63, 81, 181, 0.1); - outline: 0; -} - -.dac-nav-link.has-subnav, .dac-nav-link.selected { - border-bottom: 3px solid #6ab344; - font-weight: 500; - padding-bottom: 11px; -} - -.dac-nav-link.has-subnav.ndk, .dac-nav-link.selected.ndk { - border-bottom: 3px solid #00BCD4; -} - -.dac-nav-secondary { - border-bottom: 1px solid #e5e5e5; - display: none; - left: -192px; - list-style-type: none; - margin: 0; - position: absolute; - top: 64px; - right: 0; -} - -.dac-nav-link.has-subnav + .dac-nav-secondary, .dac-nav-link.selected + .dac-nav-secondary { - display: block; -} - -.dac-nav-secondary .dac-nav-link { - color: #666; - padding: 17px 16px 15px; -} - -.dac-nav-secondary .dac-nav-link:hover, .dac-nav-secondary .dac-nav-link:focus { - color: rgba(102, 102, 102, 0.7); -} - -@media (min-width: 720px) and (max-width: 979px) { - .dac-nav-secondary .dac-nav-link { - padding-left: 8px; - padding-right: 8px; - } -} - -.dac-nav-secondary .dac-nav-link.selected { - border: none; - font-weight: 700; -} - -.dac-nav-secondary .dac-nav-link.selected.ndk { - border: none; - font-weight: 700; -} - -@media (max-width: 719px) { - .dac-nav-open { - overflow: hidden; - } - - .dac-nav-toggle { - border-right: 1px solid #e5e5e5; - display: inline-block; - position: absolute; - left: 0; - line-height: 64px; - text-align: center; - width: 64px; - } - - .dac-nav-head, .dac-nav-secondary, .dac-nav-dimmer { - display: block; - } - - .dac-nav-dimmer.dac-nav-open { - opacity: .8; - -webkit-transition-delay: 0s; - transition-delay: 0s; - visibility: visible; - } - - .dac-nav-list { - background: #fff; - bottom: 0; - left: auto; - max-width: 280px; - -webkit-overflow-scrolling: touch; - overflow-y: scroll; - padding: 0 0 20px 0; - position: fixed; - right: 100%; - top: 0; - -webkit-transition: -webkit-transform .3s ease; - transition: transform .3s ease; - width: 85%; - z-index: 52; - } - - .dac-nav-list.dac-nav-open { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - - .dac-nav-secondary { - border: none; - position: static; - width: 100%; - } - - .dac-nav-item { - float: none; - } - - .dac-nav-link { - display: block; - font-size: 12px; - font-weight: 600; - color: #333; - padding: 0 20px; - } - - .dac-nav-link.selected { - color: #09f; - } - - .dac-nav-secondary .dac-nav-link { - font-weight: 400; - margin-left: 20px; - margin-right: 20px; - padding: 0 20px; - } - - .dac-nav-link.has-subnav, .dac-nav-link.selected { - border: none; - padding: 0 20px; - } - - .dac-nav-link.has-subnav.ndk, .dac-nav-link.selected.ndk { - border: none; - padding: 0 20px; - } - - .dac-logo-image { - margin-right: 5px; - vertical-align: top; - } - - .dac-nav-logo { - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.04); - font-size: 20px; - font-weight: 300; - letter-spacing: .3px; - line-height: 36px; - padding: 14px 24px; - } - - .dac-nav-logo, .dac-nav-logo:hover, .dac-nav-logo:focus { - color: #444; - } -} - -/* Hero carousel */ -.dac-hero { - background-color: #fff; - background-position: 50% 30%; - background-size: cover; - box-sizing: border-box; - font-size: 16px; - min-height: 550px; - padding-top: 88px; -} - -.dac-hero.dac-darken::before { - background: rgba(0, 0, 0, 0.3); - bottom: 0; - content: ''; - display: block; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -@media (max-width: 719px) { - .dac-hero.dac-darken::before { - background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%); - background: linear-gradient(to bottom, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%); - } -} - -.dac-hero.dac-darken .dac-hero-content { - position: relative; -} - -@media (max-width: 719px) { - .dac-hero { - padding-bottom: 20px; - padding-top: 20px; - } -} - -.dac-hero-tag { - font-size: 11px; - font-weight: 700; - letter-spacing: .07em; - margin-bottom: 2px; - text-transform: uppercase; -} - -.dac-hero-title { - margin: 0 0 14px; -} - -@media (max-width: 719px) { - .dac-hero-title { - font-size: 28px; - line-height: 35px; - } -} - -.dac-hero-description { - margin-bottom: 16px; -} - -@media (max-width: 719px) { - .dac-hero-description { - font-size: 14px; - } -} - -.dac-hero-cta { - display: inline-block; - line-height: 40px; - margin-right: 20px; - -webkit-transition: opacity .3s; - transition: opacity .3s; -} - -.dac-hero-cta:hover { - color: currentColor; - opacity: .54; -} - -.dac-hero-cta .dac-sprite { - margin-left: -8px; -} - -@media (max-width: 719px) { - .dac-hero-cta { - line-height: 28px; - } -} - -.dac-hero-figure { - text-align: center; -} - -@media (max-width: 719px) { - .dac-hero-figure { - height: 150px; - margin: 15px 0; - } - - .dac-hero-figure img { - max-height: 150px; - } -} - -.dac-hero-carousel { - height: 550px; - position: relative; -} - -.dac-hero-carousel > .dac-hero { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; - will-change: opacity; -} - -.dac-hero-carousel > .dac-hero, .dac-hero-carousel > .dac-hero .wrap { - opacity: 0; -} - -.dac-hero-carousel > .dac-hero.active { - opacity: 1; - -webkit-transition: opacity .5s; - transition: opacity .5s; - z-index: 1; -} - -.dac-hero-carousel > .dac-hero.active .wrap { - opacity: 1; - -webkit-transition: opacity .5s .5s; - transition: opacity .5s .5s; -} - -.dac-hero-carousel > .dac-hero.out, .dac-hero-carousel > .dac-hero.out .wrap { - -webkit-transition: opacity 0s .5s; - transition: opacity 0s .5s; - opacity: 0; -} - -.dac-hero-carousel-action { - bottom: 0; - display: block; - left: 0; - position: absolute; - right: 0; - top: 0; - z-index: 1; -} - -.dac-hero-carousel .dac-hero-cta { - position: relative; - z-index: 1; -} - -.dac-hero-carousel-pagination { - bottom: 33px; - left: 0; - position: absolute; - right: 0; -} - -@media (max-width: 719px) { - .dac-hero-carousel-pagination { - text-align: center; - bottom: 20px; - } -} - -.dac-hero-carousel-pagination .dac-pagination-item { - position: relative; - z-index: 1; -} - -.dac-pagination { - list-style: none; - margin: 0 -6px; -} - -.dac-pagination-item { - background-clip: content-box; - background-color: rgba(153, 153, 153, 0.4); - border-radius: 50%; - cursor: pointer; - display: inline-block; - height: 14px; - overflow: hidden; - padding: 6px; - pointer-events: all; - text-indent: 100%; - -webkit-transition: background-color .1s ease-in; - transition: background-color .1s ease-in; - white-space: nowrap; - width: 14px; - will-change: background-color; -} - -.dac-pagination-item:hover { - background-color: rgba(153, 153, 153, 0.6); -} - -.dac-pagination-item.active, .dac-pagination-item.active:hover { - background-color: #6ab344; -} - -.dac-invert .dac-pagination-item { - background-color: rgba(204, 204, 204, 0.2); -} - -.dac-invert .dac-pagination-item:hover { - background-color: rgba(153, 153, 153, 0.4); -} - -@media (max-width: 719px) { - .dac-pagination-item { - height: 12px; - width: 12px; - } -} - -/* Form component */ -.dac-form { - color: #505050; - font-size: 16px; - /* Modal Responsive */ -} - -.dac-form a { - color: #000; -} - -.dac-form-aside { - display: inline-block; - font-size: 12px; - margin-top: 0; -} - -.dac-form-required { - color: #ef4300; -} - -.dac-form-fieldset { - padding: 0; -} - -.dac-form-legend { - display: block; - color: #333; - font-weight: 500; - margin: 20px 0 12px; - padding: 0; - width: 100%; -} - -.dac-form-legend > .dac-form-required { - float: right; - margin-top: 3px; -} - -.dac-form-input { - border: 0 solid #e3e3e3; - border-bottom-width: 1px; - display: block; - outline: 0; - padding: 1px 0 8px; - -webkit-transition: border-color .2s; - transition: border-color .2s; - width: 100%; -} - -.dac-form-input-group { - position: relative; -} - -.dac-form-input-group > .dac-form-required { - display: block; - bottom: 3px; - position: absolute; - right: 0; -} - -.dac-form-input:focus { - border-bottom-color: #09f; -} - -.dac-form-floatlabel { - display: block; - cursor: text; - margin-top: 5px; - pointer-events: none; - -webkit-transform-origin: 0 100%; - -ms-transform-origin: 0 100%; - transform-origin: 0 100%; - -webkit-transform: translate3d(0, 22px, 0) scale(1); - transform: translate3d(0, 22px, 0) scale(1); - -webkit-transition: -webkit-transform .2s; - transition: transform .2s; -} - -.dac-focused > .dac-form-floatlabel, .dac-has-value > .dac-form-floatlabel { - cursor: default; - -webkit-transform: translate3d(0, 0, 0) scale(.75); - transform: translate3d(0, 0, 0) scale(.75); -} - -.dac-form-radio, .dac-form-checkbox { - opacity: 0; - position: absolute; -} - -.dac-form-radio-group, .dac-form-checkbox-group { - display: table; - margin-top: 10px; -} - -.dac-form-radio-button, .dac-form-checkbox-button { - box-sizing: border-box; - cursor: pointer; - display: table-cell; - float: left; - height: 18px; - margin: 2px 10px 0 0; - position: relative; - width: 18px; -} - -.dac-form-radio-button::after, .dac-form-radio-button::before, .dac-form-checkbox-button::after, .dac-form-checkbox-button::before { - box-sizing: border-box; - content: ''; - border-radius: 50%; - display: block; - height: 100%; - position: absolute; - width: 100%; -} - -.dac-form-radio-button::before, .dac-form-checkbox-button::before { - background: rgba(0, 0, 0, 0.7); - -webkit-transform: translateZ(0) scale(0); - transform: translateZ(0) scale(0); - -webkit-transition: -webkit-transform .3s; - transition: transform .3s; -} - -.dac-form-radio-button::after, .dac-form-checkbox-button::after { - border: 2px solid rgba(0, 0, 0, 0.7); -} - -.dac-form-radio:checked + .dac-form-radio-button::before, .dac-form-checkbox:checked + .dac-form-checkbox-button::before { - -webkit-transform: translateZ(0) scale(.5); - transform: translateZ(0) scale(.5); -} - -.dac-form-radio:focus + .dac-form-radio-button::after, .dac-form-checkbox:focus + .dac-form-checkbox-button::after { - border: 2px solid #09f; -} - -.dac-form-checkbox-button::after, .dac-form-checkbox-button::before { - border-radius: 0; -} - -@media (max-width: 719px) { - .dac-form-legend { - margin-bottom: 0; - } -} - -/* Media component */ -.dac-media { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; -} - -.dac-media-figure { - margin: 0; -} - -.dac-media-body { - -webkit-box-flex: 1; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; -} - -.no-flexbox .dac-media { - display: table; - width: 100%; -} - -.no-flexbox .dac-media-body, .no-flexbox .dac-media-figure { - display: table-cell; -} - -.no-flexbox .dac-media-figure { - padding: 0; -} - -.no-flexbox .dac-media-body { - width: 100%; -} - -.dac-swap { - overflow: hidden; - position: relative; -} - -.dac-swap-section { - left: 0; - opacity: 0; - position: absolute; - top: 0; - width: 100%; - -webkit-transition: opacity 1s, -webkit-transform .5s; - transition: opacity 1s, transform .5s; -} - -.dac-swap-section.dac-up { - -webkit-transform: translateY(-100%); - -ms-transform: translateY(-100%); - transform: translateY(-100%); -} - -.dac-swap-section.dac-down { - -webkit-transform: translateY(100%); - -ms-transform: translateY(100%); - transform: translateY(100%); -} - -.dac-swap-section.dac-left { - -webkit-transform: translateX(-100%); - -ms-transform: translateX(-100%); - transform: translateX(-100%); -} - -.dac-swap-section.dac-right { - -webkit-transform: translateX(100%); - -ms-transform: translateX(100%); - transform: translateX(100%); -} - -.dac-swap-section.dac-active { - opacity: 1; - position: relative; - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); - width: auto; -} - -/* Modal component */ -.dac-modal { - background: rgba(0, 0, 0, 0.8); - bottom: 0; - left: 0; - opacity: 0; - overflow-x: hidden; - overflow-y: auto; - position: fixed; - right: 0; - top: 0; - -webkit-transition: visibility 0s linear .3s, opacity .3s linear; - transition: visibility 0s linear .3s, opacity .3s linear; - visibility: hidden; - z-index: 52; -} - -.dac-modal.dac-active { - opacity: 1; - -webkit-transition-delay: 0s; - transition-delay: 0s; - visibility: visible; -} - -.dac-modal-open { - overflow: hidden; -} - -.dac-modal-container { - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4)); - filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4)); - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - min-height: 100%; - width: 100%; -} - -.dac-modal-window { - background: #fff; - border-radius: 5px; - box-sizing: border-box; - margin: 20px auto; - -webkit-transition: -webkit-transform .3s; - transition: transform .3s; - -webkit-transform: translate(0, -30px); - -ms-transform: translate(0, -30px); - transform: translate(0, -30px); - width: 960px; -} - -.dac-modal.dac-active .dac-modal-window { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.dac-modal-header { - background: #00695c; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - padding: 35px 35px 30px; - position: relative; -} - -.dac-modal-header-close { - background: none; - border: none; - cursor: pointer; - line-height: 0; - outline: 0; - opacity: .7; - padding: 8px; - position: absolute; - right: 5px; - -webkit-transition: background-color .3s; - transition: background-color .3s; - top: 5px; -} - -.dac-modal-header-close:active { - background: rgba(255, 255, 255, 0.2); -} - -.dac-modal-header-title { - color: #fff; - font-size: 24px; - font-weight: 300; - line-height: 32px; - margin: 0; - padding-right: 150px; -} - -.dac-modal-header-subtitle { - bottom: 0; - color: #fff; - display: inline-block; - font: inherit; - font-size: 14px; - margin: 0; - opacity: .8; - position: absolute; - right: 0; -} - -.dac-modal-content { - padding: 12px 35px; -} - -.dac-modal-action { - margin: 0; -} - -.dac-modal-footer { - padding: 24px 35px; -} - -@media (max-width: 1000px) { - .dac-modal-window { - margin: 20px; - width: auto; - } - - .dac-modal-container { - z-index: auto; - } -} - -@media (max-width: 719px) { - .dac-modal-window { - margin: 10px; - } - - .dac-modal-header { - padding: 35px 10px 10px; - } - - .dac-modal-header-title { - font-size: 16px; - line-height: 24px; - padding: 0; - } - - .dac-modal-header-subtitle { - display: block; - margin: 0; - position: static; - text-align: right; - } - - .dac-modal-content { - padding: 10px; - } - - .dac-modal-footer { - border-top: 1px solid #e3e3e3; - padding: 35px 10px; - } -} - -.newsletter .dac-modal-footer { - padding-top: 0; - text-align: right; -} - -.newsletter-checkboxes { - padding-top: 20px; -} - -.newsletter-success-message { - font-size: 32px; - line-height: 1.4; - padding: 40px 30px; - text-align: center; -} - -@media (max-width: 719px) { - .newsletter-success-message { - font-size: 16px; - padding: 12px 0 0; - } -} - -@media (min-width: 720px) { - .newsletter-checkboxes { - padding-top: 46px; - } - - .newsletter-leftCol { - padding-right: 40px; - } - - .newsletter-rightCol { - padding-left: 40px; - } -} - -@media (max-width: 719px) { - .newsletter .dac-modal-footer { - margin-top: 30px; - padding: 30px 10px; - text-align: center; - } -} - -.dac-expand, .dac-section { - margin-left: -20px; - margin-right: -20px; - padding-left: 20px; - padding-right: 20px; -} - -@media (max-width: 719px) { - .dac-expand, .dac-section { - margin-left: -10px; - margin-right: -10px; - padding-left: 10px; - padding-right: 10px; - } -} - -.dac-invert { - color: #b2b2b2; - color: rgba(255, 255, 255, 0.7); -} - -.dac-invert h1, .dac-invert h2, .dac-invert h3 { - color: #fff; -} - -.dac-light.dac-hero, .dac-light.dac-section { - background-color: #eceff1; -} - -.dac-gray.dac-hero, .dac-gray.dac-section { - background-color: #b0bec5; -} - -.dac-dark.dac-hero, .dac-dark.dac-section { - background-color: #37474f; -} - -.dac-red.dac-hero, .dac-red.dac-section { - background-color: #dc4d38; -} - -.dac-hero-cta, .dac-section-title, .dac-section-links { - color: #212121; - color: rgba(0, 0, 0, 0.87); -} - -.dac-invert .dac-hero-cta, .dac-invert .dac-section-title, .dac-invert .dac-section-links { - color: white; -} - -.dac-hero-cta .dac-sprite, .dac-section-title .dac-sprite, .dac-section-links .dac-sprite { - opacity: .87; -} - -.dac-invert .dac-hero-cta .dac-sprite, .dac-invert .dac-section-title .dac-sprite, .dac-invert .dac-section-links .dac-sprite { - opacity: 1; -} - -.dac-hero-tag, .dac-hero-description, .dac-section-subtitle { - color: #757575; - color: rgba(0, 0, 0, 0.54); -} - -.dac-invert .dac-hero-tag, .dac-invert .dac-hero-description, .dac-invert .dac-section-subtitle { - color: #b2b2b2; - color: rgba(255, 255, 255, 0.7); -} - -.dac-section { - background-position: 50% 50%; - background-size: cover; - padding-bottom: 84px; - padding-top: 84px; - position: relative; -} - -@media (max-width: 719px) { - .dac-section { - padding-bottom: 52px; - padding-top: 52px; - } -} - -.dac-section.dac-small { - padding-bottom: 32px; - padding-top: 32px; -} - -.dac-section-title { - text-align: center; - margin-bottom: 40px; - margin-top: 0; -} - -.dac-section-subtitle { - font-size: 16px; - margin-bottom: 40px; - margin-top: -24px; - text-align: center; -} - -.dac-section-links { - font-size: 16px; - list-style: none; - line-height: 40px; - margin: 16px 0 0; - text-align: center; -} - -@media (max-width: 719px) { - .dac-section-links { - margin-left: -8px; - text-align: left; - } -} - -.dac-section-link { - display: inline-block; - margin: 0 32px; - -webkit-transition: opacity .3s; - transition: opacity .3s; -} - -.dac-section-link:hover { - opacity: .54; -} - -@media (max-width: 719px) { - .dac-section-link { - display: block; - margin: 0; - } -} - -.dac-section-link a { - color: inherit; -} - -/* -SCSS variables are information about icon's compiled state, stored under its original file name - -.icon-home { - width: $icon-home-width; -} - -The large array-like variables contain all information about a single icon -$icon-home: x y offset_x offset_y width height total_width total_height image_path; - -At the bottom of this section, we provide information about the spritesheet itself -$spritesheet: width height image $spritesheet-sprites; -*/ -.dac-sprite, #tb li:before, #qv li:before { - background-image: url(../../assets/images/sprite.png); - display: inline-block; - vertical-align: middle; } - @media screen and (min-device-pixel-ratio: 1.5) { - .dac-sprite, #tb li:before, #qv li:before { - background-image: url(../../assets/images/sprite-2x.png); - background-size: 50% 50%; } } - -.dac-sprite.dac-auto-chevron { - background-position: 0px -196px; - height: 24px; - width: 24px; - vertical-align: -6px; } - .dac-invert .dac-sprite.dac-auto-chevron { - background-position: 0px -222px; - height: 24px; - width: 24px; } -.dac-sprite.dac-auto-chevron-large { - background-position: 0px -404px; - height: 36px; - width: 36px; - vertical-align: -10px; } - .dac-invert .dac-sprite.dac-auto-chevron-large { - background-position: 0px -442px; - height: 36px; - width: 36px; } -.dac-sprite.dac-auto-unfold-less { - background-position: 0px -352px; - height: 24px; - width: 24px; - vertical-align: -6px; } - .dac-invert .dac-sprite.dac-auto-unfold-less { - background-position: 0px -326px; - height: 24px; - width: 24px; } -.dac-sprite.dac-auto-unfold-more { - background-position: 0px -300px; - height: 24px; - width: 24px; - vertical-align: -6px; } - .dac-invert .dac-sprite.dac-auto-unfold-more { - background-position: 0px -378px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-arrow-down-gray { - background-position: 0px 0px; - height: 11px; - width: 19px; } - -.dac-sprite.dac-arrow-right { - background-position: 0px -128px; - height: 18px; - width: 11px; } - -.dac-sprite.dac-chevron-large-right-black { - background-position: 0px -404px; - height: 36px; - width: 36px; } - -.dac-sprite.dac-chevron-large-right-white { - background-position: 0px -442px; - height: 36px; - width: 36px; } - -.dac-sprite.dac-chevron-right-black { - background-position: 0px -196px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-chevron-right-white { - background-position: 0px -222px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-close { - background-position: 0px -27px; - height: 12px; - width: 12px; } - -.dac-sprite.dac-expand-less-black { - background-position: 0px -248px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-expand-more-black { - background-position: 0px -170px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-google-play { - background-position: 0px -108px; - height: 18px; - width: 16px; } - -.dac-sprite.dac-gplus { - background-position: 0px -89px; - height: 17px; - width: 16px; } - -.dac-sprite.dac-mail { - background-position: 0px -13px; - height: 12px; - width: 16px; } - -.dac-sprite.dac-play-white { - background-position: 0px -148px; - height: 20px; - width: 16px; } - -.dac-sprite.dac-rss { - background-position: 0px -41px; - height: 14px; - width: 14px; } - -.dac-sprite.dac-search { - background-position: 0px -274px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-twitter { - background-position: 0px -73px; - height: 14px; - width: 16px; } - -.dac-sprite.dac-unfold-less-white { - background-position: 0px -326px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-unfold-less { - background-position: 0px -352px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-unfold-more-white { - background-position: 0px -378px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-unfold-more { - background-position: 0px -300px; - height: 24px; - width: 24px; } - -.dac-sprite.dac-youtube { - background-position: 0px -57px; - height: 14px; - width: 18px; } - -.dac-toggle-expand { - cursor: pointer; - display: inline-block; } -.dac-toggle-collapse { - cursor: pointer; - display: none; } -.dac-toggle.is-expanded .dac-toggle-expand { - display: none; } -.dac-toggle.is-expanded .dac-toggle-collapse { - display: inline-block; } -.dac-toggle-content { - clear: left; - overflow: hidden; - max-height: 0; - -webkit-transition: .3s max-height; - transition: .3s max-height; } -.dac-toggle.is-expanded .dac-toggle-content { - max-height: none; } -.dac-toggle.dac-mobile .dac-toggle-content { - max-height: none; } -@media (max-width: 719px) { - .dac-toggle.dac-mobile .dac-toggle-content { - max-height: 0; } - .dac-toggle.is-expanded .dac-toggle-content { - max-height: none; } } - -.dac-visible-mobile-block, .dac-mobile-only, .dac-visible-mobile-inline, .dac-visible-mobile-inline-block, .dac-visible-tablet-block, .dac-visible-tablet-inline, .dac-visible-tablet-inline-block, .dac-visible-desktop-block, .dac-visible-desktop-inline, .dac-visible-desktop-inline-block { - display: none !important; } - -@media (max-width: 719px) { - .dac-hidden-mobile { - display: none !important; } - .dac-visible-mobile-block, .dac-mobile-only { - display: block !important; } - .dac-visible-mobile-inline { - display: inline !important; } - .dac-visible-mobile-inline-block { - display: inline-block !important; } } - -@media (min-width: 720px) and (max-width: 979px) { - .dac-hidden-tablet { - display: none !important; } - .dac-visible-tablet-block { - display: block !important; } - .dac-visible-tablet-inline { - display: inline !important; } - .dac-visible-tablet-inline-block { - display: inline-block !important; } } - -@media (min-width: 980px) { - .dac-hidden-desktop { - display: none !important; } - .dac-visible-desktop-block { - display: block !important; } - .dac-visible-desktop-inline { - display: inline !important; } - .dac-visible-desktop-inline-block { - display: inline-block !important; } } - -.dac-offset-parent { - position: relative !important; } - -/** - * Break strings when their length exceeds the width of their container. - */ -.dac-text-break { - word-wrap: break-word !important; } - -/** - * Horizontal text alignment - */ -.dac-text-center { - text-align: center !important; } - -.dac-text-left { - text-align: left !important; } - -.dac-text-right { - text-align: right !important; } - -/** - * Prevent whitespace wrapping - */ -.dac-text-no-wrap { - white-space: nowrap !important; } - -/** - * Prevent text from wrapping onto multiple lines, instead truncate with an ellipsis. - */ -.dac-text-truncate { - max-width: 100%; - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - word-wrap: normal !important; } - -/** - * Floats - */ -.dac-float-left { - float: left !important; } - -.dac-float-right { - float: right !important; } - -/** - * New block formatting context - * - * This affords some useful properties to the element. It won't wrap under - * floats. Will also contain any floated children. - * N.B. This will clip overflow. Use the alternative method below if this is - * problematic. - */ -.dac-nbfc { - overflow: hidden !important; -} - -/** - * New block formatting context (alternative) - * - * Alternative method when overflow must not be clipped. - * - * N.B. This breaks down in some browsers when elements within this element - * exceed its width. - */ -.dac-nbfc-alt { - display: table-cell !important; - width: 10000px !important; -} - -#tb li:before, #qv li:before { - background-position: 0px -196px; - height: 24px; - width: 24px; - content: ''; - left: -8px; - opacity: .7; - position: absolute; - top: -4px; -} - -/* CHANGE EXISTING SELECTOR FOR ANDROID M HERO ONLY - REMOVE THE BELOW STYLES WHEN THE ANDROID M CAROUSEL - GRAPHIC ON THE MAIN LANDING IS TAKEN DOWN */ -.dac-hero.mprev { - background-color: #fff; - background-position: 50% 53%; - background-size: cover; - background-image: url(../../assets/images/home/android_m_hero_1200.jpg); - box-sizing: border-box; - font-size: 16px; - min-height: 550px; - padding-top: 88px; -} -.dac-hero.dac-darken.mprev::before { - background: rgba(0, 0, 0, 0.3); - bottom: 0; - content: ''; - display: block; - left: 0; - position: absolute; - right: 0; - top: 0; -} - -.dac-hero.dac-darken.mprev::before { - background: -webkit-linear-gradient(top, rgba(0, 0, 0, .05), rgba(0, 0, 0, .05), #000 950px); - background: linear-gradient(to bottom, rgba(0, 0, 0, .05), rgba(0, 0, 0, 0.05), #000 950px); -} - -@media (max-width: 719px) { - - .dac-hero.dac-darken.mprev { - background-size: auto 600px; - background-position: 55% 0; - background-repeat: no-repeat; - } - - .dac-hero-figure.mprev { - height: 10px; - margin: 15px 0; - } -} - -@media (max-width: 719px) { - - .dac-hero.dac-darken.mprev { - background-size: auto 600px; - background-position: 55% 0; - background-repeat: no-repeat; - } - - .dac-hero-figure.mprev { - height: 10px; - margin: 15px 0; - } -} - -@media (max-width: 1200px) { - - .dac-hero.dac-darken.mprev { - background-size: auto 700px; - background-position: 55% 0; - background-repeat: no-repeat; - } - - .dac-hero-cta.mprev { - white-space:nowrap; - } -} \ No newline at end of file diff --git a/tools/droiddoc/templates-sdk-refonly/assets/css/fullscreen.css b/tools/droiddoc/templates-sdk-refonly/assets/css/fullscreen.css deleted file mode 100644 index 0f108e04605..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/css/fullscreen.css +++ /dev/null @@ -1,20 +0,0 @@ - -/* ============================================================================= - Columns - ========================================================================== */ -/* Applied to body to debug layout alignments -.grid { - width:100%; - height:100%; - background:url(../images/grid.png) center repeat-y; - top:0px; - margin:auto; - position:absolute; -} -*/ - -@media screen, projection, print { - .wrap { - max-width: none; - } -} diff --git a/tools/droiddoc/templates-sdk-refonly/assets/design/default.js b/tools/droiddoc/templates-sdk-refonly/assets/design/default.js deleted file mode 100644 index 3ba8486860a..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/design/default.js +++ /dev/null @@ -1,188 +0,0 @@ -$(document).ready(function() { - // prep nav expandos - var pagePath = document.location.pathname; - if (pagePath.indexOf(SITE_ROOT) == 0) { - pagePath = pagePath.substr(SITE_ROOT.length); - if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { - pagePath += 'index.html'; - } - } - - if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { - // If running locally, SITE_ROOT will be a relative path, so account for that by - // finding the relative URL to this page. This will allow us to find links on the page - // leading back to this page. - var pathParts = pagePath.split('/'); - var relativePagePathParts = []; - var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push('..'); - } - for (var i = 0; i < upDirs; i++) { - relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); - } - relativePagePathParts.push(pathParts[pathParts.length - 1]); - pagePath = relativePagePathParts.join('/'); - } else { - // Otherwise the page path should be an absolute URL. - pagePath = SITE_ROOT + pagePath; - } - - // select current page in sidenav and set up prev/next links if they exist - var $selNavLink = $('.nav-y').find('a[href="' + pagePath + '"]'); - if ($selNavLink.length) { - $selListItem = $selNavLink.closest('li'); - - $selListItem.addClass('selected'); - $selListItem.closest('li>ul').addClass('expanded'); - - // set up prev links - var $prevLink = []; - var $prevListItem = $selListItem.prev('li'); - if ($prevListItem.length) { - if ($prevListItem.hasClass('nav-section')) { - // jump to last topic of previous section - $prevLink = $prevListItem.find('a:last'); - } else { - // jump to previous topic in this section - $prevLink = $prevListItem.find('a:eq(0)'); - } - } else { - // jump to this section's index page (if it exists) - $prevLink = $selListItem.parents('li').find('a'); - } - - if ($prevLink.length) { - var prevHref = $prevLink.attr('href'); - if (prevHref == SITE_ROOT + 'index.html') { - // Don't show Previous when it leads to the homepage - $('.prev-page-link').hide(); - } else { - $('.prev-page-link').attr('href', prevHref).show(); - } - } else { - $('.prev-page-link').hide(); - } - - // set up next links - var $nextLink = []; - if ($selListItem.hasClass('nav-section')) { - // we're on an index page, jump to the first topic - $nextLink = $selListItem.find('ul').find('a:eq(0)') - } else { - // jump to the next topic in this section (if it exists) - $nextLink = $selListItem.next('li').find('a:eq(0)'); - if (!$nextLink.length) { - // no more topics in this section, jump to the first topic in the next section - $nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)'); - } - } - if ($nextLink.length) { - $('.next-page-link').attr('href', $nextLink.attr('href')).show(); - } else { - $('.next-page-link').hide(); - } - } - - // Set up expand/collapse behavior - $('.nav-y li').has('ul').click(function() { - if ($(this).hasClass('expanded')) { - return; - } - - // hide other - var $old = $('.nav-y li.expanded'); - if ($old.length) { - var $oldUl = $old.children('ul'); - $oldUl.css('height', $oldUl.height() + 'px'); - window.setTimeout(function() { - $oldUl - .addClass('animate-height') - .css('height', ''); - }, 0); - $old.removeClass('expanded'); - } - - // show me - $(this).addClass('expanded'); - var $ul = $(this).children('ul'); - var expandedHeight = $ul.height(); - $ul - .removeClass('animate-height') - .css('height', 0); - window.setTimeout(function() { - $ul - .addClass('animate-height') - .css('height', expandedHeight + 'px'); - }, 0); - }); - - // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away - // from the page) - $('.nav-y li').has('ul').find('a:eq(0)').click(function(evt) { - window.location.href = $(this).attr('href'); - return false; - }); - - // Set up play-on-hover
    ') - .addClass('tooltip-box') - .text($target.attr('title')) - .hide() - .appendTo('body'); - $target.removeAttr('title'); - - $target.hover(function() { - // in - var targetRect = $target.offset(); - targetRect.width = $target.width(); - targetRect.height = $target.height(); - - $tooltip.css({ - left: targetRect.left, - top: targetRect.top + targetRect.height + TOOLTIP_MARGIN - }); - $tooltip.addClass('below'); - $tooltip.show(); - }, function() { - // out - $tooltip.hide(); - }); - }); - - // Set up

    deeplinks - $('h2').click(function() { - var id = $(this).attr('id'); - if (id) { - document.location.hash = id; - } - }); - - // Set up fixed navbar - var navBarIsFixed = false; - $(window).scroll(function() { - var scrollTop = $(window).scrollTop(); - var navBarShouldBeFixed = (scrollTop > (100 - 40)); - if (navBarIsFixed != navBarShouldBeFixed) { - if (navBarShouldBeFixed) { - $('#nav') - .addClass('fixed') - .prependTo('#page-container'); - } else { - $('#nav') - .removeClass('fixed') - .prependTo('#nav-container'); - } - navBarIsFixed = navBarShouldBeFixed; - } - }); -}); \ No newline at end of file diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android-developers-logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android-developers-logo.png deleted file mode 100644 index 30a8f627caa2b0f780089ddb4cdcf131b5a2d061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3195 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android.png deleted file mode 100644 index 4040f3f764c7ec958cce55d8cbc445de6fc7683b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4934 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk.png deleted file mode 100644 index 3f39f4d8d120f0515b5915271de8673905a08395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4712 zcmeHJy-LJD5S|ke6@*i;v9hofyi#n;Nkp%aQ!H#m&nNH^#Lmt)IK^IkfWVz^kRqLp zXd@iry@7s{%aF;MWFrPq$->^w&o|%9PBweFXzy&zOfO6m(M)UG-NU+wximR}-~4QQ;^VlhV=?OsTSK-M$R+Sdt-%>asdOa#k%2mfP)$x6;{@iCTT ztixV_7cglLbJ5Bc0~p)G2fmw} z^X78cE~0)`<^RS$Is?g@&d2VWcy2?S;P+B?>Mqx!JD~@@M#LH3lyU~TDiH%tm0p&} zoRXY5!<%Gc8`4tmC7j{=qM^5@}<(t z5}A{^WrR6vqNT27{vD?#AhLZC?IP|7vySOt>M?{OJ8D2?j2?X`jJeiEQ_k;zMt|-` zA0I8v5aIX`BRfm@K#q}l>WJF_5qi+okeEpyq5nRuv)oU6KjVa|B zXIM!s?MPYY8;?R2fL&Vw(0pqZ&1&(85am>fw)Ej5V781H><%vp>Ee+tnKO}IZpw88 zY)TuoW`tl)llVBe9(L>z4TnaLMwZNI5q{sPy{8L z6M|4z@u(KLkW*Xq32?o0Lg8p5kq_X|^#HlGMDGX$fA($&0d^!y&S-HSDr7H?{m>8O zehTO7Pd+U?pre3iCAp*I6+6ABsU5#e&E^Ddwpew&l(KL^%n!MN;k+r$U2pjL!UNoELW%1&$wM|(Tq z?d7}I(Qg3+*=;Wwh5#`JOb3YZ)Ltvo0qxyevC2#bi1E~3E7Jk(-CMEBOb3YZ)Ltvo z0qxyevC2#bi1E~3E7Jk(-CMEBOa~-*nkMF1(=vUQ&!*POurBq<4#4mG{2atshkjc` zxR#iJ;5WF3RN<1Huv)xc{f@BdG)UAEe^Dx1RFl6bm8d1|012nibSCdonTIkK9RkKw zj&fo~Du4l4ltldqE0nOZ(`cRn;sE_MrX4>8k zxY&7e-?F+d@qYoBxZPed3;{e0m=56KaeJef4ya)7)<0WVPf?^V(jiWnemz&|>nb`x v_>-9obUMBn;mViz36S_?CIwH&Hx*25;a7KZ^6}4)8(1GbJsx~{{N~~xV+Y0i diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png deleted file mode 100644 index 6390a2d80d6c81f224803a3604a0a395229fa608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3633 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 D%*xKB diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left-develop.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left-develop.png deleted file mode 100644 index 5fdfaa376dee62d8b1a42a3dce6fc2ac9fc3bd6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3036 zcmaJ@dpy(YAK&bd>mhc8iZz#zcCm{#<~Ey4)EXVqMKc?VZO%3stz4R<(&=IfXP9#7 zMC8yZDOpJ^aw&?UI5{qbghJ#uo$CDl`1Sj~p6~a$ygu*u=l#5&&+~eH(*h z0RVuGx0eT1*@KmDl)9SoyJzNjRo<1qkkVcbv##G6eEXHXfmu()6D zGn@bb&}LRZkRZs<7f{U$2Z<&yV8>Xu|az zzWG-M4+fvkV?_&CTn=Q3krv905fGqCrT=V!9sP}#!~bHF(lEG?77a(j5KCM78tCWu z|3lgAZ_#`KmGQ6M|4Gabh>K>xsSG|hhDTQ(9MgO$RWzQ+W6%U#UI3RH_0>g61XsZ2 zM{uJdM1L&A8i|4-KAVR?AuupD42{Hm@e&0`VDR=xJOZI?HV}xlAC1o9EMaXvll%GM zy*YdVjYDU6dk~L=2w#st*I z-Yc$V>Q!K|uu7=^s>Mxz&6Z>1Zb?MkbiYP_m&-DP&88Ol;m0(Kw&;3c#CP@R8@9H& zuQY(>dN~19+_&eK7mmL;UY8~9l4eQcJ_cjsx_bV+p7&v4AuH>}r(n4e=*ix{?0_%G zuPjH~h%>V~E|0)G>@;Fc@9WzQsxv3aZ?#Ozi=`zm8~2nSAHeP?mERj#rk62xdvAnX z^;CGJYHLEo)ksrve9@Z3nK_ZU*uEJRSZ`OSlWM3PJCHKCyLLS#i>2y%c3Xdibqb*i z@K>1xkWy&~^h2gVr;#KgB7f+wk^P`w6YfmAHV;H~kKc4g=&a#H0*; z+D)=tJZ&D85|_X+#b<0aPB}uk0?o;bb6y2|=xv0e=`{QH5K^$84C1aRsPE4^yw8%( zq^Spn(y7HvvOZa_a}ev_BG!I8UY@4z`m3)Fl;#AG`>rdrH}_t~%t%820Z%W|V!pbl zV$1MuA93D(a%=y_1He}mlq?PV78SIC1XJ^@#r-`1k|0gGVbuIUl>djAvujbM2&tjq2t; z{oL`skj_Awa9nMvj*9$$?vLrnjo3>WljWW6;K_Pf4{F`SJGK{j*n|bzM=| z4#poEB>G(7k`=FH1_~Ra;XP*VHrjn+}}Z%XBL7% z81Z1t8M9}bDmEB5(L&EmkasP2odM?$0<{acp0gLEc_R3`R!6h`=BuZgG1p~w543^n ze~I|voVwO@LkPR7N2NjLenEBgBt%}s`c`|0t zjHFt1L}BE`XcnC{5H6xtQGVt9?!54|nU0>+sh2wF z$s@tD=Z14W2Cewb(?R?IsA=XrHfsAVhnmiClRL$QNeVuIJYT^*3*au}!a&^$&Azu#7Z>v+^-->&T z%Z!muD9cTGp-9dU~BNbr7LiP~JewlUhoD+6|ohaiJ3<)S`+;}S*( zHjU~YTKK00SOU8~*Y26|)+Re7C(CKpcUpGD`GZYpQFdKk?_$%y+a`zdGp3944~IPm zZ6itEq8Y&XQQhzX&aOWlEmqt$T4iie@N0VGqgVIx>(1nZ_Dd~$L*5i4>{r&uH03PR z-#W^%+`F;iN$GR_TlbE0)Z;-<1?3v$MdLOWhxD%vn)R|OL*mha+FbI}2Mt#Puc)o- zlCBX&pe<(QjZQwJYU6*a9E%!HcJ0N#P_a&U3p%|&>hH0iYib&5(-ji-x}plJgYPc$ zqnzSySUz6BGd+TB_vQKol?Gcoej;o{joe*)U(TJ$Dp`X*vhUJ7 z`NsyE1-+X=4TM0x{4Fdvpr`c|MVlP@NzFF@V2J=cu9ev@WuO8K&pc0eHT@KE@r3gL< zw|>&pMEz5d=>i4i(h_!q{?J9o>Kt4aJavPTJ(G;{(HnS_omK2T1tedlXri2}E~eZW zMyqK}#!YQ!`ixRq4_XxeT2_{LXf}p__MNLuo~<=b)au_Dq;+HN=HZV$J1M~%+gWEU4i+2KcP9P#;&IvUKilkFv2N$l$)RUv>6KlJsz!j`Rm1XQZGZSL P{cn4dHhElf-<|v)BA6Hn diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png deleted file mode 100644 index 43afec87f405a86370eb8f19c62922f64f26281a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3144 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 U diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right-develop.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right-develop.png deleted file mode 100644 index c86f1f35b2f85bd423ff75afdcb2e179fbcb868a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2960 zcmaJ@c{r47A0D#PQCXtJnWiY28M9a?#Een)X-qXK@|t-un5CJ?cF2~KfmX?-eV-U9m`eLs6Zf) z<&Hb;$Vn=8Df>1{$;17~PfF6FR4YYzl zmbo)1R6ffm(&(qy$Wm4?x41!7Lsw%o_HE7bhJrEgQq2Uqbjn z*08UlsIDX^fz1V>rbsM;hC-vEW@bpViK&?x8V<#v&=_Nsw3#8$COA_w9L5~_?SV1TUP$2f`36-p20? z_8^bOWpMZmHVeAM2>7xO^Q~c0rC+ze50VUuzYh+?0ky&Wa2|Dv#y z-Q%EncQ_@q!CAQ}%a){^5m9H56W=bSthq=C*qdGQ}Rwd$=hB; zdPK;M$=~BDx`|LB2aw#$KiZjjyAQAZZSrlHU*A5s<=g&OsZCRT;%T@B zzInJ$=V|ZpPjxkm_+K-vmX1UL79EGgp7MCwv)eho+ZR?@#;At7Rr>#da@4Pa# zI-qDZhA&DbeYRq4eVFIwGp!Z#GRY)B#}H9LBzdK=u4xqI&fG$+Rassu*gBMkpIh~M zKr4PWpPWcKJx8&7+e4 zof&gQJsF=PM4RdsgpqUgn@cGLJ)VL>rdHNUio|(KvH*i{KcuD;>acH^KYiTRQ6$?j z^@qpA`Kc=;mV$l7KCd#9MISk^ik$Jemdr9T@&H;R<07iut4H@b3C;9yLA`v(kMeOj z&C0#;x^kgiH>&jl%xa&)&C@CJchv+rG6FJ&)I~9hsa*p)(d0(>-=nA-}BG+4&+@KKN#owOn{zX(}5@@X9L4q>q`Igw@`c* z4_;U(P$(^^bQ!-<&}M*&0N;%3ILp=Fr za$;F*_9q|xH-Maa1xfxS2AefEI7CKt7+&38uQsIK6px;{(e1T0(xjzUclL3lD$Ax; z-120v%K+8ZFJwC;T7*?%bV0FvPL_0AS)XxD$;$<=k7m8(B~{BMT;@oJvyes z6v7LAfdQ{Q=R;%8ohP>VjiQ&ZvD*)Fg^o^k#q0eB(X@9yi>r88%)ySu&Nf{APPDiH$U2bc<476WJ!-hYK>iTF=d?Wgze z_YRf1E?|z1_a5w%pyyP()@?|#d4gUMB}rCsNxZ+9;}YTgVCszM|c|Agk~ zvBD;tWb|6ctc9NHWo=<0S+7gB?mD0We7ei-b6&qCyJS}F#44AWWR+_dtXzB)6?cSR zQe)^+f!y+xSMAzU{yqsYDtpHDbY|ufDHkkP!)@-h^vmk2!KmY790Q1=O)c|v)wv8` zY`P%9IRr##jhqx@wyp1i_pHk9qJ$SjN-*8Uq^(CIbJB!FAKlzb9jL@RGEk5x7R!K^ zX~H3;S8Jc7bxyus*Gw!{n^sHua6$mayfCea@2Wpjf8V-scqLq>aqb3nW$EH^rHQK5 z$%?sP|JivU@oAI$;?@a&hkdNF4b1lRGwkblIXOfAfaFS~lYW~Q-FuHj!$j!{$;mLTJ>WV<7jAU>VWF$;{5nnQgvYj% z`lTFU5?sEBzfFZQ;xQE2)lLUeeUTzflRXo1CGn5emp?!#hMzAHa3z4>`Yz0Z^>Tf_ zUQ})FUoC>bsuPIIN9gcZDxOawv~P}<{N7vjd`feys$*DTB*A>0g~2fL7B%%u`AC`4 zUEH-08U|Ae=%wlhLx2YF5e4P!Xqj2P0ZEh2#D(+%PP>k^-~oc?o~;yQYaOuL5GFnW zQ!)URU4+M4iaXeL4da0?#aEAoE2|ZH9!4fGHiotd&44u!bwCGF?9!5R$40f^^sHmQ zPUS7pX#b#-&L{CDgRYx&P!c1-Dic6z#6$m-waT4?%{~6!+733Ve|&yiVm8T)v=Z85 z)BRQa_D7uP1T}L$#=H>SL0Dx-^__PAfxKOoo)_q^wDjL}U=HA^4`~(go)GGU`IVNd^Evvl2M1Re vS(G1tdd#TgtZW$@9gRIaKjQppQC1CdVL>e`anz)H=^xpV=w@Gz_lf&2TF(EX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png deleted file mode 100644 index 6f7d6db65a7502bee916b21234d3bf093024c55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2757 zcmaJ@X;f3!8Vz6&6Ge(p1{p#qB?*v`1QH2D0@Pr_JgSt0aD_kyNWyGIWW66ru3Z*zti2+Hsc=4K>t$uV#@SC~s0MJ*rzq#Rh9fG?C#(x~wFx)k+zWf=p9 zy@yB>sPMm&3TOGl=pr!yBccfoTr3U;BazTJM{saQt&tm7OQSZ7z`1{6UK;ACCK;EEEa_! zlt?*3F2L}l!qvghJYEciPQ-a(JxD}n8o?2V^TK%$XdWJ9I^BupM8rEe(mrxMMciZo zAe4UO#{9!2eU`gYHG)KSWKTfMO95iM#UcUhy*m`%=W`)^R__Bh=JUBYewK?-Cxcn3 zf&Z$Bk4x%8TN!?;aP{QV9RY;uiy>CufKemlRuE{lF2mC!IPGp@g;Y8IYzoC+ZtF6@5ti{8#JGt^Q&Fxubmu9_|y8m^8CUkjL zu&SysvL4cHSxB;k^q~@uCm6e4K{Wr&ZH=tUkv9xiZP%iKCgy|LBGVdKG=0t9gKuB# zG{`;LI~4J5&hiPXPWWx@Z>9H3!K0Ida7QbT3ca)X=JA>ih(Y%22>F7XBwxe&DbUof z9vTNdx?9n{wTo%%dd?g=cLTXA_K^e1Ywj0z9cH-AzfpCq*GDT`WyE)|DO1h1+YEn; zDE9Az&Y15)$k)X$AyG}j)AE{Z&Nh_(FxZC1yPoH*EuPZ}&ALshJ?F>Oa6rJylt0oG z*EWJ}mZsl4y{;9vJARkzXpyA+ZZY_x&7qvmm-t4f=NT3+|IB;yT7}IBFfMU7(Z+L| zZJRo6o`1>y&dv|>l6Uj&!+vYsC#JcnBik#%dvA|ZO3FBT+Np5+OR^DgXe1_FnL|8T)Xc;oVyDm=-WvAC zQ{)7V#qQ0K-&FQ-GIOBAD*Qm-s=+%`XzSR#ywHc;!);g%=RvB*&Bi?u*H2v`OEjh^ z^KIEBH{1Ig8fkVx&Dvee>CZ9g={9%5F~@RhTK917T4V&EhFY<& z&aJwY6??DaqBdzwv#uoRLVG^5wxX*AvG_eBSov=G_ZGvg$QJ_3?gRH~-NT{}Fwe(9 zeQr!-QdKvXF52%9+kUO#Gq!cZgd_UamNWNScH8fd!o(jlKWha)YlRANI@sJ{2#qhD zaHe%aEAk6{>=xu5Gi-OmJX7?R^-=UVoY5q=vtd-yTZ%bV<=ZgU6TcbIA9{?#tvwOa?Acm)0-yU0!!GShDW`H_~sVo=jO}`u?1) zZEs_aRjnqt7h7z!_?p{mfLK36=`Ve@d9EVm(5rm6FMQo5H{Rs>VF-l*7I!CcDJX7F z<%P83=Bgj=?6EkAv@XCyy~&N6e!5Iz2hpkKmx2y6lA>Cb?cR$7%UJ7-KX_Ux(yX&- z)xD?pi&4l&vT1}C{t zfNVP$zfWnAx%B}P@Ddd`+MteJ_jLdF$+R+AgFzd{r~3I@Aw zG%1i=fUI5eJ1hUzho`5!uM8P)ld#;LUcrI2b(!#r+D#we;_h~I4g|^RM$QI}u3m}%i#}qMj(RSMVr)^4y zi<(rk>lEh{Um>#p!u$bY^u!g-KfMQ5KC-p`-sgJpL95eU<9W72kOMT?yV>m#)5i-& zR@Vg+8=Nyr+~-}da=NT_wJwgs>@2$kI>2K0mz-U&I>EjFV7q7yzsOPsQ_ck(G>ZLvUI-B+ms4|-l z{W{{p8R=iT-?!bQPxk>ITNy^odSx?v1M-`HKf4s$QbVj8qx1Qa2YXgMNw$OTj)2V6 z8jg)}M)~Vb=QgXp93rlBJoJ23I9P9)yBGW9WzUlqu(UU$grH*#m9$M{Y+$?@*7*1G zmr!Hq1~Vw!xQ;p3ocrrfMkbAH)Z*h??!UKOa0;jzxUMJ$Bj(6ltUmkE&TLtQBfm)V pFV&{VJLdJoIxcko?VjaT#-JowcIvIMoQahmONN)P=P4RH=RdWJdmR7( diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_down.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_down.png deleted file mode 100755 index 58c248a28944358b5a98c830ea5557bbd4738eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3CO-pp=5Atg^2$B>F!NeRu&Y)UiMI2<^`BAA+(n%bb5kg9TurGbH&q53D2 VUDx!5D}kyRJYD@<);T3K0RS*ZJJtXI diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_up.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_up.png deleted file mode 100755 index 7d0f38e7eba249fcf8d9cd64ff8f9dabe7ff99a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3CO-pp=5A!Sb&$B>F!NeRu&YNIDgBc8rYz)i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{JSR%D}?L4wN($ zU|?cmWMXFKVuwmIGBGf-unGz(8j6@EvI#30IR+M%OxoleoK!S%<3XSnaiGtECL#l% z0YC`}K@1s2K_!mbA8b;t&e?t|uCa0Xe5(bwr&XG{ z&bj}M4D7IWJ9h*&FHJyvn_~FGKz_?6m!}tG6dnyL{Qt z!0u{Y$<;TD`c)rUUwi(={zsWna?zHVvM=X<=KZ#2W8dD$09nB+s~b*LHFHe8Hg!E0 l!|HbeMoutyYaw~$?W>5dkDqKU{k6|tSS9MUS2Oefn*gGbtcm~t diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_on.jpg deleted file mode 100755 index 143184b8c3ae81bb85a5a9866c3dcb54235467f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 zcmex=i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{teP&cMvV29z`s zU|?isWMSch%Y)Rivaks%3K=FA3M(m_IR*xY6i=Ld_~IpYF_mPX9toh=fdFnCkipEz z!~&F&5=66!fq{{USy0IE|1Aa{pbbod%z_N|48O9zepnm2cHPWtoyzSV9|8@gv28D~ zb*xI7$Zv8h^?_*A@~YWa%1_-jP6^GbeU%@0UvqK3(lvob4pk-rMV19lEDBRN99o1L zCHJn$(3|+&wI}1~IrV@H$;mqtb|%h}jOY2dOLMV>oq5xBleg?9*@mU-O!Gb#ZOFK} z^5D^RTTjkY$re0jTqs>29d34VdFb(N=XQsyHJ9IBn$q2}O|bdxq>oE&D`b78r5gff z=T@wnwe45&v9*tX=Y$`BBxzd`kZ)SlYR>69-_59S(phym@%QPDx9)J=4pN=E=Wxp1 z`jcCt4yI1K{zp_jMQOsPeEa8W4(}{vUx_U_^mUJS+#4uRa{&d%t4$EEgX&-$ljE>Zg{kxbzSCx=7}r{4;)&g)qdXT65MKbT{@m;vbZEm r3ftr9j_j;b_rmrnHvBc4e#`gS{Z+4*+XxnC&RudZ_t$cF{r@)sxhvA+ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_off.jpg deleted file mode 100755 index 17d2efee21941c3231e839d145b656def41474e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmex=i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{JSR%D}?L4wN($ zU|?cmWMXFKVuwmIGBGf-unGz(8j3h3vI#30nFbb?OxoleoK!S%<3XSnaiGtECL#l% z0YC`}K@1s2K_^%g(l z{p8JjAKU}n0}@gi3jeNb{LKAr%hbxRFTVORGY8m}Hm=qwis|}kf8e{phs%9a1zd#-J)Og{c?8T%RiTNnLm^S%zb7{~6ex`Q%-j^t#ySt$2D&PT^VYc()~gSH6FKi3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{teP&cMvV29z`s zU|?isWMScDg~@`{va+xVDhe4U778mVn>hxD6i=Ld_~IpYF_pk%pdJaJ*MR`00Yo!1 zF|q(9d7L*+@NZq8Tv-oT0m4_Q|v~p~lKI`q8eBWbh@7@cmmG-sRVY+R{ zr!%jF+=?@;4W&b0PtJ&zn_I3w&t%?zhRancACA9HjO$;yCCajP+R2|^)t)5ve9E!E z)iHbD(V_`a_AnnYhcqh+q2cn`TtD-lVjHX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrows-up-down.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrows-up-down.png deleted file mode 100644 index a2a91ed0ed2b859190328f440dce6b58be4c9d4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^{6NgX!3HGNE-(EAq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6}fo2IEGZ*O8W8tzdbX@@}*1vwr}h_>citOVcxud@-x-M z44QIW#OGKRt0@Q0a=bQ~dxnGtgNWs9&RE5bQU@C*tzhCXV5n2h=6~xoI|OJRgQu&X J%Q~loCIA`2Gx7ic diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_community_leftDiv.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_community_leftDiv.jpg deleted file mode 100755 index a6d6f0e9a8ee062ecb1d022fb80c5ab614ecb2b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10692 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg deleted file mode 100644 index 884f8f56092b984dfdb4cdfcb71944cf83cddba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmb7EO^DP;6t3!wDB}-i74;$%nZxR0C#mjE+77m3JKeMPAv(?sj0l36q;$eeQXxq@ znE_=`58lN4{GA`70}MMdY}!PAI(*dCB zo`gkN0z3L6&oC!Rh{nlL+bs&OuHO=nZ54$vMVEDNfK1qXW_>a;yLZ%_oiq!U(7zMy zh_uM@91Tw{9TmIPD}2`7s}Dancs=tF3L`UELrHf_onBUKe~PEl37 z4P|7Ukz{t%G|p*?s%7%1Ap*CzJ%uSMInR~>=6{`FADNg7b64Z>m4 zuD2_3FgoKAX_y4G=9`3t_a$IY8}Nw{Qh$`vsb&|4CTK{53F@JN5fyF0Sy8SxPtMAU z=!iM2Gj|A&~QysEf)orPPA=H%gW_^K37o- za!JLwf=k(wJh&TYF;)gEm9o;rmZ@2Dh#NMsRvVlDA~u;D$77kx#J7(TYtW|-s`p2; zyVR1|ttxV6dx7!c?zJpotuD1Ru%$0zC02}-OhLy~G+k`e616qs%xG;1aoKA4YzN|( zU`>6pfi=%|4aN__X#l@nQf=W{(txKRWVh^VU3{w&&jWr%Pal9Bhq__@0H2%2v1Hb>=Vrm`V;a&p9|ASR5IK^{3=m#I3E{}e@ zc>Cld?#8~6$0ZLQ60XjxtDog=!XaAy^L6j3SzVeNUH|bpJ$ycW@$T3!r*^&N4j!*X zceeGOsQrCqXv2dimlsMmf4uYt{gc0N|NXMkzJ;srdQ;ab&fL_}<@vEae_dI9^7mhz e7wf^s$J*JoYvxwI+5GdF<-0zA%y-)`{_hjfRbj^f diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_images_sprite.png b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_images_sprite.png deleted file mode 100755 index 84437e799e177015edf5cda73002990290101c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmWMnX;4##7LG=7sXJ~g777Dy6%fP?6se$qfL2scY%6F$sfZv21qD=aW2*=Pu2hS! z3Mk;~Q#1;S$STN|1;|bAmU|Nj+3u3$#_)1x&N(yRk8jR=-#K%x?+M*Gd#3eF7K=4I zFu-rGx&La;@ab%GeZ!tyY;IP`{t?Mx2{Fm3QAr$@@3Dkvj(uQ!R4ivNC+gU_#CDE1 zi#1uiCwQMf2tfpC4g!L}yG<*rzHX}S-AvQ;y$`Eu`n>*bcSjJUxWVB`=QZ~{in;b?45Hxe;Y2tbvm8#n~|ib7Xw=$7}o3c27^H= zmGVYDv~<>kAV?4dtd9W z%=~f$<0JSWY({iS1QpWyF}~;{2#XQCA3}u+tpG-cb$T5PLzHfeGRP>MSqBk>48c;q zUauo44Q(_t%P0ngQ6WL8K6kyO7>uGwl2*XjAP9>{{V0U;VXU8|$L=()p!KRDNh?9B zA?e`bwzUMQX;T~kkr6^Cm&tGl872)<2ob;tJS_RrJ|0ez8USf0b;@C|jiSdOWCVi5 zASzH2B0`6E54@E~JB8xUFxE#Juuj#%4rPQ0`tr?eH?1UTIb|3d0lUTtAxV#u)EJ2J zNWEE;A)}EYXeA^apcsUrDF_ylqzZt$K?r~mVK4tZEbE3K5lN5YI7U!vl2SnEAZZ>O z9qAJ^LJ$C&$AEz`4PQk9G&8EE#N%23k@tM*Yj`Q}r6>x9;X0mA$s0!$MW6S3m%m?b z-f0MeYsy`vC$nBdg$~oXwbiDI;Ukfl?yOVXZ zmh&v@r%8)^Cr!PPu6#!W>B^dA7CN@!+=Few8*O{m0!n7YE=hS#W7vu{G#>W7a{Eqs z@{N1fg?pX9a~JYbR_}Vd(;+tY#Nhi9_3)4D3IqBgPO`<%>l}mnT`Z+thSKVTXQqUO zZ3YJRx%F~)-u~=|56t5Qc1JF-0P@^aPqHs&mbj^2SX!7uJ~lN5EY+E>I>CRbZo_o; zgmskUH|JU0sZo-U>FnKizUmj70f$+}%pb4d+PPl}X6F|;@L&J+7_&^_z~q*@ zt=U(XEH)MF_{%lFU`9?32p(OpYye&tsh9PIb;Y0Fvz&>k4L$lo6T08^V#zx>=1g{UJK~!k z_wy>9$MQLAy?vvKhm`Yzo3geq@6Kvm|Edz@;YOc7?Sq0l>@HMQa>hMXRXyT}=FrN> zPXeo&hQtidvsnKIt$D9}7JFvtH|+MhJQtnjc+J+QVvlOm4PWR%-ni51q^3g0-Ugon zt;jDiL(LppW0CM}?m?a;9zSdIzjT{=!MI)IEwW7AND$@6$s6~U&*I(*4ZoZkR^{Um zSd+re>`WOP8l zj?W3lHyS$dvOjOmU*N75yqU&HxBAVcq4lKm%c-f#H<~L}(vBBVR|ln_ z_qgGbsTqT&&RK;;HkFju6iYXW#vcbJhX2b4$wwhd7pHY|rV*%GS9tS#4^zhHbaTZpC;z{%gIrwQ=8q z`%Ks-vHwD>uyGeJQ6{JDp9f)NC&*4oX#B75#DHhoIfuW=Se{J8zE4$BH7)3{JacbZufi>$Y;;g}*kL QUo|VxKh*E}Pe(5OA50SKTmS$7 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png deleted file mode 100755 index 7cf0cb9cb5515a4bfe17663b2effab36609907d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1525 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 IM6N<$g3gw8qW}N^ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient-tab.png b/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient-tab.png deleted file mode 100644 index 5223ac3a23a22d05de1e1a61032f7003c154647d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^s!2~3)djIVQQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jijq8C978H@y*V7o)oj4v;CS!v`lqU13l=&pby_-WMs2X; zhvUj62?9|6H_V+Po~-c6`6RtIEGZ*O4?KV+f3M)n_Jk}*jSibikGRUrzhbI%TmV~ rjK|Uv96mJWSnvwBZ`#%n96MVz{j8;sGq^p)z4*}Q$iB}@}Vj5 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png b/tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png deleted file mode 100644 index 407a318114137c3f1f86a53f745d40396f747d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g!3HF2ETDSr z1<%~X^wgl##FWaylc_d9MQ)xhjv*DdVtQ`#GAM8`b6@<+UZCo3v`8g`>#xF-UlR-y zxi7FuIK6t_#5>8k(_Ve`!YjYnoUd5rcZGeJ6lS(q&o)<{k&U6afxETg_0&$Fi42~u KelF{r5}E*JqchI{ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png deleted file mode 100644 index 1b0d7f12b61a36dccaae0f4d402a9eeeb1dc3959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)L~=BtXB3KU3RM>9$R!V%?lOdhjkX&on1{#x~k!L(I Zz5zU&jKq&C0!;t_002ovPDHLkV1oI-njioG diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey_2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey_2x.png deleted file mode 100644 index 13555077ef1e8f0281b8f0a0c80d4943a6d0b40b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)f!9h> z=w9M5(-{sNcmW=)2Zr)zCg!p&CA?ONr5+ND4RLHqEt7WqJLKRfo7H|=X;+3pg9Z&6 zG-%KtmFXIw>rojikjOt#fDt7=-bQ6g0X3j@V>rqkwHqs)HtcRwvL11y*JNs*Gt9gjqmct`tfFr)+t5F4CDDl$YAw$L;v&{pK;WG~)K4uMN;<*4`e(cD(6;Gx;qNFHT z@!T=PRSv<0c(S-fy;92=i)xI;k?W(Bn69O%2pDm?WQMC*Sa7D6Rb-ZlV%$19G0a_ z)ri-3#uY)0cwI8C!Rnn5wmVnEQ_7sDzTjG5%_-Y+D&^WkOnIdSq)tN4qU+@hpDh4BD4eC zH{di4R+K|6;MVnkuUU(L6@{z?oT+_A!-|g38*sj1!((D$B{)<$b;wsv-+Xb!Iltn& z3(KBq?~vITcN*28c{9P@RptMg_FGGLhvAAVOzlZPJCNW|Yw2Ea&N)R)JMcFS*QHE1 zhwCGg4?A32U|9;8Y6hU0OewHw;7os5UDaS{JCGWo9@SuIJCIuBcUFV_+kvFMEUa|z z(+(se3oYIIv;!%vba3h3-3~;y(kXq`j&`5}-0nL@%P6*VZ*2!gYGc>XNF0}2x53WE zDJXcgGU2|lRnE8+$7r9f^p5!%d!^^a%Ma$1_}J3D0nSsB%Y%6QzFZ6Ea-VQ5T)Trm z)@wab6MK`dMi2Bxk5b+T)X(@2eYNnfy?hxoXwaZRg9e4_H)_E{9pCaf@c;k-07*qo IM6N<$g1Py3dH?_b diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png deleted file mode 100644 index ef02018a833dc7ffcd7ab274aa944b3bbbec12e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTXMsm#F#`iPkj*X3$S`Y;1W=H@ z#M9T6{T{cdpdNFz?1f1{p~Idojv*e$-%fSpYf<2F?d5bYI&8aVevV*YN4{9HN7|Z* z#6vl6g6!t+TekM_ha>jQT1Pc%jHmm#rJKY``ATh&7#KGQeA&<))jT%JE`^}?Zc^KuhRlpRqZx}Id(4J_&6y$ersgL lZPEOhnc*gX6z0E>(BCyDP)#hVy&32o22WQ%mvv4FO#pM*X(0dr diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-white_2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-white_2x.png deleted file mode 100644 index 9b9c41d19b7105de00b49a72feed6b78e2356d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmV-Q0=4~#P)(c9CUt5`Di#Z!*1P>0QjIBN-Sra&{c6P85O8|Bf8J>1$j|zaL zge9~~$In>uMMDkjPt)!N%Sar6nuafy7w3S9#;^byPAbVUJ{`i4x3fd*w7>+yCzsd& zb!%4xr7O4_Sl14lqjT6Avdq|Vku$hESQqV>VF#=sjKu!V)B)TBEW%ddvuV#HN*{2Y zu*#5q+BMeFb*!DRJU4{@YUucbiC{fN@C@9|F*h+R2XKe$aZe7*7hD8bPJ5?1fr|vo zVZk2GVM+{GPT(pEifFK$z^z$Fh1CPDx%!O*%L!auSe@XSo9;AGVLf!JVEr&dD~chV zvHv2OdoyHjx2WH0+jky}D^|a7Fuu6+3kvtBa_Y-%lDJdx_DJjWU YKV{-cQC+wj82|tP07*qoM6N<$f_wA#`v3p{ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close.png deleted file mode 100644 index 6ae33912db29f10e29717a75aba413c2a13fc895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!3HGD8EPYe6k~CayA#8@b22Z19JVBHcNd2L zAh=-f^2tCE&H|6fVg?3oVGw3ym^DWND9B#o>FdgVhmD7cRW;J{L<3N0ho_5Uh{y4_ zlY9kR40u}azgxro&NM*M;($Yn$%zg|nGiOkRn2=#W?u5th)Lkz^Vr+y=O<>HU+SG5 z!h-iYH+NWQze_H%Qv)*lGlT!HD`I1CY(5cp!g3mfvAS+LQd7g*H|$)#yT}i_T1&_WW_2_w!zU-|y#np6~UK_g`V5!G?NP zdMFgiFk~$~LiNp3J(fD!s<+A8aID%u0$E5ToPeaWg&@kG3vUB~5FR@bi~!l(jMQr& z1%=XF4KY~=i?M;sfq7WA8iN({1S&QPMe!92*qme#0k(mO5TA;9*7O?&fVfmllqbWD zA)tXt(ArEP7?~N$Q0c%A1fOO3qEBs7H4Go4TY0AcOJ$p*-GavV(vdvz!QnI;6;2rOj6aLPg#!;)YG7A3&~fEGyv92sm5 z#8*3D zC%L&TaOp57jR*3P1upk*Zs4L^^)m1Ts>pOu2<-s5K|+`Zd@Py_EuKrjqI#dW+{JUD zEy~5IlEJA*`(LA8aH;l3ef+$*D&zC&gM8J#3ss9P^SC#GLZPQa=>AOcz;w)m@IgOg z^TJ^hGr&O$u-ZFzLB8utKR!^YXJFPJs!25Kmya11YlmrC(zP7TRyU2tCN#=I>$2nV z17-iPJH&6eFg#zOlrMiX`(Ct`^K}0lbU)L&VbA$3KcN3C!A4y)>|q8y%4wUP`pFhL z(zYY4bFA^T=qc-;v}(e>n> zwcSFM6qJrg;~&_)cCo9reBvh}+ zgUa?F3Zxn?n+L8dZxEIdupFUao6u$FLll_*X~;W zoN6{OwpBjvIy)a%peUsv`pIeCW&v513PWj?&Ti84ixLg!iw<|K)1x|N{<$f33Z%Qa zgr?Y1`b0uqaZEB1b*<@$&f72A?|Qi@|2TP7JflZR8S*+>{LG^Mp{|^C+4F+_{!^HgJ*QFya?`_z>4oZirKR#94~LG+yexYy$8!&jVd;t?e5Vq*lqhFCK56`*{7j!k@PwR zrBNH?$){rd5AP3)Fg5Tm6m89@uq#Q57=2`2!;96bhWn7ys;kB=7F70tF4lX1g zi$1dI$J%k4w03g1#KTx~Ua<@A+vX}OUuxLwt(<>9xv7VwA9c53^yO^|pLrHb!qC4< z{Q3cRs7=$vA*UOx37!(A)kl?J?$qJ3w!?O#8Rxx}PR_kk@3|kUtxiX-9fh0EA0G*q z-%cCW8iE+4x&vkna(HayPLeN=%$#_f`!eE8L1?b+(iAAQX3}=~W}Ov{C-zM|hPxX= ehA)56aYGFbWyf{wY;RZp4TJ=S(oY4%fA=3iJ$;z~ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo@2x.png deleted file mode 100644 index 0f2784ddbaf8473b22ad64993f9dc32eb95486f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2497 zcmV;y2|o6TP)c{2zSmPQU8!s`|SAs=uncviRP`A|ti}F9rUR z@%$5kTY#AjxNFnc(^4Q~mpW!ta3`PlrErt04@Fn1e z9BChc*O1p*$3?+lOwSds0AB%K>(Pc=fQJEZ1Wvd}7>w{O_I;YDzXDzXd^yE6UIbnZ z{GM#P0eCML2ZIq_*fK=*ptkK@;M>5bQ(Q-mh`$N!Yug_a=Fk~~!6?ube*|4-3fX#p z2b@W99T~g+Ktv$q4Lj4;AJ6lM$3bsQmJq)NQXB5?Ey!e9r-Ys6f<7z+Q;4)@Ln(E;x08h$QozG!QWzs zEW{uKXwXu(;7>K-urY9mWH8p8u-^iH7|5nC1EtdhHXM(Y0$%`j@qY&6pb@s5Q6`sC z-h|s<$NtoxBAPn-O(2_o#lLb@*pniPc}p9f7g0#;AJ6G^vA<~ZRO8`>zKcJ_WmE80{Lv_M4}aPh%AK9R6OyR-C~oy|9lr?3dxE4O6g7t{7Wq z**;BliB}`VUF9moD7!1paDyB~YarWN_azQ>@*o(B=?}t%w5KLkBP%1}C;sizexKKB z5HBw&no_G&Dk@*blgY$e^yLuNX=ZUtv=WZ1qWI+tA6G;)KfX_Xw_?tlAk%~z+jvgj zvprcr)7nnb+K$^g4jxYf@2Blxe;);!#lEz8(J!vLSiRV?Izr4{JoF=KS&RZG>x{Y&_F&d{gtV&!U*2T2lCzrW|%o-8dOO{+&* zuR8H|J8GhwWeNTt!Tv#(LSR=sJBA4bs4C99 zrO!6N3O&XOq)(PnbFpi}Z6Zx8rnUBAkE?sTOhi3rNo!16R(eiSzjekU9(6r+@126n zhT7GPu}d$XIv!`s7ddx)fjr1N+{Z2tXaUYUJRBA@H=3dwv(M&+cMG(~<=$(g@+M)9 zJiJ;C$BrG3X;{QqL|!a74z^V-nJ0&Fjd6k>!3v=7sGZdstR|^co6V)6T;73;I;=d%9*12T_`qim#TR_Jn!#*|$AO z!p=KUWRTO2VZgFUi&+tkqN_FSol2!LBwdXGy5TJBlC;kHwvouTNMsb#Z?wg<8!_%> z5%#z|)XH35A@U+=OhL8W$}QjTL4eTrtv1XW=3-&zN8QjujY%a~@R*iuvPu=VjV;11 z${rDuR#_1;FI*lHDy&r%tCMz`Sk5gFxa?zl89e*hu>Wrnt%VMaUBbNXdRK{_{&j7z zMjvePi6LIQuJsRFmcDh-_7s(tkGay-66A$5r0XqPXDMQ!oaCZn>unIXmpHcRleVvl z=&PEc@f+|p!}ga-QXWkr>XBvO#&-oW#kAw5kQQx^&$JpI-QBvyg9w=yd4w)oaWw}( zio2Ru*zz^Pj|0CI(N{Va#dN=jdAo?d|U`>BP!S45xiIZZ_0yS`^iZn(nlz&n5^ z0#6sw8(#jIvZ(3w$DXC7?2>}?Eu5Y>aIt`J7zirL9$#s-9quDdE8DaPJ9J*?P$S_% zyam?@DtiNFz+a-Akb>%yR&p+;a;s^QODQX(YpdOGaKl5`lQ%8(8snsq>Z;@Q+6mVS znHM?+nulTqxZf(KpLyKDRoI^d6wt>d6tt``D@4>Y!afQtx6g{z1q5+#TB)H2uxK3 z#rH0DIqq!WRuR36tVqaF?+bvRyBvJiruQ=^1R2=J$`aSNqb{I&1+ix9$^!K zhji)bw99FKT_mJES>Ji43)|*R<$X`tw94jyg)ez$n^Ex0vvBYg&N&$EDI%@m8Ymn2 zhLl3my5-P3z$< z8Nc4aMZkzb(kwql0m7CGMC788XUMiazy}P+%7DBKI@2$A%9Uihr=0=%3)>l`f|{Mh z2q81y*00000 LNkvXXu0mjfyXC>& diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png deleted file mode 100755 index 08122ee12153c35fd01a73d7896db131ae40f88a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10155 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 VO#Zpxr$E;*c)I$ztaD0e0sx@iQ&<21 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png deleted file mode 100644 index d3aec4634ba81035245fe0202b103c09278d56f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmV6NdWwdc2w+KYk2n!wl%k&(G&{b8`c8o$wI4 zBhr(Bft!_qLGCI8!|w$Q&;Ne`%kuzD;&fwScsK)x7nb?NFg*2*V_*;zWnd5%U|?Xi zX1Ks!#Bd);4UZ}_ZWnw5+FSypt$|n*7-}zp^lfHMpf$3&-2O&)5Dk-0l0x z@a_IT++JWZX)yQKw;v4mr}Z;1Tzv~y!X=3(78pJP6}AJDk-Qo(wD^Dl zaEXE8`!~G#f(2_j|Nb6=1^6MD7z2=V7%2cCzyK64a`YLMMCt$l002ovPDHLkV1l50 B((eEO diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png deleted file mode 100644 index ec85e4bf699c4af5764598b8df4ea39f905f3fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmV+`0o4A9P)QXsYg zVnqf5;KIBrMi9*c)ocu;4p+r`a9ZmsF_g^Ng;(?STX*1W7AW0SpXkjQXsZwAJb(8Y zr)EhZUKBnPls0fOQez+oz+51dF?lmqn>FPn7%~HF8S*Bs#%cf)AsaxNLEz7iujCm( z2nR}%BtPOyI}f;!zg@^=445XQniJ7ng=;@rKFhI^>qyT^b0{~a$H>RyXABF$`002ovPDHLkV1i|ba})po diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png deleted file mode 100644 index 332d06690a0585aef6ab2b026aebb5b04bccb811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)T?Ph*QXsYg zVnqf5pg!d?BZy`JYBUDYhrO+9I8|h97!Kbl#;ft%*{g6i3lMkt**0<-st17uKK*!v zQzIXT915Qahz&FpoEgXgAe)8uTuaAmBR1o zfPTiI8Dt{}Tz|5j;n3A~xPo-|Q-qxjb1Fz9D=QNNJ0}xCKf_hrdASix+i6!4r4dE* z$$On(T2m$v?00NxrgO)nvFdymSVR5KEmFgyN zmg#B^&l0}s=<5ZmPTVk%*%#as{(0x-@P|2K8h4+j-#(GKLXPEG&99Ff%hT-mEJf^u zr(vIlK=3f$6*?e zDtH~P@i5ucOi(zK&e6qa(E9S-@&~gn^8WktQM^un!R@wpT5)w|Yc6&qa-8`8A}1yM xp(#VGp;>Q;H@nV{OO~E&3eOFK7#tcH8B(l0J2yC&YzwjU5r z0AfWX`TIaz2E=QyX^xJLW?(_$Pc||#k`opdh6}uV_fGNb*|XDd82|!IKpX@bKY7IR5qP7XwgS6e#~64c`M|Z?G4Dc$%rHsi=&M3Sp0f^;Du=o)WSAtV3rP&!EzyNFxPioIfJjVb4002ov JPDHLkV1gj{cccIS diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png b/tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png deleted file mode 100644 index 01f971cd38d63b2b99e3ffd0254deffe10dc31f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmeAS@N?(olHy`uVBq!ia0vp^20$#q!3HGv{H?nKq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfglRhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb;hUJ8nFkWk z1ncniwerj>E=kNwPW5!LRRWr!mzkMjWohhcXldl)=IG+$Vrb}U=xAhMZfW3XU~Xz| zryA&s6|>+A0%^TZ}9m z4IE9(%p6^eEU>!;qBjMnTU=amxEaktaqCTZAm1Scp47bQH|^Dpy5u}!H_6)yqzgqdaSJ6Zy^obM#a=8bJo8P^4g#~om)$h?*x~}l3u3$Cog_GuKOSUpQn}&#ZMD;qM<1g-1Zw_!b%Q&62NsKZrbX{CI;!FY0`h zd%lmOabd07@*-m){=Vbe0`@mEK78~$W_f$1objr2N>d}XzLi)QRutGYKX2JJ>y~C> z)z_t8{TkvQfBbM#(cUi2wh3pewAl4< w>@M?e+mlRs*5CM#S$=zx9r0I9l#74gU1yF%PW2a80o};p>FVdQ&MBb@0OToMSO5S3 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/Android_Dev_Lab_l.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/Android_Dev_Lab_l.png deleted file mode 100644 index 3c04f244267bef55abe56ef4ee28533c8f8d1164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16512 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png deleted file mode 100644 index 82ce918b38157e27e391504d7d52890cdb9ebcbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15892 zcmV+vKI_4WP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW0vHz|3t40n!TTmhHvloPW z+y4~7fM~uZW#x*`Vhwp5&mV>aj%Q%idC{C%pMzJMLuJUep0)OZZ*TiFw@5@R$uw0} zA`ua{;````7Z7UzIo59oBuenIPNwDS@8TAZb0?tErR^n_z3qRZ<(ZIRunkB_p*S4* z-Pr_k|A3VQYA@9FLw>^HcYYp8Y(!Gy2pssf98ob@r{fUXoIdu7VSC%BQZMQF`-Re| zrB9>sm$&v~$WhNg!%_IDM*QHxA^)IS8Da+U!3|LyZzL&cKwAf52mUN0Hx8w0%Tag^_|8UsVL-hbLa~2Xir-d8Th$q~ zR-THcK8uz7C+)d+a@G2$~y`~yy1B9TAlaO~unv@|@;%F&NAj)a792vyuj&{{+)RRn<=A_&X>y@3la z0>Q_#a`@b12kzBb_O?$)GiYqqMBOlof$THxVSMLcEPQ+$1|~NiG!>ttPd%2V)Rzh5 z{(M;qRYjRx|4;1N=XKwG9?~Jh2Ne8n%q)sE#h1_d9hO4>9IG(==V(o$am^kj7C|Ka z53*$=bFcGvd)udv8*Hc1xg^MZ?g6bB0K>?!>;l2};J5j$XH$6nqibvg7o30-|hM`ccFViTV(=!fu!eBhuWY zxC;H~IGpi^Xo78!O4oiw=p-je?-pqKb(!}GUB|PfEglhJ4_P|4H9iEP%X}1cPmZw% z*cMf^6ZReW%}54pXR8wsQzG_OHwy5JQ9p{twt(8{dIossj8Cnizh(lpEDzD@vs8TN_mVwIPp#;9TtiqouwRvFuz;IN>@LFzM7EQZ^{U{Z7fE@h)O zsCcyaLW|{4iBDD1V^xdI`XQx!C?7^MbsFCG!iN9 zBumwX1{vSaXBjrWW#d~9Tfbsx>#wjI6+ftuD%UShIkqqsm6Avdj%v-N;KX@&oWTH_ z`_6yx&9BjVQad&v>qqDf2M`wBO~fJ+a@QJ;he0R;;|#Rnf8OF(?ovk(<3Y@gR!EuM{U;Hk%QY3{d?)U13oHUp6j zcy1mN3T@h*I@(>c&IX>UPO@SBVEj2B&|X%6 z-n0-aKVOso&EnMBwUYDa{Y`tGYn;_*5SVZ)sq=5tc6mWb6TR|=GZCb4)&m@C9Qu8p+&lp1L^8UynO{6r0h^VKEN(9UMk+fJ~ zsfR5N)}^oU`^OvWuEs&}tvESLj);A3es$qP3$hq6YY|Cne|)d~jZ0@%9D+Z-9a2GT zr-k-!9H2KpN=b~JB9^VhnJ%rlLC($gxL9loec>?61J7cqCC+9Y0Ui@p>XoyWfcCHIhu#qh1X&F*u#i7_~}^ z2(V1E5)CZQD6+zr;qS_;o~6jWql9w0RArG)^MbKxL|iF9Fuf z7}+LyGb1B~ihNTEl~hCR)5WDZd`yYeZWsIivG=gVj{Ys6?C<0l*N{3dkHB4W(0 zOENd^GpEXDcCF8Y>#CP<+qx?5^lP}?ujVe@$ZZi+9oRI!odh0&QETQ*vfJvp(T}sr zkJFZDV0v4e&&``hF0R@JwL&3w;i5#qSZc5gYN2W=DpemcpstEZ?e+X5S<5rp#LRo= zleLLhurS71$wMdB9>FWGO=SRkXwh}OTo)S`8>1Ger5LNGg;TsLZcNs*Ak~0+4QQ%? zkCOHLWc@sHF=};PWdBKG!C-+}t@WIls$*U%jwTv-t+|@-HB@mJMy-x(SB()6qd27T z?MyEs&{WUai8z1t8t_xKT-tT>C05|nZQ#IEoHxBV>c{a?jd&VI|5nEHL@S$^-K6|! zd1VQ=F0JD?TE$eanqO-LcioOo4-^3Nn(q@~?m8Slt3NA}E<9QAEt+m{I z@4aMUj0GyXj4Xq(VlkXuxhOlh4yd451&ZUk*aocWN&wfjZ+MS>Q(xhyEO2wWJ{KZn zuiRB(Je?lQEX3+LHWmx>o%8hN#$fkPGSqEZ4egOkR;vC`wxT{51K zVjF{HT!KZ@36zx)OygXwH_Dj2yoPUfjJtF?0b{UYF`PG-G0>~$-(CZLDo!%dl;%b& zHn5EQmabgOw1!IV^s2bst74jN{bST>so~^goPVVnXiZl0 z)7nx7ZMFMvB|7b@ov@?tZSCJ4{z_uHrWA^DcGUr8Q_M%BHA$zlR7Q${?!N^1d zC4L;$dRqMkJgq}pvHw!bom$P^UM0WQkGbo56bH;U=hG`IP+1<938^Hnm!D_byy8Rk zqbnJH>u{#NIf%9`T#mY>sZ)2EGTPDiHu}q$fj>F~@KVjR1*6ySr}1&awCEvGltQC^D2%_W##UaA78~P- zL}l_^_CIboi^So(sXETK-Zd8w9O5n@FDfx3R)>#eE3Y%V2)5ms_Zu2=upJ0G{qKuK zrK@Rv;Sj9;s|#wXo46n$yrPip*;pwXS~z;7hxjR4ET3WD8mmk1rKDiHuh}87NHlB{ z78^x={}~3SX389VZfb|CvIgmeE9TIer^p3|kk}@`_K^P~uNKAjYyw{MCq67h0X2*p zNBg8nFl0Y{_gAm5e|a7ErP|3JFr4?B&XTX-B2gDB5)msB+0Fv)VGK$nB38*Htgve& z*(g)?w^-pR3)*TpJnH~`v1}h>nMhbQ9QLd7&^_t{$`ZjBu&61apbLGW6K9apf)anm zzO=0==OSNuT0GDc36JB(`Xnu%tRIci#~(7XuV)Gid_qRHyGM6-&7V&e8gsOap?(8v zygELvS;ziqLQ5;woh)(>iZffWW5Vyd@ZdSN0SZQfNDTp?3ngV7XxIak{xofnXUn^o;y?ZXrhL1E5=eb7q2&2^!A`A z``A&xWbW(Ayd}q=8C|LCm`ID-3)YYmE5J$B@@T4_WF?WR3hurVogRRYy(5*u*-r36 zC)>N=0!=ipljD+OcuqVP&G{!6mWNF{3PlUWmV8p3thR^Z%%<=Nk<5#9d!a1b4E@+{ zNKKcPf1yLWSUB?Oh^*dB3`x(s>_)65ll2ApZU2*JpVR!{B?oY4TaC0u!g^nsD-?u! z%!<=6&O{Q7i;`T~OyIGwJm3pqua&d2N9l{PnArR5gQbw@x_j?P#NN^$x9zZ%4t#DO zuUq@|GQVy0bIHlszKE-+2oidOL{$vAYzE)>`WL}s=o|a!$$u*-oTw#5`4-@Hr!qL( z;`s|zoE1_0@^ZB9-|U|?fH!=fxz1qyN_n|h2BVokpj2O&uc{D{<3f1fO-RtvVcnUn0e_DeOBj2Pw@=Xzi_hjmE7kvJx zcji8E8o&Q}r8GG|FMWg%UeCll!Hr^v)o3V+M8oRuS19#rbR6dDmfS**TWm zVTO#waC+BQ+Ck*91B(wTlosdm#9hj~Wq8Jt_a71zL6J2Hv$xAA{u-iOMgiw?)# z!Wy;><}_#qU>Kd?zG`d zInqOqbg)M!NexnhLB+$zR~xHU&}t#Lx{b@<%Vyxa@9BL@x{)Z-{a^D`KMKDIc535>Fn3G{Xky)i8}n{>d4Boy73VV-bR>wC4#Mtk9#B?= z7KfGNo8&U9nHy_na(dYf=A%g~B^Z61WKTKCw%^nFordp`oTH`a1dG(+iha0Xjq=cJ z#ZpKTAh)rNwzW#)g8&0RjOicVEkIK}vVx2d;q~Zlvo&`J0R4ftodwa4(qG8(&Lr7guB%E^sqbBwvQ5Z*#{}_K<6M>o`c$GtOYDZ$V zAAl`mz#2l9GnlNw!;m2jqy`G?+k%d$0Kb~{jm`M4FQYN`E-i~2&auk%xrds=QL&>@ z7j;A4{`biEwPWvFM!&QFtmlpYb|%!=3g;pBhwuNq^1xr6ISa=Qxme>nf^MWxoCiu6 z*pK~BhYQssg@=ciwo~mbN|4cLrXq4Su;uqHL(oW2IE7JvTZKOmTb04a%dh*a=kF(EHCWDkF!6f@{Y)@;;$v>0hM#pMBH z2YT5yT3Et140-Z*v(CNfklg1^(rGg;iOk@M9r1(P1`-%Ch8OE^Cps*jS%~tk&@6v@w0W(<75A5q` zRHa|=S!T$Q6!mXsb>Sd}UXh~h9AU^g?Tl$Hey zN#Cm~Ls8Sah1wU+LI|tzhYSmjhqyS|o(aNyI6gWu$R5c46K*OW!={`3)z{EI3t7i3f_Pqz$Q> z7R`(zMpPRc7VJRu>;SMc`XhclJP+W}OBv+1}HZ=D;oOI;Z znS9zfM)!N3cD+qMJMLAGfJD?YCW4_%Fs@P@$($U^6WlPNuuGJ1#v73qT*yq?)Az)*59wYCz@hJvO5N6Exnb*JcVagTe)=Jk7sH?^H# zqyt)w)ioRjHI|Z&xoR(=dHE?EpALTP{ai|m2%y*}bJcjRa^K^L@^=35VI?zH9&17b zH}@5>xzA|J5T9+$Ev62x3BJnrhOFhT>+85HRmE+JYLI#F|D5^DT8S+>9M=SQmx6C~ zh)bX}7syc>yfv!{+<2!$HonA)OhT!7K^2KEu&cNikk?K{8`-KM$@Lg-pYL! z%|d1Fvfp6moQ*Fn*bV3C=kph*_q@&9t_VQfqQ}e{N#80){m!`R|Hj-f%BEp&ITL}C z^*8H=PX6%NAg#{|fguC%-}ykUJ1Ju-7L1V{K`3^Wi2i)l2eh|8_46g19xj?;nTYW_ zclf5$HTMb5Yj}(WhpCp%e|Cx`q27VYoiM>Ot~-!1!xy8$!8rPcwjOjDHy+b!@?6b22piA5MR*iD`nb|f}DLcV_%eI8&AlOi%&O6EYi=1(iX62xB|QW z!zn95KQ0QnKkoQVvnwN8kEZ`)V_BgTq;NCos&?SO?6TX7Jo?s12KnCt3#`T)7%;I# zLsPvDWv{1weG-}#MZJdC<E{!W&2 zt$dU0j_=z;d`%Wxue|kqsI9Bw-HXMo49cB_XM?6@>G{XLM0vU0tA2sXVW z5qvGi4{4}(eeG@AY=&Z;1pX2Flf@SH<385#eaW2yDy|WckZW~kdKD4TYs%lJO&Xx) z92PEgs^r>3d;#5&5cDCIbIG&{_LGqGBE6hU_yD%;O(`{Lt9Vf=^TNT#|7-x4^BB*lN0XiC2UNA zC3$5IGV}y2RZ@*lb>(cICedp%Vj0c)5k86Pag+O&@leCAlBH*Z1HznW2s=cy*O9)e zsuC4jw8V}`#1c&>*x%_(g-ArKh)SSj(kHVlpus4G;zgtQCB^Eu(0;4U7<<3*Ttd04 z6zBD9u~&THl4?DSvVpds`K=x=1HLISeoysOMWF=v{)ixsOu$!!?2`PKYLVVM2v*psPrVOhajR| zjxbN1==u#ca$>R;N!H0OD~Hhpc5^~%2F&FHLZ9#*u<&JnHYFc~xv(0>9dOx+Zw-!I zKwY;xyQZn-S1udFjs@|yGXew-U$PJ7L?VEpH;h4xV=1|P)Of~ZL0jNCkO2DMor`&w z5Q|0bab)pOT6OFFVWyus2WWNoruZ~2}V&3tJqgbOvcw1<~>r+369O( z>N9Xxs)z&AK@gP_H|S`>QMsSWPb9L^hv@P|w74ZKx0l0+W5!twSY))0;%;y!Y3?!g zAW|%AUeCzjNe+qqN546GwZ37LV)c9O56S#w|KSJW=YUkb1)A*3+WEv0i(u{R3AJgi z()-CS9!X9*(Mxh=29%2S+)i-Q46KP1q*`nySU#s~lKTK#{m#lvJKcN>+p_qQ8Z-=& z$Rx4-#ED}9qG2D@Nf3A;8#!a2kI5=d-|CjNM2ToYBTBB_!m9W%pH$2G(Hj`ud*4dB zHMa%GZ3AncrT@*fV|FpI$bJnrO)3!)E$(#1QoIYrB|*w6GoK;$q#A zwRCg>_P7qKC}G#eC1ugF$U}lTIRr!tZSD4;n1C@{bst)CX-+$XWK0f0Z{&u)OsIn_ zeUJn+wZ=2Spr3vPA2g6#MXg}^R4gYx0)bY*v-@c4ktu+F>5jkppXE%_=fSK@%>J&q zj5rfs|Hd)c8y|wAfQ{orwpCL~kh~sPlH8DGH<7~M01~i3Wzrt7tON1!3uDEM2I+1u6}Oa~nLE3K`T66|Mto5tT$ z_;$X;&T2xdfdTx_5Q~qIHnekD_l8)Ez|8q6C9x!%U!Dfo zKcXlVcEu8jSP~H{BIzT_J6*Nd0?OJofrn479MnWMo-6+Dt0>PvS*;}C?AdZt6)8l z8uCds$@hBsWD%so^7c`RQ+-~H!Rn>JAsvchuL#DVS|)ZDfmK3|Qz^Hv`cOuNqu1tV zff0&Ba$%|15iw~q^G<2{3bn0jkyK?rZF!YZ6c_Bc(=r5C6C{%>ku@Vl)z=u-9?9(- zHX5Q(M=*G_$I^8J2GbDMAy#)>PJs#G3}Nfg;RGEkiIo)tiAG&8nJlC|t^Q00XG!M@>p8*5X+`=GO@B$kT(I{W zg!S+%8@{+~Iye5`Xt7Vp&(~zJn#{4(js*<5-!2jPZr z%@);vyM>^Fi^bx#ZP;s9lUj8mef7_M(ul>PUzIT8h`yR>jf#++vw+s;kmpM!0IrN@UqqIH-s@XtqJ559!a-zw$USAHWud+jXw+yNqDNknZC zvHE7JOdr!}p}I~WnOe2qXxOnhWylEpAFiK4%ezBm@goB>3dDb03^S&{60j|zCs^6M zHlvhO=lHr^;%agFp(i2xL2gdDM}Gpj*M7FQx!wrz5J``v{3)q=vo0$Q{pXtMfQ~eb*Hr)!e2q{>80%05~+BMKJx;sePFD- zn_?vT@7zNbd|t-yDQ8iD5hJ8Hswvue3Ge+O^33H2{Z9}}D~<1a?0b|!95VVwZ*-2b z6*EMyUcVI2Sw-9Z7cLxtNXSUe{sD`0jVocDvSJ4!VMj99;2D?U`_Q!FsU(Bf2qOvw9M|Oa zTx3?oyj2WN}+OPJ}Q>7CSBA?bcF{?jLsZSnP9nV>PQCKIG8y`ezTy-O2 zoxZ{0I6~T|^`Po{S|DD?Rj*jpFU!*eL>M;xl+Sx)H~3g*1ImOxia!cmG{92u!Fxj) za9AGM19wDUs;V(jPbpT`zJ3?hh_Mg9$F&8hO$>W?BPo(jyCi~GciqLnfJ1S@;ueKu zNL^1u>UBr33drwI+zqw3Z8#PFY?j{lbKMo`y<<;$rndy^o5ulIDi{ ztpOChxr_nROL0QszFAd25yVo@;3YPL@JbK*tacV@>-k&_#usBmC%-=rhHh*NFjF^6 zc+tbqZ{1FAGBHX~zWO8{&!YdqownS*woEeDcI?L>+j1CvVONoBE5k$w;uRGY^t!ec zG=F@@tZFWJqE0Rh73!usGJPrh@st08FiPSbVM12caeT&2n>czl?oD~9gorpCeB4jgB+feKs3AO8G*R{Ks|a*E zj$O=fyTXXw%;7DY#nnDp8*(`J!q@*I1Bi$a=^5Yzkz%8YF)AuTQ^j{f{~l-4B9BT$ zth5b(muxbcB=9~sgXpA|z5^x_5o@eo8}-PhAD_JuAQ~21G-`Ego)(a(*fal97MWjJ z(Aw0_UmvQH(+x%>Bf##egHNie(Wuxe!lX%9Tut0|M`eS ztcZvu3yT~WaUOz&=xe1fL{+gD3PC@(`ph%K(NM2_MhYr46!Vnzbl6xuvU&J7~vu+ z<=xUs`c{a^C9xDu_1{16pNFi=&ceO6&Wtqzri@({`XL~p5lBR_3tv{h<`g-BkN92l z0xmoDR$a-mdw2XUW73}cSLz%BfeVqKN3ee0#Ob6yrhXB437aDeuKQ6m*r!2;%QZ$! z^@(RAAIaJKKEH||#P6ASmbf7y4=K(=cDFBTdMS=X3=2b8y4y7+RjZC$iz~TJ*Yc(B zp)seg*%k}ZrN4tbcGT-jHlGHNQ-}$I;_9%VgP$@j|+0{Jw_aJTl;!L_L0@hAS~@xuLDcxZRTM-PFXG~fPwW5$`o%)uMDRX6gJ)u@WuP95+bAsZF`bi%mYM|nmY@Zwcm z4p^nr38;&$7%Qe^_jm!Nt5@v?VhP!^xnx)sQ!8q?t8O`0j3pGZca$WYj#Qy8w&L3S z>D(*a4_T>=XnPG2P%GqOPcJ24VmR8%>SiGqd-`+&MsYx`L?c%x<7mZe+^T4=(xHY3 z*~I1yX5KPo-ZJGM<)6tEuo6{eBX?g>%`LiyZ~hKdix9R!t)7e*HZOAO60&*hqLU7F zc~zUyWF7YqQwKHaehpTs5=iIQ?m6y_!O_g~u1m0}l)&^-0&WPqt&Z!xIL+}jj7ReW zJzY~fkuun|QMIf1wOh^Yx{6CK-xa0f_ujW>*;FcL^ruuSE#)MidyE;o%VaB9Oo-1Rq*MKJDlr~rM1%q0I)JExf z*)~+rkZn+_ZUYCV>WO*{Xrhv93~Cv(X`%P5FXJ$K)ij>@NO^kctLkFYMQTXneOgU5 zw`(cqjt1TAey{LdS`<)Jc;ws@u6vo6Qcb8|&l_zuoQqM%q$?d;z2N|4N-1KDg;5Jv z?L;-lx7Tues*wi2o~3>ROH*;~$JO1=Su9HHtmzBIs%N^&?&j1etQoXqHr+Cl^2n-0ll__Qble)3R`=Oc3+{z47LD?4}^j zcNWQaj_X<(xjS7g?25RDoSu@1Skv|8r_X)*>~o*`h<`d3`MFs<@w2!rO-+~c5%oJt z1@=S<{BTJ$_a{v0;;6eGJxSmM2AdWPC1J{#97`c-9}K z4$E}O38!J99p@e&7|ZFmU_>#YzQHx;S`nfabHBClo~JGf-|;qca5yRGFweVQ-n+KZ zOk$ho2)5;y*;J9C@MV0x#N;$xC)c*0FKg`}Z#fpgLQnSImyr3lYE;I|A8z% z9aK|>308CG>y=DRt>YJ0q6H2`MS-2>Fh8EU@4atuS4$0^A4mN-ueH|mox1fL;G#B0 zEmQ?pZDX)vnccHvm(Sd{*7Eo_su-K>&|`L%vvjQqvyQv3tl=K5Cs+I+*M%1rIy*TmqMrI}AT-RL37ve3PP+QB9RaG2XTftGS8z^Y6<#Ml% zTl_e$dvP=sXJxXU8)7rb4k`AQwdcDPy+YWOnV>4dlVx+6w_JJl!-ZOalV3`JF7t+v z{W>=uT+g)DDsGRz#}CG#z2_`j=^-I(j9O3qo3AJ9S?t%NejVyHu+fV%Gf~GisX9L2 zQo%`0wHy_%WPEishga2;-&oI?Ej4^OS;zHWJ%8~VD9=2b^yAD;)bVxHwKMp$F8dQB ziGHr0hsStD*vW>yf)#SI;@l>J#O{F&p-)kV@ z$4U8d5`F`1UL#3u#M3yMszZ};7Bp5-SXz{p$x+u{sbqKPf;}0FA?9GPn6vnLo?7Me z>?-9RGq^|zpl(pp;-_Rv3s|UH>$&~6RotQLFbj4`_2!J|WDL&L%gCzP$jPaCo=Y^L zUK$qa*U{p|Y4_`C^&4pQ>uL4lB(;u2q5;p#z^$#3l7I<>7rU2O(z};k%`JbeWSUlBUZMa;Q47)^v7|R%}^n&g|#WjPaXnOHHz4!>8URJ~W<;t^*t}`(lL%Q#- zmQG?ZrvsLi+_k)hsanA=e`+*s;p*$6bJKdM7}L>@ilUZ2N58gO&i87#A=SvAyn1H& zbJ_=RdYpRJrf}#U1-O+Gx|$LkL}>*Jdk%Be?Ke5??;Zq6ga(> zJbHL_sVRv-p}l~DfrrxX9UpIuMf){pXz`!QBPK+%xz=UD=(4ScLRxHK#J8%m$>YquO%Wu zIr`EDg1`L`U3-eTXkwe`Qny7Sg$~7c$p(4lI{}h^OyO59W99KLni=bj390U&(r@Rn zgs!E`g^n~53Sx_>udY~A4#L{E5nVq3nLbfd9r2Ny&82I3?~d>^6}A`2Eh6F)vcmJ5 z9DaX3eE-aq&~G$$+d}s*N1PbGN<|AuZK>OI#Z86WQ6OYLXVc`@qZ8w$zg#+TqNaLX z+omVUD?|j82qMHXdf3bO7(+3|>0ET1=`@)PC>?Owto*rHs_M(Ev;K{K@StA4?)MQR zk`Bq)O*%_@cXEUIN?i-Ebtg{4}Ive@@Rh8VK8@aXlJ$`Xwf#Tr0wlQgkUY{0BN7=eArQxFq$^X#%#+_w+wI=3AzU{m0r%d$2yZT3d) z)*7ZRd6lmY!NeSladxQ>qYI8V$0@xQ^*f(;PaBJSb{&t8{?hI<9e0Vd>1ZK|>fF++ z|D^DcLm+oQa^~MHzdDA{2r;8eZ4(Y_UwGJN} z(Wdfr6s?z~tUf(~S8g%js64KCC5zc3aiefyOnM)amKp12ThrF%-ue`6GQrq70-^cc z0aCU6CGbxmkZhzneyWxqzihL)?O=?C65q&LZw+sM(;~GfMe5KaIP!&mm?uY2T&BA; zlDG?wH^-^=I*e)4qJ3=*1m7h0OE=1HG9Pc#ZXYGAQ>KRek+FY#tCi$q7WU9F1YRkV zXD8je|3u5|RM_usjX~WekfPU+!oF6q+lA3P=w|d%`*brhZqt5Z8||xY{NqmJxP{B) znZwE7l!#C=g-UjJWNo(*yv8Ku?c(7K%__x9o{9!*Xx(tS`TEoEM(EwScw@j&s1x<7 z<~JF9vWH!+$Y)MqpEu{puu=bYnBLZ=;1wJ&=8_ zKbLD~zsJ)bDf2#D!ILXOstB%Y7ZnlMSsz0u{$d4Afx$u5sw8rA6}QGKnW`JObtavi1Te2Lpt$%KIdnh#TBQK`=dYb<9W5buqMH?tDob6M-I@mpU82+ z-X%`fEv;eQnYI5Fk%q-I^ zR0FT@(-GC&_PdSTqLob3joiMzj9>f=U7y=wf+iNrICA^8XpO-#F`QV&`q*JboWxhY z$$7tdiCOQr@$3p^&WAtdYBTWOWn^Ju&aT^(kj;-5q^)(UxN}@3zlzl`Ro8HLq6+iD zVs84JsuI(T^LlzwU|V7NJA-dGgdHepzweGauR zy?fK)m3qfb@tz#D+>w&a|#`+IoKJr!J852jsHP{{N!iDQou|65^)w z&g6)LYDw0)7pSgp>DpHb;uN5%2x65*kqMasL&a=c5124Pf~oRrj~PlL z-zIQU7T&mbNVV2oddd+LOc=x<>lsE2n}yW9!>e^0wYVU)EzMgyO}M>|L&!*&+F6Dq zCSv!)j6IM6MK<0|2@ZaU=s8T9Za*~Wc{2=^a z_%vT^(T^sy;a!@SKS0yVuTcM-jr~?!AE@2-#wS+hvoC3X+E#c!T)uqtK!%?7|HYk8 zYg~00g`f9#Zzh?^Okz5dG*c&7GqIAS5Nm?}K%5W}v70JnblWak!B3!@+~7(O3NGBb z5rm8&h;*ei72O%7Vz9MLu{BManP!st)0sPS@BO{5+}V|we24?*J?HQ~Np$Ie!OSm9 z`801WOmkxN3Mu~+8u9BoGF78MB#$Trj!Z0%yf-(b@6x>5U*-Lw93$^qz17d;+e z27Gk?LEKh(?TpKtbB0sXKar?>qjOJP2eeqil#1BHfq#m~s!HJ%G3$j*12bV&K77YA zbV0EB6ehbxv;PMk2H(@(4lsXKh;Foq{%X<<8ekJ(V#H!fl#Y;m4<~mYddIH@b_);`y_PnSVl*_am=Ho~I>oQfc<6-{BZBC)U7TYH$OX8k8^lipM9uAl zv(1IVFmFulGno0B8)IMSML|SErDQ~lsHi=xZ!-T`EV8=pviYg93@opy$|_$`&b-KE z#${;IC3xP)p4!Jb*(Mqfh|>3nf&;>!4(g-YBh(<S&D@w^GNyUBhf$dwlQ@GRYbf zV=b1R2zX|~XKJ{vxe1?DWD(5AS!Cf`wacX{{ zCYbDE$Gb4zAhHkW`VAy(6NyEGI?`%rt=Fu qz!pnLsR*8jcwjxxV?_@S9sf5aEK6bGW{5lh0000F9LhnuyQHN{TBM|r{Kn^f zuJ6zL{y1k{XJ2RUbynQ#Uh71^(p193eu@nM0G^7nybe(Tu>P)u-ui6 z-T?p($-fH)$j+q%0BkJ>Ik{J_?A<)w-r2jk)2qnI(Yt%N**ZAe0D$iz?6sZl>pgPG ztJQO`T2yeVnwt(8CcO?gHkdT&IXeRup=uOE;R2a<7msF>l~b^p&!v#nPqT~U4aiC&cKSlvC%P}2Z(juGM@08CtfM>{I~1px8~ z-VQP``2t~C0IA}sfy4<%72z&B(oEzikf{R-_7)A!-2eGTp)j#&VPSh~YhJY%{KjI~ zAmG8S+q~1@-uZ8!#NE}!&-M-G5I)loCD8TH?(gU7MKt5dSYejSI|)j64LFZ?w9|~e zDwa)#?4+C8#E^LT?6@<&BF1QN@{2x}sYmOLHO^Z!sWm~M#!(8zKj~$usTJC#8Y`ip zXXnNh0GzhCb^Tz&L<_bLT_5*(JeIy!DqsPEZB>#X0AME1%%wYAD?NY-0P+PP>@~8~ z=UtSXo#-@OPnNrI?%oQ8fth=|!GvIJ>tGs>w=XI_fY~BOYiQZua{rK_73kEqk4SOH z=jzsL#Fum@xUs;@>tbsS!2-z+Vv<-eEJmSN#uzfiV^U;=Uo&(mgNS39>4&07wHeit z1eJMpVsz>Clxa^TJy1m>O%$7x#0LSs4|fr*O1!Bd2yMw9xOH+(rNU3c6hGliSbOqj zCy*E9On7{IDj6qKxH|#2Cs<67k{jUZ{6&eu-|Ni7)!zgDD#D4CVm0!Wu>u#~|FlNG z0<9(b!fO1h4~RHKp%Y68Q?5Epdz@uC0?JRB zQic|-oe&tJshsp2gW+4St)4CZE$S_X(>K^KOBu+Q>(?7>I>U~tRNI8x0^8^|nS8Q( zpR;vVN(*&~1QU$Gm4)>>)!LDzBm!R9qNAbYDr!ZQpVFqE+EdtHIaL4hY$jSsqtnco zFqj(IQ~H(h3+>zo7cYV=bRf!(jVgx{gVK)5hq5|Ty_jk`mTEwkN0@g%b2p11%T3Ra zy`KF&S<*0enrhnfG-`Hk-LmrH^3`%2y)(TL-Gnl;*8x?Edi<|9%dmc=!}ZExul8S4 zzqTtAFO4j>D|OSA{t{?(AB}F*qu!$>_eHzltNCVYKRu2WRjn^4gA*P+!Yf3u_xab+ zh4mRmm=4>KAhH=Ht^jy4^lCGvDNIc+#~6LzVq}w zZac$q!tr_j&3clN7rhR!*E!Qlb`*9^??TU_Vx!eQjBsU0aph3=uMDOOxOLU zE?_yeIo*e)OVvk0M-E4k%lY30@?Yc`@xPns8I=2}y*(+7lb^=pv{n(QC8rf)SGUW= zZN;5rP&rrAP~=m7WpPX)bt&bMzbUmTA-u}BYGnRhxU*rfVMMFPEzdlBO)iM((fZNv zaS|vAWtKVa3~vB&?HMHoA9CX!**9CgZNByE{CK+<MJ>7dF0vN^e%joVr{&k$w`S2a5;lU zO1<50yB%BakqVn|#6zEJYy&r48pe=QZDPd}qnFtA;NoAp#%y!!7zjHX1KW<#=wZ=x zcpk^-;rH6%r9|P}E#(a8ThVv3ya_I*7Uy} zUR)|Hac7LOEwzN!%Qb!OkZ5eRDH$3Y6_?iiqI<4;qbqbYwNhs>ckMcPMD5>tDR3~e z^rrRdUTUa)Ne@L&W5#yI=2qpl_DZ@cx_s|C{no{_Qqu);IDj^Vc8|e?Uq9FMV}^E0 zQdcKomSbNDf8bgB1MJx6C7uwT-pAbj4JLPa=+@p9*4h;vp4g&yoPWhS#`H69T02^9 zM{xFOwqnlf?Ate%Z<@8fOHI!HUiG_ET6#v1D$^r_x|*J^Cdk-+V^nb326O5rhfSG-kx%;dDu^AxePO=8e!kXxg!*S|gN@>%wwJ^s8#ptbd$K8Wqn{_od|*ApeTDO4#bk07+n zvpXyPmrKZglio^MM*{%-SO6e66afA{BIO$`XW)3V<*%o{L27E+Ex-JAFWnwF1nV60v0m11eq%~iAHU!vQsS=f3-wfkyCFEV_k zr<)7+`#IM^fL&IP_jIH+oIJVGC~APB#pCO1+?=qZe!g1zNQ)#?JYwe%&@{cQa9!lw z#VO+uqGB+}^0A#&{A)f-TSDMX+uHHfs{ih2jxZ*uS^9>g5kxOT4nnn-Eoktg;0oDq zE_PrDF{u;h>CD(Yd5eqS#eD&Hs8No?3H;!B12Jt~z_SZ4Vc&}|W}b9$5oQN8C( z6xalzLB|(W{VFflXLjF^xabWNasbwD4sA8hM{v42;Ep~LKNSBMvq^xs$rJG=kH+fh zF-Z!AJ{TC88FE+19s>x54QP9Qhlq|NlkXD>@lk+WDMWTS3;Rz z(u>RdUDn}h_>r)97CYh@bo51EIBtI;h%A;mIjm3#SmfL@T zW{V{Ze_|c!?%2S-{WdV9R3Bafb^%pWZdOV?U|}X6?*CAfdFO*vyDj1h*FpcM+jyY@ zG4(k4o&ve5fSIP6^RpWju_s;^UFK3Z&geV3oqigC9z-uAlzs_MxDl-jGv>3QFBWrb zSP7gt?)cBkxP6~O|6)XrTk0%nx70l(nGQY$5M^cNlekH{P)O;=9WvQ<9QvH9SsbS> z)j!ui@VCgY&4GpUI=vT>yy>f7U84@hPn3P6j0x9)?<)#a|2vo|m3dvqfqw%n zZVL5pxLbCGkQsH4LiATK_ZZ- zA?q1J&bS1bUzo4jH~peLt}xhc(|1yN@wV7~@2QM8AD_mEmnk+QRLxADx=%%g5Jdb) ztdP`7?>^lSe4t)fMvYE|&JcE^SG?*3p;2-q=A%O9ANb7K;Kg@*ME30TN2h54mn8^| z-B^AerB&W8AC)MajbHH(C%seltV-pon;5ooI)&{E0myOEVFL}}pq*!lqxL|{uhjt? z>d}nOeHo+lw3}W*8KJ^x*pTcDn`a>Ypk_$1^~-tx!YnBH=py^7c+f@0D>8*2j`<3@ zsiA2wa+GRaDyYzz-79i5Bwqdtn_x~%(BKD|V9sBwPISVcIv2Znmo@M%=JgJDTrCW` zI^}(osG)4uKD_u(h%`?IrrJ()>m+UtWspIyoZyz z>J1a!&YY9ZD;g}?F+(|e*CPA zvn)$r{3m5F(uRMgbY{RHEO4z#-Qlhk8;qkI!lzKo`15H;jEVzib`&IZjVr4hBrmx? z?v#n$)sJ-fE%Y7=WS0aVn6RA;5A7UsXBTJ9e=nKR+~7w2zf3^->cCe|B~<`>wkbU( z2kW=%v}5FEqYmVqR1&Nu%tfl9_g${2HQ2(-X2BqzUB$Pfx#Yr+#KG>e{x8Uy=~f*6 z1%VUAysq1*0;hGymHDrGevXW_KOLR67%5Qg8!c$bDuBJ0qNr#=qEl0;&0jni`SG%n zg5Y02|11Q0B^1?9O0-c19=r53?uf?I-g*6Sb-7Nn9I~B0Q#o7~MaM$I5t_FfE5}m( zu8r25dbWM_KKB2I8Z+@p2w+5r6v*fh(ubRLR zA2~(+^Sjw>gXI!sfr#DnwK`uK0VuvpKsC9B9&;iVlA4p2`={;7My(I86H*`&|AxB) z1@RhLT+4Kav1VIxpJ9EdF<()$DcN(F5O-T`&H5-KtEA_(0w|@|RV0Vi8nNWR!S=dA zS=giEY$?yztP($?ArVv1CRLCnRnR76#u_Is=8t!lCVKBO@YRKy;mbZc?|A$> zX>ij&;1Pne;^GLCd3K5=6m5@h%T2t|OM4f5I-39-0#*EME*cp|T-umhA=p z5zT)R`5$8bW!wL_@qc@R9Hd(8vrZhRL|eDy2>UxcWCOMEvGdn2A^47o=;DCAnp%@_4QFsBVsAk7-!x zsAdJFey{udB|&W*Ay{I3;27sJ_7fXp*x;L~CVB`5dsV`)iwnVdary<4gFkEethZcEL7qLOGr!Ln{xk%g&GB}u+P5EER1NN{ z7Ud>w$1jfVrav9cDB9Su%MUskF~57inB-;JFcatnfkYE-h`4%riRO=livjhA-xlpW z$Dsod$2vc_SH0ego^K_*9B|Ir)plx7} zuJe+p$a_uSK1%6;(-S|7%KRSom~Q=|yRDRggJ{wCX($e_z4HdtOq+ax!7A6y0k=8^ zF&O`RDD|haH>5n$yx4)3M(Ru=A-7Y%h{jHy6A8JSU%#%OoG^Mc6;;an50BO|V;KZp zvVBqFgfB?2RP**1s)30xNEuQ`*?(9kL(f8!X8eSo3*Gi8zVFpA=dLJfuhAJEY_9Ux zfs>f=_VYrE8hnM|l>LH#vgZ}?J&SzvVjpn#sSVR@mc}}L@zuN)>6*AR5LOe89iK+B z@%uRHCi*te|A@I%16g=dp-g{6b~SwR z^dlu%#oN$43lliIqmY&jl%cT&@+U+Ft-tW&mWLXVHohM-Z5`a9?U!Dg@)u~S_~YGO zvXo0S?&i(Lh7Mtv4#eumPvW(owuH8nP)OMt8D*_O;&TM8o`$n_#P2chTQV?`xR7Lh z9%%@|+q|hA?$NR0={8n!imI>*pej+ z>$pXR>FcLM^ERPU55`$l`*bu?4V_nM= zslshy-?XWU+K+Mb3VVtskY&tuprIP1WMuY>LI)Yoh4=E6`d13%TF90X{)scf7(Z|K z3Z5{3Px16)#zDV2(i++hdXt-&8fL6o8?JO4SZg?Ee0;ol;u{+uJ8|Ff-FIpSn&JmF z7Mze!_yk=E-Q;}h2Z5xEzh-5()xFOsMQYCahK%ezR|&4 z=|&};;scCXrSX+-6y+`HndVWcsRuXKhl%k@OSc3wO1aOm)HSo`JAP05uiH>P%~e~C zJ`+n`4_aH#J{66Z#N?3#G{9FwywWLW0*9m~1RN+Jw7|ncv4?&8`B=)0#>b5?X|yr@ynK zr2ALzvS;PKmuAq;#ZPl6lNhOVJIkByoAxEpA_NbmCb5~)J47%xm%7q4H2Rjajgon` zlWRCuyw%>159eHFg~pM5x};t5vv`@$wj!ys)_Er3*Dht?^8KtpM@}du$%wUWT6>dz zzxn8IAInE{(95f%F>f9}o*MDb+@Cf@Aatmo*mSIi^nIls#<;oUl8QEo<2N@Os{}Z;A#)|5PWk@bM32Srg zNSCX&+G*s81C#fMI`UpOD)uAUdWC>{EdoMGb5o}*KrU(PH4yf%L zY@f4VQ5#v>2Rzu|5h%W?>C?5Sj+P zzYe8`Yvrl=QqVgjpDqh4s=wkmP+NrN`M6&@tCn8;MgPH@6J-#rm{hZ}vT(Uws$1vp ze$8oXU$&;Vw6b6uvcJogQe;#rJk%U5Fsk5zeeI2qwIl){?##*sfVoCgp1^jkB9uFDb{F~VLG(6VQub-;_323U9I?$KwMi0*FLodzA8Or=qHK3C{mrUJw>TjJGvp>8YQTaI@gS%B(!5OJ}5dSCj7ds!KHPM-Y$2dcd;C3%%faEKJ z$vh=Cj(3xE#3BxBn93-gKQ#QpXb+aCM{X67?zuw$u|}9oG@=3_!sDbs-Z_QW<0UyQ zU^<86u>(gr-sJ(!P44~c^)FV?wm=w~$5?d;&#@@Bm?2w%U(H?VhSt_l9jCu>ZYA!f z!tZnXQ%VZMPF``OYnU{1*0JL`Hi=l&J65;Da!)KnRlKqONfd(4Gux z!jwNoxlvgoay=B&yAc0IHQbK>Hs$}O*@yi{3;=)1(;8fR+K2qd1*j-!%2$Eke)xY5 C0cKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0009cNkl9zGjoSfBhvH>u04*gJ4%ud9v0X#W} zUX>JM4p{2jz2DCMlLhL798_Hn9<)=hcc)+2ki`vi!Gde*zNGl%Vf?#B?n;a-=^4aI`bO=t>fg``s7hyiS`O0RZ=|PJZK#! z3jp5`w)C}OH_^SDmNF#Q_!2I6qU5K`;vFF4YmWK4u@<(^- zSiJwTt?c({rG=LY+8)0mt>BZ-sbeu$W;y469UxSdJ9BXt(K<_T-3i30r zb=Ng|jMHsRqogQ$6rZbZasZ&DFgi}E;x?THZ9$qEahp1z>c(}^-Yu)_9S-w;xhKvj zDHgUXxURS<8YRV|tEIy?{Ecv!Gn{++6$=|XsS!ulLDxauJm}10$F?=%ivMjr7B1_u z>xeEDXBW!^J34IJbqp%p#NXw%&a&Qf;!K+}`yNgSx32{ROAL`cO3e0bm7xQz_MPQWdxEvb|f^ z0Z_L`(Pl4$rGub@P-6p}CQHZ2wmb8HAkXg!bc(m7SMxwKJH7eRVHXds(DIyJ#i(+H z!*^h=sz%pGpI93`c0S6N9=*Biq*KQZ=4iP0(F^^T9PPpw-%TrbCUS#Rk3X47dq>a| yK@&7VQv^-W6hRX-K~n@x&=f%vG(l4h=+6LY2{7<9p|Gw100006x8lVuxE6PcI}|S(+~r+9{J*~WWwY6v zY_dCd=A1J#H$q845*_6O3KSF+y0ny-3a}prHajE);MJH!&lcE0JF7^FKvhqEIs^_7 zjAbRofIaYd5N-DdcE}D=+Rji=sJQPNG*o6b5ip48A}ueDxC;9Phu||zZ^#=kMC>B2 z)}h9d`j|w4d|-@4%6ow$1fvgSS)2l1S-*R(Ywz~myt}K0;=&5@ zkF%h!TX|W(ed(II^2y7JSCQen=*O+N?~wc(LH$_>IDq{@o$CPw3}TYzdTc}Y<0|q6 zcx*=?##d;VZoL`&8UjAZ+;w6rDhW?u4HqIE@!V_z&J;?VC$K7+$pM=RSB=(!> z?kT9KL7EnZ!?ZpL{(3i_716-1ggT8h(0ZbSmNxQ82{+?}653zJSYR&Ocjh37jTlqb|fOaz#*=lRSa z(oAk5yY%fj&eQ(hn^MA0$m)^3_dt>q>7Ew5H(ZQ-53TH4yIgeQ-ba|V6%Pao?irFZ z5BdbsvEpg5-NLC3$Ukh>#6EBw`#kjgAqbvH7nqu5cKwE2UL`5A@jMv3B0S^Yi;+UC#%xBo zM$8hVK9I}a|BHEx8p&`*i*|E-J~1fDh9>)kw7{B_W9;$FEQydyjrYSrc9vfa?igh# zeJdw_@nL@X3oDCnro+$F<0HF+!LZFzp0&S3MxUkl0`!#2s@f7heiRgE^vL)GZdCdOrj=fl7T`J6!wQ# zF$eLl$aAKZG+ml+HnjSI4xz@zNB6Cs+;s_NZ4Z-YY>hD<+R_VUy z8K&QveF40LcT0ubELDzCo{CGH8H-HAkwlg4Af8o}6LCoL*6DIB4hg;-DLgZMk}5+A z)8YCWbv%N8_pvRGBII0-0h6?wxD06lr{L{|J9hfTxyEZ)tK<`4o1si z<6vV6h`d@+u^kZQa*tjlbk3=72vs^6KomYI6h^Y$7O0dj2G`>vSk$s>dA* z{z#9Lclo)SX*b>AP!0!qPIAREmVw$}Rv286@_MEJ>B|G+QMvtg-_>i#=r>sWK%Sy; za&d%^xSutV8Ecf?L~HULCBfwmxX^}6v*e$Js=4#vk<3|fDZ}oV1zceQT&Sege?@%K zu4j!gggcKQo!JimdvffFD3FvxnUzJZQ@-T?Sr_A@AWC!Cw> zK~~3FP^NO5N5_~BBLLHd!rDrcI7{u}e(riyZdV{s|HBEd5x_gfis+(^ zt^U?Gp?erOAN+obW;XlDp^Ql?5c_%DxalDB6D%iF5x_SZCDImyWoQetI(IDlgQ;v> zP1$mGktP-f`{Vy~qvbzSCylALF0bK1FwXXY8&3xu62$A6d^rA}uyPERK+vnz%rfQB z)LCKUnHxF2V{c$OA`akC29wdR(RF3GQW<^JLH)p`AE5hBe!H|)$Pw%r_Nc*y<_b)p zkmX70XX*vdx%~Om9+R4>&>KiZJ=Hl<=4|gIaKosY;SBept`_!Tc!XY+jRGy^%l7z^ zqGjyH=)+3f<=Ni~;J#w7AY-WU(rjIC)n#H!2>!yFy6_%ApY>F=Hbhx;N`(JdY25d(tsSN_^_sYQ9+80 zTja&z>$BY%>aL}((>MUdrqmH(x|Y@2lWR*TA1Gvr`TR2p{T+T3cE^7bT$ba}j}XGV z!6$5b)ge0;OU=&Q#>E}Yk(xMg+_XF_#nHig%qmL8I3x`aT(8Xz|E%Sytl0Vz*gZRC z$X%wE+vxVi?5x;>MWi+1*;{66@D+FLiaw{oV`aehrqagV=;a8W-p=}-)H;4!AyaV- zuuozVo7_~kB$6PsKYq&Z4>laS1K~N73h|RA@vOmyAy|Ha$=Zpk)Fb;P=TE%=;zWiWmPYiWJxrE{Mg@!O`bpjz$K>9J`aW-9y_!G?u+%9AA~M3DUxz_ z0d}~57%3%|d(9rnFe2aLwxE7&@w;?y$v0xSNf3uawWN3;skkR~2G}HiHySa!)YhV& z#;KLPQJri06X3rSG5`c@pNM_&_P?!p?sFIDSK}#4NBq7Ya5W(Pw30BIcItD8@?9-S zYTa^vr>(wG?83D~H-3wwl~$vJlv_f>b<|cr{g7j@FZM>F`jsXjS^Iv`5E- zCNXJeSiZU|`N!}?zWT#k%-ke_9BC&naCrXi6!H%!4*aX(-5Ip#8)go+ATd@BHW}v= zjUjDD8S&cG$ZrgO{$H2Z(1Z=)K_F2ot_i^XT|F2l>Q>(aPxV@(#C+1R_s99dCD>hfum7_C*E+2A|!;KjGO}Ij? z;-+r4mDv@WTz~CH)?#`lRvzp5dARpHoU$#o2dV)}1Qc6FjQcSR^7J2%*dPR*r6<6R_gVevl8|K_z1(`BGxeM#MThNB1Z= z$srA2SuTBa*>D0U=2&Mf5H5~Np)Oc?O^*;Z_~54*wAmghDq#1^u&?Lga~O3j zYmz+ZkWASBtAJs^;W!Z_XT4ACksXv_UcxA@zb798qnv3x_CtM=B88aJpgD3OGmg2` z3i?15axshRKQ-*Z1c(i&5YZbXA2duZf^mX;HYJTO>h7$?#sujlfvc3W9ASsEc#S{R zp#DP1qQL$tKCb0iNZSq%u=^mbFMAXVesxhx>@}S?H<_BVl`8Bq8$rYgi`)5b1}`Lu z+xLY&;GHF{-xcZ?=acaw7sl1sSyY&5|)$VOlOOh|JE^_bB=G zWV-}7)TZiYLh^a$q#%bMV)ND&dDsAlM|v#3cnX4-Pc${%CIV(6Lod?BEgB%Serrwa z%f%V4d-8|`UpcuOHX!-=TT@h^1g1n)b{JBsxATtFxBXL7a=1nB(TC^wOK%=6@fKf~ zohxK(7qa9Pchywg_u}(GQsR+P1mi0~ppept{juBw_a|8<+=4EAtRFuaMA* zW6NmzuYkOCI>OVg4|7z@om8J7LAx!_9%VXMsrc!noHIj$IP-ng38YidZ=B+$dbiqi z>NS=*YAjfBsQDvNBN3|#<6@3*ai*2>)%wZLWZtN&{?Ki~1$+@|-yzJJvS2JI)m)bb~U0IReV7a*bB9D&*CYR@Uvx#4j@qhEc2^_=GXj5U3(nFjj z+gvwAoUKC7`na_cdD@FXc{1}R+H4|6(0s}Wa{Ilk!TwfgO6dYASoGO~rS#mflwr%S zy}Bod3R*dDz%@UH4;>zoK>Z!bL2PL#jFIH5c7pz@L1I2+;(qloWaymj!4Pj5X1_bH zEqnFx)JFrmvas>C(C5BQ&{+GKO)Wf2+Jbs`xTEmkE)?m$Jbss(>jL9IrF%EE#QS?R zJq6J(D!S7AaXW@eaPeRh&zRQtvrfA%sUbc(rMf1h=01!RB34UB32|aJ5%j+!+U)YJ z$Ev<`3>e0{apJV1CmtuC>A1UYd@w(DJu{u0Dtv3YS`f0mcK|H!bD4i|uQ4siDs&0B z3QiRY&28ATJLEEdcd5e731!|^mG#%+5A*5d!N zH6zxL@NHDO@9h07tMEVh*S#RxY`WHhf5_iSkFs_tj;KD}RyTXNJPB05zBNu%;Nz-( zm{MrtM8+g#Orn#LpGRN&usM8r{6>wQ;8rxAAcM&Ya!&mz*z4--7oIu#5$gBzBd=xT zh72WNnjB|w@qC3aGui|xJ#XEAB^K?y;iCt|)zV-+@_b4*6eCbgHAlaAfN@hGTJIl; zw!#W)3D<`EleS`w@Moqb$WDqcgqy2CVlK2?SnN9;X!aRzBKsK%MN8>`zn;%@oW>6_W0EgyQsJ%`1s(NQGH9|Kvw&Y&zHg^$i-xa zCh~m)5)4AsuLUw97C_=P_Di*n`bHyl{E6|Q$rd+RneLUaA9ZqPB>7qX7njh;ycPUY zC0Logu0WlvX|22WCd0zOKTGrWrq#{fmx4xVU8H%lNcaO@1A)QH;?U?V!I^HS67OQ) zN6orYy7y>Lq9}&>{s3L-$u!u41aG`HQr^C8Rnx(51^T@3};@F(G%pP(2ohhaJD2}Bv+$}EehN-+{mfNJ3Yx+$E;rYp# zXmw9n<|ofamQGD=ZzpZ$Rv589$9=U;5&d0rT2W^djQY8HJwo;x3p*PS%oh--FpD}e z>F8u*2ArGHfU@2k-=fW|_6=zr4wsQulZdk^`=%@O&q=8^7~M>js|XxCvNmzWk`f#( zU!*^k-`_`^Kw8#Ojpu^AMm)7sMx49k+2cBixX3UoK#D$kXO(^9ngU()Jo;ZI>A*4x zRDuKQ;?x7&1jiU41QSf5y&uB~FzdK4XnDVmrn9X)rf`;2n)a4;1^pT4eCj+@P|P^N zHR%Vm#_0E)CQ0#o8J;c5oO6kOvuS;1cX2I_>EkyP$0s6cW+428L0?2(_zj_O=B* z2e%=S%vHZuJSN%KC7a?_nBO@hSNb*G9W_(p=ILnZ4s|jrvnn$%Dk%k@W#z3ek_#%k zO#%_*lwa#Spjxq}Jy}{o(1u@|*!EBDfP9!T9H$cnIyAo zI47q9XFTphi3HXb_#is?Ezsc`O$OJ2I}jF1E58R@C1AO56&V6e6zR7Bfpmh`umsGHT&=Y=!B3C^`N@6 zxG5=nJo%TpEmyKjQ}g-tLOY0qyBg9G3h6B5pN#Uqv9z^ldK`zb-D>xNir^3|&(2{G z8-ZqA2uz#6z`FHeNODb*B3M^~@C+vO*P_Dpk~Yb9#Tp3MU=%k5si)rNT&QINq6Jmz zh{l57n||Smxsg%gsDco?<^gGX)Ki1Ht$}}Xk+Wuhgaq+^@~l~(uGvHyHO@w7pm6oB zu9;4GP>k&|+d);v%dEg|IGL@%G=r0GkBEL&5(mLro!ysU(jB(Q-{DiIU^KK|m6yst z%0c@5+zOe7^H)_-y8tk!xPDb|Jmf(4Er9nhjrM(pIZ|vjtZu#=hcsgHOKL&_TqPkq zd_ASz&*bZp2+Ur%<82lA#Q#~|Q@6Q09U8VzEMg(#&@r@*s-*fvYLOwzq!dPM&0K_9 zNt6l2XKqoCIYjr0M~o#NQprrMCwqvBQE=3L*Tp1F`#o2V!8MJeo6kK^j0l;dN_Jd} zs*&nz(CGGHL4~hWnJ%BLNV$yEK2uI_Z|(U0CwUxqr`N)0T!w@7>y?~6KW!xq57k$? zQ6-E46KeGG#ewGx_O`T24^R23hnu`V1cfoKtZeFIe#9G&^&b{?lX|p02 z8C2KDD!%yh-A)8e;FEqcwY-d8<97FksG_#?o6Rvx0!QqLcJZW3y%~6l+U@V^DAZWu|T3K0Tuzaj6@r?M5b+vCX=k=HLou z`q?(uFVgbs#OXDwYY3#T4ukF+kGvWrDG_GKeVypE&2Lj=XS7hsjBsFbK81F4>Nx=xZbPX zdp)pC%ToS7I_+y#kN6LwS1s_$L=g!cv#!eNjcyZsIAZ)5EDp_BI{E|D z!gT+SC=QzHz}NhX-c47FkJsWVdI?sX73)*+4cM|eH03?1WH#w4R-LV8MudXPg6wBJ zng@w38qY;mD%J=M4orR=r~L#|N;M;#Pdie^V$Qb%>M|Fv1P`Q;S$pLYdVK4TA;ZpB zlDLR}IK1;44D>!M;3flz=?Yos7zUnVRpm!txVdg7m>gZ_^HU81c99BLuR`FZR&Z(Nt zdDPakKg6I!v7Y6jzuAtgDN4Y7pj%trnf#?cJH20?O5o1(SR0#+W}$V1iw4Ko%`=@@*N;D00^{cBGVpSH z-~i8dWi~nDkXN->=F_Wqf@- zIks<~Y&GkX(Yz_#xRm@DGj?k*~rlOBknRRVGbcfd#N9hlTUje?p=4>P{?EXZvzpHMsMdyl6+i58g7+RnK z4yD2~m%C!xJuxr%!{#&=+`r@+V=74dt6s z6lK=*bW4b_A2ru=jl}WO+cBO_^gNY4*ukBK#=Z;5T~BP~b_D0scq~&|~AD=2w#7~7)RyN{}YAQ{&U?gfNi{pE;+6;o342E9=!qG_eE7*T3r&CL6psM{k zn?fPE4F+KuY|qq|EH&T`8gT}`Hs9{Cxk&YJ&&Rs<)~RpVbCgoehx@snm#wa29v3wN zr%vNTR3#4$_8mrIkU9-4FWH!kRY?U=JqjiSy)F z$Hoy3+i+OKCtDBODm3#a5}EHTXja8k@}~7aY&1(GL(j2 zwir>XA6ndRV615)P-0DnB*CXcWWDllf64?epqw7$=_wl5Qjsh&kuqPH*8QT`5e{1j zy999i)otjaStiV~Avk7Kqnl~Vc)cRpgtoF|p>!M5v%EbAU;JawVVN{itMXg`Z6<^X9o}7H;6h z;ttaAip(%h@g~4+WohhR@9ZI7vakgyXiD{gaa0ob&kKtl=hekFt^Rv8ry2I%UE!zg z8%`&JjZkRL_gE!6`!@q^i3F+MH#BA2`_Im4TLrO!ZpFE%@~i()|K!+zRdXKG@ecI< z_iL}~v)9jOk=NTOdrMShl5Tpm+n*k9CS~lah8|IAwCD($vG&BKg*OgW zmd&Q>RY!)9_?tDpm36$in~IO1EjI_o1dN)q=?9UTF?T4k_1%7;!(h&n&wN5rbyHTN zAIiB8wRj`N(ADryP#8lGqm^ohbb$TXX##3as+qu5Gx5!42m3nJ>iaZXY1rzF;23AB zd{Q$E| zXw5F~L+=78b(}iALd4RBUa-ji%lUFHAb+M}WSvr;8>De`X1FG7+Yyk_R-jPMip=Qy z-@hk!t+7&HWZSy56`aF?=Cey4aS_gvd1RUDe;I&WMNOdp!zT^viAq{AojQiiXiJ-Zl6CsTuf$Ye%a9fRFF)3Ta+ zpoT(@viKzLrtyJY)beQHY!qnJp=rbJZ_~ ziRmJd2SXYTiSHl7mK!QQ(NP!g0)@mBLG6D1jNly-m)%di$Dj z-N&Y;HYJ$`^mS3!5Z8kFVjLbXT$|n_tu9jDt^-YJRE$d?q8i5w&nEL3)E zm9v-WeT+-iwC+n8qbo&7T3E){OacJ33b(+gT3>O^%p=}UnCJllZA5PYMa1ikY>uVJ_F;+D^izN9y*qOWC@ z!8Yx;z3u0pe|E)q-n<<3z*sh~*O$)^?j$asu4BJCeqL@Fl@|8jziIX~K7bAhh#h!v z?l14_07HlrPq>9xIpi(8*F1f979carpWWM{->>ZRvJ0;yE=5OujiR?5(4rf_<;D0} zZ}a|+?&*>H2v6X5X9c0d=27VLUMv^L&8I)#ldyTdp|&bF?T%#UI7?6%C>8@Kwgcoh zH8yQI?{9(Bib%FNf=lCSg2@*pfZBc6o072X)EhGVWfOMTEcM2n{%0{+Z$mq#BRk9Z zU6U^YR{uwe_YAq=`%aAVtqV0bKrfEEumF<)6L8tM%$m1|Z~ucd5V*^>6tbV8CP)pUCOU*0#ScUOk6HN;=+Ao1$%qi0 zK_C-tcnNLx0IE4{-iRK6T4;3k`ml>K+zA-YSvq^6v?eQ4!zYFlW73|I`Zr0mfu;YNuXPFomwUYZ)KBo zZRm_q&!mp|C}TZ5n=IYC9f#h^+QAqx3o_--xHg;e%~7|r;n;4YHi+qY;-io674;=@ z06KQlDRAvvH48y;4<2HAvmM_`jdw!t7_BPYR}hiEDeHFLzILu7Z_8u9*TeSF>9Ut3 z7q|Qp%fMG_T$|l`v)?q?Uc4tX@tQa#WIbibF+*+^fbTh z18&7aO!#M#6BTd|46Vdxird~4|JN46a98uU0x+&w9}2_UN%4#CBvObZXBBM+;}ZBr zoiY&!SB26atJ5f*kA-XPUeK%VBy$$-^bx!z=GG?3g}9!Ag}*W)eDqcnX#N*4Nq9B?wtbw zNTCoFjYZdv^fr0LQb`bHrBeZ=bbI%pP;vRd-GrEm%KhlmC6S)@QjI|C-rM&E{%v{X z*b~M^%$G3|dnbC9UH~!9M_&cdNhd{;#GQ=b^L+k+Y)LIDjEwOK>z)k0-mTZgzx(+L z!_@Tr>XffM>X?CG{Sv<)G}GyEVWDreGr#!e!IM66*ZHD-ZQ);U52}Tf1yYsE-APy} z${`$!R{I+mYO@`!ZThUHuA|By07ZxbU5e>)ER!-z9)jloP$k|`AvUZhnIJ9*=zkCdwPQU4a6wVitc?w_bb=JW?ek+ofL4?Fk85I zYNd(vb2&`3|M5bVZVg9(ScS;ilFk_Vh0a2a!C!D=LQl+v4)qYthLV+>lA-QM!NX1E z)6xV+)rT?^N0W|J50hlz2{_HUEHeN7E3IqF{HSY<91i1i(zob%eUHQ+j(BgM zXLI1}&fwhn+CxovHFUSWZ-Y1B%#>*e(US%9=y7Y#-K?pp+5?b1eS{T-ve@*iD%XWa z7VyjOu2OWuu^QnycMNvcq#7ht8$?DxTJ@e60IeFJdD8|!)_r*OyLpiiVJAWA%!W3v z%lLH?9eVVNd^Ai3l{A66Mp=jw~y{1 zq*P^6P+PtNlVWQ_MQJEq0Tm^7sR~i6FunrIHAR$)@|CaPQ?9^Y!E6|>CGAQ`AcE!` zpTw55TJ6p=e>*#S@&5jfh8k+w^1`Z@(L(cJS=hmLl{3;;p^O90;5zmFSMYv^F6 zbw|vsj+i|WAbK?d@hMUpz#PDT9Wfg=!_m+|fJ`Rz3u)no$|DQFyd!3dW+)mughqa; zi7))OQm@g>4OQwRcf_pMfcPLZ?uePO&uj~KNE-bsfR=JO0`LYP*!Y9Mpsk5vAA^lQ z2yEeYB~NVp!Njn?4giOKec1SeSovEf@%PxmZIOEi0N%zQM0p3B+UNqfWaAeB_yu64 zYm<%Hm2xSjHd6bw$9K1>&tDQS8Pc448-Eag0y2QR24e>^v%3I1!~5qZ!oe194B%0M zC+)r*{S2tDV`8pw;}2Gb{cQt?7;`!~-pvI@i#-<*08Ifb`<`V1&28a60GJjWvo4K& z0N_VL8%4jnoAI2(`ab0XKmxhZ#yd$HGHnMYky{B`u?Q7uBfvIlueNiA-O9okz>O{3 z9~w;)0C?40=l=r04S+cJH+62_z76H_-#|Omi#8?Uq0>1mM`hz0Lr$Y-6d6 zy==n)@S=yzW$zqd*0wn&J4+4zGI2XY#dOPvW>AxRL&q$$(JZ9>AY4d5vO zG@RZN+VO1R_5duXjUIr9GQT_Foq;V}kA36N7VhK5A4IhQGEbtQb=WLGm7yK~n4_jX zE8XV-@Mx`lQIeJ}Oa$1zE!;Q8m_z8-+)Zdn?OC>P+Z%t7CFpLYAE&vmN^Lx0n)pXn z>|o;$Cbn>;`Rv%j9d7)=L(Z}HY~kL~J8#o~T=sn1!tDe2$;@rCevx)QHa(Jrw&>s0o(!X! z*CPY7dUd34@3A?{2h1HYyTWem^H>y6AFoobf2B1}(*Vl~yJfJh>PjeP^`l0U zWC11GQwX$*0E&Fhh@QX9sTtc0RL_U_ZfZ-;$Af(KoPhjE6O&(E)R$az#0(tFWO_O{ zasbT01kDmQ7a8VtQa~q+abi^!_%T{auKJJLwv?l&?7Sra{d@_37wuReLG>9~-SDLlh zKW1P?zv@c2ws5Z$pY+%M-pMd+7X12Ey;w{g}&ZgV!qTNyA^0lb&d5{Ozjw&b47uo`oy<}zVV@42JS1H z3ct3ZWs~Ul#vcUi=O~3D=)KY}ZjqmUHb4#%0tRJMkN-j?iH_m(-7yVWHjtN$`5i_3 zKi6QMW&XIu89c|BRU!PU0CT{2>&g_!LB_|)Yqc(8lVDamRlFymUf4mIf|ytK;jsb+ z3K;|4C}#Dl1`O`8{*6sC+ejNr(0j+yw0kHgM+f8>9}^s=3SdXdwXmii9Hs;=svy;* zdpj_Q=gh>cDs6Pd80hNAZbTAI*&NRe;t31J?^B!(y)yHYHPFgZu=H%<{#1P6KjVgN zCZD|4KVnAOz6#0#(xcX|__!(CVvPERA|+2Z&b#L~P0JPp$tcJD6BJ0j zB!FG)(a%6KJDJx~&>F7+?=xn5e7Dha8-LITi({n$Inrq9-mwBZH8OV(V#c4a#;B7( z4FC3TOf#*M%x5b@#b4I+`z!+iRh1dvY9Q3mv4PwpfUf9gijNED9$ohc@O3R}ukIVJ z63Af#AAja=GS?OV z7ubJa^RfEASHE?^t}LzMoXA`|_?WctTtVN%1a0q>Jn22MijvkvBW#zR0_E>5Y}fg_ z%HO3`HO(lnE|*L^3aq5{Yl3ag!Bi=RmxCfm*ml952YOR{3A-&0uxFwdBr!|taW1;~6$URjj1F{4bW{ltW7fRA;l zFR@!mP=UW-u>sk~FW40q=-I;UYj!U6Y~e2V(BdKTrSV1?v5Y9?Z+!f}vhQ&7o6wEjLX|c5&ob%?p$o9y1VMYwB$m;>&XZ z@*UOag4D{$k<^eu!P>u9fl`XuPNs32Os713?GgARgM#aPZ)-OtMj`<*&ZweUM+yz% zJbCC1yEC!oIp(p&6iL6TJos|~vZZPrDw_AOC!_pG@QusT#&^uD$}{=Wtk-U3Bn`h} zv4o_10_Hj_PHfJBa&rgzENZS%zfIktR@)**sc|Sn)rf6?oG|Y zLp^7rjV88mZ?QYK*wk+f8-EbU4fr{pGxn*e{S}SfhkD*w-%@c(Xvj@&mOwMKh5Nh0Gnq%&9&Osy9R4QD z2)9vT)tK4r>mc417`b3~4#sp`3G~)7~>B{>e(131}X#P~j20|7gsdb0UW(<%yW!CxHK9clNT( zggTTNEu)-y&pMV-ZtZ!$w8p7DgiIAOU~9{$VF_8%jxn~SajV>!_aFr)3AG?&9=l2P z!^#G7(BSxBw93IGF$^j~DkRsBTefhAntNrtK_2s$5={c?+igw9IZ#}ON-QVr)|ST^ zLPhpvQPKhQsX#6>WwD_Q=8^}#88V5C4EJo|KBZ+=aps^1s(fyq1ZG>fmMz=`X=DDL zygnju{9|O(=v8qYs?`1~=FX&zRZK$VB`cYvDA50<;8D~OGZ|8Es2YlqGrCF9QK>n* zWS)iO&%R;1lc|l}E}u|pOk22Lu}uw}+rquW=iN`TeC~CTj3e?9AMiPkeP2plGlhPQ zH%TKq>ZTGV^)wn;EYG>^ZSz-g0GeaJf|e=@r$5?mz9sUbau z0KO-!Lz{pZz;~M9h$g#7rreMiC`fotR+5w^@R&U#*IB>qnKn4BAig3sThdQEkDy_F zOY)Q38SiQ3oTCVu0{7IP?}V|C-qB_A;$TVojCm;iEw+x#-enF00000NkvXXu0mjf3&9w3 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_l.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_l.png deleted file mode 100644 index 0b101a4afc9fb6cdd23da19ba8991dc78975b202..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111790 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 D3&GmX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_s.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_s.png deleted file mode 100644 index 0d36bdb03927b448e8c51bcbfc9b2c0340b300ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27250 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�kHp4}AS>bY@$H8;< z(CsEX=a9B251Iynq}#BcKAMueJ+B!u5#4wrZt?RkywvJj#HS>RoXW(w>k%rXL6`DhhD*#v|+I9#~sUZD=r~hw5IG-j1h3&>Lo$ZdM(yhtFqRs&f*>F=rgl z=Tv6GezT|OPWi{tU^G@MZv>5>fc(GPDJ^8|J1V=PI{xy_lU_b{ip?d`Lhvn_n11oQ0J`^!3cYCcvf* z?Cg(dgrf(P#fP@Sc`)A}p754Po8+Gi?C1iE*Cf64eHmsmm&ZSUx3Vm%Yb^OAi;JEQ zKqg5M6u0Zx|J$oKr8Ui<1iBUw_xPif9%r|8cyy19k)4|jC|MU7-RgDbsdYKL^{skh z`sdKn22%zXUy>0lzk2o>O#17z=n7LUk^k8m&^{XnS}`OW2}6(Y;v~63iXLgLjO~^2 zo)vIXMViO*>MSsi*XTmpaJ%Qim0d|uYx<;97`EsQk==1Or(}fI%OBbhQ|Ix6E7k*S z=YKGnUgfs|p}LRMfq{~_8~H!`>VOwm8k_vOyJTP;pEe!zLWP%Bro$)c#+T4)#H7@_ zoV8t_7O`%ne34Ee#YN6%N2Lhnt85G7&d!F0e@+=~K&B45v`pLCx^nU*GG#4Rd=qo6 zLz1i?Qez&6({9Yp&8L3Ly#M~lwAjz&!Jc2kvRYqzJzjMk^XZj~gMI+!Msx?7^XBPa zoK?GgN-XZnbmjM2CN68W8mwE^`plXgb}i}o#)^uMR~R3Fkt6L7o96Tv%j8o`l5cxZ zoMaP-3Bn$0uu8U)t;IpoHMAQPB5{FRTe;6Pe=;=X>(vdgzJB|wJz=*m1a;}v^gqM1 z;}`EidJH|-GDco|pcY-)_Q=p@9^mE(4-UbMucyco{Q=i2*wmfSOoOLIOf}5#7|r4sCn?Sl`-{QAXXk4*|q7Kh=L9F z4{reVJl>`k4U-XeW>X#TuZQ}^PXQjAcGjhTb!sQ$&x1x~X8cY1Mg0K2&kNBho%h*B zy~EiA9M*p|ek`16h{vm{goAsQLoT3JL=N(S@#Ap^&l3YFa6Oq&$aPl+ zSRtRj+)F(&GS1JXfi2YqohqipKZ|%udj^kuFC4e<8hP-SiIlc;2^XY38DB?FC|%9J zN)V|xvKIZrv71<+*I7!bk4>B`@zDOhX&s%}d6{@z!v zzkPeW-(>URqK5Nl3Jz95#5Pfq>@aVT!(6I={{bFJab&+bW7Xh1vX

    m#+tVQe$N{ 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

    +fmpOQkM-*&5^7E@&61pN2-36_?Rd-q`o`E z@c4z2vSCYcd9e9e&tED}s;8<_9~{CkF_F({y<rXJj`jw8WtN=Fus9i_VP9z_`um1h)UP&#uD?%F0Oq7SDD>PegCFH0BwY zbrF$>HT@#VG@pV+hL*qPtHc`rbxH7WmHr;bwZi1rxT#a-#}=ZJ@(Eiza0RYXhUTK?afr}tLmB_A8*%zW$4U%(2IX!%BHsv4v@rGWj4juUYKR`xE8sunpLd1C4 z6^f#re{u`Y(>^Q4vGqExqYrq=1^cLx>KGi%8nzxm7r37acldL4ulGWpp>$6%-7!Y} zg~^-?HOd9$Xwk83Iow*>q`|qXF;nr!P5wuDh(@6$Ci_c`xFP_mn&H`Q6h5k*vOifrs{&E*n<4isW(vtq6rXef&bd?&_F&!gE2}7M;tY7FZRSfzGzVko8RN1lAah)Oe^j4vv zDLEASulq1*)0js}#*1-qDrRUZx~nO|KyMUC8CFOxBO)@5GlReeRLVj8hK;^=(v$!9 zh)wc-yyUXCK3r2EbFO^k$(Gh;jDYkqBKm_-10pnrn~$izcS<{cavr_0ZS-Wn;>q8G zB=+wNl%e!UetG%Q(1ABQ!uL?oKI2EoK7#1xc4IhC dSPaf*`VbLjBycfnOIu%bAG$If!}Y(J{{stZT5$jX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_announcement.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_announcement.png deleted file mode 100755 index 91485ffabb90cc68d18f29ad2996b1ed29604e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 zcmeHJdr(tn9{nN?TDxcqt&4!ttwUYbpi(6!7GdckDp(Xygam^;0+I*8L`CG4ty`_~ zDpV2+DRwp>poFKnfC0oU5FREJ5CTbnbOXT}1B4hzfZ$$aq&UML&g{(owKKmt_nY6` zd;U20oHO5z6W)i-Hdt){0GJ&;;_eH;nj-)pkn7jLn`({J9)4`Oa46t{A2s4aYzU12 z+`_4$ginrALLv#igplyK^KArY05&{4>h5;(vgE~}FiQq~%;Ox!>1e?4cctI@}L&jVfISOTh7Xl&yo1s>=Dj zW#d+$P}iXnvskRz*{K4G-PohD8Nw}Yv+wqX=(1ouoixLsjSO4Tx>IN z+l(pSH#o0pyrDCkY9&mQB)i>nU!|*!?`LsEqO|jr-4d#8kau{1rt3z^gz6jlt$BBy}7iI@|-E)birOSN6c!h2=lwELq#P)a%C6Eawy_10kJ z{L2)q7)Ci_hQ;JJ*MfJS$Ux;}_i(Bu z5px-jQrW@V+AxLecu&QYzNzj;XR#Ul+PbN-PJfQS&N!&uiRvgilXCJ?Th}2zYF$P3 zd*jKkToL-m7P*Rw;U`AtGi*PcJ-tL-Md-kWS?}jo&-DpLrgO%AAPjWd8m@zDVT@M- zTlvFjl5&qf=fzm6lLRGr0PRya0I~H5_-p^~^8pIz^$SlWR=FPm^qKwz*={#e#-o-^ zvv#duQatJP9ik>+AgS^7_DP0*aeG<=Z}m~87yy5~JpV8QD<{MRgqSesL$W zu&a3y{882q5H;p+;GIYoc_yLCuZyx{diQ6_uK~c0$T#)C4^kw zy@`qGd&2TG3GayAltxicQv9qzJw`NQM#IP{7+!Yw*!_V@0=FVfsk<~hds~LrI#(fa zl1L0d7h_U;|2&5YOM`@tTnAy?_SK|aRtG+;R41vka@3#b@F6bUNx&VAoXFvuG)86D zy6&4zI6^w^Gk1cH%R( zSSUP`y(u83uTqHZor#U_jp+AKWAn`odd(0|^XuhYIgqob9HC~m#Pc_8FL|J{uiry^ zg-=a97F`yX7szx_SJ?peQ=1mzEhD?aL#n*p$5hsR$WWQleh(8If|X%{&r4w%J9`xc zY_rTHAn4{Il#o&9Ok(Wbz+}%K-hl+B8XjC#k_d;lBndzscw3UTXRjr>gzU;wxzk1V zV|m>*?CFmsMhp+p7}$X#of;lipUMrf=8-ZzM-+m1am#fD*|2Wn4rc^q`XlVtnbA_kE`6EmoA=Ff1-d>j6slx31nAOZ72Nei3FO|665- z8N;grhLmif3ksAry@8}0w~cT4;B`u1gD=feF6B1lUrb>VI5}PwFu){mbV{4vz&nw^ zRB}EJl6i9NLOUvyHN5#3XXvp2&HY?la_G*cD78J&mY8lwJ7AM?NU+pZYZz5lKM)gl zZApCTFSTh&x0BF+JSW18%KWTYJq=&-T?)6ZeuimmGX=B+Or)kmzIT zzKQ`c-Udr)s5hnHrGW^M14(2~T>W6R%V*VM=T2k?b2@M%@Fs2yb81f#1#l?zVa(Wr!mAdgwDWKo=&YQXC5* zU!`OC9S2;WmGm5*Izw65DkbFw-}&!~Llm-F1TqP zTOc3)=3;l3RSYnj;Dm!poS?3{p>dq;_wfIZWD>mQkn6w>r|T6~1lP!tE(mj%SAe0e zm0!7P^H#U6xTU})yL3xw#Pt7U)_6S}E?ZV841e62yV$mERPrwi)xZR#mkw>b)(JJk QS6y)Qkhgp3muJ8J4{PQX_W%F@ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_bottom.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_bottom.jpg deleted file mode 100755 index dacd401814b44029cf23bb574d4b55246380b7f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmex=i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$ic9L$(@-|kby~%ky()O{}BdBkW+zx0Rfm8nOWF@QfdN>42-Nm zDMl71W{5O1Ba=wbMB_phK_NvYLnFt)M4&oxbORU|7@3%X64HW<49uv8GYSeZ87eaW zzs11A%m{P^vmk>#!|(qLPkl>2U7NrD>(Y9!z#Rqe>UL@)+(QEEOP$E|X!SR1>z77O z_di#+r`Br|svX4f_~!TjIqMbtXUX=T$FHycv|mWles6tL?0<%me-h=(c_g;& zUb-ydV0ZSe$QcGnx86-l0}IV;X475wGHq015C@6e{G)#|7A=3b{qO4k45p(0Zvp_4 CJL!P{ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel.png deleted file mode 100755 index 5ce5e30cbacb280186b72de45f5174104e4633d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3654 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 bZ3AY{ST64vJMJz!7y{Oo7vPm={&wx3HLOs) diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_board.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_board.png deleted file mode 100755 index c577e02f28427156ab9bd88c4b9336af51f7858a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1902 zcmd6oc}$aM9LFm#2PoTQ8aL+w@mM?vW}0C<=0u5QI*(4A3GM(z?)yFjDI$U*1&bh; zphXZBL@qf56i~U!RZ0(fP-=l5@7YpHTi(4KF4LGL`)|pcJkR%+{GR9cd_UjhO+0bz zu$k#9Qv!itW=}jsA`lFS1j3>n#)f!B-@ViTU%n2qI}`Ma?}eaHrvMkif%Cr3E*AFQ zPOdH_7pL>#{_QS%2?RsJiKD0N_y{}F`(t2HwiT`1IG7@yB)0rIi2 zF}_^U%3=?UjjN}zb{=0pgQ0qi4*+bLOsB=@Y_3AB;mTwzxlBH-RcLiQ7?QxKR5>X? z5s?BEA_!NZ5ChPN5(V{o9*kfZcHzPWS65dzH#c{8cMlH_Pft%TFE4LzZyz5YUteE8 zKR&$-MW>Lk&&61dHeS5tgNi;?ChMJoZQ^pyu7?Sckblp=NA+d+`W7E z-o1M?8m+Lf@c#Y#MMXu$#l;UEJSZtCdHC?*qeqV(KYmO-;?s%`aZOc=_^WOG`^@ zYinCu+pAZvUcY|*=FOY-_V$jBj?T``uCA``?ru7r-qX|5+uPgM*Vo_QKQJ)BU@!&; z2boOf(9jTz#bUGB91e%e7(JvB9@(P*Zpr?pxwo=-fe zcwBLsRX-b95eP;`_JUv zhrn?2fj?{xH$4yEque=F<=301LC|yQ)chB5w}-80E7N-%v$kgC#goXtH+~k!?D*Bf zWJBx*$_9#2+K=W$bE1JgUYIKx&59IbQi%eVtiS}MntcsJXNY|Tr*;i8WTp-!HSSwh zZF|7je^Bae%3ZboNHXaZt+?DOYS$TOODkV%;CnBX+J<;iuXi-7zsBv1F>_aL=k8?= z^#w-zr&}*iBGuYj#svHG2l{N7Ir~;8$20QULxPJUk6D+Yg%!YY^^K%9o$9Uo@w)o0 z+3qO`RL==1kh!*YPh{ZeVh5>2;!|?{XlPJql~`oyLJo3>@DA9&J1d1wrtKl7#z)bd zVgjrT%+EVpe&U+TjxD^Ya-R9EaVPa`L6VE{MswM>M-18Y3X8S)tnq$`T6D*rx}Bcj32!FTS`1-p3*HZmw#yLtmSid<7VUDxYT{uR{+jA>#@^pfp_Ce)KgUfjpT Qf1m_=yJLq+ZT}?y1y`ZzcmMzZ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_wheel.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_wheel.png deleted file mode 100755 index aa224adc0f6a5b8b83d279d63cc6a642c28bf40c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2041 zcmbW2dsGzn700)}5P?82Xf!IU!9v=iwYC_nMnuph5v$-)Q)?8El86N1;6Yr)BLOU} zL84&9q#7b(jRlX$Q;_#-7g%7I$IialU6$RQ*?I13c6N6<%Hf>!oc`5+X70T+_jkVE z&%JY|_|U=qJ}cI)V6j*}v7G357HbiQiQAShX0G*rscdC#YqDdGXD4L*H9IFUD}}Y^ zOh!^lP;7c)YD#=c;+fn`Udm1uYccE4fg>?CnjRL5-88Mh2|0$&&CMxICgtp`0z({D zn*>H&wA)2FX&3FH-2D=%48vt8rbST+3R~T@96_AS2@;7M!IXqqPGCxm0B}T(!kCpr z?G7b^C~!=H;!*^4yWK9AONOH|6j7Ni6iqvwP97kZqL>cHXEBVhQwkWyNJ@$!3Nx-i zQ85Ms8ZAXRW(b0&U8u#bLeU|q)MP>?4f;MnVxeik1PQfTrG>E4w9JBcj0&a@2q7K9 zX^Glyoq<5B)jFfoO9)gAnapOh)oxQFFot1nr_<%8l^8Z<1cznP5wS!JLo)_YgW-G$ zphi)?7_bl)fm$O_sb(-t07&hO2p6RWjT2g}%|VkiJ!3S8=JYBAH@j)4+l8A6lA-B# z%0WnLFlr12BMe(ehnBE9DOw7GVhHRN10aIxKxocl<;fKQ2%2o96oCmBJp~z+FvcKP zC=?)uY3B5L1L$@;Ns`nMxCTM=C=MW|88e|W=xK&Ogg6`ytqD>gkd{ErcG5=LO*X5_ z2pS=fA{`ow&1i%S1P)sW9gdnvn+%3$K*-^wtWF0`*`+3gCP@{J+pMGth5U6Tg+if7B$}9*n4FxP znwpxPo)(M6002lN5~)-wlgZ?AIYU6HRH_*AGc#(nTBFfuwc6R)S)ESDY^k0B!>~0P zK@fx>$Ye6XFpMAwilWS9aU3TIf|<3&VqvClv)Sx+JHwD+MNt&9b<7?z+sJtI&Pvy_ zSW9lkM(;UtQ36S)GZK!mIupN*juidkmrFQ5^hDPsKN5KcM=ta9ycQH0WL31D3+1k! zsDyvwB65eXx;!1EMcC?*0cX<84Pz}gI3`AI3IU>vGRStBz3(*9kpZZ`@Hv`e|{y4 zRlun|RTlcIs=2({e}ouALIR8YcsxsAp;>w}1;ZUC-u0m9Ebccaq<>6)novA@lIOvW zu1m|!{I&4fs4@QWS2bZC?ED&2cBYN(qd(Ylj>NS0DS8D#U zZC%x$$Eb}{cYN{(X9duwE0_4E{pMX^mG0hsxG`?v*^#>!UW_z+XM)P*277fQeE*&< zmgzsIHc~07&!f#YeN~dz&-H&dR*i&OG zK3OfuX|xE|iq2=Hca_$D+MI4FX786suSfpy$~9QJ@@Z3;Gbd!}-k+WxoIX0SPZZ$C z+5go#;pBzBq9eynuJSJ4C+b`A-ua;qzTD0gr;V%kt-j)2x$PZi%wVP*P1t&SUxqDd zFrsk%7wKKQxu9=tr)NOsvZiMH(qqA)MWyzPf{CU~1+SG#`SH8`$}11z`gR5Qn?K<+ zgb>1KQ-TcE_-@DYr;*Gm6Z%yv+Z28)YU%A9 zKitDnUM1nFH9dF2-t*pc9Fssb10@3BZD4CE-QE7P&BG`(VNvbR~(v(?A)OY?T*e5nWw6jWT?U3PkM q%L4(I+g()sHxF9xd)4c=tWxsq&f`~&dCb3@6&rIfx;E-`{(k_^ap8vm diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/carousel_buttons_sprite.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/carousel_buttons_sprite.png deleted file mode 100755 index e98c942801421e526499b5467ffc0aa5f590dc25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3413 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 JI%)IJ{||jddsqMf diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-small.png deleted file mode 100644 index e10bfa92d6ff7aab2c1c407c588d80f5fe200a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/eclair-android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/eclair-android.png deleted file mode 100644 index d476ce965bded4980e07e68eb65a4b5792262f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11311 zcma)Cbx>PRv<~hNiWDcfLvbzcQi{74cc)OKc!3rz7Tnw5?rse(#oZ|`#frWA`~S_n zH@TZT_s(X|9{bLBCL8_!odOOf872q>!ckI`)dcRpfKh;s3Vb6Ah86%f1W!!`X;9@j z#UJ1S)lx-47WDGpC$FP48F+)?rfA>^0$~ySHxNM3EE3=)nwOHA9NHo#F+LMJ@7jhH z2m}Es$x3N|TsjH#OVGLx+}~eqZ7c2s%kc6|PV&A1<4#zmV+yTR8_3ii2^sYnB48Q^&&z_4KET2Zw8vF7*@`L&Mt4%-NIp`ory$Myj;|1Oj2kf?^{eAkd)y-{b!^ z>A!{kUlaeANm6REmSN4L!V0LC5#32N`ex}$E0SVwl~F_Oz@Z*rN)lf$39Drvq3x^w2elCLN9dcvic9^0CQkFUVs+>ZSR5heIx&PE+3(TK_2yOO zYH%5iC1IFtAPIVIcg|X}l_ZALTq9$1&(cE^tD%G(YmZm_t<&6VEJJJDQcl+d*x zilrb-DOZUW(r}1lJVlyoM@+Lew10W#Q>|>P+2ck^Z7#fT#ihWn zE8mGf%hni%AKk9Qgf^oJUn}z|aClhp_u@L8h(`iKj^;37oLj>S_A8G0Hnhkz`mbnf zdSE3eB<}XFZc+~<45`%D zX|92oywUlv+zSkgfUWNJ?T$@Ba5PRYQ}~7D3(F6GOhEs6qMk$h<@jd4X}9{aQs*w2 zUm5*iz#w7-;!**G(h0jmW4~Hjv-S(y*5!@KdKxb37{(tY?~vEpuH4lO`fw7H(ja!!mw%G` z-?sVb@7I;I^@wu?A>x;ASOZRxf@{T^{)Csc@y}*~8#wV-2`RJieeRuP1jCR4t zKMb>MKU=@3P`7Up;*ReyuJm-yyE&ct8B>ay(5{-T1YvU9*VA~cWp{*U^y5&F3Weo# z2RUI<`c$@Vun=E`9ay`0 zMC56)Ewijn1onpnASNz6SgVQVg5@Wd2Up@{N1Wy*;i zDNN4%C-W7IQzWGwFz&ll6U_o}${(KnB~TT3aMvgoapF$#ISgDhDdr%+;#+;z5Gvi* z%oj7#WLj~6g&nTGVZQDN1pSW@d|dyBp1S9lcQ1({ynwcYfNPosees8GbE06eUsMVg zmIAS1oR&NS=_WEs6tKg>^YV!)7p_+XvEZWA-&H6^Y{ullWqHy9ugLp9^|@+i|D~oB zLej_>{M45_p5ga^|M#X4h-133G80d+w=qC+RhSHAM+g21)9c>l+19N5SYt4>>hla2 zNn%Qe48(bhAM?aI7@Px^6pnLok2rSwE3GtLwIC+Ky;=UA2JtDr@Ctt{*3 z{=mZYRrNjQo@egE%089eSmLM{^Fy%UdPqVO_3i!(el0PZBdc|N`u1k^$*S-rtD|q5uOA6b-iicNz9E6SF1mVLQ68M#GgR}%-~ZXN$i>$KjK1-cG@8xA=$S9na=@X#k05%y!VW}Ws->V| z_oS1B4>df zV;q-}*)hkhy#4dBTv?5tVTn)JUnZ(fsb3_{%+ay)_HPcm5_@XcDyLnovf4a=1|_ky z(WnO7KZs0V$e#k`J6d83+ty5zH>V8!$hP9eq>$ma{Kw%&?u8Bh?p7PvmGQY1e#Z_8 zGMWX=qMzU_GzRae*{QiCUT~7={3!Uon3&SQr%L{*ocwtk-OOiL_dS6Bmqt0h6LkUc z>6mG6O3jSQKNnH3R6v3^ZWUNw-8`2-$Dv;j-Tz^epqC$>$YCPUu=T1zNQ=r(d)*)0 zChz!jy(6pS+Ha!#isMg|^QT=pSH=L2ce2L$T^J_6N18w1dWB)) zq+qjI;l{cfAW1j7Q|ITiK0Krxbzy5ni|iG3xbz3*m{G6{&y0KOyuP@+TK|

    sQU1)F6vA$d64trcw*+n_oNJ|dO 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg deleted file mode 100644 index 0fbb197289c60d19d726d1179e34e0025a39e904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmex=?SV%>)=2nVFfG z*x0zC@{9~j%q*;eY=%OL?7~WpfrTPQjT5IV6cblgGj<9JOWL^UAyA(bBLgEVl8Hd0 z8A1BkfO4vW3{0Q^VMfS<UW2I9X`H7-~1wQ#WQ!cZ1XQ#6IQ1N2@}^PAzS$SQJN6yQ{Nir5V zu6z-%kUZz$+#M9yh#OHwv=Di;*{9ntq{P1qe8{dDEFZGM|1n&Y{bSlXy7Y`6WPd?$3( z!P35`%)5PsHatB0p6jpdIp5$5yIlJVv^tG^l$0*YIDBaok6o&DbN}jpO(%}-|M6$q z`Bh5B5vyjfRV)1N(CW&a%>0A@{+E@hdpJ%l*!KL>^BX(g@h)1>-M21dA^X)wckekD ztqZyxlUOln?$bFcJCX}FS-r^0EA5?A`c+iu`I{e{IvKVT_$!Y8jhvpndSPp3WS8#V z=k*2dMz*SbmxJ?mu(`AP_|4fOEXVCvc%I?i`ni&UGuFSa<2b_i@6d@@zsx6nUhVs; zIvjFxIv#HP@OFCd#|QVTu2xCb`lf!`_1ySQw5hf90e_8qd@>iT+m7E_75zSMm8zQQ z--@@r_x>~N`C!I5Yo6pPC8e9{7N$IF+AbQ;b71F{OKDgXXYGF0BWrf8@3~8_q9SMW z?8&W;dpLpH&t30dV(8iSIH9@^(RGX~9e%%(?#?xvx%xiy^K1hPslqvPifs?3if1x2 zi0Hi1$dW#GtUvP3&#mw7OsGuG?Xz5~x7;_oYgVS_@_kYFMb_$6`!ZKHzYYC(F>T40 zV4qS}&2)*1vl^%U3<{qa&R5v^`s%)An^ZrVw(Of%_uKS`vl+*t8w(z0++{m)v2=aQ z1eq664{Qp;#jolu{Cm**!@|g2wimYRT2_?S=AP18b1a#0B3pv!+^mgPgRUMnOEcJf azOCcwsV<34XITZslcG2}8sNzO|4je|cz)mj diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png deleted file mode 100644 index 6cd03a39a2540c18159e8ad06b6af663f5c4efaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmaJ=TWHfz7|xs&84d-d=M|_lZyHzDDKS*3L+?8V9G$4`k>-TZL1H~kmQ{6^L^icJu`y?yIWf} zv|t$4n%Ki9(b|Q+?o}@IKh<^f3tHC0z7aU2XJA1z0Tz|@G{6(8I0lkHl#AmJKp4ZC zwt=kMpXEFOy!sHxn<;0wBpgJErHTfilEBg@ObInE)9JV}xR?nG)Vgx zrjOZ0`(nH|5cknhh7LyA8kg6l2^DCt#+CnY*@j$a7*qp!=7Fh90y%E#DqcyNQyRzO zZKzk}%8g_3HRMt#7|LnwU#+g0(EK>t`rx8Nee{8b=G{bt?OOhzpi6N(!ADc}i;wfy zTBqqYew<(InC}Q(h#$r?O((d}wdRnGoj&`jL+lPN^|vf0-iMCf*?s{&EWy_+t`_h8 zyfmHczjfpI+Kuha_S;S0l{wd=;BKXN=|^_wLazO24x3Bo-c7ld%Lkw2?|&IhUH^8d zdA2RE=EJv7E7$g7O)Ceb^7t$8b<3G&r(dp~8s7i-z@+!{o2TctZ5B>GUzknj?q7VU uy}OdzS}xDz+OMB)y856^Vx|iDb)(qcFnLG|ETMakVTry0{_?KTW4{33Mr&CB diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png deleted file mode 100644 index 8bfdc7b648228ab80273c1d60d7945f8b64a8ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10201 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 C>dDCf diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png deleted file mode 100644 index ee90a12acbfa44744fef9fc4e2dc0119ec5ab0ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeAS@N?(olHy`uVBq!ia0vp^MnG)A!3HGvFIjyZNJ*BsMwA5Srr5%(GQ`zk9!uLS~AsQn;zFfp39xYDT62(s|s5su(?)1Hb_`sNdc^+B->UA;;0DU00rm#qErP_J!9Qu14BavGc!Fy z6H_xYLmdSp14AQy10XWfH8im@HM24@SAYT~plwAdX;wilZcw{`JX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OOP2xM!G;1y2X`wC5aWfdBw^w6I@b@lZ!G7N;32F6hI~>Cgqow z*eU^C3h_d20o>TUVrVb{15Cdnu|VHY&j92lm_lD){7Q3k;i`*Ef>IIg#cFVINM%8) zeo$(0erZuMFyhjbK~@!5ITxiSmgEszI(?e<5eKXDorVq3^&!w3mo%{8s??f?c=zz ztUFDrq;lu)V)3fX^@~q_+f}{ucYgM*x1UriE7#XYh`4Ux*A)?9OyrofY~@;OHP>UM zZl`AdxnE-S_j|-IKJ}-QN?fI;{0hB4>&p$1jOhx>K~BFE_fEWb(f$C}%4*?DGqyb7 zD(Y=~HsfpQ%euCM_6$ERA3yaa>R;U1AFN@I?lCRAEwp;!_NW8ADr{$D3`%|3YjZjm z&ux~GYRIpi!<|320K`sAn)AmhWGd79NS({jOuxOqW=*l*6R)Lzi3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$icwNz{|`i$iO7X$SlbC{|JK^*r^OifQ^X-D6TBPz{JGJ%)-nF zlVW6IW?^L$6k=c(HWXEKGy*CTXJkOggViyyurdQB)PXiIGBdHTBkN`mRAgaQGMxB9 zNLbm(F|lyt|62?^K>bXD%z_N|4Egh~ot*kJ;>*;nQEd zIQH!PGOKdNDc$8iKRP~Pnc`vDTot*<#8%cgs7S@^llUCpqT4ItQh29^*8N!3?_9U6 VTT4q%khRrVd0NujcUk{$0svBNhK>LL diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg deleted file mode 100755 index fd32a64f1b75e75914eb218fe35d9c1affa838f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmex=i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{JSR%D}?L4wN($ zU|?cmWMXFKVuwmIGBGf-unGz(8j6@EvI#30IR+M%OxoleoK!S%<3XSnaiGtECL#l% z0YC`}K@1s2K_!mbA8b;t&e?t|uCa0Xe5(bwr&XG{ z&bj}M4D7IWJ9h*&FHJyvn_~FGKz_?6m!}tG6dnyL{Qt z!0u{Y$<;TD`c)rUUwi(={zsWna?zHVvM=X<=KZ#2W8dD$09nB+s~b*LHFHe8Hg!E0 l!|HbeMoutyYaw~$?W>5dkDqKU{k6|tSS9MUS2Oefn*gGbtcm~t diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg deleted file mode 100755 index 143184b8c3ae81bb85a5a9866c3dcb54235467f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 zcmex=i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{teP&cMvV29z`s zU|?isWMSch%Y)Rivaks%3K=FA3M(m_IR*xY6i=Ld_~IpYF_mPX9toh=fdFnCkipEz z!~&F&5=66!fq{{USy0IE|1Aa{pbbod%z_N|48O9zepnm2cHPWtoyzSV9|8@gv28D~ zb*xI7$Zv8h^?_*A@~YWa%1_-jP6^GbeU%@0UvqK3(lvob4pk-rMV19lEDBRN99o1L zCHJn$(3|+&wI}1~IrV@H$;mqtb|%h}jOY2dOLMV>oq5xBleg?9*@mU-O!Gb#ZOFK} z^5D^RTTjkY$re0jTqs>29d34VdFb(N=XQsyHJ9IBn$q2}O|bdxq>oE&D`b78r5gff z=T@wnwe45&v9*tX=Y$`BBxzd`kZ)SlYR>69-_59S(phym@%QPDx9)J=4pN=E=Wxp1 z`jcCt4yI1K{zp_jMQOsPeEa8W4(}{vUx_U_^mUJS+#4uRa{&d%t4$EEgX&-$ljE>Zg{kxbzSCx=7}r{4;)&g)qdXT65MKbT{@m;vbZEm r3ftr9j_j;b_rmrnHvBc4e#`gS{Z+4*+XxnC&RudZ_t$cF{r@)sxhvA+ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png b/tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png deleted file mode 100644 index aa55f9a64367a9ed0bd0284210172bdebdf17c17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@wC9V-A!TD(=<%vb942~)JNvR5+ zxryniL8*x;m4zo$ZGeh$JY5_^DsCnH`TyUZd1Zs4rRB^CQX;|6&&)i0qDilVWrjnM zf~$g`mls!zEcY2V4P7?T-;BmQD`qe*lUz2D_3W2$i#f+T-my6SOLW;ZapD9u9%+u7 wEy2uozCAyh=5;pmIN1B@+?d3r$RLow(9a^9m$iX`4`?rgr>mdKI;Vst0J5P%kpKVy diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/locale.png b/tools/droiddoc/templates-sdk-refonly/assets/images/locale.png deleted file mode 100644 index de3aae7ee785d53dba0253bd2d3a00b996750d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%MFseTxJDoQ>%H}d@{})gul`wa|6kgf|5mGi7%ci8u38w5e?a3iY7_W@lw3)WUocQRZou$HLM9HVa<-?7V@SoVn67TVW(6MC z+l^CBUEZGe_cP#4&zD&Q%r{Rl{v<59Ua#l^Si#N$BxBrNKGVlc|H_=WRc;GMBR# zPRViFt`Fh;)-*GzWAVz;)*av1OaEqinzY90Q-0U``O9?PWqSQQ@tf0tp}L8e)hxLn Q66j0@Pgg&ebxsLQ0F83V6aWAK diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg deleted file mode 100755 index e743f860f03cdcc5d43ebe522b3ab59f45e04c6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3311 zcma);cU05K7RP@f2>~HU=t_xzvLH%FB%y4C1w{}M0|<*g2vw3GHFQ+gr3knzRjGo4 z^xnJFg$TqLkiHNEDWL}lh&){Pyxl+FXU@#rneUWy?#!JtM<0*=1bB@Mt{DIz5D2(> zoPeWoKo5XHAP^`728F^-z>YIFCk)2P4d>$G=Hh}Q;D3RDpX5dGo`ees2nh)YNQjGz zOGy2XZ;OC9U@$m0T!fcbZ2*D;NB{!BAOygM z0D%#pqfS5!00AH<2n75C3Ww);%Pd$CSCit5h{s9DrvO(C7H3h`+reH7|1PTSf z-*pfh7y*$~hVtV{$cQ2=kKBw_qfzqyc zpo(gSY}!sp7U%7$4^*OuN(C*lM3pxuJ3WV$?YHY{Ymgn8`72I#y~I$h3C32$C@6K- zkWd&Jp9ftjK&FG6MNrw@b!8B(PHG`DE3XONdfw`W23pPRUS>+r3G%?TV++H zIi}-`euW#S+25!&FDTr>RYWk8@)nC+b9Qx56Hc{n8=?6MX3{S7uYO;PrG2XN=%*&1 zzuBGT*Emt<|2X-IS;n^0wUsc{G@faV|1|B#Cf{G%>RUz~B++Nw8SAYkMgtZw)gwT0 zvng>~)Vz}%T1YSYIo3l#7rTxUe#^?Qx>ifX^lcnAjbt>-6q+_SG|p-ZQwpe4V|9#7 z?`!GQ-LhdVx&5A&ck#=gLkbP^m?$44JDR9v{SIoOqd=%$*5emg>+caXaL{98gMD)- zq}}q=RWT8&(%k07B(tr?{B2y|vsKGMp9@PqY9III@Gh;+rW!5v!C(PpJyH7z&u&Vk zH5y;Lm@TC&rabTDtP<8jvCN8w;{Nq*WFJ21QqZ_Q#qh0HUJsW=1+d0(x-5R!wXv5CzIv$*3(I7S6~>X+oUCbFO>Jk}BqX4!7@tc3b(?G~(8 zQ`9#urYg@a%E)b-o+&;87Nfg+?aS*$f<$Sf_KNQ}>deOZG8SVc-VEhjDJwP-!q~Q6 z@Q8W5$ie@t!WNawZgL2`#YxzdUMz9^+;}-+hY&&@zHs;{r35uR7jxhbEB$#OwDyJa zVn_AtSL^1WGmi!&&hW%_3;|`RPhQ#y23zT4hcamaSLN$pgnQS1 z41_LF2R0jac^Q7EULy@LL2kA)cl$DhyT(0Fv9PsrFLDU4J1r4fc)DL#B>5(fW2!7OZ8yp_Hv7sq#JkPn;JYWVaH}aQ{+l z6?|`=5K17N>>u8jpmQx>rA$1j3{btUFfp6gx4+s{#Ux&f4%NK)^QFJb)A^4!_(0y-&vI#@ngl2~tBYUdx1{R+;qA>ZxEx3w zZ9%$@fsql&lUCyW)>8`~5_JM|ceM(RfJ(#0}?pql(KHYBk$ ztw{~;Tgbh)W0*$lrxS)0OJ(DVpC!aC1ts}rGf^=n{6w#@osYHHR6!CW;XK;sp59`T z+7WQ>_G30Sw&=KCl6X6~_qUvu%xlJ-ooj4s6}SvU8bd5fE|X|35;^^(ZwGIY++8Xe zYkIS=(LS|2imp&>n~HUM-l=kS(8+;SRPVRAc-p=Eb8Jq4f4{rK?VVOfRs$N&DO~E=tzAE4-bb4-P*2*^|bl3lDOo>FF1T zmj-|My&0A9lH?jwGr3TkU9GH)Uae!uiTTTWm}(Mrax|x9SrOU~vF5|`1+Ja$x5gUq zB;x=*x2U(Xp1;{Cm({f-Hoh#4n?&|cR3+Yc%orV}32uZ36v*b8h!=Oa&JxW{@4H>* zRyQh}Q6{gO+>vtS6R(-MlrGXx_+kN zVUn(+*Y1mMYu2oH+7Q9}B#bYf7*qZ>=90R2q?{6YFZGioYI-hfWEN>in8SUUn-H(Tl+4~pr0(ClOtz3&Nj~eQSsckBqapF`I55IqV3s(I zFG;8PDA%Fg9q;B&N4h)vD)?Hq!k4QF>{IdQ?mludGT7WJAz?m^+M81fQhKOx>xS0| z-Tfped9ce4*Mri2h3lVGjGLweRyCvK>Zj8)u8%FI2B$a~7RdLr$T0(Cm&|5<;{Uv1dDHCKsdW_^N#1e8eh%$ElI6c;Vro>6B`;8DF~Mrx z+QJSra`HL#NcqrL)gn<{!G~I7x6LU_xhXwLQTwl)H{?B+T#$Ql>Urg36oEw5;M(e6ghf(7~J86`V5_?wrP|lTbzW~ zb^8ZW`44AVt->L(Jli{%<{l3l4%wMlXT&*j4F}_f-*n%*=BrH1)A-pSQu*^fUC4Ye z)3L^X_iLuY!uN&k>Wz1*w+Bdn*M_6Wm?42*=_>z^W5*Gh~bx}L6Vf?Z+AB6`x z+(g=o{rw7Qev&;OgpTH%jP*kY*K5VssP3IF@nG?#?EDbZh2W3QbA9A9sp%!qmgC+1 z?I-mA03W*j_`S73r}vqx?BjRpAGnHhJl^r(Z(P*Ij6%YCVvtYT7w(WwkLY`f_N$@4 ziunJKQbwqoh}oGQg?Rq`@BFI@^UqorsNB!ZRanj#qc*`(dU;mSeBxhugVilfT$ie| ci=iA4rSkG_Zh{Bg<)e@9+_r>^?$PLf0q89UW&i*H diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png deleted file mode 100644 index 632546aacf23ab8c776da6fe8dfe922a916da723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmaJ>TSyd97(ObAcu9*cw7ne0qNH|bX4f6v!Ohm4-CS@~){T60oH@FK&YWrH*sc;} z*@F^77w{zmAEKVDXE6w(Eb}GlsgNKfkPwBUhlnm`bk}-t8-|(x{CwZ{UuPyd+s{>% zd&&U-Rf$$92|!ULwM)xN=~L*LiO|;(66+>ixQ}EM8-a+1dl5_+NMH{}jh?)Q> zIi{z&Nw?f4s@U);F2Hs3J7xn9AnAx0v%0OKUGZ%s~CtFdJ)>}tx z)HTwcQbz{Vkj6BhflXPF3K)neFl!8&j+hNITe>2(T{p|XEeIJ1GuugZ%bhTaZ3Kh9 zfLG;s9twhwuMY|We;WEZ-p_LM7QB4D7!*W*1I%3vjb>|oVp59dV$oBWNfTm;ESt$> ze3^g`+x;vb3WZz^zu!v{UT4@OO4e&SwRr^zIjXH&M8_s{6_s8*M8XWsbh`w@+L1M# zT$^aa*sNl)ypMBB$^&Kj|4_r&K|3Ug{^q-@u#+0L5Sv5}9X3me&E|)urTo=Gr9l9ThG{)tMCw5jjwuYew1-wv#f6I)$(Eb3jiPy LYnL9i^j!M`jZIhW diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png deleted file mode 100644 index f2fcbfca231b4e29542c7ba8b9798043ca4bc067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmaJ=&1(}u6kp;;OQle;2Q7l*wv|}Te&l1*U9z@mHftkpTGC)sPuc8Fo3-7Y?e5fU zdkh7sCqV?gi4;5(1igw1dhrtkZ~g@y1dpB+XVWD0U|fcsH;?!Gz4zw*W@o;5d2nE4 zfTF0u!mLsvduSi)KT7_pbNVFNPT_n7FQ8@I&^<_HO;m%RVCyTe1a)(B{T<9u)S)q} zT)`FXs$?LW(Zd)fuw8c%R>paxegN2Y%~e?d1ZvwI=47q zM;Q5a7IOTtl7Jk z$(~r26vKw2{cF@67tv2>c7;n0UFk!I=-ng2eoT!|kVjE3DA{uGwN?d@kC`{%t+M^- z!Swt4JNysavV^ryTWcS|Z;ZMz_ z7bAtp9z9guzTWrj#yKYc?d9R6UuPDh4=-GMJ>EA|rG|e;r+4RAE_{iFd{KEaQ*HhM DMc_Gy diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png deleted file mode 100644 index 99bc99927ac3c4f11aefc1867d9198d379452095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmaJ=&5qJg6z*t-nM|C-g$s3c(=kz_w7ms7w4sth!D(U%DP&}4OM8KaX>V;WQrM|0 z6BjOg16OW*0T-_46^t8SK)1TWTLu^xV$-zeo}BMHf8Tx6ZaqFcxP8Dd%%O3jTMV;v zjoLf=Ir@Eo-uK(t^BR%tp;^KgF zvKTH6B8q01N;QofcZ>+=qoE(F?9b0%Sm1jq`?O>VW>iNb|70Gc&b-xi=VMp)*ygT<00!G}N; zpvVjKmGZEtlq5ww2CIjq*?SbB4ni=I?=L`bCY{B%0yrUeeiLmtYqoN_^1MA;=h=KAsSjrIlW^5JVf=Fj4vbHoh=-hzwX_a2&Hsl6 z!6rH(7P_qWpTtRb79rk337*6*UEJU(OBE^g7&!#TU5wAxQ*4hg!N~|mpx%+dJ=1ah zFmv2rB1}^;!h|@Xiws?5DF^5Ko>G=dV!6=NG`RpFY`~gOtm}p2W>L_fAZyYZt7CT( zppdMw-X*rS6`P46h-hXV#r_NAHDerrWz&kky_WJ;z7^KnUW>dH%hO``Y_)%_dhMe6 z$;^##>0u*%6jHs%RM^Hh?K`~`f}v~O^lRU3mw=RHiEBhjaDG}zd16s2gJVj5 zQmTSyZen_BP-l zO)W`OsL0L9E4HezRRWu91!RMS^_3LBN=mYAl^~9a@C{IK&M!(;Fx4~GO*SwzR4_Bs zGc++ZGc(jtFfuSS(l-DiGhIUyD^oKoBXb2PPy*Ukl#*r@-k^OpPpz-OL;0ZljVXP~7}LSEt}Eh&y|vm~ zA8Sp=;EWkQ74kn$xa9b9ettcD<*W#X53YH++mG*i(e$xMy7(MJeqy3_(XoBbhj}~J zh`qbc!E+!!!ev?1vPE+bEvnw~^WHhfkB^VtpPiTZWobD_uZ~8YkFL+u_Xb<8%}Gm; z&s1Dmz@$98`P7yF3n!L5sakz&^{ILOszFCQ{}p~-DYo&F((K)vJH?DHC0WJ!rtJP} zt&_Iw*|x_E4m12Ik=V95;N|R(8;(6JdlNJ7MMp7v1$XbXmpZS`l-Zqr*Lr~APq}32 zwB0^R1`PIz58K@4?#$Mj1Qcy|GdS*OS6`kE>x3|A+l s)oBV#9V`WfTGVUB=fVyX;~Ci)ICn<;*{XhI5vb_&boFyt=akR{0EVLv-~a#s diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png b/tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png deleted file mode 100755 index 12bb1fbe80ce0b9dc7f1c38c7c4c4067dd04f014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6340 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey.png b/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey.png deleted file mode 100644 index 5e7e7ba694be5c37d5a43d3d710e4fd70832995b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 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 b(rx({hW|1b`cl_z00000NkvXXu0mjfhz2h@ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png b/tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png deleted file mode 100644 index fe0da3d20d693fa7d1b5ebf788939a3ba4ba58b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2251 zcmd6pdpr|*AIF!&NlBbe&F#rJb=)dRNhup5NyBQ{%I3NeixQ@#DYr!ztJbV6)2ZY3 zG}l~W7-h`$DQe7&+$Ot4ayNTC=kj{~cwWyR&-v^5=l%Qq^L_vO{-t?&xN2_H-v|Hz zG~G@(p9TQd-Cx^Wb(J-`#Tr$tJ$lhD$mlbdf}>*tu3!O`PtW0= zEmmbK3)J1LU%~}y4fg6P8rn#}A8_zrr=qb2_1(V#kf5f%dksbR3Nl$)Xe*Os^Y0ZffRZne6_`?@RkdfPtz;Do+p`{z z8gTVw@2r0>ns@Obhuz07w>&36FUfk?KN3I5S~Br7f>a^U$7U`+Y#W^!a^^=Fq;K9D zy6-z`hh=-Eo#6?YsJHv3gpjuYo<RpO1l@vflho15AjZ5Nl~!JjP(1_(!hMv5;L?2Kr?ImcR7CT}pf zSz#7El0fwSgjQu6*Dqe33R<5P zdCg4uz&*FrsnJo#DPqpv&zESh{hb9jrpPb0mBwE}&Ld59glE5AMGrn4&Z%fkxa$E_5muh}*q~`a2K88n=-*vNH3>d{Zfmcbyoj zaK&o58h`A~^YpoTyWorG;OFZ*L%WCbp*3lYqRQIiEULUge%>`Qtv9!*PmU`eD{mO% zj85iISGL?51=X_Jtu2`5N3MO1uK{(XybMjB3Ik)W+tLOi(n%24ZQdg`y&&C;`U4fo zMD~l(FL}LoLHeZ0;{oWjN2g{MCg}IRo=k}e4L#rjQcN(LlT3{V8J2d%5%GxwWMNx# z34eRmfKb?dFOAoP*GXiHy6!0m-_+gpRC%1xm;g23!W#Ny2wpf_b8P>X6d{K3Ncz;=ugAVBYTMbu8D@Q6sc`El^ zAHQua&y1)O98Nf!hifLDj!v3yLg47KloxL-G3$o{s+x=yAF^7IZAK-Qb|7E|LfA+_ zwY|fWnPLlOSx3!_lozeljHc-uoDP&J!gv#TJ)MSGXJbXLE^hyx4Y$?a+*%kWnb2;b zj?=6`4CCR)ZDtwraX!pm=6xb3E{dgyBE|kNcl`3}R#k5#@km~+U7X+6bYU=x0#JTQ9w2FMNmCE#J=-vyY%GC2&nSwL=~azL){dqWzOc{Q0gn% zPwpwR)q>Ym+)M!tJ)S7#*<2ZZ#2?Rr5)yK`rvrq<2QhLA9W0}Ds`3jx@1g0oZ*50% z_Tq9WKP${$RdAl4>=fbgRl5o{4*yJh&w56>>+eu zMe-*w4$SYtSr*Ey1PpsHt1XOXHGr=g%|=u3o0R>^lB2ZFKJ0Pm+h|rFTj=u_)?p=1H!QgwOPKQ fRyd`OKR{W&al^BZzjD@oCjd7W59cB$|HOX+rvMvS diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/preview.png b/tools/droiddoc/templates-sdk-refonly/assets/images/preview.png deleted file mode 100644 index e5856db199b56e9abf22f1530445de7e13aad883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1664 zcma)6|2q?iAJQo|w*B6PJi{eFzYBMt4!K*IgCy8Zx5G=pB+8FYr0mVxm<*ri3SH`6S2aEP;~ zb%ff+hEB&IbLTWJ+C~W2sSDYEewvr23S7Bl{uA@BA5R@BJG2&Mu`9r}wBFh*2-Mwochi5$->RS(mib$*_iuw=he}D+ShH&rA>ZW^KK4h-vX6j zw&ZPqX@}1CN#p7S5-fLUJG0_b6q?ZgO*KVdfR4y-+W3%{dTgYrocl&T+%J}uH-jU$ zRP=5u{4&}0GwsKgoFdciO^32E6T!nbty%n*ch`eB{}EffoAa=~%`(qk;!WlQ5-oN?s{nY3A;OWybqQqIQeCta&R)k-9iFb-S z2~{-5Z@9+&^HD(_qt>aFjIXemU{^YkL7-pkoe9Vvt z0V>mrt}AeV*EAbDC-2EHWlOr2)|QNU*3UU;yQvvu`egSLGd`hTlC)zTZ{KNp!zV22 zue-h5HA1yqdyVO#dN3?n3p4T#_juP)($4tkH4WnV*@a;33m|(K4V8nBz;k?n*q0u% z*t~Q{{aT#MYcmBsp54fqui%bCYH#G@Uyq%CR`J#7{UkwJ+SgXrj0|XG=1kP%aJJBY z)%-{kDQf}S_;j1JZ*=9vv>f`_ojUiN-_}aBLVJiiIGmi&L$xK2Mg3D83f2|-4*EPy zw7i%?@umBn-SB$l8be$?SbK;Bt1)O6lyTjvkOk)rd~I2SYwc$B2-c{cQ`|L@=hd$k zEUm$vR51+@)X7-zdNH5E!WhgXCurhCg3(=rGZlXrL>RMr#+Noy@M{@$9#4y#Mzuqm ze(kHQ%u7kIkk%*?p>@Zj>rv3=Ksm-vjde^2Gx`l6xM#$po8puELUrO&bw$sox}rv8 z;T>vGvBC0FOHi~^opZ*)s zyX;KY@hBQHt%4JuEP=oY{1woX>=vKz9~{pGD%;XSjr4TJY4R$Hn2PXK%6w@zpZUf$6`sa!md3Bz@aA7 z>v5~$ig8uG3&B%&DPq`{{QARPmulI$+Ao%DNuR!KP(j4*t!q?~i|*pgJx$hP!Y$oE zGpX&)h`w6~&pu=7QcQ(|vsL1~jid91JV6!lnNAzS0z)177*q^mLUQms^iu9QhqBL= zKe8T0SI4&8Ir>r+YvJU!+dj6U@WfsQ(=f~B0$lnEN|QjY1l-zO)r*J!v}j@X9tHD} zI;JVjdDTA3h85bS2K;wC4(3$xKYWsyzo$tvV`Zp_V`($*#Ki4!#4v5Gv5qG#gb zz#=t4_=8JEpo(3oY?BTJ5^|c-U*s`fC~-M;1@w^!i~UTZx9|54M?}o!Zr?nAxQpzj zWUwow#A+5NTj3&m<92(CCKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00028Nkly3SC`UfC(jCk zkghEo4L*>z}bROoR0&`-XsjP$%gBf#9tpiiokVB;yu-bW>6*_cX>A?YrCsW zdw0_=IO6eAb@CdU&>}~lGj!R-s7xQ&;EQ_EAVVfoKIH{Id2W1)(pi0?{4G{vG zCZU|FX=n~85GgX`L(8BXRyC~Xp#O+GTIj6fhEeUu;=7XAVJyJ1-0gOyZdRhqmW?xM6Z^1u~Lg za-{*#H2)9vydgSb4RVt2KZT>_PC(=aiRgA{^B=c9m4pg#IV2XNVUyCWfs6GHWi;y0 z0F>7>FoUuZ?3o9%P?bC>ht$58SsAKWK^Q_lW&xNnE!*`I?rcxoG;z(3nC07~W|Tx8 zPI6rbFKT+BtU*0rHFSh3s8BKTRo&2`mNgcUt`E2dwYNRuvjNvR;pRtjle+N&9@!wF z`(uzmTJaAGd^q=qi>&csnm;=)X}r=b6`K8&rj}Ihp(^AA1$O5s3=PP+?P+crl;TD s8CyzURp0!)Pk-;fyzpc1?vqoeCxq)y(^{MwKcDnut+HyoTYUKZ54QI;&;S4c diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif deleted file mode 100755 index f748097f43742e45f732b4ffeb20a0e9fb732b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2713 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 R-eG8c&hRg`nz{;P^FN@uE71S| diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif deleted file mode 100755 index e45d0c5bed0b1f244dfe4c7054025f91f28e5006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif deleted file mode 100755 index 619661626bad7c1a45609fa7c7db16baa0c9103b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3075 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 auekL&I--;3DePwBF^XO8=RjQu()u43Z}FS} diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif deleted file mode 100755 index 7f6a4eb0e38f6b5306c0ab5b86bddefd2c2f9648..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2617 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 W*wFcOQ!4oMo>;uKx!LxFdA{ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png deleted file mode 100644 index f3a6d2dc06a45aed20551a96fdadbdc55afc03b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 966 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 KG!+X$7XJfXX9~Cg diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png deleted file mode 100644 index 416493f8c2b1ee770c8234147d1e043d0967f2bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%9SHCVaoxXv|B)j{jvhUF;>3xwXV1QS_wLD)CpT~2{QLLs zxpU`!{rYwO{P{zN4jnjf;KGFq2M->+cJ125ix*$Kc=7Y+&rhE|oj!f~@ZrN}&YZb^ z{rZm|KTe%Gb>qg3W5TOn-MjbkQYAZ*3i(-zfNew8K(rvGmDXRbN^nc;iR?d+(l4JWrogm)-= zr9bv^C={Qy>~4pYr|5$CC-R2-Up7UqXZZ2;|JBDo&+sQ)Kg~F=Y)#+qUFZE%w}44uAhVLuyKdd`nX!Bw^qt$WYqN9JN{M@T^|0SCq&nbr3*B&{emyH! zM)vpZtk(*w?=P&6VY?t(tzTU6!vB8!{(~!(Z@2C{aQ|4GiwfhO|0ePO&5kL)SgO5o zb8v&i|Alwnzx}g!Lz4fWYqvE2ew$p$!Tz;-@v2zM`>koS=kDF2bN~Lc?MhQ~??z3S z+3KGoHDk}ey(_BpBkV~)bg%UdLn|D7nk#@ai6=J{egXatz({$eEIR!@wpPL_En*Ztv_uNb8{yj7hVF+P~ x&|-*lVTgG-YYtoS!-T*~tRFNP{?8-3BCXT diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-article.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-article.png deleted file mode 100644 index 72732754b903843e57d3240347951e74cf7a00cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2095 zcmdUv`B&130>!_GR<9#tjarV?=&N46mMNRINgFMfOmj;!dse27L~3U4Rw`7MI+iWe z%d8%yxhsQ-iYrR)3yY{MqJWAD3dkxu&)?qP@a{SHe$M^~SSIDE?-0T0|lgI2#oo3AOi%i-17`p%GE{5(c2B0l>sD zz~_?3*WObE#{Jf@*vbL-w(&d7)LR2n`DK015+!$GWvH2Y^E)H6wAZPdnbkD<2W~V9 zPfMvD^r{~6QmU7iWMgWrgfAhtkH?qypJDN_-kzL7$3ROr08pEC1Nsb2aQXH<*jH6$7r4RW5osfW3s%=~XRbx8_9Oo2jtBMgrzUJwwyaRT?pR*uP~g zdYo4xQ}IS;Km9clI3vUhq@&|=C6kMog_S|sDz9ZMW|;l5XA)7-@5&SP^2ELE6L+Pn zvu)$IiQKn!#LHp@YiPQlYS438Hla`p79}Hc)xwIBEtJzq+;_D@KD7DD5zgxs<@B7W z8%K?z%zV)5mGt?lj)_F>a)(e(>t-SZQgZFEZ_SW*)!;emEUJ(7WP(>(-tV%i5ptGV zxy$V{!cLK#F)Jbru?zZG*#ar0XYwI!zFe+aG#ZV?mw!FAHnooAK);~1`u{5ciJ?9P z0Mjln_p_JMnadv*+$_CpdQV1dezyCFjk)Wi?Ch5|CdF2-cJ7=3jhfZK#O-#S-v&E*lyO*_RrG0iPTfwGiLyaJy4%*KCg{tfo;*VsBGw#e z*zy#oe_&(BdC_hTi6yM7h+L%a^+9a$*7#WOIb-Bglin|{65&{;oFcJU4!;Jz4<-}XPfCTm5_190wMfz zN>cvmu;3W@O$-Kxm*bH;Dww{e_T`5zyoGouez}>S*_B}eylaA1W4PQD9WDL0%zE{0T(qA6 z2)1QX{-zkYnHpVv5{e*L$xmwD2gYkaGn!cawag%gDS(K$g1X39mj@t&1rH((A(|3) zxU|fa>|je$W(Jc(XzQ3;cV0L;YLq2*!~V3-M4Wl|t)nQ6ym3=u?&7-dJ421vFCzzH9v^u0N#t!qL+w+rV{P80~j?5l5>D&nf-$4$By*az#3 zHOJBMcAhCGlLwdJGIp42iqpSW?Fw8{^oK3T1wy0wIRXCqoKYMKGVI@WARc|yI@g$+ zMNnOxx9`}*K<_g6`wQTbV>1zs5k^@*e`}uB?q|#1g&$v7Zd{7buQ3)Yx6a?Fdz}9H zwFiyu^(Hz_^RKWIZ;G6eg%E|n8BF7o{!O`eciIRrkdo7@x|Pp{xIRu z`kTJmYvG2^jia3<=+l*oo~%TTpP8sG=_j>N2w9PK};U?eHKHAJl+)!R{M=AZBGz6#Om z99S>zblxj;x%An=5Co>=V53E zvz4uqpM4_nw?*&g(NTgFt`V3cMKXw2=)I9NP_3eXfG`Ig|jD9)eHFS4-KiaZcDVYV$Y z$yGU7k#$HxTaCD5+!t*LRiUm{#o8VQ^{72la(SJRR=@oSyd z;;k(?uu$NE1E}r8KG4A~Q(&*4V$mPnX$FXmUq0j8z~Nv7QvpW?+nFEk&We!W0Wbg~ XUNrmpSB=TqEdyR2e(q@3@JIgzSoZP( diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-sample.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-sample.png deleted file mode 100644 index 59b6b68bcbd84213304f89811a8f04111e62c627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2480 zcmd^=`9IVN1INE(RE|eHmUUFtZte4=Wjmx*sgScRixfG^S!~L=IDsW6W6p$Mbo;KA-pN^ZV!Z`s8?fx$Ehe>i__t=jq|% zyF27Z7j~fpHsM-3cD8ohLAfRCpGz30WUAF$Ya2`T2*=GWsd$~HQg1d+ zcy?d{r+@sT7-AYaHR&x`MAzN)}cIdhxLmIcr%uTQ`1wivC)ul6PW) z@tm3-Tr^*TMN(f3lhe6k8C+y80 z+?^Jb@5iaj4M-R4!n<+GGx?^FEgYusI{NT&3oC<6L4OO%`}0g#`?P=a)NcxM$vd zw~AgAPtLH)zs%n4#zl?JKlw^X=1XSq?CMEcUi)+akqcWAqsU9mXvUijrAWHLSz1L2 zr1*Nog84|9M28j>968^w2ixIy^fWo-T_L(t0+jjyZ`glqE)D_=**5FER*al(VZt)Ju6iq@%o z35F{|wxO>hsM*9t7@AqwH2Lcsr*18{7t@>$+lThV_oZ zYv119{*LJpxU=}>WM8kVJN5rWz)@b_8vxk#%G1Tk?;%-GvUt(R-DtpFFZcdr z9x#m~g+42UM~e41ZAG6dY=>)cKyw*b{%lbw)l_>sookd_^vemn1qbxQ``d%Tbrz;W zTj!uaCP~~T0puO97l4!G@J~76e9i=zod9>ci5b^!LUc47ay(pta6omj!tI?jaqX?( z+2GO|(*eVqW^Xm>2c7y=XK^P%ttdEF5leV0(MovSLoj!%L^H~%ZDCov#J)s%VTV^LNcmA@$H3oS3FgV3LDy# zKf83Ve!{w`eXQb)0(kPJcD;{?ZX(`ggEc)UT!CI>dyKZx^Ga2cRmf9Yrh#{HX3&o# zf2h)k_)Ck&9nMP1<=C8Ow2Og5je`?nW|y4M}(q8*P`Oak;9;w9L57XnfkJ<&4th7pHMANU@(BTu}wALaBtl zk4t`-Yfd*v{k<&(4IqJg&GS?T6W)GJm}J+~*N&oY|!7UZ3LX!ZEhfZK7y zV54r8x6+lRFz;E7rv;U_lSr9Rj%#@r*3E6T)ak@PWUh7LTGx4SL~oG~r55_H_Bbp;%X9R#NxJRuRKk-7I$URfK}2fuWY$$Opz zK!UJ2WN(3QJe|8k~(au zZ&|b_;KG6~k9akgzy_Vv*wWm%5G6iJT-QFW9{vk**u+g$xCiSVkt>g!MWRWrc#M5~^>cYW>LnS)F-<>$H`i-nwH+862@$TMZ{{UNo-dcan z;|l7nKzg#e?o&+U_BtBjoxBpz`T6snn2N*$yS0aZv$-c`Um&z+kgN7 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-tutorial.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-tutorial.png deleted file mode 100644 index c32e89a584846558d55de0c0edde3a24fa945393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2544 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 N&W^4Q6&C}a{TJ#f1>yhz diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-card-default-android.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-card-default-android.jpg deleted file mode 100644 index 398030f13429e0ebaab9de285a760a146ae28e02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12042 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png deleted file mode 100644 index f7a411cafb0f6308a9b341a989a863c55eb3f893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%9SHCVaoxXv|LN1GA3b_>xpS{xy*hgI=*5c{@7=q1|Ni}l4XlP6D}J$rWb>ea7bzh1t4`O1|muV25udGqF-J9l2Zc=7JtyHlr5egFRb&6_ue z4jsC7?b_YDcVE7IdEvr^8#iuz`0(M@ty};9|JT`?DFE_)NswPKkV^?*I8?pSg@J)7 z%+tj&q~g|_X_>{F3dC1c(_f=MS>FAEFv~JC(uz(9cWWQVXseVVugdK!-2DxM87A&R!qh zt{dl>q*N1Ur)LES>MQ-aX?Blsfz3ZNhF6N6p}wDE-C7wKl;_B2doO1=Ft168Kc?XI zjhEcaX;wua^h|VoJl-`$3$ofIe{a;8Rq?RdRDgAlP^}>&(;{!~f{C}J*H2(r;B8tI z_J4}Tfh;zQ9l{J5Z)${oCtNgOKTtI9+uDlP>dHqA%#SgO%;gTa_GA0rpYwNy1emHc zKZw{O?=og=k(#* zz72=}ty@~!SZiS<#h`D_sQ!8>B$e_NhFs2^>+W76<39 zE!_1$x5UgWv+yAMl0t=Z?2op6oVreaxz7DbnGDzYqi%UTJ>NJpM6u)Z-o!WGH=erk z$tS5hG}B<^?rFC9>Up=B`#swFo z1!JdZeY>j3a`pAMuLi9@xUCl2PBu=-wVX7$y6L~y>};+WnZL4oS9>{~-(!2$geU4q zT4TA=-iUpZR_SsvoUkbS@Rz~QsAUm@&Hq(ytbE(+;usR9RxN&VG`nYSd{xeU#_|LA eS!=ir7?PKskl(-c&wpTQW$<+Mb6Mw<&;$S~Bp}@Y diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png deleted file mode 100644 index 10a14fec1edae390e304950b21b775d5a2de3a43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%?F#S-aoxXv|B)j{u3x|Y;K76Y_wS!Nb?Wfp!&k3fefaR< zwQJYjy?b}@;>DXcZ{E3c=itGE_wL=hapT6XU%zhMx^?p8$v=Po95`^`!-o%t4juaa z`}c(l7w+D@d+gY;Cr_SSzI^%Y*|R53oH%pl%#R;Gjvqh%?c2BW=g+@*@#52`Pd|VD z{QLLs(W6J-zkmPq>C@Y{Z$EnU==AB+=gysb_3G8jmoHzxe*NXkm*>x)KYsl9Nwb$d8rJw)3|5}UNtOie)wX?L(^IkRkdE~?VU`CbI zbuYB;Nbz=VaVY!v%pqb0-v)v8?AMmCC3rJjSj}jn6`%E!pV2d8n>-^^@Z~w|4F|3X zn9Shcww-a};)OyB&gC(R$X@=c^PoKAOqFb0Zhb7%IYy_R$O9@*a&@{o9>y}1{J&$X z!|;FZAKoL9oU0o;OSxz82vi=K*pd^)_-C<~d=KlamMtm`r%pSHCOC`ozPYhie#X8p zFVDWd_rh<%%%kt&9`ND3(t$GvskV`j3mrcEQJ#?Pm-CVW&J9w;rz!d-A5bZ&h1+@oss)?;`Gl_ z-5c!^8Z(ve#O5d!th{i4N+YXy!NfKTh97R>M^X=5{#<{KTY*E-NnU4zf&-Sgf$f3@qYr(D8Q3rItvdlXmeB#x724)5wU!Lc-0iwr&37Wyv L)z4*}Q$iB}D#t5Y diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png deleted file mode 100644 index 8fd5cae4c9bdaf096fc79f70082f89fcfb389d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmbVK`A^bu0R4PD8=K2A&2$xNYu&Zh>=+uDM>s=NYGxM{WNOTdwA09SOsg%OX0B-- zwY0-hXBHiDs2n1Aafuu%pa|$t1PzSnU+8V`y}j-I^0rrk#l-o*f?xmuAN29)WS1lV zah1DEYdY^4UABP|lS)a+zDy}3Q zk(kZqxw$zOi>1|SEfx!t$y`}k(d+e#i;E72V}5>qX=#a0r;Ekng@pyX-OlB5rBbOt zATSz@-QC^G%gcjb+x8)r*a-+&!oHv)p1e;UiIu1kmt&tgNG_(Pn$O{fnF=^Cad_Lona zR)3fu`bB`EvKrF-GNMKzk#rAG8Y-iUNkGl03{1%=HF|+3*k|M(Sep-+Mp8fOIeXlx z5Og8p%3U}5nyvDaUyC8|Bm~*8npg$us#ptA!=!7LO%AHMV%zGgsAB*VSBUgHm}xV2 z;?)_VumTK=nrYbj)uxh0rmmlLC;Rd`Xz6$TiU8(z*!He_coPkK1{w3$bn9tTFbIqVj;?)b{2||4MsR<~$<%=A)3BtIGD}KxzlkhE`Qm z3hVLy{@_Kc_v`b*Q{{GeY*iAkKt?9tLF#g;xU8FDiQc}F?|pB}V7}5%L(nek7W~pK zxYO$g^a*i3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{JSR%D}?L4wN($ zU|?cmWMXFKVuwmIGBGf-unGz(8j3h3vI#30nFbb?OxoleoK!S%<3XSnaiGtECL#l% z0YC`}K@1s2K_^%g(l z{p8JjAKU}n0}@gi3jeNb{LKAr%hbxRFTVORGY8m}Hm=qwis|}kf8e{phs%9a1zd#-J)Og{c?8T%RiTNnLm^S%zb7{~6ex`Q%-j^t#ySt$2D&PT^VYc()~gSH6FKi3*BJDIfzy2uD#7 z!~l|D0M`y-{6D}T$iYy;Ai>Ni$iO7X$SlbC{|JLL(5Vbe%!~|hz{teP&cMvV29z`s zU|?isWMScDg~@`{va+xVDhe4U778mVn>hxD6i=Ld_~IpYF_pk%pdJaJ*MR`00Yo!1 zF|q(9d7L*+@NZq8Tv-oT0m4_Q|v~p~lKI`q8eBWbh@7@cmmG-sRVY+R{ zr!%jF+=?@;4W&b0PtJ&zn_I3w&t%?zhRancACA9HjO$;yCCajP+R2|^)t)5ve9E!E z)iHbD(V_`a_AnnYhcqh+q2cn`TtD-lVjHX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png deleted file mode 100644 index eab992063319619cd766aec87e2575fa356cafda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmV+d0sa1oP)!BEG%o-8H_iDW@IK$_8n0!k{==r{ztT#%YybcN07*qo IM6N<$g7lwvsQ>@~ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg deleted file mode 100755 index 6d75be1df3b09efbc2f60404ea013f23c47ca9c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3060 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 aB`u4ew<4rsZ~Qvq&A~UQ&H9WTkNqF7`PN?m diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg deleted file mode 100755 index b04deb3607d4d632b84a20e327deddbe5a9c874f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3151 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 M+r6xhy6Ln31w7k_N&o-= diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_1.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_1.jpg deleted file mode 100755 index a992e923d8453bc302c49b5eabec00c51ad8413c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19240 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≫53*nQV(r1S{5^cEeYSga&yt#`MCsV}NK2g3)_Aj*6=nO}dVr~Ia3#c);9-E87oO6!z*=;CoN+g38t8tiw{;tJvE zv&S6ez8hul8#~7r*k|GU#Rt&E*(u#DGDjG1Ggm4xjkJNeAOo`O zaN{@nvHB`YGF!rYQ*N->>gr;9WWCPzwkmhE<)SwCE*Kl+?W@r~m#D{!3un%Z@$SFD zguHbH`pH{GdgW8j17Aky*&zk(-yh{Mo|*ZrGV3QU7H6q`i0sw&a<_;rGT!WUESoUW zLlbIUrT!Ab;@cTG`6*N|>8>58j>k_;Qs=`%Go3Tv8^Hja>c$UK&*F&j7Q ztIT)opMM`78BA|=%l(F}zT&@1Z7|+#wJmX$nUq47r%PN5N$b=M;Nzm#{9Y40Z_~F_ zy*r?>%fhzX1=fa&xz#gP2I($|?9P+3dUYAxoGI?&!;dUw-M_-Mm9VxuX9s)zD;-xi zxjr3La$xFY*z&jG^v}rs>lu#^boaW~zvul2>Ip3+gXnij9Pc+?c9z4B2PgVoUcd2v z3M|93&+6a%E8l;?OtFAgD$=6BkkgJEAeB6vASrX4fPVkc3G||tAX(!l5nbY zl@i5*!{4GPhY(k?e>TrhZ&Wj1-V#($!@r41y5zuTMfs+Rsqhe}gS~}OR0M^t-8~1< zJ%?2pIF_b9-sb0j-H-nOE5G_*?qA3KGUf0^#CiQIyMxo;YJZAX7gPJWersGj0&~xm zy%sA*X92KC7uL*ifUg)qSnL&cC2N_SeAIzWgn$&N9b*Z8rFhiTBN|(t>D0RvWRzNP z%9=A6!&Ftniys$p1%>bWGNsUSG0bin_MCdP;lnFVE`0d@G$VfE3#IO)R9z|^G=OPo zb^rs=HJ~(p0Z%6`S>5ICaI;pEkwiL zt!#la6%3h3*9491pxp-uB~wa*+6<|}G&VAxY=v4aiEPd8QqWJ{;bV6xD@tE?V|Hpv zkxTCHCoN3$iMq^F8guE1T9N6|e?1CgPCosCfDkmR>1Un73rZxqOP;$RkQXPQlKNW% zbR`pajP*>mi>{F4s(MACrn|yBs?sh&MbbCOjR}#25{C?_s+2}{NpB3GCXi7nKvZ0U z4>R^oMA}nXF1Z%?Mj6#AiO`UHR>&K6BjQCUcW!)g4I`??wS#MI&7PF$^93qr%bgBd zM~E#vqOGPfz1iu6sFczQmbhqlnMG5RH1$Z`jAfbbfT)wHR7GDGDn?=3IRqM_n;ujc z8KKElDqEjnEyotsf4IN+u`fsZU+!PW{WIn8QN=&btEly@sQxKjJx}iC`K_?<3^WET z77}R=H@CRcdzuM3pU>ZePU zAz1t)OWTIM-ic`T@VLr$Per$#QsiiD0Z`ymJ-lk1mWyaQt^E_xTCd*To{_W-WQfsi z2UR^iBIJXr9IHvWDs;{&w9eNX87{_C*=Tbu?HD;xYUDAeZjcsra8NlRO4fElk#S6e z$WkRlrUBNxwS`n?N{;1j=XD111BfSC)hZyGX`K|F6&Xg6q_@>NMqsR(0=rR1%n$CI zO$7IH_6d@f&hq??ih2eVb2?Vx$`uyCai}CHIo{zSsG9R7adKoJ&7-KwKt8bU$(wQP dK!570pZ6#K02U?a{{Tz<%lQ8QraZnM|JhBDQ#1eo diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_2.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_2.jpg deleted file mode 100755 index 9af63f40c4868db14a6e0c4cfc56f173195af069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20188 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≫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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png deleted file mode 100644 index 185b7e8010de29c0502d9fe0dd621af167abf446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7283 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 KX;s7TWBvyuYj4;9 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png deleted file mode 100644 index 7fef43e754b72f333119a569369cbb3ca14883d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3121 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 LNkvXXu0mjfIsVQ% diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/stack-arrow-right.png b/tools/droiddoc/templates-sdk-refonly/assets/images/stack-arrow-right.png deleted file mode 100644 index 46d6a50208ef66d09600e18bf38fcf935a84f672..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbNtU=qlmzFem6RtIr7}3C8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1?ON>1>eNv%sdbu ztlrnx$}_LHBrz{J)zigR321^|W@d_&vyrp2xw(s*p|OjJp`ojxg}J4x(xwAm%KD6=dz#jPkmR{`v0t4!Q(alvUG zRBsASx45|C)TknMZjdO*x!Aefr0V1r;B4q z#jPZhd%vbUT(jLon3hJI0*JO6`U(*{l%Lno+W`22py}y0Swm_{sLXmv=wY-cD2&s8}8Qs|5LHG(C_`^ooCw@veh*HY?|WG@aiYu z(f<+-XN#7oS+WZhJI?mmBei#SZR4l^yw~qnD?Xb)iBF`MA<0%@nj@EPo{)j~6~2hi z^BV7a$b_3H{PwS%% z(~R$};_3cT_4rMF#)aB8R@)1o>aTdr(5blf;mmX9sgoBv9%~RO-@h`|GLAjwbWt7O z)c@UA=Kf;#5)OI0MnGeU#Kd1E|2@wXxiB^`Ff-gbwsaTE@=QNa(dX&v=d#Wzp$Py# Cv;?XE diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span13.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span13.png deleted file mode 100644 index bab6aca5af3b29780629d6c70f3442ae9996d92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64431 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�HIA2aoZdZzEBJg;LBB&6{Dhh+2?BfhD# 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span8.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span8.png deleted file mode 100644 index cb180bf918f09de4c8b90680acfd5531a8c6c1ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30679 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 He!%|&**CqZ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span5.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span5.png deleted file mode 100644 index bdccc2f2324c94a8b31e84129b4e2ea987b778a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39994 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 ob33ymf-Gs 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

    !#!TBZ%-&%)zk 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

    eZ2r|qeyo@oE(cm8cV>|L+pZ9=tK2mi-(J^!Is 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 z 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_land_span13.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_land_span13.png deleted file mode 100644 index 5d37121e6cc214e3b14acb5c86d1c3991812e7a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57247 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 D6AV%^ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_port_span5.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_port_span5.png deleted file mode 100644 index df351171b5b02ac90151ec36e065c4287c7f1c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33589 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 HanSz&kgF0( diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square.png deleted file mode 100644 index 077a7e648bfd1c9ab56353ee8a2c95ade50c0f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13039 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_left.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_left.png deleted file mode 100644 index e887b2a6ebda2e21803dfc85df57ca098125074e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPaixeA|QRvP^hy|WZ#h9>XF=)u=@Utt-tuso;mX--#qR)e@Wl8 S)H6T}89ZJ6T-G@yGywp%*iEMZ diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_right.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_right.png deleted file mode 100644 index ced7fa48d2723b401222bcde8703b30a6a14a2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPaixeA|TzcZUDL|nVPZ!6Kh{JC$ z8*()m@VGrp-`m$bxk~B$y7Yi<@Af_?rp^!b-Y+M7YGZS8aVeU;S5E8L&!gIDCgIXlq@PUEZ^PU^2Knr>N1PJTW_6HEGkw@_eYXj!O*(=~N=os2_TJ!UeV24} Q4bVOYPgg&ebxsLQ0C(?9lK=n! diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_up.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_up.png deleted file mode 100644 index ddd4ec9326485ee1874cb76e1dc47ec11a4f6145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPaixeBDIp054YoJi9r;B4q#NoH+ zHgYx?NU%O+zU!`i_TSW{yIPGkGK3Xd6=pSXe0S{nF8G)~899*Wq`Pe$&o9pO3$9iHOS7GR~NCjBctJ;QWE1eiOolKJtvhsXYi5Zeah`ICk$v2gQu&X J%Q~loCIIg4N16Zt diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png deleted file mode 100644 index 5f09a29fb8499e6412e7ab185574ba6845d6138f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^1|+TAxeoy;#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wkP>{XE)7O>#4jZ4ixkdWzNDH8lWQl7;iF1B#Zfaf$gL6@8Vo7R>LV0FM zhJw4NZ$Nk>pEyuav8Rh;NW|f{mp1Y?2k^8!l%I6PWTj4EYKydz;_Vb6wQBAI3~|kE zj1%Uu2;K>g{&v!A#>|_ZrqNw0y{67yn)_d`3AyBcY5TVGYt2|bu*C@$o&=T=fj BRKfrN diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35.png deleted file mode 100644 index 3c2dc1adf546a583adb8537eb679e0a7bc81af5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1437 zcmV;O1!DS%P)500001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RZ3J4G)7{eTzw*UYIFG)l}R9M5+ zm|JXARTPH5wa-lHz4jtOdf`$oDTNv|Pz2PNXrgFBVhm3tK0$mn8U&+J6Qd!i(fFc4 z6CcEo7>y>5z0C9)Lfpw@_Wb+oz5ZG2 z-)pb4;s4UM{n38M)_%XOYXT}O;eJ2dD9Z= zsw#Nk0=TW`cp;2j0ftfD){WL>r0y=BU>?|fTEi8 z%INReVrk@IQh{&&-M2mAS4}Z}F4!b3lnN9vS%`r6%Or%WbH_A2nUtP!RUNC{N#@wG9 zv-xOE8BINdd~%}~ECVrzhKKoZvS_lIX5Hl+QPfo@Yp%jI~321G8wjd%1^u}#OBrqrS*E=B| z!;18QF@hk8Jd<2+mSkKn%{255B%lN9mO#fy*6)?Kmbj zg4NgKd1$<-XRR4y6jjdkM2Xloc_E9HdD+_W)cw?5>!LH}u=`Rc(M!kG%FUs=uz==B z)bm7cj#`mkoV2IG0S8%B1dMRY%3$4ziwPn+ z%Jl;L*40Z#bQt50f4FuT*e)1rj$ulbMNz#)vd9t`PXvs`>7Gaed%m;~T*t3%X1lc$1(pBt`E)vp>^}rUL*CI4 zBsL=u4in1BVf~>qJ^=$68IYX?u1rcOl*Yb{$(R$$0ENhOKlx~|@73RW3hGXe z%p1+u*j`!w`;tNWN7ZiC$L{JIblJsbh9YD}D>1G0%x2hMz7bmHI zXyx+93Nq_6KycMt!Bs&u`8&Ykwm5|)GLl~?aYSrH5Toh~Tm7V|!A?jc;t85@hx=)~ zIlwyL=!O-WR5i5w+|?%)+%efLMclQ#fSmsRSc}89FK_hhkdUQ_@ri(l5l>4xJu)UU z-+PPf?&ihLK}5s`zMtXS>*0M@ZhZA>>&=7Rjtj<8jG$s>=9!@7mXyr;J^J02Hg;An z{7F@dR~>I|J0G=k5nuR|oKJ>3(Dtla#M{knh{)~pkFL(!Qj~qf%UW|e4(8Bat6s#w za6df#F+bFkM$XxXn9PTbYIo;@w?LCFz% rrt!+EyMFofbNfGu{u51CCyf6G=H!R}(_Y3P00000NkvXXu0mjfc<`tX diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35_2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35_2x.png deleted file mode 100644 index e34be2e28c8cdb8ee4812f563bc471d3c415227a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_action.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_action.png deleted file mode 100644 index 30e4cc7ec1dcb86a37938c85a5b74ccd48de3d7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TG%*9TgAsieWw;%dH0CG7CJR*x3 z7`TN%nDNrxx<5ccu@cva66d1S#FEVXJcW?V+*AfbLw!RFeM7@XC*B+as*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBE!_Ip45-dHz$e5NNdN!;ezP@6zW zkY6y6GH?h;C}^0lV8ek64?gS;DK-Ym&GmF~4AD5h_0nm+!wNhufdw23J2k)m-@mQf zrb{vP;;PL~R!#>bp0^j?tA78@L+{|+mzEB{I={}3Id(>T&xVr+KVK~`dx;62} z+gqD#vg39)`t96TVgG*BY$fyij{0>w6qj4~X}+A7@uN5{qfuzWp|1X~K!-ATy85}S Ib4q9e0NZS>NdN!< diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_good.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_good.png deleted file mode 100644 index afebe1c2f07b138f0e35d313c69520623efce5fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^{2H{an^LB{Ts5{fKRT diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_movie_inline.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_movie_inline.png deleted file mode 100644 index 7cfb5c514dfe88c4ff8ab45600c2b32dbac5e417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmbVLJ#W)M7`9reph6L4gN4IIT_E~mwa_L=jAIGrja z2H2QbkYI!biJ5_!A5ey_ATc8N0l+zl3qw^TEZO(r_j#W8^T~Si#@y_MSwRry8f#XI zucx#3wu;9Wn1Z5;4wWw*@ zRiHowWvIwVDIm>I6$3&rc|@*8J>O_qs}n7Ls){|vVndb(gMlrSxdu~?%(c(z%$_hUym~f!aIP)+*^D;oP3!H-=A+-86g@Bi diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_phone_tablet.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_phone_tablet.png deleted file mode 100644 index 003b8764e095e83ec41fcb940be845a08eeb5e4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3En2Vh}LpV4%Za?&Y0OWEOctjR6 zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r5{ zfz&w{r6!hS=I1GdWag$a7#ivuTId@ZK05K{5Kx75fKP}kkpBPwKaj)(^H}z82a0l* z1o;IsFbJ#p21g~N=~f>;2o&`8ba4!kxSTBD!pbA^xmDXL;Q;3m@%CctTMjjyY-}0{ zZxrUsU%Ys+>kPY)4D(_3-|HEVJkMzVEq_R#?IWwigIBDAH5-1f6uS50Cj;MeOAk>C R&xarvc)I$ztaD0e0s#HBS|k7f diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_use.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_use.png deleted file mode 100644 index 9d868b3a1c1363cec49cfa7c895901da8e508649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TG%*9TgAsieWw;%dH0CG7CJR*x3 z7`TN%nDNrxx<5ccu@cva66d1S#FEVXJcW?V+*AfbLw!RFeM7@XC*B+as*nMx2+mI{ zDNig)WpGT%PfAsA%PdMQ&o9a@R&WkBE!_Ip45-dNz$e5NNdN!;e*Yh7p+SJj}b2IxQ z(}9rWSVpH-Q$`1_%?D>Syp&{&IXH_!{S(`ty}RFUKE?8{?mJVY>z@7YyR&}k%x*j7 zVV1hha`krhs8>^Y_ik9KKD%mzaq07e*XEkes*+iE@sjZ@xBGvd-->9qFMGpnHHWu` TqgAsH=v)R*S3j3^P6$T2aqu(GjpaB^|;@bd8s2nmabiAzXINz2H}$tx%-DXXZescUFz>*(s~ z8yFdzn3|beSXx=z*xK1UI667IxVpJ}czSvJ`1<(=1O^3%ghxb1MaRU(#U~^tC8wmO z@tx&J1=@1V)5S4F4+*HH9Wl2;i}AWC~-G zN)CPZU(H6Kt7NB5;m-5lY}hwnpO-)3U(_G%;`ogzQIX}d*W9pwcj#nAh<$`y?uVO6 zRlEPc`jvYshp(r74ePh%C1+J$hNcwBM&Ep}C47r65BsCV&MGIjneV9XIkCX)fU*7d z)=L(>Yt`4AJc(fGDp;>9c+U08*1UQ5iiKl$-vg=R+9yYMRf+TBjZ6RUx|6)U{8CJB*>kpT z&*}wCxw0pCyUmYvzv|l0>D+o#EMS|1o~vKjs#)50|7uhYKjmEDE0ks}FyWJtw%?cI zhd0H&cv`agSM9SGw*>t3uUYH=`nCJtm)Fz%{_aRVkk}n#zW3RWrHdV|oo$MoykgE9 z99w2Ju zdA8-smXrxnY@4^3I2$yZ>V^uqvaDlU$DPM_C#A%jagL{8jri89Yk=l4c)I$ztaD0e F0szMETp<7e diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video.png deleted file mode 100644 index eea34852e75caa3536a722d4fca50189a47e8f71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3338 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers.png deleted file mode 100644 index 1fb22a2acf0e2b6974438b8c8fd8d5d376c011f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 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 E1y3iJ>i_@% diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video.png deleted file mode 100644 index e9f8ed24e3f652685e802465cbbb2500e661ba3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3219 zcmbVPX*`r`8=p2=LQ+|>OygKeV-{wHVT4&C**Qd(F=iOd3^St{TI?d*LA0nWWsOo% zlsIZ^B`3rPV{1_;qU`aGmh-+J&ij6NpWpL5_kCZ__5WY{hbO_-`jDi!qBsBmkhCzz z*$Y>#^+!}h_)c1_rU@4XHr|Epz@V@>L?#(v>cj9R11)GoU$Q-!=o1>;N;U!jHu+H< zUDz&GN6;h&O^3Lyqr;^I3DE$6(LrtykrY5?1HH+P*)k{!aV9Z6vUBm*DNL1Um17cC^9k=aBbmljB8p}82)cV4t`zb=M=fZtWv0T|E^ zr(CRTfmjBU3`FSYf=N&q42VSP!1NGEB~x;hM|F9c>_V6e^shl7P0U{)xdP2_^vp{Hwrgu(E- z2D%7cEP`N)L=kkc`Uu=FtOcFLCelgdUv{ZNyFamd{}YSGGRZ_XgXzd%1pev(TR#Sy z!SZ7S0kIB9pq3SpM5V6__N^D_N4z*PlX{%&Ltrv!!0#DGQ~$vOJRXIFBh2&>g#Q-# z53JAslQoFY8OVBj{71X|5(#^7efxLw3lD#f51B5U8K!VJu9wm<0Dx$N1jGJANR3V^f;TKxTELmiG~NTbBKvswVZSdqvH%CyZ{(mtW%bRwndl zlvwV;%ckOzEgiiPbg=#XQAImP+ue8*6Y>@Q)L`f}S=}j&cjt+ARBb5h{M72aC*1f zg8(qODtQ86!z$+m=#y@x0vGW7HC$%ACAK^gSZvz0(Jp;g%3}wqH!7b}Ym@eBX>z>*YW82F5<_(KQZK6oE!FMShnLJmvQA}^EDv0t@MK8Hz=(f|F#k~Pz zfXnVENq(w^g?a@Ea?n?HOfpr!x?H`1J1VQgBv3R2%OsGI;RX%+Q%OHjRm5Zx%U7K&&pFisRnuFD%gFw*~KX~!hC zwcrmgg}7TsOl}$Ue_r$NuqcAj`&rYHMmEHiNJgQH%(lJu@1ZNuHv+Nv?2B~$#pr&M zr4!eJ=Q1`wG3L*OG~_jA_;oaebsP^;Nk=9}=I?ZXYA|?A8X`1>*}^VEIJi)M`>;9OUbERuc5M7bIaAOJ#*%V-j!aBo5gFKjy~P0d)+Id zUQB(O0KMA0B%w#oO4zF{r(mto5~y6iOPwEQ)`I_9P?)uutNy<1Yhy2a=RtI|5Hw$h+vUcii(n0P!oL4uMtfuhF{hqy|UDL)D9y5pRL;? znvI6NOH7!Stk!T2?#xlKz6xHc=CBH0#FcS3A-@_w6ulw!<+t9>*@wNCXmHmHQ zZd%A-dF{MX_NmDAvf0a)jJR)DWzLJzW|a@ajd9{O>bany=8EuVgU&Luqpsrn&BAs_ zN6EhV?XM&5QrS7TyQw}-tb=BRjWXI;C4<6m_<+HWr2|Pxx192nR0I3!`^%&a>fhb- zbE2qQ*T%=KHpW}@kw)ZqQugUYZ+BP_@z1)+L-j8DRgPN*AcpL4E1@wV3vyd}&JXoT zM7e7vYsGM^utCdk?bFkapy$+&6P4)3*=*x8!FO3}X<}}z7T2MlOWVeH!Bq;CL+FPU z)CY4la`)RK^@^5ym8!BxeVA~ZbKPJmJ8AT8D1XgWs`kpOog7Bov(>0lo8gd&iYDVr zIxD5F2Mawv9%zm+x)Lk$6eIp;-i%uMQT#45LjhFzTvfTIeKQ?rMb@pkKmaGGJnCTH zE{ZE?`0F(Gsi5#x1*d2KWf$1v7lQbnYMR*H566}|M4jSLvBCUzq?_TI&KlRInNcsd zJ@-g4WohQWUg*l&j5U<&a!!f0xu#TedzquWFh81kY=B;N_;~V3dT<`l>Ap`Dc|@g&Q+J|57_B_*Lv9PtNmTsda38@+^!O1$ z?4%$q>&;=vGRa|7$1w|i4E@0~qPW8{uXp@_{8?VXF>gM_J3ir=19V#f5u?-n^s}9i+&#Y>&os{F% zrL;COrKL=!YW9HD62@oW@7$T_>a@M)PS>GZis8*lOa-LWw%Fgb@9auDbdP_6BI_xW zBa5;ZA7D*7u8i!U9!PzSrElI1z-3jjbRya$3)xaoEwJ&s>>5jdZZdU7tVHP zgTUM}l4jJ+t@Y=3U60zun>e|e`iHXnwz=H0O2pR!PmH(o*C)l!4uvkqoda(y)?8hP zuwS_lP<5{Ja|(r*(>n!OnY*g*&XMl}rY^Q!x>zW6&S}3~+xb-Q$N94(M~;+hWo_?@ zAF6&W6Wrk4wv7{xYKU&*!-K)6e!Dq&RyR1;WMb8`mG}G8x(W&Ll>2v>-Mk&CQ~a+J z8J>xyjXnb#^Tg>6$78 z-w|`s;3PqOC@vB;Z(Tcjk$TeFvr0Nt?#$?m+I>x8etb~vGz{x(f{a0CQ8>(_sYJ^! zqp^bW3tY=vZw7n1N8Cu=%_6I36R--M2f3<8-AIz>lTINv-8w0da6f$yaB8g0xAsv$ zx(T62O@8q{p^`@QCGQkXvDUx{%JJqqSYlan6 zo{W+QRHc1fQ@y6&O)y;N3^WF%Y=2UljIewqXP55qVM%f1&&O6SLkG8@QgE0J4UU5O z8n;Z3+4fAkwzspBBCD)NPFA<$mXnJ{uB*-WZZ4bRh`2Q!I5aotJ3f;8R&w9nERZ0R zdl-zp-)EcAVOBpIC_#wbv}+5cF$V9*8$}z0*`Z*&IV~!!pvt3+wK$m_B&@&A@%x zBy>Ybi^P``qJbBmnX@c!Et%P-@fD>nz+V;gJRccTP57{c@zR#%+&#w~3Sr5ZMrEJT zT|@gGy%|PT{-QnVk-y~a-?%L{t+A?`nGW_EptL!qOsvJ}7rKSWe@>_GRQ^(PbNgsL lAe;Q)?Y*^J(G{DB4S;xH|HNER=bCPhH$y*B}Y&;(Qv1yn?( z_ki>WB3;FY=iGDO`*Gj<@%GqzueIiy-#5#ebL=s8f{}qHJq;HP005xZ)>1dQ7>)is zRF^K^Da`u~7XxP?(kjpteLE2Agh2sRT+z-bptg^b8_ERbZXUh}&~A4h2?Ko{09 zuD9h))HVKP>tclfxd#UN$xBFJu~;xx3XI0MNkHY~37nIk1QZOB@bUQ* z*I(KJfhMT`cH=*42bhKUp(IRD0q7u%%f)%z7WfBzk-Puf&>zJMZ{!Uz9v6q=h;R}WWthzk57i?Y%XSxJZt914X?N~*wRp>l93H8mtu4)zbnf5Jj# z;i?)iDX6rRoD39-l#-KzNvXj!RAgi|q}1Rr^?$J1z5#(wzAmVL?0Q_-{TCMUe`4j; zFes-$G{y{#_Wq{=jNH+I=m2-LA5hIy26$cH$;HF>k3i(l0sS4XItt?vjB?e$pnZUU zWmw+hKX`yd%F0N>RN*j<|1I*rv9AB0tVvurBk`v^{ztj|Bf6-;Khu8~|Hb0p?St~Y z=o!pKa~NdZ$OHf`XKSmgnBitV+f&<_qh@~J>UjPLNv`g%@|@zBVlL~pk!r@UV1RJj z$D#b4b!mB*Y3HH}RHXGvcG+VY5w4V+%8HfVrH%(cq1TCZAo#tDu8 zrEh|SuvG5>!GSie7x4$Y&kGqFOmVnXwYl_;j3uFgtEAFbniY5?Jed7S{FT0;2+{-= zf-9kn&=aTjYQV{!O8IUbtKvG@h9(d4XZ?wS9+KPlPEW!%lO_`*TTyeM5HtGfg5J+0 zQ#Y4o!C(PEfgx|gN<1Yst9T;~p7qP523M{M>0NV~)G0kXHLV7Th{pTUIN6f93e1)v zj{uGhIxQHk_Ds8Vg#{xN9T9&^AkwDVRV0VP>h{^_>+d{viYCll1>}ssKT+}H7z$(P zmV8QTWdPP&p36J;9arsXH3w6I-}FtBoXRz9aKljIl3Iu+;se(3J2>b!8iH-8;YY{m zV{p^)?*p^t_XD32ibRF?k(d2KsOXdci)m41r+Wx@t~{EIMFe5%&_sPImzK`8U(Nrv zi<@heQtZwu2S%1&a8v9izs2Tnb`$IJBzihxjc9Zmg=Ky!j2U)UmruW5qcm!Nb`5@T%Hk^6qs6vZrsvn1iUWPqZUcBy7j0i@6o}Nl zG%6N@mHKN&=;+zQO&f7u$+Ek32{Es4e1#k96|3cQ-HUKw}X)g?#V0! z(kl@<`fIoBiH2ETF8zDqN0F@bpsI)VW;2_|@l{*&jtBxQIGu7up3dQr$A<0)YoGZ( z9l3^gVcdP*TS82aUL4vH#zINn94+e-WP;O=?S68Q?t&w?SFPiee{On_YZ@5i+zqJu zfM07Vqot4r9zh&WDl@KyxKJw+sn2?N_7~(FnzF|)z18sSzefls0vQ&6QruC9C{OFp z9k_Lc(vu|ZQ;A2#l}guV+pEyr@gsr-V|_|Of2mM+Q?d4qlyHlP-Hbeq&@q|98Lb!T z!7cvok=2qyM|;QYynS)~jYo>@`r^QvY&z4T+a<~1&brYxTUMu~ z;RM&pk1YNK4#Ki0U^V-?9X>E3zn z#w;eD7{b)c-$pZOm~EB{J8Mbat2<`Z(GRGumNw^njzuzmvf-dg&54cI&N5@X9^#~y zKYcEz$8hE{%FZUok64g1|8lg|N_qB7HjeI`RY9)#-5YPdc<~kC=k=0#2c<@`YoCsd z=qehbkOMCn$ssfo5wu>~!z0H`XHln*LJh;n;E*4wpELTZ*|ILt?0map6RE+sM}Hz+ zA8I`m8;GBLD}FMcH#$a|b>D;yxfHa##FFn&*1Iv~tj;F?Aisgi=NT`>R0<#;)Hg~y z<@A%XdRi-j;+Vh|WjD$tFfEcqs#xdI5mShc0);5UKD!K(oQ(fAuz=m2f6FC+8UpB# zsUFK__0JRUsSd}@jw|v4reZq!#3Gb>!#HDr;rX68&cJg{25WqR}IIX=Yw*UxZduO6?nDhkj`HG7Ha_jTu=q$ko4FH%SZ z)~%EMu5;;}XTuT;ZgP^1Ty`T;XT}Yhxp|jY&mdHHH6Q!wb7Z^hl_e*6OAVS|yd+k% z_+;Su(<%{G-dl_1aO|Uqo2`F8->35vUSPc@<2L{;pwi*CC$E0l80@l1Ohi zQt)9>x)w9jQ-*V^769nd`%>>SE1f9VAP^seiZHuVLLT7H4rEg7T#n5gH%>m=Hp$Q= z_X5z11vDbN6x)yQ(*d#j3ez2v407@KmG@g_yG@H%pk~GIyI6Eb+U!ep4ZW)b1{+PQ zn~MO(m(q^ms;+=vFC*{8HNFzbcnYVIi=<^?>CCuPU@PSCm}KW#ANVR&KP7Rj!6k_d zQh;O=#?N0ryBr>#&U!W=46*YD1dApA3V&a=8J%Ik{RXYSzlyO0R^&$<>o82{Um)+k*m0$d7xRAqo)IC*}6SlLOkZc8E8k z8#jK1w24LYjN;-CUh7@=8fBmvvKD;roq%ZRi?+>iL9jV_=~wbIeb~nz>Ak+&5*zif zHD_en`s?ZBm6fy)QKT5KdwVa*yYI&BLAfs(CQtyck<&(!&b=pCHQTS<0(7)_!j7Xq z53c%}wXq!-J3 zfMwqD`aalhY*O!2w?8P+^DrQYgMN0gq_a;mA!=YRYi#Wm-MrmXMpSVGyIx$9Kf1Fl z1HbYdc{=|v2$vX~VO!ct3FCxUaQOMw(kokHTjpOlRs51Vvr``(8g*9wnc6jN%?*oE zq8x4Hd=R}io-S$2liB`22!Z*LmpCbuC8>%AXN7tspNa*4OiLMzIM%JI$X6+W$}V#@ zwcG9aj=|DQhC5iaL}eK~GaqWfKwsCGwAKg;##T~r=Bf$l30}pcR?)J`tHkH33iM5P z>j%o!410CF-UAlK+CrDN{BJTc2sK5r`I}~ zeuu>?wR9+Go<&UY8j6Rg#l6+x%w8mH?#;K5Hk%0LTeFwekYO(` z;a5IFy+;&VIT7|UOgg$FI+4V;b#Ii`NMMKOU}Kz(yXz4~1W<$=vc60k0^EKXteyJs-PAZ=EcRft$#+0JaV}L9g#8j3 z%MA7{nNje+TDQ(-^4^0r3F(Dci}oe;4~}q=q$U~0+TA;=9N}H;o`_MbQDT1bkf&?t zwTV!s3MXnJzGy6Vka)Wt?tRP^jJVJ2r73VQ^u3EDJBwF)1#A2Uo2#F9TDt+A7nb&Ojv`taK!&cc-Hw{SjpaNbP{#g8PCl|(A8d8Q zp_oEfdBPZ_^C9m9Wra4QFuVF`iekH2SN~6H)wfN=xs|`H_<@=_9SLXEJiiu~0K-ps0D!ufoaSdX{|> ze_1(+$}~VJuExndt>VFPHVCA zESzw`w2vT^%qt>YkI-cA&MHf*efZhXiKk!7Ml{I;~ZxmmHu?ENqJCvW)N-(_7(aA}; z4|40%!-WwsR+Vi)9+9L=n*hGBk#okq&wA|f!dH%&W-9Tj?_{$JgUNyFfDntXNBiHJ z;RpV1zjsOGhsO$qA){`Nq46Z=fr1lAkt@BF;%Bh{16V zM1fZ`IZfyzZ&!X(%eZxL>H6;ds1GLH_ELA}BAM_#eazieH9=N9Hi|X-?Qu?sZFY)n ziv2C7-X+kZ*gyQFO5Pv&VjL|!+wKjd-)gNdXsL= zIs4TPn|MakS2S()TQ6>;K*P+*f!zyzFY&itR-VrFGNwH%Zri#l6Q#uHKdVt1xvKiK zwStw)VrS+sN_9ZJtrN@6+n-r<&$Zd?yq#uo*D7cJgfWwysJGYu9?Q1!Q|K_yAUSm1 zWngWR3EIU^H~5YP&#rq8xpsquuh-MoXX73&l}Nbq(xB2}zbB27bHN&uDZwg28|wVy zvmvYiwybcK%+j}i>TWYG*dI%0t;o}J+h-hN?FOJ)E}1rMXYFhh*pK+o((;v-@pW)X z3Jdq`qQdxl=j+h$?~3E>uGx3wCHb2Lzod$sQlS-EpQ@j#3}B~(-W;XTCguzU?D_0i z%^M&#A9-zS)}sYjZ`YS*O10NEe_|Yndi?tpWiVJU0+|lqgaVAwfYZH`z647W+y~^| z!4`Q@6#Hfxy}D)kK&)1LL7BY9=QxJ#&jzN(L(}xzQdD)S+T%S{PQUF~8PH&1{nt<5 zZ~N`fE@_ejce^}7$Yc7L=p5p+j1H^f{kJl!*Gflzl!A;w?7U(~vL@eEUvCZ=04vEa z6D_OWhSWE9thWLbng%rvJ}q}J3Nv*t+)%U(Mrug5zP4z5y${y)a~|)1JSbt@V~QFZ zP;iX6q1iF4l-0E1-s#z9Vy0|@>ieP+wa_C;vaPZEn$f>8!{;DU3-C2U8SFJXv(CN# zP1QN7v7}Fp$rcEfpDJ>1POnH@PH`+Bh)VfVK>en9#b2;yO%33$A^1gP0l1kpLQ%{y*iA=q3`Zd?y02gZ;)@`iC914U1>(lXCRT>|lxIl3 zTz!axqi?wi)MIOt3cfMf2>Juggb7a9!yG>y8QCnnIsT@vVf9uCcfzl7@;sxO8AlN` zyWZcH?zTR6@`{22yS+4b-)Pl-J3e6B#ZOitFVG|1NHoLmM(FNapXkHDe){QJd1htq zw#&_|>*>kE5jLb>$T~W~Y5=@mT(@B*gkJWQtX1x*t9yiN)xDBpNW7Ra@2NG^LQPr) z;8y0L>eKd>{`R1RRtH1A_w)cCI*hX% zy$#M-0@qU(KSh$nAkL95%;z5x@FAKF85@Qn&yuk_Ch8B4mq;me9eeO6MF28@aDVJb U)|pGmpTED_NCWjJs*ZR53ma)$k^lez diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers.png deleted file mode 100644 index a29c31afd1370f923c16b28a34b1c6c47b36e138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 zcmbVOdpy&7AD?R_cPExdT63?kjcqoQ#x{mYqs%Fn*@eX}wq>J>ta8gGsi%Z;DW#HJ zvdRfPNlcQnB$wPOQVvHq4&j+D=Xw4(&-vr|y?(#n_xt_)KJWME{(AjV{d_&NG>kO> z0DuKecx7TpCL2q!^E zJaY({CZLc_h-G#2mr*L@82cFQ)SBp>_~^HhVd)ui643 zneiVt{!&{I5XWQKlNkc;UOr7x52o1@aj`kP|&YtAMq-tzb8^4SS09Rn5Ui0FpyWo7;{u!fN`xDsKRR{lImEE9ywE zDD?s*teYB1gGwQUC#D`%(z2v#?Q;VISDGhY`*{9CNCU^YU~!@0aQ_wg(#$*;H8n6l zd0>h)SL%@%s;z?fvU42QPrT52>7Z?5$K(;hZVA)*ez$(Tk)ErpY7p!T2CJW4B*Of5 zXs8Bp;&q^h*ZDNTHO+VDtj4b{3yu|KFpuo3S1UU4{GL>+$#>-JxOFi>y5+`wrYPH? zI}BZ^%LaM?3hvt#io6gblS}G%$zD%f%9ODiB!$|+SzFn0nvd656^-;|U*0I&`r-k~ zgr+T-R(ZEMkgjsf_KfkDKn=fOlaw%>k&67z_2!iWDk8JEXC6GCo}@gJXOEuwb**}x zC*NMnH1#!N60L5~oD;?jR%ns>;R7d!c;WE&E}h_glMfGYe@S~~)gW;(S(2Kxd*8oq zQBiay8uOw!k$#>zjy97dYC2~$%TB*ik62KvPMgHb=Er)CdY0P2Oba9Mnd9hwp z(4CeiGWFL%`B?3LAUAv{XcdcJ>f@S`!!sw2dxm{X+i|8oM%C?(NzuDs9{g&tbJc)% zd%49uv=1dWwMH$ES3=+V?4VD_K0uM)in4TM5bU8etwM*;cB?CW7i6-42&@XLzBF1C z-P~qYKODI+=G1e})?w{6n*;$ar@2Q(D&+Go-*~xNNzum_hD3A&-x3`fv9c5V$H`Yr z+V8KVzw-vp_i3GSQMZ0!Gg5Gz5@ZDQ&IhaOWz^?b@l#t>RcuFPt;al{RW8 z7lv-KS`r+R7p8KK$y;x|t@gwXN8>(OW1D3c*DaJf=vsd806Mo?G|P7Dd%YC8Mf@>2 zH zN%Nd5pnN{T?RnqKe48k0w@@8!!`Klb}8y<-?K2qwakTr3pvn z-t$E={|t-RS?tGOJ~?mnxi)$bu~y@Hk!v_vR2bEOUft=9TPloV% zC8^u?9WWRrK`ej=cA?yAHubAo^~~mYc0>|pu%|5BlXTCw@rGgiyg4p2ymEVafPp@9 z-UCmN-r2bwrAd9TG}|K-;?|N*3-U1wSw#w`MvK4EL9uKP2Wel(HgrT zZIaZ7RirD%f$5kmv1{0^J(ttAy6+7=JD2|?EH%IF_5!i=s`vfM*sJ8^`x5naAyXNa zW!o)U%u*wxOOz*))$UDQG}<}gCDoNX`X|U28l5wLMhz(h{++d+eti!uyPWDGFxSuN z+&sR)u>$r&l6rR+u>1YfQq;ES1DQtenXn0{qMb26^Ua^{e;R(Vdkw`*Lpc~@FiS4ezH<&Ys#dMwp=kIJ(}R+rE9 zRn*pwCNGgeKfc+*>1G5hlS_m`rxWh(f2X}(xgPw5ee(47)z2T#3dQ3%=?j5@}}x$-y0#i#n_4NI@@%s)QxT&Ci`$);wbM!RWBRbrLz zYCD7Kl=Z>vFV=<8pL9)H^0IVMf4p8KXPz0Wu2~G3h?@#-x;TYjD!X{D;($Duc+W1% zFy^1Es`_^reov##fF*2YQESP$954D*XjVRKa@|DIZ}!)igRxx^<(;=FEhWNVJM{Ep zev%73HXIbL;au2_HkC}o+`f!LB-TsQEfQdLc|qH{L()g*lv;ADRIC;SeOhLL{)QP7 zkL-UxW-fg^xGtkJbC$hven*X?IrV;%^8WcbO{ZN4L-`k%Oq1Ydu_dFkxVZulvM;ns zvxX7sMS6VEKzI+yjc$xE>n^S;T-s|;C%&+vKEGBou6lK+Fzz_)odH3qU#3>-G@j5n z>Q211HnVK0v0z)dTYrmwTw|qqz@r|QRo1~DfHL5iamDB2XHBPCy>SDdc8A@;o766~ z#Dr|3vvQN!${j=MAKlYtU#wYeo$O{v-%P` z(_*B5u_;;J<7k8jCWrC+l5%r82*&o8`JCg)swu_@(^KUOlfqr0d;VO;U^HpKBuC7kAw)O!9B2KoN2P diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers@2x.png deleted file mode 100644 index d42f537904a85dd6aab01f7647085519091abc51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5456 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 Jmvv4FO#tKbG@t+g diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png deleted file mode 100644 index 40a68d9fc638f0c7d3139916b74ff3722a9780d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3565 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 F;eWTrM|l7M diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened-small.png deleted file mode 100644 index e1eb784ff933a2a7c36dd76ba83c58afbbe5a33e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%aR&H=xbE7u>+033|NsB*KauSR6l5+5@(cd|pW*r`UPmBT z!_&nvq~eyz>FvA>3_L9d+W)q1o3mn_V%$TnnH|bKx;Y$r->RlCFf(vFFhstKtNR1g O!{F)a=d#Wzp$Py=CpmZk diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png deleted file mode 100644 index 789f5fafc4c37e4a2840134ee95ef5ae83bc85b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3567 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 F{{d$eM{588 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png b/tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png deleted file mode 100644 index 5ce1611e2f891150f0ff81918c07b6b59b6173aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5258 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 M07*qoM6N<$f>UhKRR910 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/js/android_3p-bundle.js b/tools/droiddoc/templates-sdk-refonly/assets/js/android_3p-bundle.js deleted file mode 100644 index a67b5b0d8cf..00000000000 --- a/tools/droiddoc/templates-sdk-refonly/assets/js/android_3p-bundle.js +++ /dev/null @@ -1,2766 +0,0 @@ -//third_party/javascript/google_code_prettify/src/prettify.js -/** - * @license Copyright (C) 2006 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. - */ - -/** - * @fileoverview - * some functions for browser-side pretty printing of code contained in html. - *

    - * - * For a fairly comprehensive set of languages see the - * README - * file that came with this source. At a minimum, the lexer should work on a - * number of languages including C and friends, Java, Python, Bash, SQL, HTML, - * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk - * and a subset of Perl, but, because of commenting conventions, doesn't work on - * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. - *

    - * Usage:

      - *
    1. include this source file in an html page via - * {@code } - *
    2. define style rules. See the example page for examples. - *
    3. mark the {@code
      } and {@code } tags in your source with
      - *    {@code class=prettyprint.}
      - *    You can also use the (html deprecated) {@code } tag, but the pretty
      - *    printer needs to do more substantial DOM manipulations to support that, so
      - *    some css styles may not be preserved.
      - * </ol>
      - * That's it.  I wanted to keep the API as simple as possible, so there's no
      - * need to specify which language the code is in, but if you wish, you can add
      - * another class to the {@code <pre>} or {@code <code>} element to specify the
      - * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
      - * starts with "lang-" followed by a file extension, specifies the file type.
      - * See the "lang-*.js" files in this directory for code that implements
      - * per-language file handlers.
      - * <p>
      - * Change log:<br>
      - * cbeust, 2006/08/22
      - * <blockquote>
      - *   Java annotations (start with "@") are now captured as literals ("lit")
      - * </blockquote>
      - * @requires console
      - */
      -
      -// JSLint declarations
      -/*global console, document, navigator, setTimeout, window */
      -
      -/**
      - * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
      - * UI events.
      - * If set to {@code false}, {@code prettyPrint()} is synchronous.
      - */
      -window['PR_SHOULD_USE_CONTINUATION'] = true;
      -
      -/** the number of characters between tab columns */
      -window['PR_TAB_WIDTH'] = 8;
      -
      -/** Walks the DOM returning a properly escaped version of innerHTML.
      -  * @param {Node} node
      -  * @param {Array.<string>} out output buffer that receives chunks of HTML.
      -  */
      -window['PR_normalizedHtml']
      -
      -/** Contains functions for creating and registering new language handlers.
      -  * @type {Object}
      -  */
      -  = window['PR']
      -
      -/** Pretty print a chunk of code.
      -  *
      -  * @param {string} sourceCodeHtml code as html
      -  * @return {string} code as html, but prettier
      -  */
      -  = window['prettyPrintOne']
      -/** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      -  * {@code class=prettyprint} and prettify them.
      -  * @param {Function?} opt_whenDone if specified, called when the last entry
      -  *     has been finished.
      -  */
      -  = window['prettyPrint'] = void 0;
      -
      -/** browser detection. @extern @returns false if not IE, otherwise the major version. */
      -window['_pr_isIE6'] = function () {
      -  var ieVersion = navigator && navigator.userAgent &&
      -      navigator.userAgent.match(/\bMSIE ([678])\./);
      -  ieVersion = ieVersion ? +ieVersion[1] : false;
      -  window['_pr_isIE6'] = function () { return ieVersion; };
      -  return ieVersion;
      -};
      -
      -
      -(function () {
      -  // Keyword lists for various languages.
      -  var FLOW_CONTROL_KEYWORDS =
      -      "break continue do else for if return while ";
      -  var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
      -      "double enum extern float goto int long register short signed sizeof " +
      -      "static struct switch typedef union unsigned void volatile ";
      -  var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
      -      "new operator private protected public this throw true try typeof ";
      -  var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
      -      "concept concept_map const_cast constexpr decltype " +
      -      "dynamic_cast explicit export friend inline late_check " +
      -      "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
      -      "template typeid typename using virtual wchar_t where ";
      -  var JAVA_KEYWORDS = COMMON_KEYWORDS +
      -      "abstract boolean byte extends final finally implements import " +
      -      "instanceof null native package strictfp super synchronized throws " +
      -      "transient ";
      -  var CSHARP_KEYWORDS = JAVA_KEYWORDS +
      -      "as base by checked decimal delegate descending dynamic event " +
      -      "fixed foreach from group implicit in interface internal into is lock " +
      -      "object out override orderby params partial readonly ref sbyte sealed " +
      -      "stackalloc string select uint ulong unchecked unsafe ushort var ";
      -  var COFFEE_KEYWORDS = "all and by catch class else extends false finally " +
      -      "for if in is isnt loop new no not null of off on or return super then " +
      -      "true try unless until when while yes ";
      -  var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
      -      "debugger eval export function get null set undefined var with " +
      -      "Infinity NaN ";
      -  var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
      -      "goto if import last local my next no our print package redo require " +
      -      "sub undef unless until use wantarray while BEGIN END ";
      -  var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
      -      "elif except exec finally from global import in is lambda " +
      -      "nonlocal not or pass print raise try with yield " +
      -      "False True None ";
      -  var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
      -      " defined elsif end ensure false in module next nil not or redo rescue " +
      -      "retry self super then true undef unless until when yield BEGIN END ";
      -  var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
      -      "function in local set then until ";
      -  var ALL_KEYWORDS = (
      -      CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
      -      PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
      -
      -  // token style names.  correspond to css classes
      -  /** token style for a string literal */
      -  var PR_STRING = 'str';
      -  /** token style for a keyword */
      -  var PR_KEYWORD = 'kwd';
      -  /** token style for a comment */
      -  var PR_COMMENT = 'com';
      -  /** token style for a type */
      -  var PR_TYPE = 'typ';
      -  /** token style for a literal value.  e.g. 1, null, true. */
      -  var PR_LITERAL = 'lit';
      -  /** token style for a punctuation string. */
      -  var PR_PUNCTUATION = 'pun';
      -  /** token style for a punctuation string. */
      -  var PR_PLAIN = 'pln';
      -
      -  /** token style for an sgml tag. */
      -  var PR_TAG = 'tag';
      -  /** token style for a markup declaration such as a DOCTYPE. */
      -  var PR_DECLARATION = 'dec';
      -  /** token style for embedded source. */
      -  var PR_SOURCE = 'src';
      -  /** token style for an sgml attribute name. */
      -  var PR_ATTRIB_NAME = 'atn';
      -  /** token style for an sgml attribute value. */
      -  var PR_ATTRIB_VALUE = 'atv';
      -
      -  /**
      -   * A class that indicates a section of markup that is not code, e.g. to allow
      -   * embedding of line numbers within code listings.
      -   */
      -  var PR_NOCODE = 'nocode';
      -
      -  /** A set of tokens that can precede a regular expression literal in
      -    * javascript.
      -    * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
      -    * list, but I've removed ones that might be problematic when seen in
      -    * languages that don't support regular expression literals.
      -    *
      -    * <p>Specifically, I've removed any keywords that can't precede a regexp
      -    * literal in a syntactically legal javascript program, and I've removed the
      -    * "in" keyword since it's not a keyword in many languages, and might be used
      -    * as a count of inches.
      -    *
      -    * <p>The link a above does not accurately describe EcmaScript rules since
      -    * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
      -    * very well in practice.
      -    *
      -    * @private
      -    */
      -  var REGEXP_PRECEDER_PATTERN = function () {
      -      var preceders = [
      -          "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
      -          "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
      -          "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
      -          "<", "<<", "<<=", "<=", "=", "==", "===", ">",
      -          ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
      -          "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
      -          "||=", "~" /* handles =~ and !~ */,
      -          "break", "case", "continue", "delete",
      -          "do", "else", "finally", "instanceof",
      -          "return", "throw", "try", "typeof"
      -          ];
      -      var pattern = '(?:^^|[+-]';
      -      for (var i = 0; i < preceders.length; ++i) {
      -        pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
      -      }
      -      pattern += ')\\s*';  // matches at end, and matches empty string
      -      return pattern;
      -      // CAVEAT: this does not properly handle the case where a regular
      -      // expression immediately follows another since a regular expression may
      -      // have flags for case-sensitivity and the like.  Having regexp tokens
      -      // adjacent is not valid in any language I'm aware of, so I'm punting.
      -      // TODO: maybe style special characters inside a regexp as punctuation.
      -    }();
      -
      -  // Define regexps here so that the interpreter doesn't have to create an
      -  // object each time the function containing them is called.
      -  // The language spec requires a new object created even if you don't access
      -  // the $1 members.
      -  var pr_amp = /&/g;
      -  var pr_lt = /</g;
      -  var pr_gt = />/g;
      -  var pr_quot = /\"/g;
      -  /** like textToHtml but escapes double quotes to be attribute safe. */
      -  function attribToHtml(str) {
      -    return str.replace(pr_amp, '&amp;')
      -        .replace(pr_lt, '&lt;')
      -        .replace(pr_gt, '&gt;')
      -        .replace(pr_quot, '&quot;');
      -  }
      -
      -  /** escapest html special characters to html. */
      -  function textToHtml(str) {
      -    return str.replace(pr_amp, '&amp;')
      -        .replace(pr_lt, '&lt;')
      -        .replace(pr_gt, '&gt;');
      -  }
      -
      -
      -  var pr_ltEnt = /&lt;/g;
      -  var pr_gtEnt = /&gt;/g;
      -  var pr_aposEnt = /&apos;/g;
      -  var pr_quotEnt = /&quot;/g;
      -  var pr_ampEnt = /&amp;/g;
      -  var pr_nbspEnt = /&nbsp;/g;
      -  /** unescapes html to plain text. */
      -  function htmlToText(html) {
      -    var pos = html.indexOf('&');
      -    if (pos < 0) { return html; }
      -    // Handle numeric entities specially.  We can't use functional substitution
      -    // since that doesn't work in older versions of Safari.
      -    // These should be rare since most browsers convert them to normal chars.
      -    for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
      -      var end = html.indexOf(';', pos);
      -      if (end >= 0) {
      -        var num = html.substring(pos + 3, end);
      -        var radix = 10;
      -        if (num && num.charAt(0) === 'x') {
      -          num = num.substring(1);
      -          radix = 16;
      -        }
      -        var codePoint = parseInt(num, radix);
      -        if (!isNaN(codePoint)) {
      -          html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
      -                  html.substring(end + 1));
      -        }
      -      }
      -    }
      -
      -    return html.replace(pr_ltEnt, '<')
      -        .replace(pr_gtEnt, '>')
      -        .replace(pr_aposEnt, "'")
      -        .replace(pr_quotEnt, '"')
      -        .replace(pr_nbspEnt, ' ')
      -        .replace(pr_ampEnt, '&');
      -  }
      -
      -  /** is the given node's innerHTML normally unescaped? */
      -  function isRawContent(node) {
      -    return 'XMP' === node.tagName;
      -  }
      -
      -  var newlineRe = /[\r\n]/g;
      -  /**
      -   * Are newlines and adjacent spaces significant in the given node's innerHTML?
      -   */
      -  function isPreformatted(node, content) {
      -    // PRE means preformatted, and is a very common case, so don't create
      -    // unnecessary computed style objects.
      -    if ('PRE' === node.tagName) { return true; }
      -    if (!newlineRe.test(content)) { return true; }  // Don't care
      -    var whitespace = '';
      -    // For disconnected nodes, IE has no currentStyle.
      -    if (node.currentStyle) {
      -      whitespace = node.currentStyle.whiteSpace;
      -    } else if (window.getComputedStyle) {
      -      // Firefox makes a best guess if node is disconnected whereas Safari
      -      // returns the empty string.
      -      whitespace = window.getComputedStyle(node, null).whiteSpace;
      -    }
      -    return !whitespace || whitespace === 'pre';
      -  }
      -
      -  function normalizedHtml(node, out, opt_sortAttrs) {
      -    switch (node.nodeType) {
      -      case 1:  // an element
      -        var name = node.tagName.toLowerCase();
      -
      -        out.push('<', name);
      -        var attrs = node.attributes;
      -        var n = attrs.length;
      -        if (n) {
      -          if (opt_sortAttrs) {
      -            var sortedAttrs = [];
      -            for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
      -            sortedAttrs.sort(function (a, b) {
      -                return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
      -              });
      -            attrs = sortedAttrs;
      -          }
      -          for (var i = 0; i < n; ++i) {
      -            var attr = attrs[i];
      -            if (!attr.specified) { continue; }
      -            out.push(' ', attr.name.toLowerCase(),
      -                     '="', attribToHtml(attr.value), '"');
      -          }
      -        }
      -        out.push('>');
      -        for (var child = node.firstChild; child; child = child.nextSibling) {
      -          normalizedHtml(child, out, opt_sortAttrs);
      -        }
      -        if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
      -          out.push('<\/', name, '>');
      -        }
      -        break;
      -      case 3: case 4: // text
      -        out.push(textToHtml(node.nodeValue));
      -        break;
      -    }
      -  }
      -
      -  /**
      -   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
      -   * matches the union o the sets o strings matched d by the input RegExp.
      -   * Since it matches globally, if the input strings have a start-of-input
      -   * anchor (/^.../), it is ignored for the purposes of unioning.
      -   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
      -   * @return {RegExp} a global regex.
      -   */
      -  function combinePrefixPatterns(regexs) {
      -    var capturedGroupIndex = 0;
      -
      -    var needToFoldCase = false;
      -    var ignoreCase = false;
      -    for (var i = 0, n = regexs.length; i < n; ++i) {
      -      var regex = regexs[i];
      -      if (regex.ignoreCase) {
      -        ignoreCase = true;
      -      } else if (/[a-z]/i.test(regex.source.replace(
      -                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
      -        needToFoldCase = true;
      -        ignoreCase = false;
      -        break;
      -      }
      -    }
      -
      -    function decodeEscape(charsetPart) {
      -      if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
      -      switch (charsetPart.charAt(1)) {
      -        case 'b': return 8;
      -        case 't': return 9;
      -        case 'n': return 0xa;
      -        case 'v': return 0xb;
      -        case 'f': return 0xc;
      -        case 'r': return 0xd;
      -        case 'u': case 'x':
      -          return parseInt(charsetPart.substring(2), 16)
      -              || charsetPart.charCodeAt(1);
      -        case '0': case '1': case '2': case '3': case '4':
      -        case '5': case '6': case '7':
      -          return parseInt(charsetPart.substring(1), 8);
      -        default: return charsetPart.charCodeAt(1);
      -      }
      -    }
      -
      -    function encodeEscape(charCode) {
      -      if (charCode < 0x20) {
      -        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
      -      }
      -      var ch = String.fromCharCode(charCode);
      -      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
      -        ch = '\\' + ch;
      -      }
      -      return ch;
      -    }
      -
      -    function caseFoldCharset(charSet) {
      -      var charsetParts = charSet.substring(1, charSet.length - 1).match(
      -          new RegExp(
      -              '\\\\u[0-9A-Fa-f]{4}'
      -              + '|\\\\x[0-9A-Fa-f]{2}'
      -              + '|\\\\[0-3][0-7]{0,2}'
      -              + '|\\\\[0-7]{1,2}'
      -              + '|\\\\[\\s\\S]'
      -              + '|-'
      -              + '|[^-\\\\]',
      -              'g'));
      -      var groups = [];
      -      var ranges = [];
      -      var inverse = charsetParts[0] === '^';
      -      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
      -        var p = charsetParts[i];
      -        switch (p) {
      -          case '\\B': case '\\b':
      -          case '\\D': case '\\d':
      -          case '\\S': case '\\s':
      -          case '\\W': case '\\w':
      -            groups.push(p);
      -            continue;
      -        }
      -        var start = decodeEscape(p);
      -        var end;
      -        if (i + 2 < n && '-' === charsetParts[i + 1]) {
      -          end = decodeEscape(charsetParts[i + 2]);
      -          i += 2;
      -        } else {
      -          end = start;
      -        }
      -        ranges.push([start, end]);
      -        // If the range might intersect letters, then expand it.
      -        if (!(end < 65 || start > 122)) {
      -          if (!(end < 65 || start > 90)) {
      -            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
      -          }
      -          if (!(end < 97 || start > 122)) {
      -            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
      -          }
      -        }
      -      }
      -
      -      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
      -      // -> [[1, 12], [14, 14], [16, 17]]
      -      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
      -      var consolidatedRanges = [];
      -      var lastRange = [NaN, NaN];
      -      for (var i = 0; i < ranges.length; ++i) {
      -        var range = ranges[i];
      -        if (range[0] <= lastRange[1] + 1) {
      -          lastRange[1] = Math.max(lastRange[1], range[1]);
      -        } else {
      -          consolidatedRanges.push(lastRange = range);
      -        }
      -      }
      -
      -      var out = ['['];
      -      if (inverse) { out.push('^'); }
      -      out.push.apply(out, groups);
      -      for (var i = 0; i < consolidatedRanges.length; ++i) {
      -        var range = consolidatedRanges[i];
      -        out.push(encodeEscape(range[0]));
      -        if (range[1] > range[0]) {
      -          if (range[1] + 1 > range[0]) { out.push('-'); }
      -          out.push(encodeEscape(range[1]));
      -        }
      -      }
      -      out.push(']');
      -      return out.join('');
      -    }
      -
      -    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
      -      // Split into character sets, escape sequences, punctuation strings
      -      // like ('(', '(?:', ')', '^'), and runs of characters that do not
      -      // include any of the above.
      -      var parts = regex.source.match(
      -          new RegExp(
      -              '(?:'
      -              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
      -              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
      -              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
      -              + '|\\\\[0-9]+'  // a back-reference or octal escape
      -              + '|\\\\[^ux0-9]'  // other escape sequence
      -              + '|\\(\\?[:!=]'  // start of a non-capturing group
      -              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
      -              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
      -              + ')',
      -              'g'));
      -      var n = parts.length;
      -
      -      // Maps captured group numbers to the number they will occupy in
      -      // the output or to -1 if that has not been determined, or to
      -      // undefined if they need not be capturing in the output.
      -      var capturedGroups = [];
      -
      -      // Walk over and identify back references to build the capturedGroups
      -      // mapping.
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        var p = parts[i];
      -        if (p === '(') {
      -          // groups are 1-indexed, so max group index is count of '('
      -          ++groupIndex;
      -        } else if ('\\' === p.charAt(0)) {
      -          var decimalValue = +p.substring(1);
      -          if (decimalValue && decimalValue <= groupIndex) {
      -            capturedGroups[decimalValue] = -1;
      -          }
      -        }
      -      }
      -
      -      // Renumber groups and reduce capturing groups to non-capturing groups
      -      // where possible.
      -      for (var i = 1; i < capturedGroups.length; ++i) {
      -        if (-1 === capturedGroups[i]) {
      -          capturedGroups[i] = ++capturedGroupIndex;
      -        }
      -      }
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        var p = parts[i];
      -        if (p === '(') {
      -          ++groupIndex;
      -          if (capturedGroups[groupIndex] === undefined) {
      -            parts[i] = '(?:';
      -          }
      -        } else if ('\\' === p.charAt(0)) {
      -          var decimalValue = +p.substring(1);
      -          if (decimalValue && decimalValue <= groupIndex) {
      -            parts[i] = '\\' + capturedGroups[groupIndex];
      -          }
      -        }
      -      }
      -
      -      // Remove any prefix anchors so that the output will match anywhere.
      -      // ^^ really does mean an anchored match though.
      -      for (var i = 0, groupIndex = 0; i < n; ++i) {
      -        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
      -      }
      -
      -      // Expand letters to groupts to handle mixing of case-sensitive and
      -      // case-insensitive patterns if necessary.
      -      if (regex.ignoreCase && needToFoldCase) {
      -        for (var i = 0; i < n; ++i) {
      -          var p = parts[i];
      -          var ch0 = p.charAt(0);
      -          if (p.length >= 2 && ch0 === '[') {
      -            parts[i] = caseFoldCharset(p);
      -          } else if (ch0 !== '\\') {
      -            // TODO: handle letters in numeric escapes.
      -            parts[i] = p.replace(
      -                /[a-zA-Z]/g,
      -                function (ch) {
      -                  var cc = ch.charCodeAt(0);
      -                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
      -                });
      -          }
      -        }
      -      }
      -
      -      return parts.join('');
      -    }
      -
      -    var rewritten = [];
      -    for (var i = 0, n = regexs.length; i < n; ++i) {
      -      var regex = regexs[i];
      -      if (regex.global || regex.multiline) { throw new Error('' + regex); }
      -      rewritten.push(
      -          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
      -    }
      -
      -    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      -  }
      -
      -  var PR_innerHtmlWorks = null;
      -  function getInnerHtml(node) {
      -    // inner html is hopelessly broken in Safari 2.0.4 when the content is
      -    // an html description of well formed XML and the containing tag is a PRE
      -    // tag, so we detect that case and emulate innerHTML.
      -    if (null === PR_innerHtmlWorks) {
      -      var testNode = document.createElement('PRE');
      -      testNode.appendChild(
      -          document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
      -      PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
      -    }
      -
      -    if (PR_innerHtmlWorks) {
      -      var content = node.innerHTML;
      -      // XMP tags contain unescaped entities so require special handling.
      -      if (isRawContent(node)) {
      -        content = textToHtml(content);
      -      } else if (!isPreformatted(node, content)) {
      -        content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
      -            .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
      -      }
      -      return content;
      -    }
      -
      -    var out = [];
      -    for (var child = node.firstChild; child; child = child.nextSibling) {
      -      normalizedHtml(child, out);
      -    }
      -    return out.join('');
      -  }
      -
      -  /** returns a function that expand tabs to spaces.  This function can be fed
      -    * successive chunks of text, and will maintain its own internal state to
      -    * keep track of how tabs are expanded.
      -    * @return {function (string) : string} a function that takes
      -    *   plain text and return the text with tabs expanded.
      -    * @private
      -    */
      -  function makeTabExpander(tabWidth) {
      -    var SPACES = '                ';
      -    var charInLine = 0;
      -
      -    return function (plainText) {
      -      // walk over each character looking for tabs and newlines.
      -      // On tabs, expand them.  On newlines, reset charInLine.
      -      // Otherwise increment charInLine
      -      var out = null;
      -      var pos = 0;
      -      for (var i = 0, n = plainText.length; i < n; ++i) {
      -        var ch = plainText.charAt(i);
      -
      -        switch (ch) {
      -          case '\t':
      -            if (!out) { out = []; }
      -            out.push(plainText.substring(pos, i));
      -            // calculate how much space we need in front of this part
      -            // nSpaces is the amount of padding -- the number of spaces needed
      -            // to move us to the next column, where columns occur at factors of
      -            // tabWidth.
      -            var nSpaces = tabWidth - (charInLine % tabWidth);
      -            charInLine += nSpaces;
      -            for (; nSpaces >= 0; nSpaces -= SPACES.length) {
      -              out.push(SPACES.substring(0, nSpaces));
      -            }
      -            pos = i + 1;
      -            break;
      -          case '\n':
      -            charInLine = 0;
      -            break;
      -          default:
      -            ++charInLine;
      -        }
      -      }
      -      if (!out) { return plainText; }
      -      out.push(plainText.substring(pos));
      -      return out.join('');
      -    };
      -  }
      -
      -  var pr_chunkPattern = new RegExp(
      -      '[^<]+'  // A run of characters other than '<'
      -      + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
      -      + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
      -      // a probable tag that should not be highlighted
      -      + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
      -      + '|<',  // A '<' that does not begin a larger chunk
      -      'g');
      -  var pr_commentPrefix = /^<\!--/;
      -  var pr_cdataPrefix = /^<!\[CDATA\[/;
      -  var pr_brPrefix = /^<br\b/i;
      -  var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
      -
      -  /** split markup into chunks of html tags (style null) and
      -    * plain text (style {@link #PR_PLAIN}), converting tags which are
      -    * significant for tokenization (<br>) into their textual equivalent.
      -    *
      -    * @param {string} s html where whitespace is considered significant.
      -    * @return {Object} source code and extracted tags.
      -    * @private
      -    */
      -  function extractTags(s) {
      -    // since the pattern has the 'g' modifier and defines no capturing groups,
      -    // this will return a list of all chunks which we then classify and wrap as
      -    // PR_Tokens
      -    var matches = s.match(pr_chunkPattern);
      -    var sourceBuf = [];
      -    var sourceBufLen = 0;
      -    var extractedTags = [];
      -    if (matches) {
      -      for (var i = 0, n = matches.length; i < n; ++i) {
      -        var match = matches[i];
      -        if (match.length > 1 && match.charAt(0) === '<') {
      -          if (pr_commentPrefix.test(match)) { continue; }
      -          if (pr_cdataPrefix.test(match)) {
      -            // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
      -            sourceBuf.push(match.substring(9, match.length - 3));
      -            sourceBufLen += match.length - 12;
      -          } else if (pr_brPrefix.test(match)) {
      -            // <br> tags are lexically significant so convert them to text.
      -            // This is undone later.
      -            sourceBuf.push('\n');
      -            ++sourceBufLen;
      -          } else {
      -            if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
      -              // A <span class="nocode"> will start a section that should be
      -              // ignored.  Continue walking the list until we see a matching end
      -              // tag.
      -              var name = match.match(pr_tagNameRe)[2];
      -              var depth = 1;
      -              var j;
      -              end_tag_loop:
      -              for (j = i + 1; j < n; ++j) {
      -                var name2 = matches[j].match(pr_tagNameRe);
      -                if (name2 && name2[2] === name) {
      -                  if (name2[1] === '/') {
      -                    if (--depth === 0) { break end_tag_loop; }
      -                  } else {
      -                    ++depth;
      -                  }
      -                }
      -              }
      -              if (j < n) {
      -                extractedTags.push(
      -                    sourceBufLen, matches.slice(i, j + 1).join(''));
      -                i = j;
      -              } else {  // Ignore unclosed sections.
      -                extractedTags.push(sourceBufLen, match);
      -              }
      -            } else {
      -              extractedTags.push(sourceBufLen, match);
      -            }
      -          }
      -        } else {
      -          var literalText = htmlToText(match);
      -          sourceBuf.push(literalText);
      -          sourceBufLen += literalText.length;
      -        }
      -      }
      -    }
      -    return { source: sourceBuf.join(''), tags: extractedTags };
      -  }
      -
      -  /** True if the given tag contains a class attribute with the nocode class. */
      -  function isNoCodeTag(tag) {
      -    return !!tag
      -        // First canonicalize the representation of attributes
      -        .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
      -                 ' $1="$2$3$4"')
      -        // Then look for the attribute we want.
      -        .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
      -  }
      -
      -  /**
      -   * Apply the given language handler to sourceCode and add the resulting
      -   * decorations to out.
      -   * @param {number} basePos the index of sourceCode within the chunk of source
      -   *    whose decorations are already present on out.
      -   */
      -  function appendDecorations(basePos, sourceCode, langHandler, out) {
      -    if (!sourceCode) { return; }
      -    var job = {
      -      source: sourceCode,
      -      basePos: basePos
      -    };
      -    langHandler(job);
      -    out.push.apply(out, job.decorations);
      -  }
      -
      -  /** Given triples of [style, pattern, context] returns a lexing function,
      -    * The lexing function interprets the patterns to find token boundaries and
      -    * returns a decoration list of the form
      -    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
      -    * where index_n is an index into the sourceCode, and style_n is a style
      -    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
      -    * all characters in sourceCode[index_n-1:index_n].
      -    *
      -    * The stylePatterns is a list whose elements have the form
      -    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
      -    *
      -    * Style is a style constant like PR_PLAIN, or can be a string of the
      -    * form 'lang-FOO', where FOO is a language extension describing the
      -    * language of the portion of the token in $1 after pattern executes.
      -    * E.g., if style is 'lang-lisp', and group 1 contains the text
      -    * '(hello (world))', then that portion of the token will be passed to the
      -    * registered lisp handler for formatting.
      -    * The text before and after group 1 will be restyled using this decorator
      -    * so decorators should take care that this doesn't result in infinite
      -    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
      -    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
      -    * '<script>foo()<\/script>', which would cause the current decorator to
      -    * be called with '<script>' which would not match the same rule since
      -    * group 1 must not be empty, so it would be instead styled as PR_TAG by
      -    * the generic tag rule.  The handler registered for the 'js' extension would
      -    * then be called with 'foo()', and finally, the current decorator would
      -    * be called with '<\/script>' which would not match the original rule and
      -    * so the generic tag rule would identify it as a tag.
      -    *
      -    * Pattern must only match prefixes, and if it matches a prefix, then that
      -    * match is considered a token with the same style.
      -    *
      -    * Context is applied to the last non-whitespace, non-comment token
      -    * recognized.
      -    *
      -    * Shortcut is an optional string of characters, any of which, if the first
      -    * character, gurantee that this pattern and only this pattern matches.
      -    *
      -    * @param {Array} shortcutStylePatterns patterns that always start with
      -    *   a known character.  Must have a shortcut string.
      -    * @param {Array} fallthroughStylePatterns patterns that will be tried in
      -    *   order if the shortcut ones fail.  May have shortcuts.
      -    *
      -    * @return {function (Object)} a
      -    *   function that takes source code and returns a list of decorations.
      -    */
      -  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
      -    var shortcuts = {};
      -    var tokenizer;
      -    (function () {
      -      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
      -      var allRegexs = [];
      -      var regexKeys = {};
      -      for (var i = 0, n = allPatterns.length; i < n; ++i) {
      -        var patternParts = allPatterns[i];
      -        var shortcutChars = patternParts[3];
      -        if (shortcutChars) {
      -          for (var c = shortcutChars.length; --c >= 0;) {
      -            shortcuts[shortcutChars.charAt(c)] = patternParts;
      -          }
      -        }
      -        var regex = patternParts[1];
      -        var k = '' + regex;
      -        if (!regexKeys.hasOwnProperty(k)) {
      -          allRegexs.push(regex);
      -          regexKeys[k] = null;
      -        }
      -      }
      -      allRegexs.push(/[\0-\uffff]/);
      -      tokenizer = combinePrefixPatterns(allRegexs);
      -    })();
      -
      -    var nPatterns = fallthroughStylePatterns.length;
      -    var notWs = /\S/;
      -
      -    /**
      -     * Lexes job.source and produces an output array job.decorations of style
      -     * classes preceded by the position at which they start in job.source in
      -     * order.
      -     *
      -     * @param {Object} job an object like {@code
      -     *    source: {string} sourceText plain text,
      -     *    basePos: {int} position of job.source in the larger chunk of
      -     *        sourceCode.
      -     * }
      -     */
      -    var decorate = function (job) {
      -      var sourceCode = job.source, basePos = job.basePos;
      -      /** Even entries are positions in source in ascending order.  Odd enties
      -        * are style markers (e.g., PR_COMMENT) that run from that position until
      -        * the end.
      -        * @type {Array.<number|string>}
      -        */
      -      var decorations = [basePos, PR_PLAIN];
      -      var pos = 0;  // index into sourceCode
      -      var tokens = sourceCode.match(tokenizer) || [];
      -      var styleCache = {};
      -
      -      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
      -        var token = tokens[ti];
      -        var style = styleCache[token];
      -        var match = void 0;
      -
      -        var isEmbedded;
      -        if (typeof style === 'string') {
      -          isEmbedded = false;
      -        } else {
      -          var patternParts = shortcuts[token.charAt(0)];
      -          if (patternParts) {
      -            match = token.match(patternParts[1]);
      -            style = patternParts[0];
      -          } else {
      -            for (var i = 0; i < nPatterns; ++i) {
      -              patternParts = fallthroughStylePatterns[i];
      -              match = token.match(patternParts[1]);
      -              if (match) {
      -                style = patternParts[0];
      -                break;
      -              }
      -            }
      -
      -            if (!match) {  // make sure that we make progress
      -              style = PR_PLAIN;
      -            }
      -          }
      -
      -          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
      -          if (isEmbedded && !(match && typeof match[1] === 'string')) {
      -            isEmbedded = false;
      -            style = PR_SOURCE;
      -          }
      -
      -          if (!isEmbedded) { styleCache[token] = style; }
      -        }
      -
      -        var tokenStart = pos;
      -        pos += token.length;
      -
      -        if (!isEmbedded) {
      -          decorations.push(basePos + tokenStart, style);
      -        } else {  // Treat group 1 as an embedded block of source code.
      -          var embeddedSource = match[1];
      -          var embeddedSourceStart = token.indexOf(embeddedSource);
      -          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
      -          if (match[2]) {
      -            // If embeddedSource can be blank, then it would match at the
      -            // beginning which would cause us to infinitely recurse on the
      -            // entire token, so we catch the right context in match[2].
      -            embeddedSourceEnd = token.length - match[2].length;
      -            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
      -          }
      -          var lang = style.substring(5);
      -          // Decorate the left of the embedded source
      -          appendDecorations(
      -              basePos + tokenStart,
      -              token.substring(0, embeddedSourceStart),
      -              decorate, decorations);
      -          // Decorate the embedded source
      -          appendDecorations(
      -              basePos + tokenStart + embeddedSourceStart,
      -              embeddedSource,
      -              langHandlerForExtension(lang, embeddedSource),
      -              decorations);
      -          // Decorate the right of the embedded section
      -          appendDecorations(
      -              basePos + tokenStart + embeddedSourceEnd,
      -              token.substring(embeddedSourceEnd),
      -              decorate, decorations);
      -        }
      -      }
      -      job.decorations = decorations;
      -    };
      -    return decorate;
      -  }
      -
      -  /** returns a function that produces a list of decorations from source text.
      -    *
      -    * This code treats ", ', and ` as string delimiters, and \ as a string
      -    * escape.  It does not recognize perl's qq() style strings.
      -    * It has no special handling for double delimiter escapes as in basic, or
      -    * the tripled delimiters used in python, but should work on those regardless
      -    * although in those cases a single string literal may be broken up into
      -    * multiple adjacent string literals.
      -    *
      -    * It recognizes C, C++, and shell style comments.
      -    *
      -    * @param {Object} options a set of optional parameters.
      -    * @return {function (Object)} a function that examines the source code
      -    *     in the input job and builds the decoration list.
      -    */
      -  function sourceDecorator(options) {
      -    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
      -    if (options['tripleQuotedStrings']) {
      -      // '''multi-line-string''', 'single-line-string', and double-quoted
      -      shortcutStylePatterns.push(
      -          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
      -           null, '\'"']);
      -    } else if (options['multiLineStrings']) {
      -      // 'multi-line-string', "multi-line-string"
      -      shortcutStylePatterns.push(
      -          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
      -           null, '\'"`']);
      -    } else {
      -      // 'single-line-string', "single-line-string"
      -      shortcutStylePatterns.push(
      -          [PR_STRING,
      -           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
      -           null, '"\'']);
      -    }
      -    if (options['verbatimStrings']) {
      -      // verbatim-string-literal production from the C# grammar.  See issue 93.
      -      fallthroughStylePatterns.push(
      -          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
      -    }
      -    var hc = options['hashComments'];
      -    if (hc) {
      -      if (options['cStyleComments']) {
      -        if (hc > 1) {  // multiline hash comments
      -          shortcutStylePatterns.push(
      -              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
      -        } else {
      -          // Stop C preprocessor declarations at an unclosed open comment
      -          shortcutStylePatterns.push(
      -              [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
      -               null, '#']);
      -        }
      -        fallthroughStylePatterns.push(
      -            [PR_STRING,
      -             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
      -             null]);
      -      } else {
      -        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
      -      }
      -    }
      -    if (options['cStyleComments']) {
      -      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
      -      fallthroughStylePatterns.push(
      -          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
      -    }
      -    if (options['regexLiterals']) {
      -      var REGEX_LITERAL = (
      -          // A regular expression literal starts with a slash that is
      -          // not followed by * or / so that it is not confused with
      -          // comments.
      -          '/(?=[^/*])'
      -          // and then contains any number of raw characters,
      -          + '(?:[^/\\x5B\\x5C]'
      -          // escape sequences (\x5C),
      -          +    '|\\x5C[\\s\\S]'
      -          // or non-nesting character sets (\x5B\x5D);
      -          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
      -          // finally closed by a /.
      -          + '/');
      -      fallthroughStylePatterns.push(
      -          ['lang-regex',
      -           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
      -           ]);
      -    }
      -
      -    var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
      -    if (keywords.length) {
      -      fallthroughStylePatterns.push(
      -          [PR_KEYWORD,
      -           new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
      -    }
      -
      -    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
      -    fallthroughStylePatterns.push(
      -        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
      -        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
      -        [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
      -        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
      -        [PR_LITERAL,
      -         new RegExp(
      -             '^(?:'
      -             // A hex number
      -             + '0x[a-f0-9]+'
      -             // or an octal or decimal number,
      -             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
      -             // possibly in scientific notation
      -             + '(?:e[+\\-]?\\d+)?'
      -             + ')'
      -             // with an optional modifier like UL for unsigned long
      -             + '[a-z]*', 'i'),
      -         null, '0123456789'],
      -        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
      -
      -    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      -  }
      -
      -  var decorateSource = sourceDecorator({
      -        'keywords': ALL_KEYWORDS,
      -        'hashComments': true,
      -        'cStyleComments': true,
      -        'multiLineStrings': true,
      -        'regexLiterals': true
      -      });
      -
      -  /** Breaks {@code job.source} around style boundaries in
      -    * {@code job.decorations} while re-interleaving {@code job.extractedTags},
      -    * and leaves the result in {@code job.prettyPrintedHtml}.
      -    * @param {Object} job like {
      -    *    source: {string} source as plain text,
      -    *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
      -    *                   html preceded by their position in {@code job.source}
      -    *                   in order
      -    *    decorations: {Array.<number|string} an array of style classes preceded
      -    *                 by the position at which they start in job.source in order
      -    * }
      -    * @private
      -    */
      -  function recombineTagsAndDecorations(job) {
      -    var sourceText = job.source;
      -    var extractedTags = job.extractedTags;
      -    var decorations = job.decorations;
      -    var numberLines = job.numberLines;
      -    var sourceNode = job.sourceNode;
      -
      -    var html = [];
      -    // index past the last char in sourceText written to html
      -    var outputIdx = 0;
      -
      -    var openDecoration = null;
      -    var currentDecoration = null;
      -    var tagPos = 0;  // index into extractedTags
      -    var decPos = 0;  // index into decorations
      -    var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
      -
      -    var adjacentSpaceRe = /([\r\n ]) /g;
      -    var startOrSpaceRe = /(^| ) /gm;
      -    var newlineRe = /\r\n?|\n/g;
      -    var trailingSpaceRe = /[ \r\n]$/;
      -    var lastWasSpace = true;  // the last text chunk emitted ended with a space.
      -
      -    // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
      -    var isIE678 = window['_pr_isIE6']();
      -    var lineBreakHtml = (
      -        isIE678
      -        ? (sourceNode && sourceNode.tagName === 'PRE'
      -           // Use line feeds instead of <br>s so that copying and pasting works
      -           // on IE.
      -           // See Issue 104 for the derivation of this mess.
      -           ? (isIE678 === 6 ? '&#160;\r\n' :
      -              isIE678 === 7 ? '&#160;<br />\r' :
      -              isIE678 === 8 ? '&#160;<br />' : '&#160;\r')
      -           // IE collapses multiple adjacent <br>s into 1 line break.
      -           // Prefix every newline with '&#160;' to prevent such behavior.
      -           // &nbsp; is the same as &#160; but works in XML as well as HTML.
      -           : '&#160;<br />')
      -        : '<br />');
      -
      -    var lineBreaker;
      -    if (numberLines) {
      -      var lineBreaks = [];
      -      for (var i = 0; i < 10; ++i) {
      -        lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">';
      -      }
      -      var lineNum = typeof numberLines === 'number'
      -          ? numberLines - 1 /* number lines are 1 indexed */ : 0;
      -      html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"');
      -      if (lineNum) {
      -        html.push(' value="', lineNum + 1, '"');
      -      }
      -      html.push('>');
      -      lineBreaker = function () {
      -        var lb = lineBreaks[++lineNum % 10];
      -        // If a decoration is open, we need to close it before closing a list-item
      -        // and reopen it on the other side of the list item.
      -        return openDecoration
      -            ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb;
      -      };
      -    } else {
      -      lineBreaker = lineBreakHtml;
      -    }
      -
      -    // A helper function that is responsible for opening sections of decoration
      -    // and outputing properly escaped chunks of source
      -    function emitTextUpTo(sourceIdx) {
      -      if (sourceIdx > outputIdx) {
      -        if (openDecoration && openDecoration !== currentDecoration) {
      -          // Close the current decoration
      -          html.push('</span>');
      -          openDecoration = null;
      -        }
      -        if (!openDecoration && currentDecoration) {
      -          openDecoration = currentDecoration;
      -          html.push('<span class="', openDecoration, '">');
      -        }
      -        // This interacts badly with some wikis which introduces paragraph tags
      -        // into pre blocks for some strange reason.
      -        // It's necessary for IE though which seems to lose the preformattedness
      -        // of <pre> tags when their innerHTML is assigned.
      -        // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
      -        // and it serves to undo the conversion of <br>s to newlines done in
      -        // chunkify.
      -        var htmlChunk = textToHtml(
      -            tabExpander(sourceText.substring(outputIdx, sourceIdx)))
      -            .replace(lastWasSpace
      -                     ? startOrSpaceRe
      -                     : adjacentSpaceRe, '$1&#160;');
      -        // Keep track of whether we need to escape space at the beginning of the
      -        // next chunk.
      -        lastWasSpace = trailingSpaceRe.test(htmlChunk);
      -        html.push(htmlChunk.replace(newlineRe, lineBreaker));
      -        outputIdx = sourceIdx;
      -      }
      -    }
      -
      -    while (true) {
      -      // Determine if we're going to consume a tag this time around.  Otherwise
      -      // we consume a decoration or exit.
      -      var outputTag;
      -      if (tagPos < extractedTags.length) {
      -        if (decPos < decorations.length) {
      -          // Pick one giving preference to extractedTags since we shouldn't open
      -          // a new style that we're going to have to immediately close in order
      -          // to output a tag.
      -          outputTag = extractedTags[tagPos] <= decorations[decPos];
      -        } else {
      -          outputTag = true;
      -        }
      -      } else {
      -        outputTag = false;
      -      }
      -      // Consume either a decoration or a tag or exit.
      -      if (outputTag) {
      -        emitTextUpTo(extractedTags[tagPos]);
      -        if (openDecoration) {
      -          // Close the current decoration
      -          html.push('</span>');
      -          openDecoration = null;
      -        }
      -        html.push(extractedTags[tagPos + 1]);
      -        tagPos += 2;
      -      } else if (decPos < decorations.length) {
      -        emitTextUpTo(decorations[decPos]);
      -        currentDecoration = decorations[decPos + 1];
      -        decPos += 2;
      -      } else {
      -        break;
      -      }
      -    }
      -    emitTextUpTo(sourceText.length);
      -    if (openDecoration) {
      -      html.push('</span>');
      -    }
      -    if (numberLines) { html.push('</li></ol>'); }
      -    job.prettyPrintedHtml = html.join('');
      -  }
      -
      -  /** Maps language-specific file extensions to handlers. */
      -  var langHandlerRegistry = {};
      -  /** Register a language handler for the given file extensions.
      -    * @param {function (Object)} handler a function from source code to a list
      -    *      of decorations.  Takes a single argument job which describes the
      -    *      state of the computation.   The single parameter has the form
      -    *      {@code {
      -    *        source: {string} as plain text.
      -    *        decorations: {Array.<number|string>} an array of style classes
      -    *                     preceded by the position at which they start in
      -    *                     job.source in order.
      -    *                     The language handler should assigned this field.
      -    *        basePos: {int} the position of source in the larger source chunk.
      -    *                 All positions in the output decorations array are relative
      -    *                 to the larger source chunk.
      -    *      } }
      -    * @param {Array.<string>} fileExtensions
      -    */
      -  function registerLangHandler(handler, fileExtensions) {
      -    for (var i = fileExtensions.length; --i >= 0;) {
      -      var ext = fileExtensions[i];
      -      if (!langHandlerRegistry.hasOwnProperty(ext)) {
      -        langHandlerRegistry[ext] = handler;
      -      } else if ('console' in window) {
      -        console['warn']('cannot override language handler %s', ext);
      -      }
      -    }
      -  }
      -  function langHandlerForExtension(extension, source) {
      -    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
      -      // Treat it as markup if the first non whitespace character is a < and
      -      // the last non-whitespace character is a >.
      -      extension = /^\s*</.test(source)
      -          ? 'default-markup'
      -          : 'default-code';
      -    }
      -    return langHandlerRegistry[extension];
      -  }
      -  registerLangHandler(decorateSource, ['default-code']);
      -  registerLangHandler(
      -      createSimpleLexer(
      -          [],
      -          [
      -           [PR_PLAIN,       /^[^<?]+/],
      -           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
      -           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
      -           // Unescaped content in an unknown language
      -           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
      -           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
      -           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
      -           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
      -           // Unescaped content in javascript.  (Or possibly vbscript).
      -           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
      -           // Contains unescaped stylesheet content
      -           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
      -           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
      -          ]),
      -      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      -  registerLangHandler(
      -      createSimpleLexer(
      -          [
      -           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
      -           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
      -           ],
      -          [
      -           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
      -           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
      -           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
      -           [PR_PUNCTUATION,  /^[=<>\/]+/],
      -           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
      -           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
      -           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
      -           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
      -           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
      -           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
      -           ]),
      -      ['in.tag']);
      -  registerLangHandler(
      -      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': CPP_KEYWORDS,
      -          'hashComments': true,
      -          'cStyleComments': true
      -        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': 'null true false'
      -        }), ['json']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': CSHARP_KEYWORDS,
      -          'hashComments': true,
      -          'cStyleComments': true,
      -          'verbatimStrings': true
      -        }), ['cs']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': JAVA_KEYWORDS,
      -          'cStyleComments': true
      -        }), ['java']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': SH_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true
      -        }), ['bsh', 'csh', 'sh']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': PYTHON_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'tripleQuotedStrings': true
      -        }), ['cv', 'py']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': PERL_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'regexLiterals': true
      -        }), ['perl', 'pl', 'pm']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': RUBY_KEYWORDS,
      -          'hashComments': true,
      -          'multiLineStrings': true,
      -          'regexLiterals': true
      -        }), ['rb']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': JSCRIPT_KEYWORDS,
      -          'cStyleComments': true,
      -          'regexLiterals': true
      -        }), ['js']);
      -  registerLangHandler(sourceDecorator({
      -          'keywords': COFFEE_KEYWORDS,
      -          'hashComments': 3,  // ### style block comments
      -          'cStyleComments': true,
      -          'multilineStrings': true,
      -          'tripleQuotedStrings': true,
      -          'regexLiterals': true
      -        }), ['coffee']);
      -  registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
      -
      -  function applyDecorator(job) {
      -    var sourceCodeHtml = job.sourceCodeHtml;
      -    var opt_langExtension = job.langExtension;
      -
      -    // Prepopulate output in case processing fails with an exception.
      -    job.prettyPrintedHtml = sourceCodeHtml;
      -
      -    try {
      -      // Extract tags, and convert the source code to plain text.
      -      var sourceAndExtractedTags = extractTags(sourceCodeHtml);
      -      /** Plain text. @type {string} */
      -      var source = sourceAndExtractedTags.source;
      -      job.source = source;
      -      job.basePos = 0;
      -
      -      /** Even entries are positions in source in ascending order.  Odd entries
      -        * are tags that were extracted at that position.
      -        * @type {Array.<number|string>}
      -        */
      -      job.extractedTags = sourceAndExtractedTags.tags;
      -
      -      // Apply the appropriate language handler
      -      langHandlerForExtension(opt_langExtension, source)(job);
      -      // Integrate the decorations and tags back into the source code to produce
      -      // a decorated html string which is left in job.prettyPrintedHtml.
      -      recombineTagsAndDecorations(job);
      -    } catch (e) {
      -      if ('console' in window) {
      -        console['log'](e && e['stack'] ? e['stack'] : e);
      -      }
      -    }
      -  }
      -
      -  /**
      -   * @param sourceCodeHtml {string} The HTML to pretty print.
      -   * @param opt_langExtension {string} The language name to use.
      -   *     Typically, a filename extension like 'cpp' or 'java'.
      -   * @param opt_numberLines {number|boolean} True to number lines,
      -   *     or the 1-indexed number of the first line in sourceCodeHtml.
      -   */
      -  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
      -    var job = {
      -      sourceCodeHtml: sourceCodeHtml,
      -      langExtension: opt_langExtension,
      -      numberLines: opt_numberLines
      -    };
      -    applyDecorator(job);
      -    return job.prettyPrintedHtml;
      -  }
      -
      -  function prettyPrint(opt_whenDone) {
      -    function byTagName(tn) { return document.getElementsByTagName(tn); }
      -    // fetch a list of nodes to rewrite
      -    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
      -    var elements = [];
      -    for (var i = 0; i < codeSegments.length; ++i) {
      -      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
      -        elements.push(codeSegments[i][j]);
      -      }
      -    }
      -    codeSegments = null;
      -
      -    var clock = Date;
      -    if (!clock['now']) {
      -      clock = { 'now': function () { return (new Date).getTime(); } };
      -    }
      -
      -    // The loop is broken into a series of continuations to make sure that we
      -    // don't make the browser unresponsive when rewriting a large page.
      -    var k = 0;
      -    var prettyPrintingJob;
      -
      -    function doWork() {
      -      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
      -                     clock.now() + 250 /* ms */ :
      -                     Infinity);
      -      for (; k < elements.length && clock.now() < endTime; k++) {
      -        var cs = elements[k];
      -        if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
      -          // If the classes includes a language extensions, use it.
      -          // Language extensions can be specified like
      -          //     <pre class="prettyprint lang-cpp">
      -          // the language extension "cpp" is used to find a language handler as
      -          // passed to PR.registerLangHandler.
      -          var langExtension = cs.className.match(/\blang-(\w+)\b/);
      -          if (langExtension) { langExtension = langExtension[1]; }
      -
      -          // make sure this is not nested in an already prettified element
      -          var nested = false;
      -          for (var p = cs.parentNode; p; p = p.parentNode) {
      -            if ((p.tagName === 'pre' || p.tagName === 'code' ||
      -                 p.tagName === 'xmp') &&
      -                p.className && p.className.indexOf('prettyprint') >= 0) {
      -              nested = true;
      -              break;
      -            }
      -          }
      -          if (!nested) {
      -            // fetch the content as a snippet of properly escaped HTML.
      -            // Firefox adds newlines at the end.
      -            var content = getInnerHtml(cs);
      -            content = content.replace(/(?:\r\n?|\n)$/, '');
      -
      -            // Look for a class like linenums or linenums:<n> where <n> is the
      -            // 1-indexed number of the first line.
      -            var numberLines = cs.className.match(/\blinenums\b(?::(\d+))?/);
      -
      -            // do the pretty printing
      -            prettyPrintingJob = {
      -              sourceCodeHtml: content,
      -              langExtension: langExtension,
      -              sourceNode: cs,
      -              numberLines: numberLines
      -                  ? numberLines[1] && numberLines[1].length ? +numberLines[1] : true
      -                  : false
      -            };
      -            applyDecorator(prettyPrintingJob);
      -            replaceWithPrettyPrintedHtml();
      -          }
      -        }
      -      }
      -      if (k < elements.length) {
      -        // finish up in a continuation
      -        setTimeout(doWork, 250);
      -      } else if (opt_whenDone) {
      -        opt_whenDone();
      -      }
      -    }
      -
      -    function replaceWithPrettyPrintedHtml() {
      -      var newContent = prettyPrintingJob.prettyPrintedHtml;
      -      if (!newContent) { return; }
      -      var cs = prettyPrintingJob.sourceNode;
      -
      -      // push the prettified html back into the tag.
      -      if (!isRawContent(cs)) {
      -        // just replace the old html with the new
      -        cs.innerHTML = newContent;
      -      } else {
      -        // we need to change the tag to a <pre> since <xmp>s do not allow
      -        // embedded tags such as the span tags used to attach styles to
      -        // sections of source code.
      -        var pre = document.createElement('PRE');
      -        for (var i = 0; i < cs.attributes.length; ++i) {
      -          var a = cs.attributes[i];
      -          if (a.specified) {
      -            var aname = a.name.toLowerCase();
      -            if (aname === 'class') {
      -              pre.className = a.value;  // For IE 6
      -            } else {
      -              pre.setAttribute(a.name, a.value);
      -            }
      -          }
      -        }
      -        pre.innerHTML = newContent;
      -
      -        // remove the old
      -        cs.parentNode.replaceChild(pre, cs);
      -        cs = pre;
      -      }
      -    }
      -
      -    doWork();
      -  }
      -
      -  window['PR_normalizedHtml'] = normalizedHtml;
      -  window['prettyPrintOne'] = prettyPrintOne;
      -  window['prettyPrint'] = prettyPrint;
      -  window['PR'] = {
      -        'combinePrefixPatterns': combinePrefixPatterns,
      -        'createSimpleLexer': createSimpleLexer,
      -        'registerLangHandler': registerLangHandler,
      -        'sourceDecorator': sourceDecorator,
      -        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
      -        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
      -        'PR_COMMENT': PR_COMMENT,
      -        'PR_DECLARATION': PR_DECLARATION,
      -        'PR_KEYWORD': PR_KEYWORD,
      -        'PR_LITERAL': PR_LITERAL,
      -        'PR_NOCODE': PR_NOCODE,
      -        'PR_PLAIN': PR_PLAIN,
      -        'PR_PUNCTUATION': PR_PUNCTUATION,
      -        'PR_SOURCE': PR_SOURCE,
      -        'PR_STRING': PR_STRING,
      -        'PR_TAG': PR_TAG,
      -        'PR_TYPE': PR_TYPE
      -      };
      -})();
      -
      -//third_party/javascript/google_code_prettify/src/lang-apollo.js
      -/**
      - * @license Copyright (C) 2009 Onno Hommes.
      - *
      - * 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for the AGC/AEA Assembly Language as described
      - * at http://virtualagc.googlecode.com
      - * <p>
      - * This file could be used by goodle code to allow syntax highlight for
      - * Virtual AGC SVN repository or if you don't want to commonize
      - * the header for the agc/aea html assembly listing.
      - *
      - * @author ohommes@alumni.cmu.edu
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // A line comment that starts with ;
      -         [PR['PR_COMMENT'],     /^#[^\r\n]*/, null, '#'],
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double quoted, possibly multi-line, string.
      -         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
      -        ],
      -        [
      -         [PR['PR_KEYWORD'], /^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null],
      -         [PR['PR_TYPE'], /^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],
      -         // A single quote possibly followed by a word that optionally ends with
      -         // = ! or ?.
      -         [PR['PR_LITERAL'],
      -          /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
      -         // Any word including labels that optionally ends with = ! or ?.
      -         [PR['PR_PLAIN'],
      -          /^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
      -         // A printable non-space non-special character
      -         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
      -        ]),
      -    ['apollo', 'agc', 'aea']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-clj.js
      -/**
      - * @license Copyright (C) 2011 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Clojure.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-lisp">(my lisp code)</pre>
      - * The lang-cl class identifies the language as common lisp.
      - * This file supports the following language extensions:
      - *     lang-clj - Clojure
      - *
      - *
      - * I used lang-lisp.js as the basis for this adding the clojure specific
      - * keywords and syntax.
      - *
      - * "Name"    = 'Clojure'
      - * "Author"  = 'Rich Hickey'
      - * "Version" = '1.2'
      - * "About"   = 'Clojure is a lisp for the jvm with concurrency primitives and a richer set of types.'
      - *
      - *
      - * I used <a href="http://clojure.org/Reference">Clojure.org Reference</a> as
      - * the basis for the reserved word list.
      - *
      - *
      - * @author jwall@google.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // clojure has more paren types than minimal lisp.
      -         ['opn',             /^[\(\{\[]+/, null, '([{'],
      -         ['clo',             /^[\)\}\]]+/, null, ')]}'],
      -         // A line comment that starts with ;
      -         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double quoted, possibly multi-line, string.
      -         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
      -        ],
      -        [
      -         // clojure has a much larger set of keywords
      -         [PR['PR_KEYWORD'],     /^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/, null],
      -         [PR['PR_TYPE'], /^:[0-9a-zA-Z\-]+/]
      -        ]),
      -    ['clj']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-css.js
      -/**
      - * @license 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for CSS.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-css"></pre>
      - *
      - *
      - * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
      - * grammar.  This scheme does not recognize keywords containing escapes.
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // The space production <s>
      -         [PR['PR_PLAIN'],       /^[ \t\r\n\f]+/, null, ' \t\r\n\f']
      -        ],
      -        [
      -         // Quoted strings.  <string1> and <string2>
      -         [PR['PR_STRING'],
      -          /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null],
      -         [PR['PR_STRING'],
      -          /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null],
      -         ['lang-css-str', /^url\(([^\)\"\']*)\)/i],
      -         [PR['PR_KEYWORD'],
      -          /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,
      -          null],
      -         // A property name -- an identifier followed by a colon.
      -         ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],
      -         // A C style block comment.  The <comment> production.
      -         [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
      -         // Escaping text spans
      -         [PR['PR_COMMENT'], /^(?:<!--|-->)/],
      -         // A number possibly containing a suffix.
      -         [PR['PR_LITERAL'], /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],
      -         // A hex color
      -         [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}/i],
      -         // An identifier
      -         [PR['PR_PLAIN'],
      -          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],
      -         // A run of punctuation
      -         [PR['PR_PUNCTUATION'], /^[^\s\w\'\"]+/]
      -        ]),
      -    ['css']);
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer']([],
      -        [
      -         [PR['PR_KEYWORD'],
      -          /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]
      -        ]),
      -    ['css-kw']);
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer']([],
      -        [
      -         [PR['PR_STRING'], /^[^\)\"\']+/]
      -        ]),
      -    ['css-str']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-go.js
      -/**
      - * @license Copyright (C) 2010 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for the Go language..
      - * <p>
      - * Based on the lexical grammar at 
      - * http://golang.org/doc/go_spec.html#Lexical_elements
      - * <p>
      - * Go uses a minimal style for highlighting so the below does not distinguish
      - * strings, keywords, literals, etc. by design.
      - * From a discussion with the Go designers:
      - * <pre>
      - * On Thursday, July 22, 2010, Mike Samuel <...> wrote:
      - * > On Thu, Jul 22, 2010, Rob 'Commander' Pike <...> wrote:
      - * >> Personally, I would vote for the subdued style godoc presents at http://golang.org
      - * >>
      - * >> Not as fancy as some like, but a case can be made it's the official style.
      - * >> If people want more colors, I wouldn't fight too hard, in the interest of
      - * >> encouragement through familiarity, but even then I would ask to shy away
      - * >> from technicolor starbursts.
      - * >
      - * > Like http://golang.org/pkg/go/scanner/ where comments are blue and all
      - * > other content is black?  I can do that.
      - * </pre>
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace is made up of spaces, tabs and newline characters.
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // Not escaped as a string.  See note on minimalism above.
      -         [PR['PR_PLAIN'],       /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])+(?:\'|$))/, null, '"\'']
      -        ],
      -        [
      -         // Block comments are delimited by /* and */.
      -         // Single-line comments begin with // and extend to the end of a line.
      -         [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\/\*[\s\S]*?\*\/)/],
      -         [PR['PR_PLAIN'],       /^(?:[^\/\"\']|\/(?![\/\*]))+/i]
      -        ]),
      -    ['go']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-hs.js
      -/**
      - * @license 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Haskell.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-hs">(my lisp code)</pre>
      - * The lang-cl class identifies the language as common lisp.
      - * This file supports the following language extensions:
      - *     lang-cl - Common Lisp
      - *     lang-el - Emacs Lisp
      - *     lang-lisp - Lisp
      - *     lang-scm - Scheme
      - *
      - *
      - * I used http://www.informatik.uni-freiburg.de/~thiemann/haskell/haskell98-report-html/syntax-iso.html
      - * as the basis, but ignore the way the ncomment production nests since this
      - * makes the lexical grammar irregular.  It might be possible to support
      - * ncomments using the lookbehind filter.
      - *
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         // whitechar    ->    newline | vertab | space | tab | uniWhite
      -         // newline      ->    return linefeed | return | linefeed | formfeed
      -         [PR['PR_PLAIN'],       /^[\t\n\x0B\x0C\r ]+/, null, '\t\n\x0B\x0C\r '],
      -         // Single line double and single-quoted strings.
      -         // char         ->    ' (graphic<' | \> | space | escape<\&>) '
      -         // string       ->    " {graphic<" | \> | space | escape | gap}"
      -         // escape       ->    \ ( charesc | ascii | decimal | o octal
      -         //                        | x hexadecimal )
      -         // charesc      ->    a | b | f | n | r | t | v | \ | " | ' | &
      -         [PR['PR_STRING'],      /^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,
      -          null, '"'],
      -         [PR['PR_STRING'],      /^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,
      -          null, "'"],
      -         // decimal      ->    digit{digit}
      -         // octal        ->    octit{octit}
      -         // hexadecimal  ->    hexit{hexit}
      -         // integer      ->    decimal
      -         //               |    0o octal | 0O octal
      -         //               |    0x hexadecimal | 0X hexadecimal
      -         // float        ->    decimal . decimal [exponent]
      -         //               |    decimal exponent
      -         // exponent     ->    (e | E) [+ | -] decimal
      -         [PR['PR_LITERAL'],
      -          /^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,
      -          null, '0123456789']
      -        ],
      -        [
      -         // Haskell does not have a regular lexical grammar due to the nested
      -         // ncomment.
      -         // comment      ->    dashes [ any<symbol> {any}] newline
      -         // ncomment     ->    opencom ANYseq {ncomment ANYseq}closecom
      -         // dashes       ->    '--' {'-'}
      -         // opencom      ->    '{-'
      -         // closecom     ->    '-}'
      -         [PR['PR_COMMENT'],     /^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],
      -         // reservedid   ->    case | class | data | default | deriving | do
      -         //               |    else | if | import | in | infix | infixl | infixr
      -         //               |    instance | let | module | newtype | of | then
      -         //               |    type | where | _
      -         [PR['PR_KEYWORD'],     /^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/, null],
      -         // qvarid       ->    [ modid . ] varid
      -         // qconid       ->    [ modid . ] conid
      -         // varid        ->    (small {small | large | digit | ' })<reservedid>
      -         // conid        ->    large {small | large | digit | ' }
      -         // modid        ->    conid
      -         // small        ->    ascSmall | uniSmall | _
      -         // ascSmall     ->    a | b | ... | z
      -         // uniSmall     ->    any Unicode lowercase letter
      -         // large        ->    ascLarge | uniLarge
      -         // ascLarge     ->    A | B | ... | Z
      -         // uniLarge     ->    any uppercase or titlecase Unicode letter
      -         [PR['PR_PLAIN'],  /^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],
      -         // matches the symbol production
      -         [PR['PR_PUNCTUATION'], /^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]
      -        ]),
      -    ['hs']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-lisp.js
      -/**
      - * @license Copyright (C) 2008 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Common Lisp and related languages.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-lisp">(my lisp code)</pre>
      - * The lang-cl class identifies the language as common lisp.
      - * This file supports the following language extensions:
      - *     lang-cl - Common Lisp
      - *     lang-el - Emacs Lisp
      - *     lang-lisp - Lisp
      - *     lang-scm - Scheme
      - *
      - *
      - * I used http://www.devincook.com/goldparser/doc/meta-language/grammar-LISP.htm
      - * as the basis, but added line comments that start with ; and changed the atom
      - * production to disallow unquoted semicolons.
      - *
      - * "Name"    = 'LISP'
      - * "Author"  = 'John McCarthy'
      - * "Version" = 'Minimal'
      - * "About"   = 'LISP is an abstract language that organizes ALL'
      - *           | 'data around "lists".'
      - *
      - * "Start Symbol" = [s-Expression]
      - *
      - * {Atom Char}   = {Printable} - {Whitespace} - [()"\'']
      - *
      - * Atom = ( {Atom Char} | '\'{Printable} )+
      - *
      - * [s-Expression] ::= [Quote] Atom
      - *                  | [Quote] '(' [Series] ')'
      - *                  | [Quote] '(' [s-Expression] '.' [s-Expression] ')'
      - *
      - * [Series] ::= [s-Expression] [Series]
      - *            |
      - *
      - * [Quote]  ::= ''      !Quote = do not evaluate
      - *            |
      - *
      - *
      - * I used <a href="http://gigamonkeys.com/book/">Practical Common Lisp</a> as
      - * the basis for the reserved word list.
      - *
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         ['opn',             /^\(+/, null, '('],
      -         ['clo',             /^\)+/, null, ')'],
      -         // A line comment that starts with ;
      -         [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double quoted, possibly multi-line, string.
      -         [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
      -        ],
      -        [
      -         [PR['PR_KEYWORD'],     /^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/, null],
      -         [PR['PR_LITERAL'],
      -          /^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],
      -         // A single quote possibly followed by a word that optionally ends with
      -         // = ! or ?.
      -         [PR['PR_LITERAL'],
      -          /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
      -         // A word that optionally ends with = ! or ?.
      -         [PR['PR_PLAIN'],
      -          /^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
      -         // A printable non-space non-special character
      -         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
      -        ]),
      -    ['cl', 'el', 'lisp', 'scm']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-lua.js
      -/**
      - * @license Copyright (C) 2008 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Lua.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-lua">(my Lua code)</pre>
      - *
      - *
      - * I used http://www.lua.org/manual/5.1/manual.html#2.1
      - * Because of the long-bracket concept used in strings and comments, Lua does
      - * not have a regular lexical grammar, but luckily it fits within the space
      - * of irregular grammars supported by javascript regular expressions.
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double or single quoted, possibly multi-line, string.
      -         [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\'']
      -        ],
      -        [
      -         // A comment is either a line comment that starts with two dashes, or
      -         // two dashes preceding a long bracketed block.
      -         [PR['PR_COMMENT'], /^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],
      -         // A long bracketed block not preceded by -- is a string.
      -         [PR['PR_STRING'],  /^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],
      -         [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/, null],
      -         // A number is a hex integer literal, a decimal real literal, or in
      -         // scientific notation.
      -         [PR['PR_LITERAL'],
      -          /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
      -         // An identifier
      -         [PR['PR_PLAIN'], /^[a-z_]\w*/i],
      -         // A run of punctuation
      -         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]
      -        ]),
      -    ['lua']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-ml.js
      -/**
      - * @license Copyright (C) 2008 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for OCaml, SML, F# and similar languages.
      - *
      - * Based on the lexical grammar at
      - * http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597388
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace is made up of spaces, tabs and newline characters.
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // #if ident/#else/#endif directives delimit conditional compilation
      -         // sections
      -         [PR['PR_COMMENT'],
      -          /^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,
      -          null, '#'],
      -         // A double or single quoted, possibly multi-line, string.
      -         // F# allows escaped newlines in strings.
      -         [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/, null, '"\'']
      -        ],
      -        [
      -         // Block comments are delimited by (* and *) and may be
      -         // nested. Single-line comments begin with // and extend to
      -         // the end of a line.
      -         // TODO: (*...*) comments can be nested.  This does not handle that.
      -         [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],
      -         [PR['PR_KEYWORD'],     /^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
      -         // A number is a hex integer literal, a decimal real literal, or in
      -         // scientific notation.
      -         [PR['PR_LITERAL'],
      -          /^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
      -         [PR['PR_PLAIN'],       /^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],
      -         // A printable non-space non-special character
      -         [PR['PR_PUNCTUATION'], /^[^\t\n\r \xA0\"\'\w]+/]
      -        ]),
      -    ['fs', 'ml']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-proto.js
      -/**
      - * @license Copyright (C) 2006 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Protocol Buffers as described at
      - * http://code.google.com/p/protobuf/.
      - *
      - * Based on the lexical grammar at
      - * http://research.microsoft.com/fsharp/manual/spec2.aspx#_Toc202383715
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](PR['sourceDecorator']({
      -        keywords: (
      -            'bool bytes default double enum extend extensions false fixed32 '
      -            + 'fixed64 float group import int32 int64 max message option '
      -            + 'optional package repeated required returns rpc service '
      -            + 'sfixed32 sfixed64 sint32 sint64 string syntax to true uint32 '
      -            + 'uint64'),
      -        cStyleComments: true
      -      }), ['proto']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-scala.js
      -/**
      - * @license Copyright (C) 2010 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Scala.
      - *
      - * Derived from http://lampsvn.epfl.ch/svn-repos/scala/scala-documentation/trunk/src/reference/SyntaxSummary.tex
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double or single quoted string
      -          // or a triple double-quoted multi-line string.
      -         [PR['PR_STRING'],
      -          /^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,
      -          null, '"'],
      -         [PR['PR_LITERAL'],     /^`(?:[^\r\n\\`]|\\.)*`?/, null, '`'],
      -         [PR['PR_PUNCTUATION'], /^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/, null,
      -          '!#%&()*+,-:;<=>?@[\\]^{|}~']
      -        ],
      -        [
      -         // A symbol literal is a single quote followed by an identifier with no
      -         // single quote following
      -         // A character literal has single quotes on either side
      -         [PR['PR_STRING'],      /^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],
      -         [PR['PR_LITERAL'],     /^'[a-zA-Z_$][\w$]*(?!['$\w])/],
      -         [PR['PR_KEYWORD'],     /^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
      -         [PR['PR_LITERAL'],     /^(?:true|false|null|this)\b/],
      -         [PR['PR_LITERAL'],     /^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],
      -         // Treat upper camel case identifiers as types.
      -         [PR['PR_TYPE'],        /^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],
      -         [PR['PR_PLAIN'],       /^[$a-zA-Z_][\w$]*/],
      -         [PR['PR_COMMENT'],     /^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],
      -         [PR['PR_PUNCTUATION'], /^(?:\.+|\/)/]
      -        ]),
      -    ['scala']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-sql.js
      -/**
      - * @license Copyright (C) 2008 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.
      - */
      -
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for SQL.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-sql">(my SQL code)</pre>
      - *
      - *
      - * http://savage.net.au/SQL/sql-99.bnf.html is the basis for the grammar, and
      - * http://msdn.microsoft.com/en-us/library/aa238507(SQL.80).aspx as the basis
      - * for the keyword list.
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
      -         // A double or single quoted, possibly multi-line, string.
      -         [PR['PR_STRING'],      /^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/, null,
      -          '"\'']
      -        ],
      -        [
      -         // A comment is either a line comment that starts with two dashes, or
      -         // two dashes preceding a long bracketed block.
      -         [PR['PR_COMMENT'], /^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],
      -         [PR['PR_KEYWORD'], /^(?:ADD|ALL|ALTER|AND|ANY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|NATIONAL|NOCHECK|NONCLUSTERED|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PERCENT|PLAN|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNION|UNIQUE|UPDATE|UPDATETEXT|USE|USER|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WRITETEXT)(?=[^\w-]|$)/i, null],
      -         // A number is a hex integer literal, a decimal real literal, or in
      -         // scientific notation.
      -         [PR['PR_LITERAL'],
      -          /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
      -         // An identifier
      -         [PR['PR_PLAIN'], /^[a-z_][\w-]*/i],
      -         // A run of punctuation
      -         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]
      -        ]),
      -    ['sql']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-vb.js
      -/**
      - * @license 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.
      - */
      -
      -
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for various flavors of basic.
      - *
      - *
      - * To use, include prettify.js and this file in your HTML page.
      - * Then put your code in an HTML tag like
      - *      <pre class="prettyprint lang-vb"></pre>
      - *
      - *
      - * http://msdn.microsoft.com/en-us/library/aa711638(VS.71).aspx defines the
      - * visual basic grammar lexical grammar.
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t\n\r \xA0\u2028\u2029]+/, null, '\t\n\r \xA0\u2028\u2029'],
      -         // A double quoted string with quotes escaped by doubling them.
      -         // A single character can be suffixed with C.
      -         [PR['PR_STRING'],      /^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i, null,
      -          '"\u201C\u201D'],
      -         // A comment starts with a single quote and runs until the end of the
      -         // line.
      -         [PR['PR_COMMENT'],     /^[\'\u2018\u2019][^\r\n\u2028\u2029]*/, null, '\'\u2018\u2019']
      -        ],
      -        [
      -         [PR['PR_KEYWORD'], /^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i, null],
      -         // A second comment form
      -         [PR['PR_COMMENT'], /^REM[^\r\n\u2028\u2029]*/i],
      -         // A boolean, numeric, or date literal.
      -         [PR['PR_LITERAL'],
      -          /^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],
      -         // An identifier?
      -         [PR['PR_PLAIN'], /^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*\])/i],
      -         // A run of punctuation
      -         [PR['PR_PUNCTUATION'],
      -          /^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],
      -         // Square brackets
      -         [PR['PR_PUNCTUATION'], /^(?:\[|\])/]
      -        ]),
      -    ['vb', 'vbs']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-vhdl.js
      -/**
      - * @fileoverview
      - * Registers a language handler for VHDL '93.
      - *
      - * Based on the lexical grammar and keywords at
      - * http://www.iis.ee.ethz.ch/~zimmi/download/vhdl93_syntax.html
      - *
      - * @author benoit@ryder.fr
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0']
      -        ],
      -        [
      -         // String, character or bit string
      -         [PR['PR_STRING'], /^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],
      -         // Comment, from two dashes until end of line.
      -         [PR['PR_COMMENT'], /^--[^\r\n]*/],
      -         [PR['PR_KEYWORD'], /^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, null],
      -         // Type, predefined or standard
      -         [PR['PR_TYPE'], /^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i, null],
      -         // Predefined attributes
      -         [PR['PR_TYPE'], /^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i, null],
      -         // Number, decimal or based literal
      -         [PR['PR_LITERAL'], /^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i],
      -         // Identifier, basic or extended
      -         [PR['PR_PLAIN'], /^(?:[a-z]\w*|\\[^\\]*\\)/i],
      -         // Punctuation
      -         [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]
      -        ]),
      -    ['vhdl', 'vhd']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-wiki.js
      -/**
      - * @license 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.
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for Wiki pages.
      - *
      - * Based on WikiSyntax at http://code.google.com/p/support/wiki/WikiSyntax
      - *
      - * @author mikesamuel@gmail.com
      - */
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer'](
      -        [
      -         // Whitespace
      -         [PR['PR_PLAIN'],       /^[\t \xA0a-gi-z0-9]+/, null,
      -          '\t \xA0abcdefgijklmnopqrstuvwxyz0123456789'],
      -         // Wiki formatting
      -         [PR['PR_PUNCTUATION'], /^[=*~\^\[\]]+/, null, '=*~^[]']
      -        ],
      -        [
      -         // Meta-info like #summary, #labels, etc.
      -         ['lang-wiki.meta',  /(?:^^|\r\n?|\n)(#[a-z]+)\b/],
      -         // A WikiWord
      -         [PR['PR_LITERAL'],     /^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\b/
      -          ],
      -         // A preformatted block in an unknown language
      -         ['lang-',           /^\{\{\{([\s\S]+?)\}\}\}/],
      -         // A block of source code in an unknown language
      -         ['lang-',           /^`([^\r\n`]+)`/],
      -         // An inline URL.
      -         [PR['PR_STRING'],
      -          /^https?:\/\/[^\/?#\s]*(?:\/[^?#\s]*)?(?:\?[^#\s]*)?(?:#\S*)?/i],
      -         [PR['PR_PLAIN'],       /^(?:\r\n|[\s\S])[^#=*~^A-Zh\{`\[\r\n]*/]
      -        ]),
      -    ['wiki']);
      -
      -PR['registerLangHandler'](
      -    PR['createSimpleLexer']([[PR['PR_KEYWORD'], /^#[a-z]+/i, null, '#']], []),
      -    ['wiki.meta']);
      -
      -//third_party/javascript/google_code_prettify/src/lang-yaml.js
      -/** Contributed by ribrdb @ code.google.com
      - */
      -
      -/**
      - * @fileoverview
      - * Registers a language handler for YAML.
      - *
      - * @author ribrdb
      - */
      -
      -PR['registerLangHandler'](
      -  PR['createSimpleLexer'](
      -    [
      -      [PR['PR_PUNCTUATION'], /^[:|>?]+/, null, ':|>?'],
      -      [PR['PR_DECLARATION'],  /^%(?:YAML|TAG)[^#\r\n]+/, null, '%'],
      -      [PR['PR_TYPE'], /^[&]\S+/, null, '&'],
      -      [PR['PR_TYPE'], /^!\S*/, null, '!'],
      -      [PR['PR_STRING'], /^"(?:[^\\"]|\\.)*(?:"|$)/, null, '"'],
      -      [PR['PR_STRING'], /^'(?:[^']|'')*(?:'|$)/, null, "'"],
      -      [PR['PR_COMMENT'], /^#[^\r\n]*/, null, '#'],
      -      [PR['PR_PLAIN'], /^\s+/, null, ' \t\r\n']
      -    ],
      -    [
      -      [PR['PR_DECLARATION'], /^(?:---|\.\.\.)(?:[\r\n]|$)/],
      -      [PR['PR_PUNCTUATION'], /^-/],
      -      [PR['PR_KEYWORD'], /^\w+:[ \r\n]/],
      -      [PR['PR_PLAIN'], /^\w+/]
      -    ]), ['yaml', 'yml']);
      -
      -//third_party/javascript/jquery/v1_7_2/jquery-1.7.2.min.js
      -/**
      - * @license jQuery JavaScript Library v1.7.2
      - * http://jquery.com/
      - *
      - * Copyright 2011, John Resig
      - * Dual licensed under the MIT or GPL Version 2 licenses.
      - * http://jquery.org/license
      - *
      - * Includes Sizzle.js
      - * http://sizzlejs.com/
      - * Copyright 2011, The Dojo Foundation
      - * Released under the MIT, BSD, and GPL Licenses.
      - *
      - * Date: Wed Mar 21 12:46:34 2012 -0700
      - */
      -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
      -a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
      -.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
      -
      -//third_party/javascript/jquery_hashchange/jquery.hashchange.js
      -/**
      - * @license
      - * jQuery hashchange 1.0.0
      - * 
      - * (based on jquery.history)
      - *
      - * Copyright (c) 2008 Chris Leishman (chrisleishman.com)
      - * Dual licensed under the MIT (MIT-LICENSE.txt)
      - * and GPL (GPL-LICENSE.txt) licenses.
      - */
      -(function($) {
      -
      -$.fn.extend({
      -    hashchange: function(callback) { this.bind('hashchange', callback) },
      -    openOnClick: function(href) {
      -		if (href === undefined || href.length == 0)
      -			href = '#';
      -		return this.click(function(ev) {
      -			if (href && href.charAt(0) == '#') {
      -				// execute load in separate call stack
      -				window.setTimeout(function() { $.locationHash(href) }, 0);
      -			} else {
      -				window.location(href);
      -			}
      -			ev.stopPropagation();
      -			return false;
      -		});
      -    }
      -});
      -
      -// IE 8 introduces the hashchange event natively - so nothing more to do
      -if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
      -	$.extend({
      -		locationHash: function(hash) {
      -	        if (!hash) hash = '#';
      -	        else if (hash.charAt(0) != '#') hash = '#' + hash;
      -	        location.hash = hash;
      -	    }
      -	});
      -	return;
      -}
      -
      -var curHash;
      -// hidden iframe for IE (earlier than 8)
      -var iframe;
      -
      -$.extend({
      -	locationHash: function(hash) {
      -		if (curHash === undefined) return;
      -
      -		if (!hash) hash = '#';
      -		else if (hash.charAt(0) != '#') hash = '#' + hash;
      -		
      -		location.hash = hash;
      -		
      -		if (curHash == hash) return;
      -		curHash = hash;
      -		
      -		if ($.browser.msie) updateIEFrame(hash);
      -		$.event.trigger('hashchange');
      -	}
      -});
      -
      -$(document).ready(function() {
      -    curHash = location.hash;
      -    if ($.browser.msie) {
      -        // stop the callback firing twice during init if no hash present
      -        if (curHash == '') curHash = '#';
      -        // add hidden iframe for IE
      -        iframe = $('<iframe />').hide().get(0);
      -        $('body').prepend(iframe);
      -        updateIEFrame(location.hash);
      -        setInterval(checkHashIE, 100);
      -    } else {
      -        setInterval(checkHash, 100);
      -    }
      -});
      -$(window).unload(function() { iframe = null });
      -
      -function checkHash() {
      -    var hash = location.hash;
      -    if (hash != curHash) {
      -        curHash = hash;
      -        $.event.trigger('hashchange');
      -    }
      -}
      -
      -if ($.browser.msie) {
      -    // Attach a live handler for any anchor links
      -    $('a[href^=#]').live('click', function() {
      -        var hash = $(this).attr('href');
      -        // Don't intercept the click if there is an existing anchor on the page
      -        // that matches this hash
      -        if ($(hash).length == 0 && $('a[name='+hash.slice(1)+']').length == 0) {
      -            $.locationHash(hash);
      -            return false;
      -        }
      -    });
      -}
      -
      -function checkHashIE() {
      -    // On IE, check for location.hash of iframe
      -    var idoc = iframe.contentDocument || iframe.contentWindow.document;
      -    var hash = idoc.location.hash;
      -    if (hash == '') hash = '#';
      -
      -    if (hash != curHash) {
      -        if (location.hash != hash) location.hash = hash;
      -        curHash = hash;
      -        $.event.trigger('hashchange');
      -    }
      -}
      -
      -function updateIEFrame(hash) {
      -    if (hash == '#') hash = '';
      -    var idoc = iframe.contentWindow.document;
      -    idoc.open();
      -    idoc.close();
      -    if (idoc.location.hash != hash) idoc.location.hash = hash;
      -}
      -
      -})(jQuery);
      -
      -//third_party/javascript/jquery_jscrollpane/jquery.jscrollpane.min.js
      -/*
      - * @license
      - * jScrollPane - v2.0.0beta12 - 2012-09-27
      - * http://jscrollpane.kelvinluck.com/
      - *
      - * Copyright (c) 2010 Kelvin Luck
      - * Dual licensed under the MIT or GPL licenses.
      - */
      -(function(b,a,c){b.fn.jScrollPane=function(e){function d(D,O){var ay,Q=this,Y,aj,v,al,T,Z,y,q,az,aE,au,i,I,h,j,aa,U,ap,X,t,A,aq,af,am,G,l,at,ax,x,av,aH,f,L,ai=true,P=true,aG=false,k=false,ao=D.clone(false,false).empty(),ac=b.fn.mwheelIntent?"mwheelIntent.jsp":"mousewheel.jsp";aH=D.css("paddingTop")+" "+D.css("paddingRight")+" "+D.css("paddingBottom")+" "+D.css("paddingLeft");f=(parseInt(D.css("paddingLeft"),10)||0)+(parseInt(D.css("paddingRight"),10)||0);function ar(aQ){var aL,aN,aM,aJ,aI,aP,aO=false,aK=false;ay=aQ;if(Y===c){aI=D.scrollTop();aP=D.scrollLeft();D.css({overflow:"hidden",padding:0});aj=D.innerWidth()+f;v=D.innerHeight();D.width(aj);Y=b('<div class="jspPane" />').css("padding",aH).append(D.children());al=b('<div class="jspContainer" />').css({width:aj+"px",height:v+"px"}).append(Y).appendTo(D)}else{D.css("width","");aO=ay.stickToBottom&&K();aK=ay.stickToRight&&B();aJ=D.innerWidth()+f!=aj||D.outerHeight()!=v;if(aJ){aj=D.innerWidth()+f;v=D.innerHeight();al.css({width:aj+"px",height:v+"px"})}if(!aJ&&L==T&&Y.outerHeight()==Z){D.width(aj);return}L=T;Y.css("width","");D.width(aj);al.find(">.jspVerticalBar,>.jspHorizontalBar").remove().end()}Y.css("overflow","auto");if(aQ.contentWidth){T=aQ.contentWidth}else{T=Y[0].scrollWidth}Z=Y[0].scrollHeight;Y.css("overflow","");y=T/aj;q=Z/v;az=q>1;aE=y>1;if(!(aE||az)){D.removeClass("jspScrollable");Y.css({top:0,width:al.width()-f});n();E();R();w()}else{D.addClass("jspScrollable");aL=ay.maintainPosition&&(I||aa);if(aL){aN=aC();aM=aA()}aF();z();F();if(aL){N(aK?(T-aj):aN,false);M(aO?(Z-v):aM,false)}J();ag();an();if(ay.enableKeyboardNavigation){S()}if(ay.clickOnTrack){p()}C();if(ay.hijackInternalLinks){m()}}if(ay.autoReinitialise&&!av){av=setInterval(function(){ar(ay)},ay.autoReinitialiseDelay)}else{if(!ay.autoReinitialise&&av){clearInterval(av)}}aI&&D.scrollTop(0)&&M(aI,false);aP&&D.scrollLeft(0)&&N(aP,false);D.trigger("jsp-initialised",[aE||az])}function aF(){if(az){al.append(b('<div class="jspVerticalBar" />').append(b('<div class="jspCap jspCapTop" />'),b('<div class="jspTrack" />').append(b('<div class="jspDrag" />').append(b('<div class="jspDragTop" />'),b('<div class="jspDragBottom" />'))),b('<div class="jspCap jspCapBottom" />')));U=al.find(">.jspVerticalBar");ap=U.find(">.jspTrack");au=ap.find(">.jspDrag");if(ay.showArrows){aq=b('<a class="jspArrow jspArrowUp" />').bind("mousedown.jsp",aD(0,-1)).bind("click.jsp",aB);af=b('<a class="jspArrow jspArrowDown" />').bind("mousedown.jsp",aD(0,1)).bind("click.jsp",aB);if(ay.arrowScrollOnHover){aq.bind("mouseover.jsp",aD(0,-1,aq));af.bind("mouseover.jsp",aD(0,1,af))}ak(ap,ay.verticalArrowPositions,aq,af)}t=v;al.find(">.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow").each(function(){t-=b(this).outerHeight()});au.hover(function(){au.addClass("jspHover")},function(){au.removeClass("jspHover")}).bind("mousedown.jsp",function(aI){b("html").bind("dragstart.jsp selectstart.jsp",aB);au.addClass("jspActive");var s=aI.pageY-au.position().top;b("html").bind("mousemove.jsp",function(aJ){V(aJ.pageY-s,false)}).bind("mouseup.jsp mouseleave.jsp",aw);return false});o()}}function o(){ap.height(t+"px");I=0;X=ay.verticalGutter+ap.outerWidth();Y.width(aj-X-f);try{if(U.position().left===0){Y.css("margin-left",X+"px")}}catch(s){}}function z(){if(aE){al.append(b('<div class="jspHorizontalBar" />').append(b('<div class="jspCap jspCapLeft" />'),b('<div class="jspTrack" />').append(b('<div class="jspDrag" />').append(b('<div class="jspDragLeft" />'),b('<div class="jspDragRight" />'))),b('<div class="jspCap jspCapRight" />')));am=al.find(">.jspHorizontalBar");G=am.find(">.jspTrack");h=G.find(">.jspDrag");if(ay.showArrows){ax=b('<a class="jspArrow jspArrowLeft" />').bind("mousedown.jsp",aD(-1,0)).bind("click.jsp",aB);x=b('<a class="jspArrow jspArrowRight" />').bind("mousedown.jsp",aD(1,0)).bind("click.jsp",aB);
      -if(ay.arrowScrollOnHover){ax.bind("mouseover.jsp",aD(-1,0,ax));x.bind("mouseover.jsp",aD(1,0,x))}ak(G,ay.horizontalArrowPositions,ax,x)}h.hover(function(){h.addClass("jspHover")},function(){h.removeClass("jspHover")}).bind("mousedown.jsp",function(aI){b("html").bind("dragstart.jsp selectstart.jsp",aB);h.addClass("jspActive");var s=aI.pageX-h.position().left;b("html").bind("mousemove.jsp",function(aJ){W(aJ.pageX-s,false)}).bind("mouseup.jsp mouseleave.jsp",aw);return false});l=al.innerWidth();ah()}}function ah(){al.find(">.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow").each(function(){l-=b(this).outerWidth()});G.width(l+"px");aa=0}function F(){if(aE&&az){var aI=G.outerHeight(),s=ap.outerWidth();t-=aI;b(am).find(">.jspCap:visible,>.jspArrow").each(function(){l+=b(this).outerWidth()});l-=s;v-=s;aj-=aI;G.parent().append(b('<div class="jspCorner" />').css("width",aI+"px"));o();ah()}if(aE){Y.width((al.outerWidth()-f)+"px")}Z=Y.outerHeight();q=Z/v;if(aE){at=Math.ceil(1/y*l);if(at>ay.horizontalDragMaxWidth){at=ay.horizontalDragMaxWidth}else{if(at<ay.horizontalDragMinWidth){at=ay.horizontalDragMinWidth}}h.width(at+"px");j=l-at;ae(aa)}if(az){A=Math.ceil(1/q*t);if(A>ay.verticalDragMaxHeight){A=ay.verticalDragMaxHeight}else{if(A<ay.verticalDragMinHeight){A=ay.verticalDragMinHeight}}au.height(A+"px");i=t-A;ad(I)}}function ak(aJ,aL,aI,s){var aN="before",aK="after",aM;if(aL=="os"){aL=/Mac/.test(navigator.platform)?"after":"split"}if(aL==aN){aK=aL}else{if(aL==aK){aN=aL;aM=aI;aI=s;s=aM}}aJ[aN](aI)[aK](s)}function aD(aI,s,aJ){return function(){H(aI,s,this,aJ);this.blur();return false}}function H(aL,aK,aO,aN){aO=b(aO).addClass("jspActive");var aM,aJ,aI=true,s=function(){if(aL!==0){Q.scrollByX(aL*ay.arrowButtonSpeed)}if(aK!==0){Q.scrollByY(aK*ay.arrowButtonSpeed)}aJ=setTimeout(s,aI?ay.initialDelay:ay.arrowRepeatFreq);aI=false};s();aM=aN?"mouseout.jsp":"mouseup.jsp";aN=aN||b("html");aN.bind(aM,function(){aO.removeClass("jspActive");aJ&&clearTimeout(aJ);aJ=null;aN.unbind(aM)})}function p(){w();if(az){ap.bind("mousedown.jsp",function(aN){if(aN.originalTarget===c||aN.originalTarget==aN.currentTarget){var aL=b(this),aO=aL.offset(),aM=aN.pageY-aO.top-I,aJ,aI=true,s=function(){var aR=aL.offset(),aS=aN.pageY-aR.top-A/2,aP=v*ay.scrollPagePercent,aQ=i*aP/(Z-v);if(aM<0){if(I-aQ>aS){Q.scrollByY(-aP)}else{V(aS)}}else{if(aM>0){if(I+aQ<aS){Q.scrollByY(aP)}else{V(aS)}}else{aK();return}}aJ=setTimeout(s,aI?ay.initialDelay:ay.trackClickRepeatFreq);aI=false},aK=function(){aJ&&clearTimeout(aJ);aJ=null;b(document).unbind("mouseup.jsp",aK)};s();b(document).bind("mouseup.jsp",aK);return false}})}if(aE){G.bind("mousedown.jsp",function(aN){if(aN.originalTarget===c||aN.originalTarget==aN.currentTarget){var aL=b(this),aO=aL.offset(),aM=aN.pageX-aO.left-aa,aJ,aI=true,s=function(){var aR=aL.offset(),aS=aN.pageX-aR.left-at/2,aP=aj*ay.scrollPagePercent,aQ=j*aP/(T-aj);if(aM<0){if(aa-aQ>aS){Q.scrollByX(-aP)}else{W(aS)}}else{if(aM>0){if(aa+aQ<aS){Q.scrollByX(aP)}else{W(aS)}}else{aK();return}}aJ=setTimeout(s,aI?ay.initialDelay:ay.trackClickRepeatFreq);aI=false},aK=function(){aJ&&clearTimeout(aJ);aJ=null;b(document).unbind("mouseup.jsp",aK)};s();b(document).bind("mouseup.jsp",aK);return false}})}}function w(){if(G){G.unbind("mousedown.jsp")}if(ap){ap.unbind("mousedown.jsp")}}function aw(){b("html").unbind("dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp");if(au){au.removeClass("jspActive")}if(h){h.removeClass("jspActive")}}function V(s,aI){if(!az){return}if(s<0){s=0}else{if(s>i){s=i}}if(aI===c){aI=ay.animateScroll}if(aI){Q.animate(au,"top",s,ad)}else{au.css("top",s);ad(s)}}function ad(aI){if(aI===c){aI=au.position().top}al.scrollTop(0);I=aI;var aL=I===0,aJ=I==i,aK=aI/i,s=-aK*(Z-v);if(ai!=aL||aG!=aJ){ai=aL;aG=aJ;D.trigger("jsp-arrow-change",[ai,aG,P,k])}u(aL,aJ);Y.css("top",s);D.trigger("jsp-scroll-y",[-s,aL,aJ]).trigger("scroll")}function W(aI,s){if(!aE){return}if(aI<0){aI=0}else{if(aI>j){aI=j}}if(s===c){s=ay.animateScroll}if(s){Q.animate(h,"left",aI,ae)
      -}else{h.css("left",aI);ae(aI)}}function ae(aI){if(aI===c){aI=h.position().left}al.scrollTop(0);aa=aI;var aL=aa===0,aK=aa==j,aJ=aI/j,s=-aJ*(T-aj);if(P!=aL||k!=aK){P=aL;k=aK;D.trigger("jsp-arrow-change",[ai,aG,P,k])}r(aL,aK);Y.css("left",s);D.trigger("jsp-scroll-x",[-s,aL,aK]).trigger("scroll")}function u(aI,s){if(ay.showArrows){aq[aI?"addClass":"removeClass"]("jspDisabled");af[s?"addClass":"removeClass"]("jspDisabled")}}function r(aI,s){if(ay.showArrows){ax[aI?"addClass":"removeClass"]("jspDisabled");x[s?"addClass":"removeClass"]("jspDisabled")}}function M(s,aI){var aJ=s/(Z-v);V(aJ*i,aI)}function N(aI,s){var aJ=aI/(T-aj);W(aJ*j,s)}function ab(aV,aQ,aJ){var aN,aK,aL,s=0,aU=0,aI,aP,aO,aS,aR,aT;try{aN=b(aV)}catch(aM){return}aK=aN.outerHeight();aL=aN.outerWidth();al.scrollTop(0);al.scrollLeft(0);while(!aN.is(".jspPane")){s+=aN.position().top;aU+=aN.position().left;aN=aN.offsetParent();if(/^body|html$/i.test(aN[0].nodeName)){return}}aI=aA();aO=aI+v;if(s<aI||aQ){aR=s-ay.verticalGutter}else{if(s+aK>aO){aR=s-v+aK+ay.verticalGutter}}if(aR){M(aR,aJ)}aP=aC();aS=aP+aj;if(aU<aP||aQ){aT=aU-ay.horizontalGutter}else{if(aU+aL>aS){aT=aU-aj+aL+ay.horizontalGutter}}if(aT){N(aT,aJ)}}function aC(){return -Y.position().left}function aA(){return -Y.position().top}function K(){var s=Z-v;return(s>20)&&(s-aA()<10)}function B(){var s=T-aj;return(s>20)&&(s-aC()<10)}function ag(){al.unbind(ac).bind(ac,function(aL,aM,aK,aI){var aJ=aa,s=I;Q.scrollBy(aK*ay.mouseWheelSpeed,-aI*ay.mouseWheelSpeed,false);return aJ==aa&&s==I})}function n(){al.unbind(ac)}function aB(){return false}function J(){Y.find(":input,a").unbind("focus.jsp").bind("focus.jsp",function(s){ab(s.target,false)})}function E(){Y.find(":input,a").unbind("focus.jsp")}function S(){var s,aI,aK=[];aE&&aK.push(am[0]);az&&aK.push(U[0]);Y.focus(function(){D.focus()});D.attr("tabindex",0).unbind("keydown.jsp keypress.jsp").bind("keydown.jsp",function(aN){if(aN.target!==this&&!(aK.length&&b(aN.target).closest(aK).length)){return}var aM=aa,aL=I;switch(aN.keyCode){case 40:case 38:case 34:case 32:case 33:case 39:case 37:s=aN.keyCode;aJ();break;case 35:M(Z-v);s=null;break;case 36:M(0);s=null;break}aI=aN.keyCode==s&&aM!=aa||aL!=I;return !aI}).bind("keypress.jsp",function(aL){if(aL.keyCode==s){aJ()}return !aI});if(ay.hideFocus){D.css("outline","none");if("hideFocus" in al[0]){D.attr("hideFocus",true)}}else{D.css("outline","");if("hideFocus" in al[0]){D.attr("hideFocus",false)}}function aJ(){var aM=aa,aL=I;switch(s){case 40:Q.scrollByY(ay.keyboardSpeed,false);break;case 38:Q.scrollByY(-ay.keyboardSpeed,false);break;case 34:case 32:Q.scrollByY(v*ay.scrollPagePercent,false);break;case 33:Q.scrollByY(-v*ay.scrollPagePercent,false);break;case 39:Q.scrollByX(ay.keyboardSpeed,false);break;case 37:Q.scrollByX(-ay.keyboardSpeed,false);break}aI=aM!=aa||aL!=I;return aI}}function R(){D.attr("tabindex","-1").removeAttr("tabindex").unbind("keydown.jsp keypress.jsp")}function C(){if(location.hash&&location.hash.length>1){var aK,aI,aJ=escape(location.hash.substr(1));try{aK=b("#"+aJ+', a[name="'+aJ+'"]')}catch(s){return}if(aK.length&&Y.find(aJ)){if(al.scrollTop()===0){aI=setInterval(function(){if(al.scrollTop()>0){ab(aK,true);b(document).scrollTop(al.position().top);clearInterval(aI)}},50)}else{ab(aK,true);b(document).scrollTop(al.position().top)}}}}function m(){if(b(document.body).data("jspHijack")){return}b(document.body).data("jspHijack",true);b(document.body).delegate("a[href*=#]","click",function(s){var aI=this.href.substr(0,this.href.indexOf("#")),aK=location.href,aO,aP,aJ,aM,aL,aN;if(location.href.indexOf("#")!==-1){aK=location.href.substr(0,location.href.indexOf("#"))}if(aI!==aK){return}aO=escape(this.href.substr(this.href.indexOf("#")+1));aP;try{aP=b("#"+aO+', a[name="'+aO+'"]')}catch(aQ){return}if(!aP.length){return}aJ=aP.closest(".jspScrollable");aM=aJ.data("jsp");aM.scrollToElement(aP,true);if(aJ[0].scrollIntoView){aL=b(a).scrollTop();aN=aP.offset().top;if(aN<aL||aN>aL+b(a).height()){aJ[0].scrollIntoView()}}s.preventDefault()
      -})}function an(){var aJ,aI,aL,aK,aM,s=false;al.unbind("touchstart.jsp touchmove.jsp touchend.jsp click.jsp-touchclick").bind("touchstart.jsp",function(aN){var aO=aN.originalEvent.touches[0];aJ=aC();aI=aA();aL=aO.pageX;aK=aO.pageY;aM=false;s=true}).bind("touchmove.jsp",function(aQ){if(!s){return}var aP=aQ.originalEvent.touches[0],aO=aa,aN=I;Q.scrollTo(aJ+aL-aP.pageX,aI+aK-aP.pageY);aM=aM||Math.abs(aL-aP.pageX)>5||Math.abs(aK-aP.pageY)>5;return aO==aa&&aN==I}).bind("touchend.jsp",function(aN){s=false}).bind("click.jsp-touchclick",function(aN){if(aM){aM=false;return false}})}function g(){var s=aA(),aI=aC();D.removeClass("jspScrollable").unbind(".jsp");D.replaceWith(ao.append(Y.children()));ao.scrollTop(s);ao.scrollLeft(aI);if(av){clearInterval(av)}}b.extend(Q,{reinitialise:function(aI){aI=b.extend({},ay,aI);ar(aI)},scrollToElement:function(aJ,aI,s){ab(aJ,aI,s)},scrollTo:function(aJ,s,aI){N(aJ,aI);M(s,aI)},scrollToX:function(aI,s){N(aI,s)},scrollToY:function(s,aI){M(s,aI)},scrollToPercentX:function(aI,s){N(aI*(T-aj),s)},scrollToPercentY:function(aI,s){M(aI*(Z-v),s)},scrollBy:function(aI,s,aJ){Q.scrollByX(aI,aJ);Q.scrollByY(s,aJ)},scrollByX:function(s,aJ){var aI=aC()+Math[s<0?"floor":"ceil"](s),aK=aI/(T-aj);W(aK*j,aJ)},scrollByY:function(s,aJ){var aI=aA()+Math[s<0?"floor":"ceil"](s),aK=aI/(Z-v);V(aK*i,aJ)},positionDragX:function(s,aI){W(s,aI)},positionDragY:function(aI,s){V(aI,s)},animate:function(aI,aL,s,aK){var aJ={};aJ[aL]=s;aI.animate(aJ,{duration:ay.animateDuration,easing:ay.animateEase,queue:false,step:aK})},getContentPositionX:function(){return aC()},getContentPositionY:function(){return aA()},getContentWidth:function(){return T},getContentHeight:function(){return Z},getPercentScrolledX:function(){return aC()/(T-aj)},getPercentScrolledY:function(){return aA()/(Z-v)},getIsScrollableH:function(){return aE},getIsScrollableV:function(){return az},getContentPane:function(){return Y},scrollToBottom:function(s){V(i,s)},hijackInternalLinks:b.noop,destroy:function(){g()}});ar(O)}e=b.extend({},b.fn.jScrollPane.defaults,e);b.each(["mouseWheelSpeed","arrowButtonSpeed","trackClickSpeed","keyboardSpeed"],function(){e[this]=e[this]||e.speed});return this.each(function(){var f=b(this),g=f.data("jsp");if(g){g.reinitialise(e)}else{b("script",f).filter('[type="text/javascript"],:not([type])').remove();g=new d(f,e);f.data("jsp",g)}})};b.fn.jScrollPane.defaults={showArrows:false,maintainPosition:true,stickToBottom:false,stickToRight:false,clickOnTrack:true,autoReinitialise:false,autoReinitialiseDelay:500,verticalDragMinHeight:0,verticalDragMaxHeight:99999,horizontalDragMinWidth:0,horizontalDragMaxWidth:99999,contentWidth:c,animateScroll:false,animateDuration:300,animateEase:"linear",hijackInternalLinks:false,verticalGutter:4,horizontalGutter:4,mouseWheelSpeed:0,arrowButtonSpeed:0,arrowRepeatFreq:50,arrowScrollOnHover:false,trackClickSpeed:0,trackClickRepeatFreq:70,verticalArrowPositions:"split",horizontalArrowPositions:"split",enableKeyboardNavigation:true,hideFocus:false,keyboardSpeed:0,initialDelay:300,speed:30,scrollPagePercent:0.8}})(jQuery,this);
      -
      -//third_party/javascript/jquery_mousewheel/jquery.mousewheel.min.js
      -/**
      - * @license
      - * Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
      - * Licensed under the MIT License (LICENSE.txt).
      - *
      - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
      - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
      - * Thanks to: Seamus Leahy for adding deltaX and deltaY
      - *
      - * Version: 3.0.6
      - * 
      - * Requires: 1.2.2+
      - */
      -(function(a){function d(b){var c=b||window.event,d=[].slice.call(arguments,1),e=0,f=!0,g=0,h=0;return b=a.event.fix(c),b.type="mousewheel",c.wheelDelta&&(e=c.wheelDelta/120),c.detail&&(e=-c.detail/3),h=e,c.axis!==undefined&&c.axis===c.HORIZONTAL_AXIS&&(h=0,g=-1*e),c.wheelDeltaY!==undefined&&(h=c.wheelDeltaY/120),c.wheelDeltaX!==undefined&&(g=-1*c.wheelDeltaX/120),d.unshift(b,e,g,h),(a.event.dispatch||a.event.handle).apply(this,d)}var b=["DOMMouseScroll","mousewheel"];if(a.event.fixHooks)for(var c=b.length;c;)a.event.fixHooks[b[--c]]=a.event.mouseHooks;a.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=b.length;a;)this.addEventListener(b[--a],d,!1);else this.onmousewheel=d},teardown:function(){if(this.removeEventListener)for(var a=b.length;a;)this.removeEventListener(b[--a],d,!1);else this.onmousewheel=null}},a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
      -
      -//third_party/javascript/jquery_ui/v1_8_23/js/jquery-ui-1.8.23.custom.min.js
      -/**
      - * jQuery UI
      - * @version 1.8.23
      - * @date 2012-08-15
      - * @link https://github.com/jquery/jquery-ui
      - * Includes: jquery.ui.core.js
      - * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
      - * @license MIT (Dual licensed with GPL Version 2 license).
      - * http://jquery.org/license
      - */
      -(function(a,b){function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;return!b.href||!g||f.nodeName.toLowerCase()!=="map"?!1:(h=a("img[usemap=#"+g+"]")[0],!!h&&d(h))}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(a.ui.version)return;a.extend(a.ui,{version:"1.8.23",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;return a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0),/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a("<a>").outerWidth(1).jquery||a.each(["Width","Height"],function(c,d){function h(b,c,d,f){return a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)}),c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){return c===b?g["inner"+d].call(this):this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){return typeof b!="number"?g["outer"+d].call(this,b):this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:a.expr.createPseudo?a.expr.createPseudo(function(b){return function(c){return!!a.data(c,b)}}):function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.curCSS||(a.curCSS=a.css),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!d||!a.element[0].parentNode)return;for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;return b[d]>0?!0:(b[d]=1,e=b[d]>0,b[d]=0,e)},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.widget.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){return c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}}),d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;return e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e,f&&e.charAt(0)==="_"?h:(f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b)return h=f,!1}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))}),h)}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}return this._setOptions(e),this},_setOptions:function(b){var c=this;return a.each(b,function(a,b){c._setOption(a,b)}),this},_setOption:function(a,b){return this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);return this.element.trigger(c,d),!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.mouse.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent"))return a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(b){if(c)return;this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted)return b.preventDefault(),!0}return!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0,!0},_mouseMove:function(b){return!a.browser.msie||document.documentMode>=9||!!b.button?this._mouseStarted?(this._mouseDrag(b),b.preventDefault()):(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b)),!this._mouseStarted):this._mouseUp(b)},_mouseUp:function(b){return a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b)),!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.position.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.ui=a.ui||{};var c=/left|center|right/,d=/top|center|bottom/,e="center",f={},g=a.fn.position,h=a.fn.offset;a.fn.position=function(b){if(!b||!b.of)return g.apply(this,arguments);b=a.extend({},b);var h=a(b.of),i=h[0],j=(b.collision||"flip").split(" "),k=b.offset?b.offset.split(" "):[0,0],l,m,n;return i.nodeType===9?(l=h.width(),m=h.height(),n={top:0,left:0}):i.setTimeout?(l=h.width(),m=h.height(),n={top:h.scrollTop(),left:h.scrollLeft()}):i.preventDefault?(b.at="left top",l=m=0,n={top:b.of.pageY,left:b.of.pageX}):(l=h.outerWidth(),m=h.outerHeight(),n=h.offset()),a.each(["my","at"],function(){var a=(b[this]||"").split(" ");a.length===1&&(a=c.test(a[0])?a.concat([e]):d.test(a[0])?[e].concat(a):[e,e]),a[0]=c.test(a[0])?a[0]:e,a[1]=d.test(a[1])?a[1]:e,b[this]=a}),j.length===1&&(j[1]=j[0]),k[0]=parseInt(k[0],10)||0,k.length===1&&(k[1]=k[0]),k[1]=parseInt(k[1],10)||0,b.at[0]==="right"?n.left+=l:b.at[0]===e&&(n.left+=l/2),b.at[1]==="bottom"?n.top+=m:b.at[1]===e&&(n.top+=m/2),n.left+=k[0],n.top+=k[1],this.each(function(){var c=a(this),d=c.outerWidth(),g=c.outerHeight(),h=parseInt(a.curCSS(this,"marginLeft",!0))||0,i=parseInt(a.curCSS(this,"marginTop",!0))||0,o=d+h+(parseInt(a.curCSS(this,"marginRight",!0))||0),p=g+i+(parseInt(a.curCSS(this,"marginBottom",!0))||0),q=a.extend({},n),r;b.my[0]==="right"?q.left-=d:b.my[0]===e&&(q.left-=d/2),b.my[1]==="bottom"?q.top-=g:b.my[1]===e&&(q.top-=g/2),f.fractions||(q.left=Math.round(q.left),q.top=Math.round(q.top)),r={left:q.left-h,top:q.top-i},a.each(["left","top"],function(c,e){a.ui.position[j[c]]&&a.ui.position[j[c]][e](q,{targetWidth:l,targetHeight:m,elemWidth:d,elemHeight:g,collisionPosition:r,collisionWidth:o,collisionHeight:p,offset:k,my:b.my,at:b.at})}),a.fn.bgiframe&&c.bgiframe(),c.offset(a.extend(q,{using:b.using}))})},a.ui.position={fit:{left:function(b,c){var d=a(window),e=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft();b.left=e>0?b.left-e:Math.max(b.left-c.collisionPosition.left,b.left)},top:function(b,c){var d=a(window),e=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop();b.top=e>0?b.top-e:Math.max(b.top-c.collisionPosition.top,b.top)}},flip:{left:function(b,c){if(c.at[0]===e)return;var d=a(window),f=c.collisionPosition.left+c.collisionWidth-d.width()-d.scrollLeft(),g=c.my[0]==="left"?-c.elemWidth:c.my[0]==="right"?c.elemWidth:0,h=c.at[0]==="left"?c.targetWidth:-c.targetWidth,i=-2*c.offset[0];b.left+=c.collisionPosition.left<0?g+h+i:f>0?g+h+i:0},top:function(b,c){if(c.at[1]===e)return;var d=a(window),f=c.collisionPosition.top+c.collisionHeight-d.height()-d.scrollTop(),g=c.my[1]==="top"?-c.elemHeight:c.my[1]==="bottom"?c.elemHeight:0,h=c.at[1]==="top"?c.targetHeight:-c.targetHeight,i=-2*c.offset[1];b.top+=c.collisionPosition.top<0?g+h+i:f>0?g+h+i:0}}},a.offset.setOffset||(a.offset.setOffset=function(b,c){/static/.test(a.curCSS(b,"position"))&&(b.style.position="relative");var d=a(b),e=d.offset(),f=parseInt(a.curCSS(b,"top",!0),10)||0,g=parseInt(a.curCSS(b,"left",!0),10)||0,h={top:c.top-e.top+f,left:c.left-e.left+g};"using"in c?c.using.call(b,h):d.css(h)},a.fn.offset=function(b){var c=this[0];return!c||!c.ownerDocument?null:b?a.isFunction(b)?this.each(function(c){a(this).offset(b.call(this,c,a(this).offset()))}):this.each(function(){a.offset.setOffset(this,b)}):h.call(this)}),a.curCSS||(a.curCSS=a.css),function(){var b=document.getElementsByTagName("body")[0],c=document.createElement("div"),d,e,g,h,i;d=document.createElement(b?"div":"body"),g={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},b&&a.extend(g,{position:"absolute",left:"-1000px",top:"-1000px"});for(var j in g)d.style[j]=g[j];d.appendChild(c),e=b||document.documentElement,e.insertBefore(d,e.firstChild),c.style.cssText="position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;",h=a(c).offset(function(a,b){return b}).offset(),d.innerHTML="",e.removeChild(d),i=h.top+h.left+(b?2e3:0),f.fractions=i>21&&i<22}()})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.draggable.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!this.element.data("draggable"))return;return this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options;return this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(b),this.handle?(c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(b){var c=this.options;return this.helper=this._createHelper(b),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment(),this._trigger("start",b)===!1?(this._clear(),!1):(this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b),!0)},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1)return this._mouseUp({}),!1;this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);var d=this.element[0],e=!1;while(d&&(d=d.parentNode))d==document&&(e=!0);if(!e&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var f=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){f._trigger("stop",b)!==!1&&f._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){return this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b),a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;return a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)}),c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute"),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){return d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.23"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g=b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensitivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{start:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!e.length)return;var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.droppable.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var b=this.options,c=b.accept;this.isover=0,this.isout=1,this.accept=a.isFunction(c)?c:function(a){return a.is(c)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},a.ui.ddmanager.droppables[b.scope]=a.ui.ddmanager.droppables[b.scope]||[],a.ui.ddmanager.droppables[b.scope].push(this),b.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++)b[c]==this&&b.splice(c,1);return this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable"),this},_setOption:function(b,c){b=="accept"&&(this.accept=a.isFunction(c)?c:function(a){return a.is(c)}),a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),c&&this._trigger("activate",b,this.ui(c))},_deactivate:function(b){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),c&&this._trigger("deactivate",b,this.ui(c))},_over:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",b,this.ui(c)))},_out:function(b){var c=a.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return;this.accept.call(this.element[0],c.currentItem||c.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",b,this.ui(c)))},_drop:function(b,c){var d=c||a.ui.ddmanager.current;if(!d||(d.currentItem||d.element)[0]==this.element[0])return!1;var e=!1;return this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var b=a.data(this,"droppable");if(b.options.greedy&&!b.options.disabled&&b.options.scope==d.options.scope&&b.accept.call(b.element[0],d.currentItem||d.element)&&a.ui.intersect(d,a.extend(b,{offset:b.element.offset()}),b.options.tolerance))return e=!0,!1}),e?!1:this.accept.call(this.element[0],d.currentItem||d.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",b,this.ui(d)),this.element):!1},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}}),a.extend(a.ui.droppable,{version:"1.8.23"}),a.ui.intersect=function(b,c,d){if(!c.offset)return!1;var e=(b.positionAbs||b.position.absolute).left,f=e+b.helperProportions.width,g=(b.positionAbs||b.position.absolute).top,h=g+b.helperProportions.height,i=c.offset.left,j=i+c.proportions.width,k=c.offset.top,l=k+c.proportions.height;switch(d){case"fit":return i<=e&&f<=j&&k<=g&&h<=l;case"intersect":return i<e+b.helperProportions.width/2&&f-b.helperProportions.width/2<j&&k<g+b.helperProportions.height/2&&h-b.helperProportions.height/2<l;case"pointer":var m=(b.positionAbs||b.position.absolute).left+(b.clickOffset||b.offset.click).left,n=(b.positionAbs||b.position.absolute).top+(b.clickOffset||b.offset.click).top,o=a.ui.isOver(n,m,k,i,c.proportions.height,c.proportions.width);return o;case"touch":return(g>=k&&g<=l||h>=k&&h<=l||g<k&&h>l)&&(e>=i&&e<=j||f>=i&&f<=j||e<i&&f>j);default:return!1}},a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(b,c){var d=a.ui.ddmanager.droppables[b.options.scope]||[],e=c?c.type:null,f=(b.currentItem||b.element).find(":data(droppable)").andSelf();g:for(var h=0;h<d.length;h++){if(d[h].options.disabled||b&&!d[h].accept.call(d[h].element[0],b.currentItem||b.element))continue;for(var i=0;i<f.length;i++)if(f[i]==d[h].element[0]){d[h].proportions.height=0;continue g}d[h].visible=d[h].element.css("display")!="none";if(!d[h].visible)continue;e=="mousedown"&&d[h]._activate.call(d[h],c),d[h].offset=d[h].element.offset(),d[h].proportions={width:d[h].element[0].offsetWidth,height:d[h].element[0].offsetHeight}}},drop:function(b,c){var d=!1;return a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(!this.options)return;!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)&&(d=this._drop.call(this,c)||d),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],b.currentItem||b.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,c))}),d},dragStart:function(b,c){b.element.parents(":not(body,html)").bind("scroll.droppable",function(){b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)})},drag:function(b,c){b.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(b,c),a.each(a.ui.ddmanager.droppables[b.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible)return;var d=a.ui.intersect(b,this,this.options.tolerance),e=!d&&this.isover==1?"isout":d&&this.isover==0?"isover":null;if(!e)return;var f;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");g.length&&(f=a.data(g[0],"droppable"),f.greedyChild=e=="isover"?1:0)}f&&e=="isover"&&(f.isover=0,f.isout=1,f._out.call(f,c)),this[e]=1,this[e=="isout"?"isover":"isout"]=0,this[e=="isover"?"_over":"_out"].call(this,c),f&&e=="isout"&&(f.isout=0,f.isover=1,f._over.call(f,c))})},dragStop:function(b,c){b.element.parents(":not(body,html)").unbind("scroll.droppable"),b.options.refreshPositions||a.ui.ddmanager.prepareOffsets(b,c)}}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.resizable.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');h.css({zIndex:c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){if(c.disabled)return;a(this).removeClass("ui-resizable-autohide"),b._handles.show()},function(){if(c.disabled)return;b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement),this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");return a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b),!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);return l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui()),!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}return a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;return d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width)),a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;return p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null),a},_proportionallyResize:function(){var b=this.options;if(!this._proportionallyResizeElements.length)return;var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(!a.browser.msie||!a(c).is(":hidden")&&!a(c).parents(":hidden").length)e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0});else continue}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.23"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!i)return;e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/d.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*d.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.selectable.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable"),this.dragged=!1;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]),c.addClass("ui-selectee"),c.each(function(){var b=a(this),c=b.offset();a.data(this,"selectable-item",{element:this,$element:b,left:c.left,top:c.top,right:c.left+b.outerWidth(),bottom:c.top+b.outerHeight(),startselected:!1,selected:b.hasClass("ui-selected"),selecting:b.hasClass("ui-selecting"),unselecting:b.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=c.addClass("ui-selectee"),this._mouseInit(),this.helper=a("<div class='ui-selectable-helper'></div>")},destroy:function(){return this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable"),this._mouseDestroy(),this},_mouseStart:function(b){var c=this;this.opos=[b.pageX,b.pageY];if(this.options.disabled)return;var d=this.options;this.selectees=a(d.filter,this.element[0]),this._trigger("start",b),a(d.appendTo).append(this.helper),this.helper.css({left:b.clientX,top:b.clientY,width:0,height:0}),d.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var d=a.data(this,"selectable-item");d.startselected=!0,!b.metaKey&&!b.ctrlKey&&(d.$element.removeClass("ui-selected"),d.selected=!1,d.$element.addClass("ui-unselecting"),d.unselecting=!0,c._trigger("unselecting",b,{unselecting:d.element}))}),a(b.target).parents().andSelf().each(function(){var d=a.data(this,"selectable-item");if(d){var e=!b.metaKey&&!b.ctrlKey||!d.$element.hasClass("ui-selected");return d.$element.removeClass(e?"ui-unselecting":"ui-selected").addClass(e?"ui-selecting":"ui-unselecting"),d.unselecting=!e,d.selecting=e,d.selected=e,e?c._trigger("selecting",b,{selecting:d.element}):c._trigger("unselecting",b,{unselecting:d.element}),!1}})},_mouseDrag:function(b){var c=this;this.dragged=!0;if(this.options.disabled)return;var d=this.options,e=this.opos[0],f=this.opos[1],g=b.pageX,h=b.pageY;if(e>g){var i=g;g=e,e=i}if(f>h){var i=h;h=f,f=i}return this.helper.css({left:e,top:f,width:g-e,height:h-f}),this.selectees.each(function(){var i=a.data(this,"selectable-item");if(!i||i.element==c.element[0])return;var j=!1;d.tolerance=="touch"?j=!(i.left>g||i.right<e||i.top>h||i.bottom<f):d.tolerance=="fit"&&(j=i.left>e&&i.right<g&&i.top>f&&i.bottom<h),j?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,c._trigger("selecting",b,{selecting:i.element}))):(i.selecting&&((b.metaKey||b.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),c._trigger("unselecting",b,{unselecting:i.element}))),i.selected&&!b.metaKey&&!b.ctrlKey&&!i.startselected&&(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,c._trigger("unselecting",b,{unselecting:i.element})))}),!1},_mouseStop:function(b){var c=this;this.dragged=!1;var d=this.options;return a(".ui-unselecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-unselecting"),d.unselecting=!1,d.startselected=!1,c._trigger("unselected",b,{unselected:d.element})}),a(".ui-selecting",this.element[0]).each(function(){var d=a.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected"),d.selecting=!1,d.selected=!0,d.startselected=!0,c._trigger("selected",b,{selected:d.element})}),this._trigger("stop",b),this.helper.remove(),!1}}),a.extend(a.ui.selectable,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.sortable.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var a=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},destroy:function(){a.Widget.prototype.destroy.call(this),this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--)this.items[b].item.removeData(this.widgetName+"-item");return this},_setOption:function(b,c){b==="disabled"?(this.options[b]=c,this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")):a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(b,c){var d=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(b);var e=null,f=this,g=a(b.target).parents().each(function(){if(a.data(this,d.widgetName+"-item")==f)return e=a(this),!1});a.data(b.target,d.widgetName+"-item")==f&&(e=a(b.target));if(!e)return!1;if(this.options.handle&&!c){var h=!1;a(this.options.handle,e).find("*").andSelf().each(function(){this==b.target&&(h=!0)});if(!h)return!1}return this.currentItem=e,this._removeCurrentsFromItems(),!0},_mouseStart:function(b,c,d){var e=this.options,f=this;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(b),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,e.cursorAt&&this._adjustOffsetFromHelper(e.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),e.containment&&this._setContainment(),e.cursor&&(a("body").css("cursor")&&(this._storedCursor=a("body").css("cursor")),a("body").css("cursor",e.cursor)),e.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",e.opacity)),e.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",e.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",b,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!d)for(var g=this.containers.length-1;g>=0;g--)this.containers[g]._trigger("activate",b,f._uiHash(this));return a.ui.ddmanager&&(a.ui.ddmanager.current=this),a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(b),!0},_mouseDrag:function(b){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var c=this.options,d=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-b.pageY<c.scrollSensitivity?this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop+c.scrollSpeed:b.pageY-this.overflowOffset.top<c.scrollSensitivity&&(this.scrollParent[0].scrollTop=d=this.scrollParent[0].scrollTop-c.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-b.pageX<c.scrollSensitivity?this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft+c.scrollSpeed:b.pageX-this.overflowOffset.left<c.scrollSensitivity&&(this.scrollParent[0].scrollLeft=d=this.scrollParent[0].scrollLeft-c.scrollSpeed)):(b.pageY-a(document).scrollTop()<c.scrollSensitivity?d=a(document).scrollTop(a(document).scrollTop()-c.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<c.scrollSensitivity&&(d=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed)),b.pageX-a(document).scrollLeft()<c.scrollSensitivity?d=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<c.scrollSensitivity&&(d=a(document).scrollLeft(a(document).scrollLeft()+c.scrollSpeed))),d!==!1&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var e=this.items.length-1;e>=0;e--){var f=this.items[e],g=f.item[0],h=this._intersectsWithPointer(f);if(!h)continue;if(g!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=g&&!a.ui.contains(this.placeholder[0],g)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],g):!0)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(f))this._rearrange(b,f);else break;this._trigger("change",b,this._uiHash());break}}return this._contactContainers(b),a.ui.ddmanager&&a.ui.ddmanager.drag(this,b),this._trigger("sort",b,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(b,c){if(!b)return;a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,b);if(this.options.revert){var d=this,e=d.placeholder.offset();d.reverting=!0,a(this.helper).animate({left:e.left-this.offset.parent.left-d.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-d.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){d._clear(b)})}else this._clear(b,c);return!1},cancel:function(){var b=this;if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("deactivate",null,b._uiHash(this)),this.containers[c].containerCache.over&&(this.containers[c]._trigger("out",null,b._uiHash(this)),this.containers[c].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),a.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},a(c).each(function(){var c=(a(b.item||this).attr(b.attribute||"id")||"").match(b.expression||/(.+)[-=_](.+)/);c&&d.push((b.key||c[1]+"[]")+"="+(b.key&&b.expression?c[1]:c[2]))}),!d.length&&b.key&&d.push(b.key+"="),d.join("&")},toArray:function(b){var c=this._getItemsAsjQuery(b&&b.connected),d=[];return b=b||{},c.each(function(){d.push(a(b.item||this).attr(b.attribute||"id")||"")}),d},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,d=this.positionAbs.top,e=d+this.helperProportions.height,f=a.left,g=f+a.width,h=a.top,i=h+a.height,j=this.offset.click.top,k=this.offset.click.left,l=d+j>h&&d+j<i&&b+k>f&&b+k<g;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?l:f<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<g&&h<d+this.helperProportions.height/2&&e-this.helperProportions.height/2<i},_intersectsWithPointer:function(b){var c=this.options.axis==="x"||a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top,b.height),d=this.options.axis==="y"||a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left,b.width),e=c&&d,f=this._getDragVerticalDirection(),g=this._getDragHorizontalDirection();return e?this.floating?g&&g=="right"||f=="down"?2:1:f&&(f=="down"?2:1):!1},_intersectsWithSides:function(b){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,b.top+b.height/2,b.height),d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,b.left+b.width/2,b.width),e=this._getDragVerticalDirection(),f=this._getDragHorizontalDirection();return this.floating&&f?f=="right"&&d||f=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){return this._refreshItems(a),this.refreshPositions(),this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(b){var c=this,d=[],e=[],f=this._connectWith();if(f&&b)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&e.push([a.isFunction(j.options.items)?j.options.items.call(j.element):a(j.options.items,j.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),j])}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var g=e.length-1;g>=0;g--)e[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){var a=this.currentItem.find(":data("+this.widgetName+"-item)");for(var b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(b){this.items=[],this.containers=[this];var c=this.items,d=this,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],b,{item:this.currentItem}):a(this.options.items,this.element),this]],f=this._connectWith();if(f&&this.ready)for(var g=f.length-1;g>=0;g--){var h=a(f[g]);for(var i=h.length-1;i>=0;i--){var j=a.data(h[i],this.widgetName);j&&j!=this&&!j.options.disabled&&(e.push([a.isFunction(j.options.items)?j.options.items.call(j.element[0],b,{item:this.currentItem}):a(j.options.items,j.element),j]),this.containers.push(j))}}for(var g=e.length-1;g>=0;g--){var k=e[g][1],l=e[g][0];for(var i=0,m=l.length;i<m;i++){var n=a(l[i]);n.data(this.widgetName+"-item",k),c.push({item:n,instance:k,width:0,height:0,left:0,top:0})}}},refreshPositions:function(b){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var c=this.items.length-1;c>=0;c--){var d=this.items[c];if(d.instance!=this.currentContainer&&this.currentContainer&&d.item[0]!=this.currentItem[0])continue;var e=this.options.toleranceElement?a(this.options.toleranceElement,d.item):d.item;b||(d.width=e.outerWidth(),d.height=e.outerHeight());var f=e.offset();d.left=f.left,d.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var c=this.containers.length-1;c>=0;c--){var f=this.containers[c].element.offset();this.containers[c].containerCache.left=f.left,this.containers[c].containerCache.top=f.top,this.containers[c].containerCache.width=this.containers[c].element.outerWidth(),this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(b){var c=b||this,d=c.options;if(!d.placeholder||d.placeholder.constructor==String){var e=d.placeholder;d.placeholder={element:function(){var b=a(document.createElement(c.currentItem[0].nodeName)).addClass(e||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return e||(b.style.visibility="hidden"),b},update:function(a,b){if(e&&!d.forcePlaceholderSize)return;b.height()||b.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10)),b.width()||b.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||0,10))}}}c.placeholder=a(d.placeholder.element.call(c.element,c.currentItem)),c.currentItem.after(c.placeholder),d.placeholder.update(c,c.placeholder)},_contactContainers:function(b){var c=null,d=null;for(var e=this.containers.length-1;e>=0;e--){if(a.ui.contains(this.currentItem[0],this.containers[e].element[0]))continue;if(this._intersectsWith(this.containers[e].containerCache)){if(c&&a.ui.contains(this.containers[e].element[0],c.element[0]))continue;c=this.containers[e],d=e}else this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",b,this._uiHash(this)),this.containers[e].containerCache.over=0)}if(!c)return;if(this.containers.length===1)this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1;else if(this.currentContainer!=this.containers[d]){var f=1e4,g=null,h=this.positionAbs[this.containers[d].floating?"left":"top"];for(var i=this.items.length-1;i>=0;i--){if(!a.ui.contains(this.containers[d].element[0],this.items[i].item[0]))continue;var j=this.containers[d].floating?this.items[i].item.offset().left:this.items[i].item.offset().top;Math.abs(j-h)<f&&(f=Math.abs(j-h),g=this.items[i],this.direction=j-h>0?"down":"up")}if(!g&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[d],g?this._rearrange(b,g,null,!0):this._rearrange(b,null,this.containers[d].element,!0),this._trigger("change",b,this._uiHash()),this.containers[d]._trigger("change",b,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[d]._trigger("over",b,this._uiHash(this)),this.containers[d].containerCache.over=1}},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;return d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]),d[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(d[0].style.width==""||c.forceHelperSize)&&d.width(this.currentItem.width()),(d[0].style.height==""||c.forceHelperSize)&&d.height(this.currentItem.height()),d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)){var c=a(b.containment)[0],d=a(b.containment).offset(),e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var f=b.pageX,g=b.pageY;if(this.originalPosition){this.containment&&(b.pageX-this.offset.click.left<this.containment[0]&&(f=this.containment[0]+this.offset.click.left),b.pageY-this.offset.click.top<this.containment[1]&&(g=this.containment[1]+this.offset.click.top),b.pageX-this.offset.click.left>this.containment[2]&&(f=this.containment[2]+this.offset.click.left),b.pageY-this.offset.click.top>this.containment[3]&&(g=this.containment[3]+this.offset.click.top));if(c.grid){var h=this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1];g=this.containment?h-this.offset.click.top<this.containment[1]||h-this.offset.click.top>this.containment[3]?h-this.offset.click.top<this.containment[1]?h+c.grid[1]:h-c.grid[1]:h:h;var i=this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0];f=this.containment?i-this.offset.click.left<this.containment[0]||i-this.offset.click.left>this.containment[2]?i-this.offset.click.left<this.containment[0]?i+c.grid[0]:i-c.grid[0]:i:i}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_rearrange:function(a,b,c,d){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var e=this,f=this.counter;window.setTimeout(function(){f==e.counter&&e.refreshPositions(!d)},0)},_clear:function(b,c){this.reverting=!1;var d=[],e=this;!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var f in this._storedCSS)if(this._storedCSS[f]=="auto"||this._storedCSS[f]=="static")this._storedCSS[f]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&d.push(function(a){this._trigger("receive",a,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!c&&d.push(function(a){this._trigger("update",a,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||d.push(function(a){this._trigger("remove",a,this._uiHash())});for(var f=this.containers.length-1;f>=0;f--)a.ui.contains(this.containers[f].element[0],this.currentItem[0])&&!c&&(d.push(function(a){return function(b){a._trigger("receive",b,this._uiHash(this))}}.call(this,this.containers[f])),d.push(function(a){return function(b){a._trigger("update",b,this._uiHash(this))}}.call(this,this.containers[f])))}for(var f=this.containers.length-1;f>=0;f--)c||d.push(function(a){return function(b){a._trigger("deactivate",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over&&(d.push(function(a){return function(b){a._trigger("out",b,this._uiHash(this))}}.call(this,this.containers[f])),this.containers[f].containerCache.over=0);this._storedCursor&&a("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",b,this._uiHash());for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return this.fromOutside=!1,!1}c||this._trigger("beforeStop",b,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!c){for(var f=0;f<d.length;f++)d[f].call(this,b);this._trigger("stop",b,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(b){var c=b||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:b?b.element:null}}}),a.extend(a.ui.sortable,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.accordion.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:!0,clearStyle:!1,collapsible:!1,event:"click",fillSpace:!1,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var b=this,c=b.options;b.running=0,b.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"),b.headers=b.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){if(c.disabled)return;a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){if(c.disabled)return;a(this).removeClass("ui-state-focus")}),b.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(c.navigation){var d=b.element.find("a").filter(c.navigationFilter).eq(0);if(d.length){var e=d.closest(".ui-accordion-header");e.length?b.active=e:b.active=d.closest(".ui-accordion-content").prev()}}b.active=b._findActive(b.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top"),b.active.next().addClass("ui-accordion-content-active"),b._createIcons(),b.resize(),b.element.attr("role","tablist"),b.headers.attr("role","tab").bind("keydown.accordion",function(a){return b._keydown(a)}).next().attr("role","tabpanel"),b.headers.not(b.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide(),b.active.length?b.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):b.headers.eq(0).attr("tabIndex",0),a.browser.safari||b.headers.find("a").attr("tabIndex",-1),c.event&&b.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(a){b._clickHandler.call(b,a,this),a.preventDefault()})},_createIcons:function(){var b=this.options;b.icons&&(a("<span></span>").addClass("ui-icon "+b.icons.header).prependTo(this.headers),this.active.children(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected),this.element.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.children(".ui-icon").remove(),this.element.removeClass("ui-accordion-icons")},destroy:function(){var b=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"),this.headers.find("a").removeAttr("tabIndex"),this._destroyIcons();var c=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");return(b.autoHeight||b.fillHeight)&&c.css("height",""),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b=="active"&&this.activate(c),b=="icons"&&(this._destroyIcons(),c&&this._createIcons()),b=="disabled"&&this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(b){if(this.options.disabled||b.altKey||b.ctrlKey)return;var c=a.ui.keyCode,d=this.headers.length,e=this.headers.index(b.target),f=!1;switch(b.keyCode){case c.RIGHT:case c.DOWN:f=this.headers[(e+1)%d];break;case c.LEFT:case c.UP:f=this.headers[(e-1+d)%d];break;case c.SPACE:case c.ENTER:this._clickHandler({target:b.target},b.target),b.preventDefault()}return f?(a(b.target).attr("tabIndex",-1),a(f).attr("tabIndex",0),f.focus(),!1):!0},resize:function(){var b=this.options,c;if(b.fillSpace){if(a.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height(),a.browser.msie&&this.element.parent().css("overflow",d),this.headers.each(function(){c-=a(this).outerHeight(!0)}),this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else b.autoHeight&&(c=0,this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c));return this},activate:function(a){this.options.active=a;var b=this._findActive(a)[0];return this._clickHandler({target:b},b),this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===!1?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,c){var d=this.options;if(d.disabled)return;if(!b.target){if(!d.collapsible)return;this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),this.active.next().addClass("ui-accordion-content-active");var e=this.active.next(),f={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:e},g=this.active=a([]);this._toggle(g,e,f);return}var h=a(b.currentTarget||c),i=h[0]===this.active[0];d.active=d.collapsible&&i?!1:this.headers.index(h);if(this.running||!d.collapsible&&i)return;var j=this.active,g=h.next(),e=this.active.next(),f={options:d,newHeader:i&&d.collapsible?a([]):h,oldHeader:this.active,newContent:i&&d.collapsible?a([]):g,oldContent:e},k=this.headers.index(this.active[0])>this.headers.index(h[0]);this.active=i?a([]):h,this._toggle(g,e,f,i,k),j.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header),i||(h.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected),h.next().addClass("ui-accordion-content-active"));return},_toggle:function(b,c,d,e,f){var g=this,h=g.options;g.toShow=b,g.toHide=c,g.data=d;var i=function(){if(!g)return;return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data),g.running=c.size()===0?b.size():c.size();if(h.animated){var j={};h.collapsible&&e?j={toShow:a([]),toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace}:j={toShow:b,toHide:c,complete:i,down:f,autoHeight:h.autoHeight||h.fillSpace},h.proxied||(h.proxied=h.animated),h.proxiedDuration||(h.proxiedDuration=h.duration),h.animated=a.isFunction(h.proxied)?h.proxied(j):h.proxied,h.duration=a.isFunction(h.proxiedDuration)?h.proxiedDuration(j):h.proxiedDuration;var k=a.ui.accordion.animations,l=h.duration,m=h.animated;m&&!k[m]&&!a.easing[m]&&(m="slide"),k[m]||(k[m]=function(a){this.slide(a,{easing:m,duration:l||700})}),k[m](j)}else h.collapsible&&e?b.toggle():(c.hide(),b.show()),i(!0);c.prev().attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).blur(),b.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(this.running)return;this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""}),this.toHide.removeClass("ui-accordion-content-active"),this.toHide.length&&(this.toHide.parent()[0].className=this.toHide.parent()[0].className),this._trigger("change",null,this.data)}}),a.extend(a.ui.accordion,{version:"1.8.23",animations:{slide:function(b,c){b=a.extend({easing:"swing",duration:300},b,c);if(!b.toHide.size()){b.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},b);return}if(!b.toShow.size()){b.toHide.animate({height:"hide",paddingTop:"hide",paddingBottom:"hide"},b);return}var d=b.toShow.css("overflow"),e=0,f={},g={},h=["height","paddingTop","paddingBottom"],i,j=b.toShow;i=j[0].style.width,j.width(j.parent().width()-parseFloat(j.css("paddingLeft"))-parseFloat(j.css("paddingRight"))-(parseFloat(j.css("borderLeftWidth"))||0)-(parseFloat(j.css("borderRightWidth"))||0)),a.each(h,function(c,d){g[d]="hide";var e=(""+a.css(b.toShow[0],d)).match(/^([\d+-.]+)(.*)$/);f[d]={value:e[1],unit:e[2]||"px"}}),b.toShow.css({height:0,overflow:"hidden"}).show(),b.toHide.filter(":hidden").each(b.complete).end().filter(":visible").animate(g,{step:function(a,c){c.prop=="height"&&(e=c.end-c.start===0?0:(c.now-c.start)/(c.end-c.start)),b.toShow[0].style[c.prop]=e*f[c.prop].value+f[c.prop].unit},duration:b.duration,easing:b.easing,complete:function(){b.autoHeight||b.toShow.css("height",""),b.toShow.css({width:i,overflow:d}),b.complete()}})},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1e3:200})}}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.autocomplete.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){var c=0;a.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var b=this,c=this.element[0].ownerDocument,d;this.isMultiLine=this.element.is("textarea"),this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(b.options.disabled||b.element.propAttr("readOnly"))return;d=!1;var e=a.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:b._move("previousPage",c);break;case e.PAGE_DOWN:b._move("nextPage",c);break;case e.UP:b._keyEvent("previous",c);break;case e.DOWN:b._keyEvent("next",c);break;case e.ENTER:case e.NUMPAD_ENTER:b.menu.active&&(d=!0,c.preventDefault());case e.TAB:if(!b.menu.active)return;b.menu.select(c);break;case e.ESCAPE:b.element.val(b.term),b.close(c);break;default:clearTimeout(b.searching),b.searching=setTimeout(function(){b.term!=b.element.val()&&(b.selectedItem=null,b.search(null,c))},b.options.delay)}}).bind("keypress.autocomplete",function(a){d&&(d=!1,a.preventDefault())}).bind("focus.autocomplete",function(){if(b.options.disabled)return;b.selectedItem=null,b.previous=b.element.val()}).bind("blur.autocomplete",function(a){if(b.options.disabled)return;clearTimeout(b.searching),b.closing=setTimeout(function(){b.close(a),b._change(a)},150)}),this._initSource(),this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",c)[0]).mousedown(function(c){var d=b.menu.element[0];a(c.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(c){c.target!==b.element[0]&&c.target!==d&&!a.ui.contains(d,c.target)&&b.close()})},1),setTimeout(function(){clearTimeout(b.closing)},13)}).menu({focus:function(a,c){var d=c.item.data("item.autocomplete");!1!==b._trigger("focus",a,{item:d})&&/^key/.test(a.originalEvent.type)&&b.element.val(d.value)},selected:function(a,d){var e=d.item.data("item.autocomplete"),f=b.previous;b.element[0]!==c.activeElement&&(b.element.focus(),b.previous=f,setTimeout(function(){b.previous=f,b.selectedItem=e},1)),!1!==b._trigger("select",a,{item:e})&&b.element.val(e.value),b.term=b.element.val(),b.close(a),b.selectedItem=e},blur:function(a,c){b.menu.element.is(":visible")&&b.element.val()!==b.term&&b.element.val(b.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"),a.fn.bgiframe&&this.menu.element.bgiframe(),b.beforeunloadHandler=function(){b.element.removeAttr("autocomplete")},a(window).bind("beforeunload",b.beforeunloadHandler)},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"),this.menu.element.remove(),a(window).unbind("beforeunload",this.beforeunloadHandler),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments),b==="source"&&this._initSource(),b==="appendTo"&&this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]),b==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var b=this,c,d;a.isArray(this.options.source)?(c=this.options.source,this.source=function(b,d){d(a.ui.autocomplete.filter(c,b.term))}):typeof this.options.source=="string"?(d=this.options.source,this.source=function(c,e){b.xhr&&b.xhr.abort(),b.xhr=a.ajax({url:d,data:c,dataType:"json",success:function(a,b){e(a)},error:function(){e([])}})}):this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val(),this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)===!1)return;return this._search(a)},_search:function(a){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.source({term:a},this._response())},_response:function(){var a=this,b=++c;return function(d){b===c&&a.__response(d),a.pending--,a.pending||a.element.removeClass("ui-autocomplete-loading")}},__response:function(a){!this.options.disabled&&a&&a.length?(a=this._normalize(a),this._suggest(a),this._trigger("open")):this.close()},close:function(a){clearTimeout(this.closing),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.deactivate(),this._trigger("close",a))},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(b){return b.length&&b[0].label&&b[0].value?b:a.map(b,function(b){return typeof b=="string"?{label:b,value:b}:a.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(b){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(c,b),this.menu.deactivate(),this.menu.refresh(),c.show(),this._resizeMenu(),c.position(a.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(b,c){var d=this;a.each(c,function(a,c){d._renderItem(b,c)})},_renderItem:function(b,c){return a("<li></li>").data("item.autocomplete",c).append(a("<a></a>").text(c.label)).appendTo(b)},_move:function(a,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term),this.menu.deactivate();return}this.menu[a](b)},widget:function(){return this.menu.element},_keyEvent:function(a,b){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(a,b),b.preventDefault()}}),a.extend(a.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(b,c){var d=new RegExp(a.ui.autocomplete.escapeRegex(c),"i");return a.grep(b,function(a){return d.test(a.label||a.value||a)})}})})(jQuery),function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(!a(c.target).closest(".ui-menu-item a").length)return;c.preventDefault(),b.select(c)}),this.refresh()},refresh:function(){var b=this,c=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");c.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(c){b.activate(c,a(this).parent())}).mouseleave(function(){b.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.scrollTop(),e=this.element.height();c<0?this.element.scrollTop(d+c):c>=e&&this.element.scrollTop(d+c-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end(),this._trigger("focus",a,{item:b})},deactivate:function(){if(!this.active)return;this.active.children("a").removeClass("ui-state-hover").removeAttr("id"),this._trigger("blur"),this.active=null},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(!this.active){this.activate(c,this.element.children(b));return}var d=this.active[a+"All"](".ui-menu-item").eq(0);d.length?this.activate(c,d):this.activate(c,this.element.children(b))},nextPage:function(b){if(this.hasScroll()){if(!this.active||this.last()){this.activate(b,this.element.children(".ui-menu-item:first"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c-d+a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:last")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(b){if(this.hasScroll()){if(!this.active||this.first()){this.activate(b,this.element.children(".ui-menu-item:last"));return}var c=this.active.offset().top,d=this.element.height(),e=this.element.children(".ui-menu-item").filter(function(){var b=a(this).offset().top-c+d-a(this).height();return b<10&&b>-10});e.length||(e=this.element.children(".ui-menu-item:first")),this.activate(b,e)}else this.activate(b,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.button.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){var c,d,e,f,g="ui-button ui-widget ui-state-default ui-corner-all",h="ui-state-hover ui-state-active ",i="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",j=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},k=function(b){var c=b.name,d=b.form,e=a([]);return c&&(d?e=a(d).find("[name='"+c+"']"):e=a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form})),e};a.widget("ui.button",{options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",j),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.propAttr("disabled"):this.element.propAttr("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var b=this,h=this.options,i=this.type==="checkbox"||this.type==="radio",l="ui-state-hover"+(i?"":" ui-state-active"),m="ui-state-focus";h.label===null&&(h.label=this.buttonElement.html()),this.buttonElement.addClass(g).attr("role","button").bind("mouseenter.button",function(){if(h.disabled)return;a(this).addClass("ui-state-hover"),this===c&&a(this).addClass("ui-state-active")}).bind("mouseleave.button",function(){if(h.disabled)return;a(this).removeClass(l)}).bind("click.button",function(a){h.disabled&&(a.preventDefault(),a.stopImmediatePropagation())}),this.element.bind("focus.button",function(){b.buttonElement.addClass(m)}).bind("blur.button",function(){b.buttonElement.removeClass(m)}),i&&(this.element.bind("change.button",function(){if(f)return;b.refresh()}),this.buttonElement.bind("mousedown.button",function(a){if(h.disabled)return;f=!1,d=a.pageX,e=a.pageY}).bind("mouseup.button",function(a){if(h.disabled)return;if(d!==a.pageX||e!==a.pageY)f=!0})),this.type==="checkbox"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).toggleClass("ui-state-active"),b.buttonElement.attr("aria-pressed",b.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click.button",function(){if(h.disabled||f)return!1;a(this).addClass("ui-state-active"),b.buttonElement.attr("aria-pressed","true");var c=b.element[0];k(c).not(c).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown.button",function(){if(h.disabled)return!1;a(this).addClass("ui-state-active"),c=this,a(document).one("mouseup",function(){c=null})}).bind("mouseup.button",function(){if(h.disabled)return!1;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(b){if(h.disabled)return!1;(b.keyCode==a.ui.keyCode.SPACE||b.keyCode==a.ui.keyCode.ENTER)&&a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(b){b.keyCode===a.ui.keyCode.SPACE&&a(this).click()})),this._setOption("disabled",h.disabled),this._resetButton()},_determineButtonType:function(){this.element.is(":checkbox")?this.type="checkbox":this.element.is(":radio")?this.type="radio":this.element.is("input")?this.type="input":this.type="button";if(this.type==="checkbox"||this.type==="radio"){var a=this.element.parents().filter(":last"),b="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(b),this.buttonElement.length||(a=a.length?a.siblings():this.element.siblings(),this.buttonElement=a.filter(b),this.buttonElement.length||(this.buttonElement=a.find(b))),this.element.addClass("ui-helper-hidden-accessible");var c=this.element.is(":checked");c&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.attr("aria-pressed",c)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(g+" "+h+" "+i).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title"),a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled"){c?this.element.propAttr("disabled",!0):this.element.propAttr("disabled",!1);return}this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b),this.type==="radio"?k(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input"){this.options.label&&this.element.val(this.options.label);return}var b=this.buttonElement.removeClass(i),c=a("<span></span>",this.element[0].ownerDocument).addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary,f=[];d.primary||d.secondary?(this.options.text&&f.push("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary")),d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>"),d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>"),this.options.text||(f.push(e?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||b.attr("title",c))):f.push("ui-button-text-only"),b.addClass(f.join(" "))}}),a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c),a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(b?"ui-corner-left":"ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy"),a.Widget.prototype.destroy.call(this)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.dialog.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){var c="ui-dialog ui-widget ui-widget-content ui-corner-all ",d={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},e={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};a.widget("ui.dialog",{options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",collision:"fit",using:function(b){var c=a(this).css(b).offset().top;c<0&&a(this).css("top",b.top-c)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.options.title=this.options.title||this.originalTitle;var b=this,d=b.options,e=d.title||"&#160;",f=a.ui.dialog.getTitleId(b.element),g=(b.uiDialog=a("<div></div>")).appendTo(document.body).hide().addClass(c+d.dialogClass).css({zIndex:d.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(c){d.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(a){b.moveToTop(!1,a)}),h=b.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g),i=(b.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),j=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){j.addClass("ui-state-hover")},function(){j.removeClass("ui-state-hover")}).focus(function(){j.addClass("ui-state-focus")}).blur(function(){j.removeClass("ui-state-focus")}).click(function(a){return b.close(a),!1}).appendTo(i),k=(b.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-closethick").text(d.closeText).appendTo(j),l=a("<span></span>").addClass("ui-dialog-title").attr("id",f).html(e).prependTo(i);a.isFunction(d.beforeclose)&&!a.isFunction(d.beforeClose)&&(d.beforeClose=d.beforeclose),i.find("*").add(i).disableSelection(),d.draggable&&a.fn.draggable&&b._makeDraggable(),d.resizable&&a.fn.resizable&&b._makeResizable(),b._createButtons(d.buttons),b._isOpen=!1,a.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;return a.overlay&&a.overlay.destroy(),a.uiDialog.hide(),a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),a.uiDialog.remove(),a.originalTitle&&a.element.attr("title",a.originalTitle),a},widget:function(){return this.uiDialog},close:function(b){var c=this,d,e;if(!1===c._trigger("beforeClose",b))return;return c.overlay&&c.overlay.destroy(),c.uiDialog.unbind("keypress.ui-dialog"),c._isOpen=!1,c.options.hide?c.uiDialog.hide(c.options.hide,function(){c._trigger("close",b)}):(c.uiDialog.hide(),c._trigger("close",b)),a.ui.dialog.overlay.resize(),c.options.modal&&(d=0,a(".ui-dialog").each(function(){this!==c.uiDialog[0]&&(e=a(this).css("z-index"),isNaN(e)||(d=Math.max(d,e)))}),a.ui.dialog.maxZ=d),c},isOpen:function(){return this._isOpen},moveToTop:function(b,c){var d=this,e=d.options,f;return e.modal&&!b||!e.stack&&!e.modal?d._trigger("focus",c):(e.zIndex>a.ui.dialog.maxZ&&(a.ui.dialog.maxZ=e.zIndex),d.overlay&&(a.ui.dialog.maxZ+=1,d.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)),f={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()},a.ui.dialog.maxZ+=1,d.uiDialog.css("z-index",a.ui.dialog.maxZ),d.element.attr(f),d._trigger("focus",c),d)},open:function(){if(this._isOpen)return;var b=this,c=b.options,d=b.uiDialog;return b.overlay=c.modal?new a.ui.dialog.overlay(b):null,b._size(),b._position(c.position),d.show(c.show),b.moveToTop(!0),c.modal&&d.bind("keydown.ui-dialog",function(b){if(b.keyCode!==a.ui.keyCode.TAB)return;var c=a(":tabbable",this),d=c.filter(":first"),e=c.filter(":last");if(b.target===e[0]&&!b.shiftKey)return d.focus(1),!1;if(b.target===d[0]&&b.shiftKey)return e.focus(1),!1}),a(b.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(),b._isOpen=!0,b._trigger("open"),b},_createButtons:function(b){var c=this,d=!1,e=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),f=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);c.uiDialog.find(".ui-dialog-buttonpane").remove(),typeof b=="object"&&b!==null&&a.each(b,function(){return!(d=!0)}),d&&(a.each(b,function(b,d){d=a.isFunction(d)?{click:d,text:b}:d;var e=a('<button type="button"></button>').click(function(){d.click.apply(c.element[0],arguments)}).appendTo(f);a.each(d,function(a,b){if(a==="click")return;a in e?e[a](b):e.attr(a,b)}),a.fn.button&&e.button()}),e.appendTo(c.uiDialog))},_makeDraggable:function(){function f(a){return{position:a.position,offset:a.offset}}var b=this,c=b.options,d=a(document),e;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(d,g){e=c.height==="auto"?"auto":a(this).height(),a(this).height(a(this).height()).addClass("ui-dialog-dragging"),b._trigger("dragStart",d,f(g))},drag:function(a,c){b._trigger("drag",a,f(c))},stop:function(g,h){c.position=[h.position.left-d.scrollLeft(),h.position.top-d.scrollTop()],a(this).removeClass("ui-dialog-dragging").height(e),b._trigger("dragStop",g,f(h)),a.ui.dialog.overlay.resize()}})},_makeResizable:function(c){function h(a){return{originalPosition:a.originalPosition,originalSize:a.originalSize,position:a.position,size:a.size}}c=c===b?this.options.resizable:c;var d=this,e=d.options,f=d.uiDialog.css("position"),g=typeof c=="string"?c:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:g,start:function(b,c){a(this).addClass("ui-dialog-resizing"),d._trigger("resizeStart",b,h(c))},resize:function(a,b){d._trigger("resize",a,h(b))},stop:function(b,c){a(this).removeClass("ui-dialog-resizing"),e.height=a(this).height(),e.width=a(this).width(),d._trigger("resizeStop",b,h(c)),a.ui.dialog.overlay.resize()}}).css("position",f).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(b){var c=[],d=[0,0],e;if(b){if(typeof b=="string"||typeof b=="object"&&"0"in b)c=b.split?b.split(" "):[b[0],b[1]],c.length===1&&(c[1]=c[0]),a.each(["left","top"],function(a,b){+c[a]===c[a]&&(d[a]=c[a],c[a]=b)}),b={my:c.join(" "),at:c.join(" "),offset:d.join(" ")};b=a.extend({},a.ui.dialog.prototype.options.position,b)}else b=a.ui.dialog.prototype.options.position;e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},b)),e||this.uiDialog.hide()},_setOptions:function(b){var c=this,f={},g=!1;a.each(b,function(a,b){c._setOption(a,b),a in d&&(g=!0),a in e&&(f[a]=b)}),g&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",f)},_setOption:function(b,d){var e=this,f=e.uiDialog;switch(b){case"beforeclose":b="beforeClose";break;case"buttons":e._createButtons(d);break;case"closeText":e.uiDialogTitlebarCloseText.text(""+d);break;case"dialogClass":f.removeClass(e.options.dialogClass).addClass(c+d);break;case"disabled":d?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case"draggable":var g=f.is(":data(draggable)");g&&!d&&f.draggable("destroy"),!g&&d&&e._makeDraggable();break;case"position":e._position(d);break;case"resizable":var h=f.is(":data(resizable)");h&&!d&&f.resizable("destroy"),h&&typeof d=="string"&&f.resizable("option","handles",d),!h&&d!==!1&&e._makeResizable(d);break;case"title":a(".ui-dialog-title",e.uiDialogTitlebar).html(""+(d||"&#160;"))}a.Widget.prototype._setOption.apply(e,arguments)},_size:function(){var b=this.options,c,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),b.minWidth>b.width&&(b.width=b.minWidth),c=this.uiDialog.css({height:"auto",width:b.width}).height(),d=Math.max(0,b.minHeight-c);if(b.height==="auto")if(a.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();var f=this.element.css("height","auto").height();e||this.uiDialog.hide(),this.element.height(Math.max(f,d))}else this.element.height(Math.max(b.height-c,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),a.extend(a.ui.dialog,{version:"1.8.23",uuid:0,maxZ:0,getTitleId:function(a){var b=a.attr("id");return b||(this.uuid+=1,b=this.uuid),"ui-dialog-title-"+b},overlay:function(b){this.$el=a.ui.dialog.overlay.create(b)}}),a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(b){this.instances.length===0&&(setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return!1})},1),a(document).bind("keydown.dialog-overlay",function(c){b.options.closeOnEscape&&!c.isDefaultPrevented()&&c.keyCode&&c.keyCode===a.ui.keyCode.ESCAPE&&(b.close(c),c.preventDefault())}),a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize));var c=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});return a.fn.bgiframe&&c.bgiframe(),this.instances.push(c),c},destroy:function(b){var c=a.inArray(b,this.instances);c!=-1&&this.oldInstances.push(this.instances.splice(c,1)[0]),this.instances.length===0&&a([document,window]).unbind(".dialog-overlay"),b.remove();var d=0;a.each(this.instances,function(){d=Math.max(d,this.css("z-index"))}),this.maxZ=d},height:function(){var b,c;return a.browser.msie&&a.browser.version<7?(b=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),b<c?a(window).height()+"px":b+"px"):a(document).height()+"px"},width:function(){var b,c;return a.browser.msie?(b=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),c=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth),b<c?a(window).width()+"px":b+"px"):a(document).width()+"px"},resize:function(){var b=a([]);a.each(a.ui.dialog.overlay.instances,function(){b=b.add(this)}),b.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}}),a.extend(a.ui.dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.slider.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=a(this).data("index.ui-slider-handle"),f,g,h,i;if(b.options.disabled)return;switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:d.preventDefault();if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),f=b._start(d,e);if(f===!1)return}}i=b.options.step,b.options.values&&b.options.values.length?g=h=b.values(e):g=h=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:h=b._valueMin();break;case a.ui.keyCode.END:h=b._valueMax();break;case a.ui.keyCode.PAGE_UP:h=b._trimAlignValue(g+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:h=b._trimAlignValue(g-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(g===b._valueMax())return;h=b._trimAlignValue(g+i);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(g===b._valueMin())return;h=b._trimAlignValue(g-i)}b._slide(d,e,h)}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){return this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy(),this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i),j===!1?!1:(this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0,!0))},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);return this._slide(a,this._handleIndex,c),!1},_mouseStop:function(a){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;return this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e,this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};return this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);return}return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);return}if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a),a},_values:function(a){var b,c,d;if(arguments.length)return b=this.options.values[a],b=this._trimAlignValue(b),b;c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;return Math.abs(c)*2>=b&&(d+=c>0?b:-b),parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.tabs.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){function e(){return++c}function f(){return++d}var c=0,d=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:!1,cookie:null,collapsible:!1,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(!0)},_setOption:function(a,b){if(a=="selected"){if(this.options.collapsible&&b==this.options.selected)return;this.select(b)}else this.options[a]=b,this._tabify()},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+e()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+f());return a.cookie.apply(null,[b].concat(a.makeArray(arguments)))},_ui:function(a,b){return{tab:a,panel:b,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=a(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function m(b,c){b.css("display",""),!a.support.opacity&&c.opacity&&b[0].style.removeAttribute("filter")}var d=this,e=this.options,f=/^#.+/;this.list=this.element.find("ol,ul").eq(0),this.lis=a(" > li:has(a[href])",this.list),this.anchors=this.lis.map(function(){return a("a",this)[0]}),this.panels=a([]),this.anchors.each(function(b,c){var g=a(c).attr("href"),h=g.split("#")[0],i;h&&(h===location.toString().split("#")[0]||(i=a("base")[0])&&h===i.href)&&(g=c.hash,c.href=g);if(f.test(g))d.panels=d.panels.add(d.element.find(d._sanitizeSelector(g)));else if(g&&g!=="#"){a.data(c,"href.tabs",g),a.data(c,"load.tabs",g.replace(/#.*$/,""));var j=d._tabId(c);c.href="#"+j;var k=d.element.find("#"+j);k.length||(k=a(e.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(d.panels[b-1]||d.list),k.data("destroy.tabs",!0)),d.panels=d.panels.add(k)}else e.disabled.push(b)}),c?(this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"),this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.lis.addClass("ui-state-default ui-corner-top"),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"),e.selected===b?(location.hash&&this.anchors.each(function(a,b){if(b.hash==location.hash)return e.selected=a,!1}),typeof e.selected!="number"&&e.cookie&&(e.selected=parseInt(d._cookie(),10)),typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length&&(e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))),e.selected=e.selected||(this.lis.length?0:-1)):e.selected===null&&(e.selected=-1),e.selected=e.selected>=0&&this.anchors[e.selected]||e.selected<0?e.selected:0,e.disabled=a.unique(e.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(a,b){return d.lis.index(a)}))).sort(),a.inArray(e.selected,e.disabled)!=-1&&e.disabled.splice(a.inArray(e.selected,e.disabled),1),this.panels.addClass("ui-tabs-hide"),this.lis.removeClass("ui-tabs-selected ui-state-active"),e.selected>=0&&this.anchors.length&&(d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash)).removeClass("ui-tabs-hide"),this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active"),d.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[e.selected],d.element.find(d._sanitizeSelector(d.anchors[e.selected].hash))[0]))}),this.load(e.selected)),a(window).bind("unload",function(){d.lis.add(d.anchors).unbind(".tabs"),d.lis=d.anchors=d.panels=null})):e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")),this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible"),e.cookie&&this._cookie(e.selected,e.cookie);for(var g=0,h;h=this.lis[g];g++)a(h)[a.inArray(g,e.disabled)!=-1&&!a(h).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");e.cache===!1&&this.anchors.removeData("cache.tabs"),this.lis.add(this.anchors).unbind(".tabs");if(e.event!=="mouseover"){var i=function(a,b){b.is(":not(.ui-state-disabled)")&&b.addClass("ui-state-"+a)},j=function(a,b){b.removeClass("ui-state-"+a)};this.lis.bind("mouseover.tabs",function(){i("hover",a(this))}),this.lis.bind("mouseout.tabs",function(){j("hover",a(this))}),this.anchors.bind("focus.tabs",function(){i("focus",a(this).closest("li"))}),this.anchors.bind("blur.tabs",function(){j("focus",a(this).closest("li"))})}var k,l;e.fx&&(a.isArray(e.fx)?(k=e.fx[0],l=e.fx[1]):k=l=e.fx);var n=l?function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.hide().removeClass("ui-tabs-hide").animate(l,l.duration||"normal",function(){m(c,l),d._trigger("show",null,d._ui(b,c[0]))})}:function(b,c){a(b).closest("li").addClass("ui-tabs-selected ui-state-active"),c.removeClass("ui-tabs-hide"),d._trigger("show",null,d._ui(b,c[0]))},o=k?function(a,b){b.animate(k,k.duration||"normal",function(){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),m(b,k),d.element.dequeue("tabs")})}:function(a,b,c){d.lis.removeClass("ui-tabs-selected ui-state-active"),b.addClass("ui-tabs-hide"),d.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var b=this,c=a(b).closest("li"),f=d.panels.filter(":not(.ui-tabs-hide)"),g=d.element.find(d._sanitizeSelector(b.hash));if(c.hasClass("ui-tabs-selected")&&!e.collapsible||c.hasClass("ui-state-disabled")||c.hasClass("ui-state-processing")||d.panels.filter(":animated").length||d._trigger("select",null,d._ui(this,g[0]))===!1)return this.blur(),!1;e.selected=d.anchors.index(this),d.abort();if(e.collapsible){if(c.hasClass("ui-tabs-selected"))return e.selected=-1,e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){o(b,f)}).dequeue("tabs"),this.blur(),!1;if(!f.length)return e.cookie&&d._cookie(e.selected,e.cookie),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this)),this.blur(),!1}e.cookie&&d._cookie(e.selected,e.cookie);if(g.length)f.length&&d.element.queue("tabs",function(){o(b,f)}),d.element.queue("tabs",function(){n(b,g)}),d.load(d.anchors.index(this));else throw"jQuery UI Tabs: Mismatching fragment identifier.";a.browser.msie&&this.blur()}),this.anchors.bind("click.tabs",function(){return!1})},_getIndex:function(a){return typeof a=="string"&&(a=this.anchors.index(this.anchors.filter("[href$='"+a+"']"))),a},destroy:function(){var b=this.options;return this.abort(),this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs"),this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all"),this.anchors.each(function(){var b=a.data(this,"href.tabs");b&&(this.href=b);var c=a(this).unbind(".tabs");a.each(["href","load","cache"],function(a,b){c.removeData(b+".tabs")})}),this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}),b.cookie&&this._cookie(null,b.cookie),this},add:function(c,d,e){e===b&&(e=this.anchors.length);var f=this,g=this.options,h=a(g.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,d)),i=c.indexOf("#")?this._tabId(a("a",h)[0]):c.replace("#","");h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",!0);var j=f.element.find("#"+i);return j.length||(j=a(g.panelTemplate).attr("id",i).data("destroy.tabs",!0)),j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"),e>=this.lis.length?(h.appendTo(this.list),j.appendTo(this.list[0].parentNode)):(h.insertBefore(this.lis[e]),j.insertBefore(this.panels[e])),g.disabled=a.map(g.disabled,function(a,b){return a>=e?++a:a}),this._tabify(),this.anchors.length==1&&(g.selected=0,h.addClass("ui-tabs-selected ui-state-active"),j.removeClass("ui-tabs-hide"),this.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[0],f.panels[0]))}),this.load(0)),this._trigger("add",null,this._ui(this.anchors[e],this.panels[e])),this},remove:function(b){b=this._getIndex(b);var c=this.options,d=this.lis.eq(b).remove(),e=this.panels.eq(b).remove();return d.hasClass("ui-tabs-selected")&&this.anchors.length>1&&this.select(b+(b+1<this.anchors.length?1:-1)),c.disabled=a.map(a.grep(c.disabled,function(a,c){return a!=b}),function(a,c){return a>=b?--a:a}),this._tabify(),this._trigger("remove",null,this._ui(d.find("a")[0],e[0])),this},enable:function(b){b=this._getIndex(b);var c=this.options;if(a.inArray(b,c.disabled)==-1)return;return this.lis.eq(b).removeClass("ui-state-disabled"),c.disabled=a.grep(c.disabled,function(a,c){return a!=b}),this._trigger("enable",null,this._ui(this.anchors[b],this.panels[b])),this},disable:function(a){a=this._getIndex(a);var b=this,c=this.options;return a!=c.selected&&(this.lis.eq(a).addClass("ui-state-disabled"),c.disabled.push(a),c.disabled.sort(),this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))),this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;return this.anchors.eq(a).trigger(this.options.event+".tabs"),this},load:function(b){b=this._getIndex(b);var c=this,d=this.options,e=this.anchors.eq(b)[0],f=a.data(e,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&a.data(e,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(b).addClass("ui-state-processing");if(d.spinner){var g=a("span",e);g.data("label.tabs",g.html()).html(d.spinner)}return this.xhr=a.ajax(a.extend({},d.ajaxOptions,{url:f,success:function(f,g){c.element.find(c._sanitizeSelector(e.hash)).html(f),c._cleanup(),d.cache&&a.data(e,"cache.tabs",!0),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.success(f,g)}catch(h){}},error:function(a,f,g){c._cleanup(),c._trigger("load",null,c._ui(c.anchors[b],c.panels[b]));try{d.ajaxOptions.error(a,f,b,e)}catch(g){}}})),c.element.dequeue("tabs"),this},abort:function(){return this.element.queue([]),this.panels.stop(!1,!0),this.element.queue("tabs",this.element.queue("tabs").splice(-2,2)),this.xhr&&(this.xhr.abort(),delete this.xhr),this._cleanup(),this},url:function(a,b){return this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",b),this},length:function(){return this.anchors.length}}),a.extend(a.ui.tabs,{version:"1.8.23"}),a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(a,b){var c=this,d=this.options,e=c._rotate||(c._rotate=function(b){clearTimeout(c.rotation),c.rotation=setTimeout(function(){var a=d.selected;c.select(++a<c.anchors.length?a:0)},a),b&&b.stopPropagation()}),f=c._unrotate||(c._unrotate=b?function(a){e()}:function(a){a.clientX&&c.rotate(null)});return a?(this.element.bind("tabsshow",e),this.anchors.bind(d.event+".tabs",f),e()):(clearTimeout(c.rotation),this.element.unbind("tabsshow",e),this.anchors.unbind(d.event+".tabs",f),delete this._rotate,delete this._unrotate),this}})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.datepicker.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function bindHover(a){var b="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return a.bind("mouseout",function(a){var c=$(a.target).closest(b);if(!c.length)return;c.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(c){var d=$(c.target).closest(b);if($.datepicker._isDisabledDatepicker(instActive.inline?a.parent()[0]:instActive.input[0])||!d.length)return;d.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),d.addClass("ui-state-hover"),d.hasClass("ui-datepicker-prev")&&d.addClass("ui-datepicker-prev-hover"),d.hasClass("ui-datepicker-next")&&d.addClass("ui-datepicker-next-hover")})}function extendRemove(a,b){$.extend(a,b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}function isArray(a){return a&&($.browser.safari&&typeof a=="object"&&a.length||a.constructor&&a.constructor.toString().match(/\Array\(\)/))}$.extend($.ui,{datepicker:{version:"1.8.23"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){return extendRemove(this._defaults,a||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);if(c.hasClass(this.markerClassName))return;this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a)},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$('<span class="'+this._appendClass+'">'+c+"</span>"),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('<button type="button"></button>').addClass(this._triggerClass).html(g==""?f:$("<img/>").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]),!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;d<a.length;d++)a[d].length>b&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);if(c.hasClass(this.markerClassName))return;c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block")},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+g+'" style="position: absolute; top: -100px; width: 0px;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f),this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!b.hasClass(this.markerClassName))return;var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return!0;return!1},_getInst:function(a){try{return $.data(a,PROP_NAME)}catch(b){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(a,b,c){var d=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?$.extend({},$.datepicker._defaults):d?b=="all"?$.extend({},d.settings):this._get(d,b):null;var e=b||{};typeof b=="string"&&(e={},e[b]=c);if(d){this._curInst==d&&this._hideDatepicker();var f=this._getDateDatepicker(a,!0),g=this._getMinMaxDate(d,"min"),h=this._getMinMaxDate(d,"max");extendRemove(d.settings,e),g!==null&&e.dateFormat!==undefined&&e.minDate===undefined&&(d.settings.minDate=this._formatDate(d,g)),h!==null&&e.dateFormat!==undefined&&e.maxDate===undefined&&(d.settings.maxDate=this._formatDate(d,h)),this._attachments($(a),d),this._autoSize(d),this._setDate(d,f),this._updateAlternate(d),this._updateDatepicker(d)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){var b=this._getInst(a);b&&this._updateDatepicker(b)},_setDateDatepicker:function(a,b){var c=this._getInst(a);c&&(this._setDate(c,b),this._updateDatepicker(c),this._updateAlternate(c))},_getDateDatepicker:function(a,b){var c=this._getInst(a);return c&&!c.inline&&this._setDateFromField(c,b),c?this._getDate(c):null},_doKeyDown:function(a){var b=$.datepicker._getInst(a.target),c=!0,d=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=!0;if($.datepicker._datepickerShowing)switch(a.keyCode){case 9:$.datepicker._hideDatepicker(),c=!1;break;case 13:var e=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",b.dpDiv);e[0]&&$.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,e[0]);var f=$.datepicker._get(b,"onSelect");if(f){var g=$.datepicker._formatDate(b);f.apply(b.input?b.input[0]:null,[g,b])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 35:(a.ctrlKey||a.metaKey)&&$.datepicker._clearDate(a.target),c=a.ctrlKey||a.metaKey;break;case 36:(a.ctrlKey||a.metaKey)&&$.datepicker._gotoToday(a.target),c=a.ctrlKey||a.metaKey;break;case 37:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?1:-1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?-$.datepicker._get(b,"stepBigMonths"):-$.datepicker._get(b,"stepMonths"),"M");break;case 38:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,-7,"D"),c=a.ctrlKey||a.metaKey;break;case 39:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,d?-1:1,"D"),c=a.ctrlKey||a.metaKey,a.originalEvent.altKey&&$.datepicker._adjustDate(a.target,a.ctrlKey?+$.datepicker._get(b,"stepBigMonths"):+$.datepicker._get(b,"stepMonths"),"M");break;case 40:(a.ctrlKey||a.metaKey)&&$.datepicker._adjustDate(a.target,7,"D"),c=a.ctrlKey||a.metaKey;break;default:c=!1}else a.keyCode==36&&a.ctrlKey?$.datepicker._showDatepicker(this):c=!1;c&&(a.preventDefault(),a.stopPropagation())},_doKeyPress:function(a){var b=$.datepicker._getInst(a.target);if($.datepicker._get(b,"constrainInput")){var c=$.datepicker._possibleChars($.datepicker._get(b,"dateFormat")),d=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||d<" "||!c||c.indexOf(d)>-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(d){$.datepicker.log(d)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if($.datepicker._isDisabledDatepicker(a)||$.datepicker._lastInput==a)return;var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){return e|=$(this).css("position")=="fixed",!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a)),this._attachHandlers(a);var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+(c?0:$(document).scrollLeft()),i=document.documentElement.clientHeight+(c?0:$(document).scrollTop());return b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0),b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!b||a&&b!=$.data(a,PROP_NAME))return;if(this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=function(){$.datepicker._tidyDialog(b)};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,e):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,e),c||e(),this._datepickerShowing=!1;var f=this._get(b,"onClose");f&&f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!$.datepicker._curInst)return;var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);if(this._isDisabledDatepicker(d[0]))return;this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e)},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if($(d).hasClass(this._unselectableClass)||this._isDisabledDatepicker(e[0]))return;var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1<a.length&&a.charAt(s+1)==b;return c&&s++,c},o=function(a){var c=n(a),d=a=="@"?14:a=="!"?20:a=="y"&&c?4:a=="o"?3:2,e=new RegExp("^\\d{1,"+d+"}"),f=b.substring(r).match(e);if(!f)throw"Missing number at position "+r;return r+=f[0].length,parseInt(f[0],10)},p=function(a,c,d){var e=$.map(n(a)?d:c,function(a,b){return[[b,a]]}).sort(function(a,b){return-(a[1].length-b[1].length)}),f=-1;$.each(e,function(a,c){var d=c[1];if(b.substr(r,d.length).toLowerCase()==d.toLowerCase())return f=c[0],r+=d.length,!1});if(f!=-1)return f+1;throw"Unknown name at position "+r},q=function(){if(b.charAt(r)!=a.charAt(s))throw"Unexpected literal at position "+r;r++},r=0;for(var s=0;s<a.length;s++)if(m)a.charAt(s)=="'"&&!n("'")?m=!1:q();else switch(a.charAt(s)){case"d":k=o("d");break;case"D":p("D",e,f);break;case"o":l=o("o");break;case"m":j=o("m");break;case"M":j=p("M",g,h);break;case"y":i=o("y");break;case"@":var t=new Date(o("@"));i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"!":var t=new Date((o("!")-this._ticksTo1970)/1e4);i=t.getFullYear(),j=t.getMonth()+1,k=t.getDate();break;case"'":n("'")?q():m=!0;break;default:q()}if(r<b.length)throw"Extra/unparsed characters found in date: "+b.substring(r);i==-1?i=(new Date).getFullYear():i<100&&(i+=(new Date).getFullYear()-(new Date).getFullYear()%100+(i<=d?0:-100));if(l>-1){j=1,k=l;do{var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}while(!0)}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+1<a.length&&a.charAt(m+1)==b;return c&&m++,c},i=function(a,b,c){var d=""+b;if(h(a))while(d.length<c)d="0"+d;return d},j=function(a,b,c,d){return h(a)?d[b]:c[b]},k="",l=!1;if(b)for(var m=0;m<a.length;m++)if(l)a.charAt(m)=="'"&&!h("'")?l=!1:k+=a.charAt(m);else switch(a.charAt(m)){case"d":k+=i("d",b.getDate(),2);break;case"D":k+=j("D",b.getDay(),d,e);break;case"o":k+=i("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":k+=i("m",b.getMonth()+1,2);break;case"M":k+=j("M",b.getMonth(),f,g);break;case"y":k+=h("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case"@":k+=b.getTime();break;case"!":k+=b.getTime()*1e4+this._ticksTo1970;break;case"'":h("'")?k+="'":l=!0;break;default:k+=a.charAt(m)}return k},_possibleChars:function(a){var b="",c=!1,d=function(b){var c=e+1<a.length&&a.charAt(e+1)==b;return c&&e++,c};for(var e=0;e<a.length;e++)if(c)a.charAt(e)=="'"&&!d("'")?c=!1:b+=a.charAt(e);else switch(a.charAt(e)){case"d":case"m":case"y":case"@":b+="0123456789";break;case"D":case"M":return null;case"'":d("'")?b+="'":c=!0;break;default:b+=a.charAt(e)}return b},_get:function(a,b){return a.settings[b]!==undefined?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()==a.lastVal)return;var c=this._get(a,"dateFormat"),d=a.lastVal=a.input?a.input.val():null,e,f;e=f=this._getDefaultDate(a);var g=this._getFormatConfig(a);try{e=this.parseDate(c,d,g)||f}catch(h){this.log(h),d=b?"":d}a.selectedDay=e.getDate(),a.drawMonth=a.selectedMonth=e.getMonth(),a.drawYear=a.selectedYear=e.getFullYear(),a.currentDay=d?e.getDate():0,a.currentMonth=d?e.getMonth():0,a.currentYear=d?e.getFullYear():0,this._adjustInstDate(a)},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var d=function(a){var b=new Date;return b.setDate(b.getDate()+a),b},e=function(b){try{return $.datepicker.parseDate($.datepicker._get(a,"dateFormat"),b,$.datepicker._getFormatConfig(a))}catch(c){}var d=(b.toLowerCase().match(/^c/)?$.datepicker._getDate(a):null)||new Date,e=d.getFullYear(),f=d.getMonth(),g=d.getDate(),h=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,i=h.exec(b);while(i){switch(i[2]||"d"){case"d":case"D":g+=parseInt(i[1],10);break;case"w":case"W":g+=parseInt(i[1],10)*7;break;case"m":case"M":f+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f));break;case"y":case"Y":e+=parseInt(i[1],10),g=Math.min(g,$.datepicker._getDaysInMonth(e,f))}i=h.exec(b)}return new Date(e,f,g)},f=b==null||b===""?c:typeof b=="string"?e(b):typeof b=="number"?isNaN(b)?c:d(b):new Date(b.getTime());return f=f&&f.toString()=="Invalid Date"?c:f,f&&(f.setHours(0),f.setMinutes(0),f.setSeconds(0),f.setMilliseconds(0)),this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(a){return a?(a.setHours(a.getHours()>12?a.getHours()+2:0),a):null},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_attachHandlers:function(a){var b=this._get(a,"stepMonths"),c="#"+a.id.replace(/\\\\/g,"\\");a.dpDiv.find("[data-handler]").map(function(){var a={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,-b,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(c,+b,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(c)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(c,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(c,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),a[this.getAttribute("data-handler")])})},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&p<l?l:p;while(this._daylightSavingAdjust(new Date(o,n,1))>p)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>":e?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+q+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+q+"</span></a>",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":e?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">'+this._get(a,"closeText")+"</button>",x=d?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?w:"")+(this._isInRange(a,v)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click">'+u+"</button>":"")+(c?"":w)+"</div>":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L<g[0];L++){var M="";this.maxRows=4;for(var N=0;N<g[1];N++){var O=this._daylightSavingAdjust(new Date(o,n,a.selectedDay)),P=" ui-corner-all",Q="";if(j){Q+='<div class="ui-datepicker-group';if(g[1]>1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+P+'">'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var R=z?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="<th"+((S+y+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+A[T]+'">'+C[T]+"</span></th>"}Q+=R+"</tr></thead><tbody>";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z<X;Z++){Q+="<tr>";var _=z?'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(Y)+"</td>":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Y<l||m&&Y>m;_+='<td class="'+((S+y+6)%7>=5?" ui-datepicker-week-end":"")+(bb?" ui-datepicker-other-month":"")+(Y.getTime()==O.getTime()&&n==a.selectedMonth&&a._keyEvent||J.getTime()==Y.getTime()&&J.getTime()==O.getTime()?" "+this._dayOverClass:"")+(bc?" "+this._unselectableClass+" ui-state-disabled":"")+(bb&&!G?"":" "+ba[1]+(Y.getTime()==k.getTime()?" "+this._currentClass:"")+(Y.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!bb||G)&&ba[2]?' title="'+ba[2]+'"':"")+(bc?"":' data-handler="selectDay" data-event="click" data-month="'+Y.getMonth()+'" data-year="'+Y.getFullYear()+'"')+">"+(bb&&!G?"&#xa0;":bc?'<span class="ui-state-default">'+Y.getDate()+"</span>":'<a class="ui-state-default'+(Y.getTime()==b.getTime()?" ui-state-highlight":"")+(Y.getTime()==k.getTime()?" ui-state-active":"")+(bb?" ui-priority-secondary":"")+'" href="#">'+Y.getDate()+"</a>")+"</td>",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+"</tr>"}n++,n>11&&(n=0,o++),Q+="</tbody></table>"+(j?"</div>"+(g[0]>0&&N==g[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),M+=Q}K+=M}return K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='<div class="ui-datepicker-title">',m="";if(f||!i)m+='<span class="ui-datepicker-month">'+g[b]+"</span>";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';for(var p=0;p<12;p++)(!n||p>=d.getMonth())&&(!o||p<=e.getMonth())&&(m+='<option value="'+p+'"'+(p==b?' selected="selected"':"")+">"+h[p]+"</option>");m+="</select>"}k||(l+=m+(f||!i||!j?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+='<span class="ui-datepicker-year">'+c+"</span>";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';for(;t<=u;t++)a.yearshtml+='<option value="'+t+'"'+(t==c?' selected="selected"':"")+">"+t+"</option>";a.yearshtml+="</select>",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?"&#xa0;":"")+m),l+="</div>",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&b<c?c:b;return e=d&&e>d?d:e,e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");return b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!="string"||a!="isDisabled"&&a!="getDate"&&a!="widget"?a=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.23",window["DP_jQuery_"+dpuuid]=$})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.ui.progressbar.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=a("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove(),a.Widget.prototype.destroy.apply(this,arguments)},value:function(a){return a===b?this._value():(this._setOption("value",a),this)},_setOption:function(b,c){b==="value"&&(this.options.value=c,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;return typeof a!="number"&&(a=0),Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var a=this.value(),b=this._percentage();this.oldValue!==a&&(this.oldValue=a,this._trigger("change")),this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(b.toFixed(0)+"%"),this.element.attr("aria-valuenow",a)}}),a.extend(a.ui.progressbar,{version:"1.8.23"})})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.core.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\(0, 0, 0, 0\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=""&&e!="transparent"||a.nodeName(b,"body"))break;d="backgroundColor"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]=="string"&&(d=c.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]=="string"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b=="object"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c=="number"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d=="number"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b=="number"||a.fx.speeds[b]?!0:typeof b=="string"&&!a.effects[b]?!0:!1}a.effects={},a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]="rgb("+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+","+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+")"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=["add","remove","toggle"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr("style")||" ",l=i(h.call(this)),m,n=g.attr("class")||"";a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),m=i(h.call(this)),g.attr("class",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+"Class"](b[c])}),typeof g.attr("style")=="object"?(g.attr("style").cssText="",g.attr("style").cssText=k):g.attr("style",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d=="boolean"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:"1.8.23",save:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.data("ec.storage."+b[c],a[0].style[b[c]])},restore:function(a,b){for(var c=0;c<b.length;c++)b[c]!==null&&a.css(b[c],a.data("ec.storage."+b[c]))},setMode:function(a,b){return b=="toggle"&&(b=a.is(":hidden")?"show":"hide"),b},getBaseline:function(a,b){var c,d;switch(a[0]){case"top":c=0;break;case"middle":c=.5;break;case"bottom":c=1;break;default:c=a[0]/b.height}switch(a[1]){case"left":d=0;break;case"center":d=.5;break;case"right":d=1;break;default:d=a[1]/b.width}return{x:d,y:c}},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper"))return b.parent();var c={width:b.outerWidth(!0),height:b.outerHeight(!0),"float":b.css("float")},d=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css("position")=="static"?(d.css({position:"relative"}),b.css({position:"relative"})):(a.extend(c,{position:b.css("position"),zIndex:b.css("z-index")}),a.each(["top","left","bottom","right"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]="auto")}),b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(".ui-effects-wrapper")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="show",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode="hide",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b=="boolean"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode="toggle",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each(["em","px","%","pt"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}});var m={};a.each(["Quad","Cubic","Quart","Quint","Expo"],function(a,b){m[b]=function(b){return Math.pow(b,a+2)}}),a.extend(m,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return a===0||a===1?a:-Math.pow(2,8*(a-1))*Math.sin(((a-1)*80-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){var b,c=4;while(a<((b=Math.pow(2,--c))-1)/11);return 1/Math.pow(4,3-c)-7.5625*Math.pow((b*3-2)/22-a,2)}}),a.each(m,function(b,c){a.easing["easeIn"+b]=c,a.easing["easeOut"+b]=function(a){return 1-c(1-a)},a.easing["easeInOut"+b]=function(a){return a<.5?c(a*2)/2:c(a*-2+2)/-2+1}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.blind.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=f=="vertical"?"height":"width",i=f=="vertical"?g.height():g.width();e=="show"&&g.css(h,0);var j={};j[h]=e=="show"?i:0,g.animate(j,b.duration,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.bounce.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"up",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push("opacity"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",g=b.options.distance||(j=="top"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e=="show"&&c.css("opacity",0).css(j,k=="pos"?-g:g),e=="hide"&&(g=g/(h*2)),e!="hide"&&h--;if(e=="show"){var l={opacity:1};l[j]=(k=="pos"?"+=":"-=")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m<h;m++){var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing),g=e=="hide"?g*2:g/2}if(e=="hide"){var l={opacity:0};l[j]=(k=="pos"?"-=":"+=")+g,c.animate(l,i/2,b.options.easing,function(){c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}else{var n={},p={};n[j]=(k=="pos"?"-=":"+=")+g,p[j]=(k=="pos"?"+=":"-=")+g,c.animate(n,i/2,b.options.easing).animate(p,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.clip.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.clip=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","height","width"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"vertical";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:"hidden"}),h=c[0].tagName=="IMG"?g:c,i={size:f=="vertical"?"height":"width",position:f=="vertical"?"top":"left"},j=f=="vertical"?h.height():h.width();e=="show"&&(h.css(i.size,0),h.css(i.position,j/2));var k={};k[i.size]=e=="show"?j:0,k[i.position]=e=="show"?0:j/2,h.animate(k,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.drop.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.drop=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","opacity"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight(!0)/2:c.outerWidth(!0)/2);e=="show"&&c.css("opacity",0).css(g,h=="pos"?-i:i);var j={opacity:e=="show"?1:0};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.explode.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.explode=function(b){return this.queue(function(){var c=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3,d=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":b.options.mode;var e=a(this).show().css("visibility","hidden"),f=e.offset();f.top-=parseInt(e.css("marginTop"),10)||0,f.left-=parseInt(e.css("marginLeft"),10)||0;var g=e.outerWidth(!0),h=e.outerHeight(!0);for(var i=0;i<c;i++)for(var j=0;j<d;j++)e.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(g/d),top:-i*(h/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode=="show"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode=="show"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode=="show"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode=="show"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode=="show"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode=="show"?1:0},b.duration||500);setTimeout(function(){b.options.mode=="show"?e.css({visibility:"visible"}):e.css({visibility:"visible"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.fade.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.fold.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"hide"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),j=e=="show"!=g,k=j?["width","height"]:["height","width"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e=="hide"?0:1]),e=="show"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e=="show"?l[0]:f,p[k[1]]=e=="show"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.highlight.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=["backgroundImage","backgroundColor","opacity"],e=a.effects.setMode(c,b.options.mode||"show"),f={backgroundColor:c.css("backgroundColor")};e=="hide"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),e=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.pulsate.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"show"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(":visible"),h=0;g||(c.css("opacity",0).show(),h=1),(d=="hide"&&g||d=="show"&&!g)&&e--;for(var i=0;i<e;i++)c.animate({opacity:h},f,b.options.easing),h=(h+1)%2;c.animate({opacity:h},f,b.options.easing,function(){h==0&&c.hide(),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.scale.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.puff=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||"hide"),e=parseInt(b.options.percent,10)||150,f=e/100,g={height:c.height(),width:c.width()};a.extend(b.options,{fade:!0,mode:d,percent:d=="hide"?e:100,from:d=="hide"?g:{height:g.height*f,width:g.width*f}}),c.effect("scale",b.options,b.duration,b.callback),c.dequeue()})},a.effects.scale=function(b){return this.queue(function(){var c=a(this),d=a.extend(!0,{},b.options),e=a.effects.setMode(c,b.options.mode||"effect"),f=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:e=="hide"?0:100),g=b.options.direction||"both",h=b.options.origin;e!="effect"&&(d.origin=h||["middle","center"],d.restore=!0);var i={height:c.height(),width:c.width()};c.from=b.options.from||(e=="show"?{height:0,width:0}:i);var j={y:g!="horizontal"?f/100:1,x:g!="vertical"?f/100:1};c.to={height:i.height*j.y,width:i.width*j.x},b.options.fade&&(e=="show"&&(c.from.opacity=0,c.to.opacity=1),e=="hide"&&(c.from.opacity=1,c.to.opacity=0)),d.from=c.from,d.to=c.to,d.mode=e,c.effect("size",d,b.duration,b.callback),c.dequeue()})},a.effects.size=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right","width","height","overflow","opacity"],e=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],g=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],i=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],j=a.effects.setMode(c,b.options.mode||"effect"),k=b.options.restore||!1,l=b.options.scale||"both",m=b.options.origin,n={height:c.height(),width:c.width()};c.from=b.options.from||n,c.to=b.options.to||n;if(m){var p=a.effects.getBaseline(m,n);c.from.top=(n.height-c.from.height)*p.y,c.from.left=(n.width-c.from.width)*p.x,c.to.top=(n.height-c.to.height)*p.y,c.to.left=(n.width-c.to.width)*p.x}var q={from:{y:c.from.height/n.height,x:c.from.width/n.width},to:{y:c.to.height/n.height,x:c.to.width/n.width}};if(l=="box"||l=="both")q.from.y!=q.to.y&&(d=d.concat(h),c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(d=d.concat(i),c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to));(l=="content"||l=="both")&&q.from.y!=q.to.y&&(d=d.concat(g),c.from=a.effects.setTransition(c,g,q.from.y,c.from),c.to=a.effects.setTransition(c,g,q.to.y,c.to)),a.effects.save(c,k?d:e),c.show(),a.effects.createWrapper(c),c.css("overflow","hidden").css(c.from);if(l=="content"||l=="both")h=h.concat(["marginTop","marginBottom"]).concat(g),i=i.concat(["marginLeft","marginRight"]),f=d.concat(h).concat(i),c.find("*[width]").each(function(){var c=a(this);k&&a.effects.save(c,f);var d={height:c.height(),width:c.width()};c.from={height:d.height*q.from.y,width:d.width*q.from.x},c.to={height:d.height*q.to.y,width:d.width*q.to.x},q.from.y!=q.to.y&&(c.from=a.effects.setTransition(c,h,q.from.y,c.from),c.to=a.effects.setTransition(c,h,q.to.y,c.to)),q.from.x!=q.to.x&&(c.from=a.effects.setTransition(c,i,q.from.x,c.from),c.to=a.effects.setTransition(c,i,q.to.x,c.to)),c.css(c.from),c.animate(c.to,b.duration,b.options.easing,function(){k&&a.effects.restore(c,f)})});c.animate(c.to,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity),j=="hide"&&c.hide(),a.effects.restore(c,k?d:e),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.shake.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.shake=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"effect"),f=b.options.direction||"left",g=b.options.distance||20,h=b.options.times||3,i=b.duration||b.options.duration||140;a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f=="up"||f=="down"?"top":"left",k=f=="up"||f=="left"?"pos":"neg",l={},m={},n={};l[j]=(k=="pos"?"-=":"+=")+g,m[j]=(k=="pos"?"+=":"-=")+g*2,n[j]=(k=="pos"?"-=":"+=")+g*2,c.animate(l,i,b.options.easing);for(var p=1;p<h;p++)c.animate(m,i,b.options.easing).animate(n,i,b.options.easing);c.animate(m,i,b.options.easing).animate(l,i/2,b.options.easing,function(){a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments)}),c.queue("fx",function(){c.dequeue()}),c.dequeue()})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.slide.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.slide=function(b){return this.queue(function(){var c=a(this),d=["position","top","bottom","left","right"],e=a.effects.setMode(c,b.options.mode||"show"),f=b.options.direction||"left";a.effects.save(c,d),c.show(),a.effects.createWrapper(c).css({overflow:"hidden"});var g=f=="up"||f=="down"?"top":"left",h=f=="up"||f=="left"?"pos":"neg",i=b.options.distance||(g=="top"?c.outerHeight(!0):c.outerWidth(!0));e=="show"&&c.css(g,h=="pos"?isNaN(i)?"-"+i:-i:i);var j={};j[g]=(e=="show"?h=="pos"?"+=":"-=":h=="pos"?"-=":"+=")+i,c.animate(j,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e=="hide"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15
      -* https://github.com/jquery/jquery-ui
      -* Includes: jquery.effects.transfer.js
      -* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk-refonly/assets/js/docs.js b/tools/droiddoc/templates-sdk-refonly/assets/js/docs.js
      deleted file mode 100644
      index 7c2af5dbd7c..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/assets/js/docs.js
      +++ /dev/null
      @@ -1,5296 +0,0 @@
      -var classesNav;
      -var devdocNav;
      -var sidenav;
      -var cookie_namespace = 'android_developer';
      -var NAV_PREF_TREE = "tree";
      -var NAV_PREF_PANELS = "panels";
      -var nav_pref;
      -var isMobile = false; // true if mobile, so we can adjust some layout
      -var mPagePath; // initialized in ready() function
      -
      -var basePath = getBaseUri(location.pathname);
      -var SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1));
      -var GOOGLE_DATA; // combined data for google service apis, used for search suggest
      -
      -// Ensure that all ajax getScript() requests allow caching
      -$.ajaxSetup({
      -  cache: true
      -});
      -
      -/******  ON LOAD SET UP STUFF *********/
      -
      -$(document).ready(function() {
      -
      -  // show lang dialog if the URL includes /intl/
      -  //if (location.pathname.substring(0,6) == "/intl/") {
      -  //  var lang = location.pathname.split('/')[2];
      -   // if (lang != getLangPref()) {
      -   //   $("#langMessage a.yes").attr("onclick","changeLangPref('" + lang
      -   //       + "', true); $('#langMessage').hide(); return false;");
      -  //    $("#langMessage .lang." + lang).show();
      -   //   $("#langMessage").show();
      -   // }
      -  //}
      -
      -  // load json file for JD doc search suggestions
      -  $.getScript(toRoot + 'jd_lists_unified.js');
      -  // load json file for Android API search suggestions
      -  $.getScript(toRoot + 'reference/lists.js');
      -  // load json files for Google services API suggestions
      -  $.getScript(toRoot + 'reference/gcm_lists.js', function(data, textStatus, jqxhr) {
      -      // once the GCM json (GCM_DATA) is loaded, load the GMS json (GMS_DATA) and merge the data
      -      if(jqxhr.status === 200) {
      -          $.getScript(toRoot + 'reference/gms_lists.js', function(data, textStatus, jqxhr) {
      -              if(jqxhr.status === 200) {
      -                  // combine GCM and GMS data
      -                  GOOGLE_DATA = GMS_DATA;
      -                  var start = GOOGLE_DATA.length;
      -                  for (var i=0; i<GCM_DATA.length; i++) {
      -                      GOOGLE_DATA.push({id:start+i, label:GCM_DATA[i].label,
      -                              link:GCM_DATA[i].link, type:GCM_DATA[i].type});
      -                  }
      -              }
      -          });
      -      }
      -  });
      -
      -  // setup keyboard listener for search shortcut
      -  $('body').keyup(function(event) {
      -    if (event.which == 191 && $(event.target).is(':not(:input)')) {
      -      $('#search_autocomplete').focus();
      -    }
      -  });
      -
      -  // init the fullscreen toggle click event
      -  $('#nav-swap .fullscreen').click(function(){
      -    if ($(this).hasClass('disabled')) {
      -      toggleFullscreen(true);
      -    } else {
      -      toggleFullscreen(false);
      -    }
      -  });
      -
      -  // initialize the divs with custom scrollbars
      -  if (window.innerWidth >= 720) {
      -    $('.scroll-pane').jScrollPane({verticalGutter: 0});
      -  }
      -
      -  // set up the search close button
      -  $('#search-close').on('click touchend', function() {
      -    $searchInput = $('#search_autocomplete');
      -    $searchInput.attr('value', '');
      -    $(this).addClass("hide");
      -    $("#search-container").removeClass('active');
      -    $("#search_autocomplete").blur();
      -    search_focus_changed($searchInput.get(), false);
      -    hideResults();
      -  });
      -
      -
      -  //Set up search
      -  $("#search_autocomplete").focus(function() {
      -    $("#search-container").addClass('active');
      -  })
      -  $("#search-container").on('mouseover touchend', function(e) {
      -    if ($(e.target).is('#search-close')) { return; }
      -    $("#search-container").addClass('active');
      -    $("#search_autocomplete").focus();
      -  })
      -  $("#search-container").mouseout(function() {
      -    if ($("#search_autocomplete").is(":focus")) return;
      -    if ($("#search_autocomplete").val() == '') {
      -      setTimeout(function(){
      -        $("#search-container").removeClass('active');
      -        $("#search_autocomplete").blur();
      -      },250);
      -    }
      -  })
      -  $("#search_autocomplete").blur(function() {
      -    if ($("#search_autocomplete").val() == '') {
      -      $("#search-container").removeClass('active');
      -    }
      -  })
      -
      -
      -  // prep nav expandos
      -  var pagePath = document.location.pathname;
      -  // account for intl docs by removing the intl/*/ path
      -  if (pagePath.indexOf("/intl/") == 0) {
      -    pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last /
      -  }
      -
      -  if (pagePath.indexOf(SITE_ROOT) == 0) {
      -    if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') {
      -      pagePath += 'index.html';
      -    }
      -  }
      -
      -  // Need a copy of the pagePath before it gets changed in the next block;
      -  // it's needed to perform proper tab highlighting in offline docs (see rootDir below)
      -  var pagePathOriginal = pagePath;
      -  if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') {
      -    // If running locally, SITE_ROOT will be a relative path, so account for that by
      -    // finding the relative URL to this page. This will allow us to find links on the page
      -    // leading back to this page.
      -    var pathParts = pagePath.split('/');
      -    var relativePagePathParts = [];
      -    var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3;
      -    for (var i = 0; i < upDirs; i++) {
      -      relativePagePathParts.push('..');
      -    }
      -    for (var i = 0; i < upDirs; i++) {
      -      relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]);
      -    }
      -    relativePagePathParts.push(pathParts[pathParts.length - 1]);
      -    pagePath = relativePagePathParts.join('/');
      -  } else {
      -    // Otherwise the page path is already an absolute URL
      -  }
      -
      -  // Highlight the header tabs...
      -  // highlight Design tab
      -  var urlSegments = pagePathOriginal.split('/');
      -  var navEl = $(".dac-nav-list");
      -  var subNavEl = navEl.find(".dac-nav-secondary");
      -  var parentNavEl;
      -
      -  if ($("body").hasClass("design")) {
      -    navEl.find("> li.design > a").addClass("selected");
      -  // highlight About tabs
      -  } else if ($("body").hasClass("about")) {
      -    if (urlSegments[1] == "about" || urlSegments[1] == "wear" || urlSegments[1] == "tv" || urlSegments[1] == "auto") {
      -      navEl.find("> li.home > a").addClass('has-subnav');
      -      subNavEl.find("li." + urlSegments[1] + " > a").addClass("selected");
      -    } else {
      -      navEl.find("> li.home > a").addClass('selected');
      -    }
      -
      -// highlight NDK tabs
      -  } else if ($("body").hasClass("ndk")) {
      -    parentNavEl = navEl.find("> li.ndk > a");
      -    parentNavEl.addClass('has-subnav');
      -    if ($("body").hasClass("guide")) {
      -      navEl.find("> li.guides > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("reference")) {
      -      navEl.find("> li.reference > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("samples")) {
      -      navEl.find("> li.samples > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("downloads")) {
      -      navEl.find("> li.downloads > a").addClass("selected ndk");
      -    }
      -
      -  // highlight Develop tab
      -  } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
      -    parentNavEl = navEl.find("> li.develop > a");
      -    parentNavEl.addClass('has-subnav');
      -
      -    // In Develop docs, also highlight appropriate sub-tab
      -    if (urlSegments[1] == "training") {
      -      subNavEl.find("li.training > a").addClass("selected");
      -    } else if (urlSegments[1] == "guide") {
      -      subNavEl.find("li.guide > a").addClass("selected");
      -    } else if (urlSegments[1] == "reference") {
      -      // If the root is reference, but page is also part of Google Services, select Google
      -      if ($("body").hasClass("google")) {
      -        subNavEl.find("li.google > a").addClass("selected");
      -      } else {
      -        subNavEl.find("li.reference > a").addClass("selected");
      -      }
      -    } else if ((urlSegments[1] == "tools") || (urlSegments[1] == "sdk")) {
      -      subNavEl.find("li.tools > a").addClass("selected");
      -    } else if ($("body").hasClass("google")) {
      -      subNavEl.find("li.google > a").addClass("selected");
      -    } else if ($("body").hasClass("samples")) {
      -      subNavEl.find("li.samples > a").addClass("selected");
      -    } else if ($("body").hasClass("preview")) {
      -      subNavEl.find("li.preview > a").addClass("selected");
      -    } else {
      -      parentNavEl.removeClass('has-subnav').addClass("selected");
      -    }
      -  // highlight Distribute tab
      -  } else if ($("body").hasClass("distribute")) {
      -    parentNavEl = navEl.find("> li.distribute > a");
      -    parentNavEl.addClass('has-subnav');
      -
      -    if (urlSegments[2] == "users") {
      -      subNavEl.find("li.users > a").addClass("selected");
      -    } else if (urlSegments[2] == "engage") {
      -      subNavEl.find("li.engage > a").addClass("selected");
      -    } else if (urlSegments[2] == "monetize") {
      -      subNavEl.find("li.monetize > a").addClass("selected");
      -    } else if (urlSegments[2] == "analyze") {
      -      subNavEl.find("li.analyze > a").addClass("selected");
      -    } else if (urlSegments[2] == "tools") {
      -      subNavEl.find("li.essentials > a").addClass("selected");
      -    } else if (urlSegments[2] == "stories") {
      -      subNavEl.find("li.stories > a").addClass("selected");
      -    } else if (urlSegments[2] == "essentials") {
      -      subNavEl.find("li.essentials > a").addClass("selected");
      -    } else if (urlSegments[2] == "googleplay") {
      -      subNavEl.find("li.googleplay > a").addClass("selected");
      -    } else {
      -      parentNavEl.removeClass('has-subnav').addClass("selected");
      -    }
      -  }
      -
      -  // set global variable so we can highlight the sidenav a bit later (such as for google reference)
      -  // and highlight the sidenav
      -  mPagePath = pagePath;
      -  highlightSidenav();
      -  buildBreadcrumbs();
      -
      -  // set up prev/next links if they exist
      -  var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]');
      -  var $selListItem;
      -  if ($selNavLink.length) {
      -    $selListItem = $selNavLink.closest('li');
      -
      -    // set up prev links
      -    var $prevLink = [];
      -    var $prevListItem = $selListItem.prev('li');
      -
      -    var crossBoundaries = ($("body.design").length > 0) || ($("body.guide").length > 0) ? true :
      -false; // navigate across topic boundaries only in design docs
      -    if ($prevListItem.length) {
      -      if ($prevListItem.hasClass('nav-section') || crossBoundaries) {
      -        // jump to last topic of previous section
      -        $prevLink = $prevListItem.find('a:last');
      -      } else if (!$selListItem.hasClass('nav-section')) {
      -        // jump to previous topic in this section
      -        $prevLink = $prevListItem.find('a:eq(0)');
      -      }
      -    } else {
      -      // jump to this section's index page (if it exists)
      -      var $parentListItem = $selListItem.parents('li');
      -      $prevLink = $selListItem.parents('li').find('a');
      -
      -      // except if cross boundaries aren't allowed, and we're at the top of a section already
      -      // (and there's another parent)
      -      if (!crossBoundaries && $parentListItem.hasClass('nav-section')
      -                           && $selListItem.hasClass('nav-section')) {
      -        $prevLink = [];
      -      }
      -    }
      -
      -    // set up next links
      -    var $nextLink = [];
      -    var startClass = false;
      -    var isCrossingBoundary = false;
      -
      -    if ($selListItem.hasClass('nav-section') && $selListItem.children('div.empty').length == 0) {
      -      // we're on an index page, jump to the first topic
      -      $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)');
      -
      -      // if there aren't any children, go to the next section (required for About pages)
      -      if($nextLink.length == 0) {
      -        $nextLink = $selListItem.next('li').find('a');
      -      } else if ($('.topic-start-link').length) {
      -        // as long as there's a child link and there is a "topic start link" (we're on a landing)
      -        // then set the landing page "start link" text to be the first doc title
      -        $('.topic-start-link').text($nextLink.text().toUpperCase());
      -      }
      -
      -      // If the selected page has a description, then it's a class or article homepage
      -      if ($selListItem.find('a[description]').length) {
      -        // this means we're on a class landing page
      -        startClass = true;
      -      }
      -    } else {
      -      // jump to the next topic in this section (if it exists)
      -      $nextLink = $selListItem.next('li').find('a:eq(0)');
      -      if ($nextLink.length == 0) {
      -        isCrossingBoundary = true;
      -        // no more topics in this section, jump to the first topic in the next section
      -        $nextLink = $selListItem.parents('li:eq(0)').next('li').find('a:eq(0)');
      -        if (!$nextLink.length) {  // Go up another layer to look for next page (lesson > class > course)
      -          $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)');
      -          if ($nextLink.length == 0) {
      -            // if that doesn't work, we're at the end of the list, so disable NEXT link
      -            $('.next-page-link').attr('href','').addClass("disabled")
      -                                .click(function() { return false; });
      -            // and completely hide the one in the footer
      -            $('.content-footer .next-page-link').hide();
      -          }
      -        }
      -      }
      -    }
      -
      -    if (startClass) {
      -      $('.start-class-link').attr('href', $nextLink.attr('href')).removeClass("hide");
      -
      -      // if there's no training bar (below the start button),
      -      // then we need to add a bottom border to button
      -      if (!$("#tb").length) {
      -        $('.start-class-link').css({'border-bottom':'1px solid #DADADA'});
      -      }
      -    } else if (isCrossingBoundary && !$('body.design').length) {  // Design always crosses boundaries
      -      $('.content-footer.next-class').show();
      -      $('.next-page-link').attr('href','')
      -                          .removeClass("hide").addClass("disabled")
      -                          .click(function() { return false; });
      -      // and completely hide the one in the footer
      -      $('.content-footer .next-page-link').hide();
      -      if ($nextLink.length) {
      -        $('.next-class-link').attr('href',$nextLink.attr('href'))
      -                             .removeClass("hide")
      -                             .append(": " + $nextLink.html());
      -        $('.next-class-link').find('.new').empty();
      -      }
      -    } else {
      -      $('.next-page-link').attr('href', $nextLink.attr('href'))
      -                          .removeClass("hide");
      -      // for the footer link, also add the next page title
      -      $('.content-footer .next-page-link').append(": " + $nextLink.html());
      -    }
      -
      -    if (!startClass && $prevLink.length) {
      -      var prevHref = $prevLink.attr('href');
      -      if (prevHref == SITE_ROOT + 'index.html') {
      -        // Don't show Previous when it leads to the homepage
      -      } else {
      -        $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide");
      -      }
      -    }
      -
      -  }
      -
      -
      -
      -  // Set up the course landing pages for Training with class names and descriptions
      -  if ($('body.trainingcourse').length) {
      -    var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a');
      -
      -    // create an array for all the class descriptions
      -    var $classDescriptions = new Array($classLinks.length);
      -    var lang = getLangPref();
      -    $classLinks.each(function(index) {
      -      var langDescr = $(this).attr(lang + "-description");
      -      if (typeof langDescr !== 'undefined' && langDescr !== false) {
      -        // if there's a class description in the selected language, use that
      -        $classDescriptions[index] = langDescr;
      -      } else {
      -        // otherwise, use the default english description
      -        $classDescriptions[index] = $(this).attr("description");
      -      }
      -    });
      -
      -    var $olClasses  = $('<ol class="class-list"></ol>');
      -    var $liClass;
      -    var $h2Title;
      -    var $pSummary;
      -    var $olLessons;
      -    var $liLesson;
      -    $classLinks.each(function(index) {
      -      $liClass  = $('<li class="clearfix"></li>');
      -      $h2Title  = $('<a class="title" href="'+$(this).attr('href')+'"><h2 class="norule">' + $(this).html()+'</h2><span></span></a>');
      -      $pSummary = $('<p class="description">' + $classDescriptions[index] + '</p>');
      -
      -      $olLessons  = $('<ol class="lesson-list"></ol>');
      -
      -      $lessons = $(this).closest('li').find('ul li a');
      -
      -      if ($lessons.length) {
      -        $lessons.each(function(index) {
      -          $olLessons.append('<li><a href="'+$(this).attr('href')+'">' + $(this).html()+'</a></li>');
      -        });
      -      } else {
      -        $pSummary.addClass('article');
      -      }
      -
      -      $liClass.append($h2Title).append($pSummary).append($olLessons);
      -      $olClasses.append($liClass);
      -    });
      -    $('.jd-descr').append($olClasses);
      -  }
      -
      -  // Set up expand/collapse behavior
      -  initExpandableNavItems("#nav");
      -
      -
      -  $(".scroll-pane").scroll(function(event) {
      -      event.preventDefault();
      -      return false;
      -  });
      -
      -  /* Resize nav height when window height changes */
      -  $(window).resize(function() {
      -    if ($('#side-nav').length == 0) return;
      -    setNavBarDimensions(); // do this even if sidenav isn't fixed because it could become fixed
      -    // make sidenav behave when resizing the window and side-scolling is a concern
      -    updateSideNavDimensions();
      -    checkSticky();
      -    resizeNav(250);
      -  });
      -
      -  if ($('#devdoc-nav').length) {
      -    setNavBarDimensions();
      -  }
      -
      -
      -  // Set up play-on-hover <video> tags.
      -  $('video.play-on-hover').bind('click', function(){
      -    $(this).get(0).load(); // in case the video isn't seekable
      -    $(this).get(0).play();
      -  });
      -
      -  // Set up tooltips
      -  var TOOLTIP_MARGIN = 10;
      -  $('acronym,.tooltip-link').each(function() {
      -    var $target = $(this);
      -    var $tooltip = $('<div>')
      -        .addClass('tooltip-box')
      -        .append($target.attr('title'))
      -        .hide()
      -        .appendTo('body');
      -    $target.removeAttr('title');
      -
      -    $target.hover(function() {
      -      // in
      -      var targetRect = $target.offset();
      -      targetRect.width = $target.width();
      -      targetRect.height = $target.height();
      -
      -      $tooltip.css({
      -        left: targetRect.left,
      -        top: targetRect.top + targetRect.height + TOOLTIP_MARGIN
      -      });
      -      $tooltip.addClass('below');
      -      $tooltip.show();
      -    }, function() {
      -      // out
      -      $tooltip.hide();
      -    });
      -  });
      -
      -  // Set up <h2> deeplinks
      -  $('h2').click(function() {
      -    var id = $(this).attr('id');
      -    if (id) {
      -      if (history && history.replaceState) {
      -        // Change url without scrolling.
      -        history.replaceState({}, '', '#' + id);
      -      } else {
      -        document.location.hash = id;
      -      }
      -    }
      -  });
      -
      -  //Loads the +1 button
      -  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
      -  po.src = 'https://apis.google.com/js/plusone.js';
      -  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      -
      -  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
      -
      -  if ($(".scroll-pane").length > 1) {
      -    // Check if there's a user preference for the panel heights
      -    var cookieHeight = readCookie("reference_height");
      -    if (cookieHeight) {
      -      restoreHeight(cookieHeight);
      -    }
      -  }
      -
      -  // Resize once loading is finished
      -  resizeNav();
      -  // Check if there's an anchor that we need to scroll into view.
      -  // A delay is needed, because some browsers do not immediately scroll down to the anchor
      -  window.setTimeout(offsetScrollForSticky, 100);
      -
      -  /* init the language selector based on user cookie for lang */
      -  loadLangPref();
      -  changeNavLang(getLangPref());
      -
      -  /* setup event handlers to ensure the overflow menu is visible while picking lang */
      -  $("#language select")
      -      .mousedown(function() {
      -        $("div.morehover").addClass("hover"); })
      -      .blur(function() {
      -        $("div.morehover").removeClass("hover"); });
      -
      -  /* some global variable setup */
      -  resizePackagesNav = $("#resize-packages-nav");
      -  classesNav = $("#classes-nav");
      -  devdocNav = $("#devdoc-nav");
      -
      -  var cookiePath = "";
      -  if (location.href.indexOf("/reference/") != -1) {
      -    cookiePath = "reference_";
      -  } else if (location.href.indexOf("/guide/") != -1) {
      -    cookiePath = "guide_";
      -  } else if (location.href.indexOf("/tools/") != -1) {
      -    cookiePath = "tools_";
      -  } else if (location.href.indexOf("/training/") != -1) {
      -    cookiePath = "training_";
      -  } else if (location.href.indexOf("/design/") != -1) {
      -    cookiePath = "design_";
      -  } else if (location.href.indexOf("/distribute/") != -1) {
      -    cookiePath = "distribute_";
      -  }
      -
      -
      -  /* setup shadowbox for any videos that want it */
      -  var $videoLinks = $("a.video-shadowbox-button, a.notice-developers-video");
      -  if ($videoLinks.length) {
      -    // if there's at least one, add the shadowbox HTML to the body
      -    $('body').prepend(
      -'<div id="video-container">'+
      -  '<div id="video-frame">'+
      -    '<div class="video-close">'+
      -      '<span id="icon-video-close" onclick="closeVideo()">&nbsp;</span>'+
      -    '</div>'+
      -    '<div id="youTubePlayer"></div>'+
      -  '</div>'+
      -'</div>');
      -
      -    // loads the IFrame Player API code asynchronously.
      -    $.getScript("https://www.youtube.com/iframe_api");
      -
      -    $videoLinks.each(function() {
      -      var videoId = $(this).attr('href').split('?v=')[1];
      -      $(this).click(function(event) {
      -        event.preventDefault();
      -        startYouTubePlayer(videoId);
      -      });
      -    });
      -  }
      -});
      -// END of the onload event
      -
      -
      -var youTubePlayer;
      -function onYouTubeIframeAPIReady() {
      -}
      -
      -/* Returns the height the shadowbox video should be. It's based on the current
      -   height of the "video-frame" element, which is 100% height for the window.
      -   Then minus the margin so the video isn't actually the full window height. */
      -function getVideoHeight() {
      -  var frameHeight = $("#video-frame").height();
      -  var marginTop = $("#video-frame").css('margin-top').split('px')[0];
      -  return frameHeight - (marginTop * 2);
      -}
      -
      -var mPlayerPaused = false;
      -
      -function startYouTubePlayer(videoId) {
      -  $("#video-container").show();
      -  $("#video-frame").show();
      -  mPlayerPaused = false;
      -
      -  // compute the size of the player so it's centered in window
      -  var maxWidth = 940;  // the width of the web site content
      -  var videoAspect = .5625; // based on 1280x720 resolution
      -  var maxHeight = maxWidth * videoAspect;
      -  var videoHeight = getVideoHeight();
      -  var videoWidth = videoHeight / videoAspect;
      -  if (videoWidth > maxWidth) {
      -    videoWidth = maxWidth;
      -    videoHeight = maxHeight;
      -  }
      -  $("#video-frame").css('width', videoWidth);
      -
      -  // check if we've already created this player
      -  if (youTubePlayer == null) {
      -    // check if there's a start time specified
      -    var idAndHash = videoId.split("#");
      -    var startTime = 0;
      -    if (idAndHash.length > 1) {
      -      startTime = idAndHash[1].split("t=")[1] != undefined ? idAndHash[1].split("t=")[1] : 0;
      -    }
      -    // enable localized player
      -    var lang = getLangPref();
      -    var captionsOn = lang == 'en' ? 0 : 1;
      -
      -    youTubePlayer = new YT.Player('youTubePlayer', {
      -      height: videoHeight,
      -      width: videoWidth,
      -      videoId: idAndHash[0],
      -      playerVars: {start: startTime, hl: lang, cc_load_policy: captionsOn},
      -      events: {
      -        'onReady': onPlayerReady,
      -        'onStateChange': onPlayerStateChange
      -      }
      -    });
      -  } else {
      -    // reset the size in case the user adjusted the window since last play
      -    youTubePlayer.setSize(videoWidth, videoHeight);
      -    // if a video different from the one already playing was requested, cue it up
      -    if (videoId != youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]) {
      -      youTubePlayer.cueVideoById(videoId);
      -    }
      -    youTubePlayer.playVideo();
      -  }
      -}
      -
      -function onPlayerReady(event) {
      -  event.target.playVideo();
      -  mPlayerPaused = false;
      -}
      -
      -function closeVideo() {
      -  try {
      -    youTubePlayer.pauseVideo();
      -  } catch(e) {
      -  }
      -  $("#video-container").fadeOut(200);
      -}
      -
      -/* Track youtube playback for analytics */
      -function onPlayerStateChange(event) {
      -    // Video starts, send the video ID
      -    if (event.data == YT.PlayerState.PLAYING) {
      -      if (mPlayerPaused) {
      -        ga('send', 'event', 'Videos', 'Resume',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]);
      -      } else {
      -        // track the start playing event so we know from which page the video was selected
      -        ga('send', 'event', 'Videos', 'Start: ' +
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            'on: ' + document.location.href);
      -      }
      -      mPlayerPaused = false;
      -    }
      -    // Video paused, send video ID and video elapsed time
      -    if (event.data == YT.PlayerState.PAUSED) {
      -      ga('send', 'event', 'Videos', 'Paused',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            youTubePlayer.getCurrentTime());
      -      mPlayerPaused = true;
      -    }
      -    // Video finished, send video ID and video elapsed time
      -    if (event.data == YT.PlayerState.ENDED) {
      -      ga('send', 'event', 'Videos', 'Finished',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            youTubePlayer.getCurrentTime());
      -      mPlayerPaused = true;
      -    }
      -}
      -
      -
      -
      -function initExpandableNavItems(rootTag) {
      -  $(rootTag + ' li.nav-section .nav-section-header').click(function() {
      -    var section = $(this).closest('li.nav-section');
      -    if (section.hasClass('expanded')) {
      -    /* hide me and descendants */
      -      section.find('ul').slideUp(250, function() {
      -        // remove 'expanded' class from my section and any children
      -        section.closest('li').removeClass('expanded');
      -        $('li.nav-section', section).removeClass('expanded');
      -        resizeNav();
      -      });
      -    } else {
      -    /* show me */
      -      // first hide all other siblings
      -      var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky');
      -      $others.removeClass('expanded').children('ul').slideUp(250);
      -
      -      // now expand me
      -      section.closest('li').addClass('expanded');
      -      section.children('ul').slideDown(250, function() {
      -        resizeNav();
      -      });
      -    }
      -  });
      -
      -  // Stop expand/collapse behavior when clicking on nav section links
      -  // (since we're navigating away from the page)
      -  // This selector captures the first instance of <a>, but not those with "#" as the href.
      -  $('.nav-section-header').find('a:eq(0)').not('a[href="#"]').click(function(evt) {
      -    window.location.href = $(this).attr('href');
      -    return false;
      -  });
      -}
      -
      -
      -/** Create the list of breadcrumb links in the sticky header */
      -function buildBreadcrumbs() {
      -  var $breadcrumbUl =  $(".dac-header-crumbs");
      -  var primaryNavLink = ".dac-nav-list > .dac-nav-item > .dac-nav-link";
      -
      -  // Add the secondary horizontal nav item, if provided
      -  var $selectedSecondNav = $(".dac-nav-secondary .dac-nav-link.selected").clone()
      -    .attr('class', 'dac-header-crumbs-link');
      -
      -  if ($selectedSecondNav.length) {
      -    $breadcrumbUl.prepend($('<li class="dac-header-crumbs-item">').append($selectedSecondNav));
      -  }
      -
      -  // Add the primary horizontal nav
      -  var $selectedFirstNav = $(primaryNavLink + ".selected, " + primaryNavLink + ".has-subnav").clone()
      -    .attr('class', 'dac-header-crumbs-link');
      -
      -  // If there's no header nav item, use the logo link and title from alt text
      -  if ($selectedFirstNav.length < 1) {
      -    $selectedFirstNav = $('<a class="dac-header-crumbs-link">')
      -        .attr('href', $("div#header .logo a").attr('href'))
      -        .text($("div#header .logo img").attr('alt'));
      -  }
      -  $breadcrumbUl.prepend($('<li class="dac-header-crumbs-item">').append($selectedFirstNav));
      -}
      -
      -
      -
      -/** Highlight the current page in sidenav, expanding children as appropriate */
      -function highlightSidenav() {
      -  // if something is already highlighted, undo it. This is for dynamic navigation (Samples index)
      -  if ($("ul#nav li.selected").length) {
      -    unHighlightSidenav();
      -  }
      -  // look for URL in sidenav, including the hash
      -  var $selNavLink = $('#nav').find('a[href="' + mPagePath + location.hash + '"]');
      -
      -  // If the selNavLink is still empty, look for it without the hash
      -  if ($selNavLink.length == 0) {
      -    $selNavLink = $('#nav').find('a[href="' + mPagePath + '"]');
      -  }
      -
      -  var $selListItem;
      -  if ($selNavLink.length) {
      -    // Find this page's <li> in sidenav and set selected
      -    $selListItem = $selNavLink.closest('li');
      -    $selListItem.addClass('selected');
      -
      -    // Traverse up the tree and expand all parent nav-sections
      -    $selNavLink.parents('li.nav-section').each(function() {
      -      $(this).addClass('expanded');
      -      $(this).children('ul').show();
      -    });
      -  }
      -}
      -
      -function unHighlightSidenav() {
      -  $("ul#nav li.selected").removeClass("selected");
      -  $('ul#nav li.nav-section.expanded').removeClass('expanded').children('ul').hide();
      -}
      -
      -function toggleFullscreen(enable) {
      -  var delay = 20;
      -  var enabled = true;
      -  var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]');
      -  if (enable) {
      -    // Currently NOT USING fullscreen; enable fullscreen
      -    stylesheet.removeAttr('disabled');
      -    $('#nav-swap .fullscreen').removeClass('disabled');
      -    $('#devdoc-nav').css({left:''});
      -    setTimeout(updateSidenavFullscreenWidth,delay); // need to wait a moment for css to switch
      -    enabled = true;
      -  } else {
      -    // Currently USING fullscreen; disable fullscreen
      -    stylesheet.attr('disabled', 'disabled');
      -    $('#nav-swap .fullscreen').addClass('disabled');
      -    setTimeout(updateSidenavFixedWidth,delay); // need to wait a moment for css to switch
      -    enabled = false;
      -  }
      -  writeCookie("fullscreen", enabled, null);
      -  setNavBarDimensions();
      -  resizeNav(delay);
      -  updateSideNavDimensions();
      -  setTimeout(initSidenavHeightResize,delay);
      -}
      -
      -// TODO: Refactor into a closure.
      -var navBarLeftPos;
      -var navBarWidth;
      -function setNavBarDimensions() {
      -  navBarLeftPos = $('#body-content').offset().left;
      -  navBarWidth = $('#side-nav').width();
      -}
      -
      -
      -function updateSideNavDimensions() {
      -  var newLeft = $(window).scrollLeft() - navBarLeftPos;
      -  $('#devdoc-nav').css({left: -newLeft, width: navBarWidth});
      -  $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('padding-left')))});
      -}
      -
      -// TODO: use $(document).ready instead
      -function addLoadEvent(newfun) {
      -  var current = window.onload;
      -  if (typeof window.onload != 'function') {
      -    window.onload = newfun;
      -  } else {
      -    window.onload = function() {
      -      current();
      -      newfun();
      -    }
      -  }
      -}
      -
      -var agent = navigator['userAgent'].toLowerCase();
      -// If a mobile phone, set flag and do mobile setup
      -if ((agent.indexOf("mobile") != -1) ||      // android, iphone, ipod
      -    (agent.indexOf("blackberry") != -1) ||
      -    (agent.indexOf("webos") != -1) ||
      -    (agent.indexOf("mini") != -1)) {        // opera mini browsers
      -  isMobile = true;
      -}
      -
      -
      -$(document).ready(function() {
      -  $("pre:not(.no-pretty-print)").addClass("prettyprint");
      -  prettyPrint();
      -});
      -
      -
      -
      -
      -/* ######### RESIZE THE SIDENAV ########## */
      -
      -function resizeNav(delay) {
      -  var $nav = $("#devdoc-nav");
      -  var $window = $(window);
      -  var navHeight;
      -
      -  // Get the height of entire window and the total header height.
      -  // Then figure out based on scroll position whether the header is visible
      -  var windowHeight = $window.height();
      -  var scrollTop = $window.scrollTop();
      -  var headerHeight = $('#header-wrapper').outerHeight();
      -  var headerVisible = scrollTop < stickyTop;
      -
      -  // get the height of space between nav and top of window.
      -  // Could be either margin or top position, depending on whether the nav is fixed.
      -  var topMargin = (parseInt($nav.css('top')) || 20) + 1;
      -  // add 1 for the #side-nav bottom margin
      -
      -  // Depending on whether the header is visible, set the side nav's height.
      -  if (headerVisible) {
      -    // The sidenav height grows as the header goes off screen
      -    navHeight = windowHeight - (headerHeight - scrollTop) - topMargin;
      -  } else {
      -    // Once header is off screen, the nav height is almost full window height
      -    navHeight = windowHeight - topMargin;
      -  }
      -
      -
      -
      -  $scrollPanes = $(".scroll-pane");
      -  if ($window.width() < 720) {
      -    $nav.css('height', '');
      -  } else if ($scrollPanes.length > 1) {
      -    // subtract the height of the api level widget and nav swapper from the available nav height
      -    navHeight -= ($('#api-nav-header').outerHeight(true) + $('#nav-swap').outerHeight(true));
      -
      -    $("#swapper").css({height:navHeight + "px"});
      -    if ($("#nav-tree").is(":visible")) {
      -      $("#nav-tree").css({height:navHeight});
      -    }
      -
      -    var classesHeight = navHeight - parseInt($("#resize-packages-nav").css("height")) - 10 + "px";
      -    //subtract 10px to account for drag bar
      -
      -    // if the window becomes small enough to make the class panel height 0,
      -    // then the package panel should begin to shrink
      -    if (parseInt(classesHeight) <= 0) {
      -      $("#resize-packages-nav").css({height:navHeight - 10}); //subtract 10px for drag bar
      -      $("#packages-nav").css({height:navHeight - 10});
      -    }
      -
      -    $("#classes-nav").css({'height':classesHeight, 'margin-top':'10px'});
      -    $("#classes-nav .jspContainer").css({height:classesHeight});
      -
      -
      -  } else {
      -    $nav.height(navHeight);
      -  }
      -
      -  if (delay) {
      -    updateFromResize = true;
      -    delayedReInitScrollbars(delay);
      -  } else {
      -    reInitScrollbars();
      -  }
      -
      -}
      -
      -var updateScrollbars = false;
      -var updateFromResize = false;
      -
      -/* Re-initialize the scrollbars to account for changed nav size.
      - * This method postpones the actual update by a 1/4 second in order to optimize the
      - * scroll performance while the header is still visible, because re-initializing the
      - * scroll panes is an intensive process.
      - */
      -function delayedReInitScrollbars(delay) {
      -  // If we're scheduled for an update, but have received another resize request
      -  // before the scheduled resize has occured, just ignore the new request
      -  // (and wait for the scheduled one).
      -  if (updateScrollbars && updateFromResize) {
      -    updateFromResize = false;
      -    return;
      -  }
      -
      -  // We're scheduled for an update and the update request came from this method's setTimeout
      -  if (updateScrollbars && !updateFromResize) {
      -    reInitScrollbars();
      -    updateScrollbars = false;
      -  } else {
      -    updateScrollbars = true;
      -    updateFromResize = false;
      -    setTimeout('delayedReInitScrollbars()',delay);
      -  }
      -}
      -
      -/* Re-initialize the scrollbars to account for changed nav size. */
      -function reInitScrollbars() {
      -  var pane = $(".scroll-pane").each(function(){
      -    var api = $(this).data('jsp');
      -    if (!api) {return;}
      -    api.reinitialise( {verticalGutter:0} );
      -  });
      -  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
      -}
      -
      -
      -/* Resize the height of the nav panels in the reference,
      - * and save the new size to a cookie */
      -function saveNavPanels() {
      -  var basePath = getBaseUri(location.pathname);
      -  var section = basePath.substring(1,basePath.indexOf("/",1));
      -  writeCookie("height", resizePackagesNav.css("height"), section);
      -}
      -
      -
      -
      -function restoreHeight(packageHeight) {
      -    $("#resize-packages-nav").height(packageHeight);
      -    $("#packages-nav").height(packageHeight);
      -  //  var classesHeight = navHeight - packageHeight;
      - //   $("#classes-nav").css({height:classesHeight});
      -  //  $("#classes-nav .jspContainer").css({height:classesHeight});
      -}
      -
      -
      -
      -/* ######### END RESIZE THE SIDENAV HEIGHT ########## */
      -
      -
      -
      -
      -
      -/** Scroll the jScrollPane to make the currently selected item visible
      -    This is called when the page finished loading. */
      -function scrollIntoView(nav) {
      -  return;
      -  var $nav = $("#"+nav);
      -  var element = $nav.jScrollPane({/* ...settings... */});
      -  var api = element.data('jsp');
      -
      -  if ($nav.is(':visible')) {
      -    var $selected = $(".selected", $nav);
      -    if ($selected.length == 0) {
      -      // If no selected item found, exit
      -      return;
      -    }
      -    // get the selected item's offset from its container nav by measuring the item's offset
      -    // relative to the document then subtract the container nav's offset relative to the document
      -    var selectedOffset = $selected.offset().top - $nav.offset().top + 60;
      -    if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up the item
      -                                               // if it's more than 80% down the nav
      -      // scroll the item up by an amount equal to 80% the container nav's height
      -      api.scrollTo(0, selectedOffset - ($nav.height() * .8), false);
      -    }
      -  }
      -}
      -
      -
      -
      -
      -
      -
      -/* Show popup dialogs */
      -function showDialog(id) {
      -  $dialog = $("#"+id);
      -  $dialog.prepend('<div class="box-border"><div class="top"> <div class="left"></div> <div class="right"></div></div><div class="bottom"> <div class="left"></div> <div class="right"></div> </div> </div>');
      -  $dialog.wrapInner('<div/>');
      -  $dialog.removeClass("hide");
      -}
      -
      -
      -
      -
      -
      -/* #########    COOKIES!     ########## */
      -
      -function readCookie(cookie) {
      -  var myCookie = cookie_namespace+"_"+cookie+"=";
      -  if (document.cookie) {
      -    var index = document.cookie.indexOf(myCookie);
      -    if (index != -1) {
      -      var valStart = index + myCookie.length;
      -      var valEnd = document.cookie.indexOf(";", valStart);
      -      if (valEnd == -1) {
      -        valEnd = document.cookie.length;
      -      }
      -      var val = document.cookie.substring(valStart, valEnd);
      -      return val;
      -    }
      -  }
      -  return 0;
      -}
      -
      -function writeCookie(cookie, val, section) {
      -  if (val==undefined) return;
      -  section = section == null ? "_" : "_"+section+"_";
      -  var age = 2*365*24*60*60; // set max-age to 2 years
      -  var cookieValue = cookie_namespace + section + cookie + "=" + val
      -                    + "; max-age=" + age +"; path=/";
      -  document.cookie = cookieValue;
      -}
      -
      -/* #########     END COOKIES!     ########## */
      -
      -
      -var sticky = false;
      -var stickyTop;
      -var prevScrollLeft = 0; // used to compare current position to previous position of horiz scroll
      -/* Sets the vertical scoll position at which the sticky bar should appear.
      -   This method is called to reset the position when search results appear or hide */
      -function setStickyTop() {
      -  stickyTop = $('#header-wrapper').outerHeight() - $('#header > .dac-header-inner').outerHeight();
      -}
      -
      -/*
      - * Displays sticky nav bar on pages when dac header scrolls out of view
      - */
      -$(window).scroll(function(event) {
      -  // Exit if the mouse target is a DIV, because that means the event is coming
      -  // from a scrollable div and so there's no need to make adjustments to our layout
      -  if ($(event.target).nodeName == "DIV") {
      -    return;
      -  }
      -
      -  checkSticky();
      -});
      -
      -function checkSticky() {
      -  setStickyTop();
      -  var $headerEl = $('#header');
      -  // Exit if there's no sidenav
      -  if ($('#side-nav').length == 0) return;
      -
      -  var top = $(window).scrollTop();
      -  // we set the navbar fixed when the scroll position is beyond the height of the site header...
      -  var shouldBeSticky = top > stickyTop;
      -  // ... except if the document content is shorter than the sidenav height.
      -  // (this is necessary to avoid crazy behavior on OSX Lion due to overscroll bouncing)
      -  if ($("#doc-col").height() < $("#side-nav").height()) {
      -    shouldBeSticky = false;
      -  }
      -  // Nor on mobile
      -  if (window.innerWidth < 720) {
      -    shouldBeSticky = false;
      -  }
      -  // Account for horizontal scroll
      -  var scrollLeft = $(window).scrollLeft();
      -  // When the sidenav is fixed and user scrolls horizontally, reposition the sidenav to match
      -  if (sticky && (scrollLeft != prevScrollLeft)) {
      -    updateSideNavDimensions();
      -    prevScrollLeft = scrollLeft;
      -  }
      -
      -  // Don't continue if the header is sufficently far away
      -  // (to avoid intensive resizing that slows scrolling)
      -  if (sticky == shouldBeSticky) {
      -    return;
      -  }
      -
      -  // If sticky header visible and position is now near top, hide sticky
      -  if (sticky && !shouldBeSticky) {
      -    sticky = false;
      -    // make the sidenav static again
      -    $('#devdoc-nav')
      -      .removeClass('fixed')
      -      .css({'width':'auto','margin':''});
      -    // delay hide the sticky
      -    $headerEl.removeClass('is-sticky');
      -
      -    // update the sidenaav position for side scrolling
      -    updateSideNavDimensions();
      -  } else if (!sticky && shouldBeSticky) {
      -    sticky = true;
      -    $headerEl.addClass('is-sticky');
      -
      -    // make the sidenav fixed
      -    $('#devdoc-nav')
      -      .addClass('fixed');
      -
      -    // update the sidenaav position for side scrolling
      -    updateSideNavDimensions();
      -
      -  }
      -  resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance
      -}
      -
      -/*
      - * Manages secion card states and nav resize to conclude loading
      - */
      -(function() {
      -  $(document).ready(function() {
      -
      -    // Stack hover states
      -    $('.section-card-menu').each(function(index, el) {
      -      var height = $(el).height();
      -      $(el).css({height:height+'px', position:'relative'});
      -      var $cardInfo = $(el).find('.card-info');
      -
      -      $cardInfo.css({position: 'absolute', bottom:'0px', left:'0px', right:'0px', overflow:'visible'});
      -    });
      -
      -  });
      -
      -})();
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -/*      MISC LIBRARY FUNCTIONS     */
      -
      -
      -
      -
      -
      -function toggle(obj, slide) {
      -  var ul = $("ul:first", obj);
      -  var li = ul.parent();
      -  if (li.hasClass("closed")) {
      -    if (slide) {
      -      ul.slideDown("fast");
      -    } else {
      -      ul.show();
      -    }
      -    li.removeClass("closed");
      -    li.addClass("open");
      -    $(".toggle-img", li).attr("title", "hide pages");
      -  } else {
      -    ul.slideUp("fast");
      -    li.removeClass("open");
      -    li.addClass("closed");
      -    $(".toggle-img", li).attr("title", "show pages");
      -  }
      -}
      -
      -
      -function buildToggleLists() {
      -  $(".toggle-list").each(
      -    function(i) {
      -      $("div:first", this).append("<a class='toggle-img' href='#' title='show pages' onClick='toggle(this.parentNode.parentNode, true); return false;'></a>");
      -      $(this).addClass("closed");
      -    });
      -}
      -
      -
      -
      -function hideNestedItems(list, toggle) {
      -  $list = $(list);
      -  // hide nested lists
      -  if($list.hasClass('showing')) {
      -    $("li ol", $list).hide('fast');
      -    $list.removeClass('showing');
      -  // show nested lists
      -  } else {
      -    $("li ol", $list).show('fast');
      -    $list.addClass('showing');
      -  }
      -  $(".more,.less",$(toggle)).toggle();
      -}
      -
      -
      -/* Call this to add listeners to a <select> element for Studio/Eclipse/Other docs */
      -function setupIdeDocToggle() {
      -  $( "select.ide" ).change(function() {
      -    var selected = $(this).find("option:selected").attr("value");
      -    $(".select-ide").hide();
      -    $(".select-ide."+selected).show();
      -
      -    $("select.ide").val(selected);
      -  });
      -}
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -/*      REFERENCE NAV SWAP     */
      -
      -
      -function getNavPref() {
      -  var v = readCookie('reference_nav');
      -  if (v != NAV_PREF_TREE) {
      -    v = NAV_PREF_PANELS;
      -  }
      -  return v;
      -}
      -
      -function chooseDefaultNav() {
      -  nav_pref = getNavPref();
      -  if (nav_pref == NAV_PREF_TREE) {
      -    $("#nav-panels").toggle();
      -    $("#panel-link").toggle();
      -    $("#nav-tree").toggle();
      -    $("#tree-link").toggle();
      -  }
      -}
      -
      -function swapNav() {
      -  if (nav_pref == NAV_PREF_TREE) {
      -    nav_pref = NAV_PREF_PANELS;
      -  } else {
      -    nav_pref = NAV_PREF_TREE;
      -    init_default_navtree(toRoot);
      -  }
      -  writeCookie("nav", nav_pref, "reference");
      -
      -  $("#nav-panels").toggle();
      -  $("#panel-link").toggle();
      -  $("#nav-tree").toggle();
      -  $("#tree-link").toggle();
      -
      -  resizeNav();
      -
      -  // Gross nasty hack to make tree view show up upon first swap by setting height manually
      -  $("#nav-tree .jspContainer:visible")
      -      .css({'height':$("#nav-tree .jspContainer .jspPane").height() +'px'});
      -  // Another nasty hack to make the scrollbar appear now that we have height
      -  resizeNav();
      -
      -  if ($("#nav-tree").is(':visible')) {
      -    scrollIntoView("nav-tree");
      -  } else {
      -    scrollIntoView("packages-nav");
      -    scrollIntoView("classes-nav");
      -  }
      -}
      -
      -
      -
      -/* ############################################ */
      -/* ##########     LOCALIZATION     ############ */
      -/* ############################################ */
      -
      -function getBaseUri(uri) {
      -  var intlUrl = (uri.substring(0,6) == "/intl/");
      -  if (intlUrl) {
      -    base = uri.substring(uri.indexOf('intl/')+5,uri.length);
      -    base = base.substring(base.indexOf('/')+1, base.length);
      -      //alert("intl, returning base url: /" + base);
      -    return ("/" + base);
      -  } else {
      -      //alert("not intl, returning uri as found.");
      -    return uri;
      -  }
      -}
      -
      -function requestAppendHL(uri) {
      -//append "?hl=<lang> to an outgoing request (such as to blog)
      -  var lang = getLangPref();
      -  if (lang) {
      -    var q = 'hl=' + lang;
      -    uri += '?' + q;
      -    window.location = uri;
      -    return false;
      -  } else {
      -    return true;
      -  }
      -}
      -
      -
      -function changeNavLang(lang) {
      -  if (lang === 'en') { return; }
      -
      -  var $links = $("a[" + lang + "-lang],p[" + lang + "-lang]");
      -  $links.each(function(){ // for each link with a translation
      -    var $link = $(this);
      -    // put the desired language from the attribute as the text
      -    $link.text($link.attr(lang + '-lang'))
      -  });
      -}
      -
      -function changeLangPref(lang, submit) {
      -  writeCookie("pref_lang", lang, null);
      -
      -  //  #######  TODO:  Remove this condition once we're stable on devsite #######
      -  //  This condition is only needed if we still need to support legacy GAE server
      -  if (devsite) {
      -    // Switch language when on Devsite server
      -    if (submit) {
      -      $("#setlang").submit();
      -    }
      -  } else {
      -    // Switch language when on legacy GAE server
      -    if (submit) {
      -      window.location = getBaseUri(location.pathname);
      -    }
      -  }
      -}
      -
      -function loadLangPref() {
      -  var lang = readCookie("pref_lang");
      -  if (lang != 0) {
      -    $("#language").find("option[value='"+lang+"']").attr("selected",true);
      -  }
      -}
      -
      -function getLangPref() {
      -  var lang = $("#language").find(":selected").attr("value");
      -  if (!lang) {
      -    lang = readCookie("pref_lang");
      -  }
      -  return (lang != 0) ? lang : 'en';
      -}
      -
      -/* ##########     END LOCALIZATION     ############ */
      -
      -
      -
      -
      -
      -
      -/* Used to hide and reveal supplemental content, such as long code samples.
      -   See the companion CSS in android-developer-docs.css */
      -function toggleContent(obj) {
      -  var div = $(obj).closest(".toggle-content");
      -  var toggleMe = $(".toggle-content-toggleme:eq(0)",div);
      -  if (div.hasClass("closed")) { // if it's closed, open it
      -    toggleMe.slideDown();
      -    $(".toggle-content-text:eq(0)", obj).toggle();
      -    div.removeClass("closed").addClass("open");
      -    $(".toggle-content-img:eq(0)", div).attr("title", "hide").attr("src", toRoot
      -                  + "assets/images/triangle-opened.png");
      -  } else { // if it's open, close it
      -    toggleMe.slideUp('fast', function() {  // Wait until the animation is done before closing arrow
      -      $(".toggle-content-text:eq(0)", obj).toggle();
      -      div.removeClass("open").addClass("closed");
      -      div.find(".toggle-content").removeClass("open").addClass("closed")
      -              .find(".toggle-content-toggleme").hide();
      -      $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot
      -                  + "assets/images/triangle-closed.png");
      -    });
      -  }
      -  return false;
      -}
      -
      -
      -/* New version of expandable content */
      -function toggleExpandable(link,id) {
      -  if($(id).is(':visible')) {
      -    $(id).slideUp();
      -    $(link).removeClass('expanded');
      -  } else {
      -    $(id).slideDown();
      -    $(link).addClass('expanded');
      -  }
      -}
      -
      -function hideExpandable(ids) {
      -  $(ids).slideUp();
      -  $(ids).prev('h4').find('a.expandable').removeClass('expanded');
      -}
      -
      -
      -
      -
      -
      -/*
      - *  Slideshow 1.0
      - *  Used on /index.html and /develop/index.html for carousel
      - *
      - *  Sample usage:
      - *  HTML -
      - *  <div class="slideshow-container">
      - *   <a href="" class="slideshow-prev">Prev</a>
      - *   <a href="" class="slideshow-next">Next</a>
      - *   <ul>
      - *       <li class="item"><img src="images/marquee1.jpg"></li>
      - *       <li class="item"><img src="images/marquee2.jpg"></li>
      - *       <li class="item"><img src="images/marquee3.jpg"></li>
      - *       <li class="item"><img src="images/marquee4.jpg"></li>
      - *   </ul>
      - *  </div>
      - *
      - *   <script type="text/javascript">
      - *   $('.slideshow-container').dacSlideshow({
      - *       auto: true,
      - *       btnPrev: '.slideshow-prev',
      - *       btnNext: '.slideshow-next'
      - *   });
      - *   </script>
      - *
      - *  Options:
      - *  btnPrev:    optional identifier for previous button
      - *  btnNext:    optional identifier for next button
      - *  btnPause:   optional identifier for pause button
      - *  auto:       whether or not to auto-proceed
      - *  speed:      animation speed
      - *  autoTime:   time between auto-rotation
      - *  easing:     easing function for transition
      - *  start:      item to select by default
      - *  scroll:     direction to scroll in
      - *  pagination: whether or not to include dotted pagination
      - *
      - */
      -
      - (function($) {
      - $.fn.dacSlideshow = function(o) {
      -
      -     //Options - see above
      -     o = $.extend({
      -         btnPrev:   null,
      -         btnNext:   null,
      -         btnPause:  null,
      -         auto:      true,
      -         speed:     500,
      -         autoTime:  12000,
      -         easing:    null,
      -         start:     0,
      -         scroll:    1,
      -         pagination: true
      -
      -     }, o || {});
      -
      -     //Set up a carousel for each
      -     return this.each(function() {
      -
      -         var running = false;
      -         var animCss = o.vertical ? "top" : "left";
      -         var sizeCss = o.vertical ? "height" : "width";
      -         var div = $(this);
      -         var ul = $("ul", div);
      -         var tLi = $("li", ul);
      -         var tl = tLi.size();
      -         var timer = null;
      -
      -         var li = $("li", ul);
      -         var itemLength = li.size();
      -         var curr = o.start;
      -
      -         li.css({float: o.vertical ? "none" : "left"});
      -         ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"});
      -         div.css({position: "relative", "z-index": "2", left: "0px"});
      -
      -         var liSize = o.vertical ? height(li) : width(li);
      -         var ulSize = liSize * itemLength;
      -         var divSize = liSize;
      -
      -         li.css({width: li.width(), height: li.height()});
      -         ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize));
      -
      -         div.css(sizeCss, divSize+"px");
      -
      -         //Pagination
      -         if (o.pagination) {
      -             var pagination = $("<div class='pagination'></div>");
      -             var pag_ul = $("<ul></ul>");
      -             if (tl > 1) {
      -               for (var i=0;i<tl;i++) {
      -                    var li = $("<li>"+i+"</li>");
      -                    pag_ul.append(li);
      -                    if (i==o.start) li.addClass('active');
      -                        li.click(function() {
      -                        go(parseInt($(this).text()));
      -                    })
      -                }
      -                pagination.append(pag_ul);
      -                div.append(pagination);
      -             }
      -         }
      -
      -         //Previous button
      -         if(o.btnPrev)
      -             $(o.btnPrev).click(function(e) {
      -                 e.preventDefault();
      -                 return go(curr-o.scroll);
      -             });
      -
      -         //Next button
      -         if(o.btnNext)
      -             $(o.btnNext).click(function(e) {
      -                 e.preventDefault();
      -                 return go(curr+o.scroll);
      -             });
      -
      -         //Pause button
      -         if(o.btnPause)
      -             $(o.btnPause).click(function(e) {
      -                 e.preventDefault();
      -                 if ($(this).hasClass('paused')) {
      -                     startRotateTimer();
      -                 } else {
      -                     pauseRotateTimer();
      -                 }
      -             });
      -
      -         //Auto rotation
      -         if(o.auto) startRotateTimer();
      -
      -         function startRotateTimer() {
      -             clearInterval(timer);
      -             timer = setInterval(function() {
      -                  if (curr == tl-1) {
      -                    go(0);
      -                  } else {
      -                    go(curr+o.scroll);
      -                  }
      -              }, o.autoTime);
      -             $(o.btnPause).removeClass('paused');
      -         }
      -
      -         function pauseRotateTimer() {
      -             clearInterval(timer);
      -             $(o.btnPause).addClass('paused');
      -         }
      -
      -         //Go to an item
      -         function go(to) {
      -             if(!running) {
      -
      -                 if(to<0) {
      -                    to = itemLength-1;
      -                 } else if (to>itemLength-1) {
      -                    to = 0;
      -                 }
      -                 curr = to;
      -
      -                 running = true;
      -
      -                 ul.animate(
      -                     animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing,
      -                     function() {
      -                         running = false;
      -                     }
      -                 );
      -
      -                 $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
      -                 $( (curr-o.scroll<0 && o.btnPrev)
      -                     ||
      -                    (curr+o.scroll > itemLength && o.btnNext)
      -                     ||
      -                    []
      -                  ).addClass("disabled");
      -
      -
      -                 var nav_items = $('li', pagination);
      -                 nav_items.removeClass('active');
      -                 nav_items.eq(to).addClass('active');
      -
      -
      -             }
      -             if(o.auto) startRotateTimer();
      -             return false;
      -         };
      -     });
      - };
      -
      - function css(el, prop) {
      -     return parseInt($.css(el[0], prop)) || 0;
      - };
      - function width(el) {
      -     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      - };
      - function height(el) {
      -     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      - };
      -
      - })(jQuery);
      -
      -
      -/*
      - *  dacSlideshow 1.0
      - *  Used on develop/index.html for side-sliding tabs
      - *
      - *  Sample usage:
      - *  HTML -
      - *  <div class="slideshow-container">
      - *   <a href="" class="slideshow-prev">Prev</a>
      - *   <a href="" class="slideshow-next">Next</a>
      - *   <ul>
      - *       <li class="item"><img src="images/marquee1.jpg"></li>
      - *       <li class="item"><img src="images/marquee2.jpg"></li>
      - *       <li class="item"><img src="images/marquee3.jpg"></li>
      - *       <li class="item"><img src="images/marquee4.jpg"></li>
      - *   </ul>
      - *  </div>
      - *
      - *   <script type="text/javascript">
      - *   $('.slideshow-container').dacSlideshow({
      - *       auto: true,
      - *       btnPrev: '.slideshow-prev',
      - *       btnNext: '.slideshow-next'
      - *   });
      - *   </script>
      - *
      - *  Options:
      - *  btnPrev:    optional identifier for previous button
      - *  btnNext:    optional identifier for next button
      - *  auto:       whether or not to auto-proceed
      - *  speed:      animation speed
      - *  autoTime:   time between auto-rotation
      - *  easing:     easing function for transition
      - *  start:      item to select by default
      - *  scroll:     direction to scroll in
      - *  pagination: whether or not to include dotted pagination
      - *
      - */
      - (function($) {
      - $.fn.dacTabbedList = function(o) {
      -
      -     //Options - see above
      -     o = $.extend({
      -         speed : 250,
      -         easing: null,
      -         nav_id: null,
      -         frame_id: null
      -     }, o || {});
      -
      -     //Set up a carousel for each
      -     return this.each(function() {
      -
      -         var curr = 0;
      -         var running = false;
      -         var animCss = "margin-left";
      -         var sizeCss = "width";
      -         var div = $(this);
      -
      -         var nav = $(o.nav_id, div);
      -         var nav_li = $("li", nav);
      -         var nav_size = nav_li.size();
      -         var frame = div.find(o.frame_id);
      -         var content_width = $(frame).find('ul').width();
      -         //Buttons
      -         $(nav_li).click(function(e) {
      -           go($(nav_li).index($(this)));
      -         })
      -
      -         //Go to an item
      -         function go(to) {
      -             if(!running) {
      -                 curr = to;
      -                 running = true;
      -
      -                 frame.animate({ 'margin-left' : -(curr*content_width) }, o.speed, o.easing,
      -                     function() {
      -                         running = false;
      -                     }
      -                 );
      -
      -
      -                 nav_li.removeClass('active');
      -                 nav_li.eq(to).addClass('active');
      -
      -
      -             }
      -             return false;
      -         };
      -     });
      - };
      -
      - function css(el, prop) {
      -     return parseInt($.css(el[0], prop)) || 0;
      - };
      - function width(el) {
      -     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      - };
      - function height(el) {
      -     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      - };
      -
      - })(jQuery);
      -
      -
      -
      -
      -
      -/* ######################################################## */
      -/* ################  SEARCH SUGGESTIONS  ################## */
      -/* ######################################################## */
      -
      -
      -
      -var gSelectedIndex = -1;  // the index position of currently highlighted suggestion
      -var gSelectedColumn = -1;  // which column of suggestion lists is currently focused
      -
      -var gMatches = new Array();
      -var gLastText = "";
      -var gInitialized = false;
      -var ROW_COUNT_FRAMEWORK = 20;       // max number of results in list
      -var gListLength = 0;
      -
      -
      -var gGoogleMatches = new Array();
      -var ROW_COUNT_GOOGLE = 15;          // max number of results in list
      -var gGoogleListLength = 0;
      -
      -var gDocsMatches = new Array();
      -var ROW_COUNT_DOCS = 100;          // max number of results in list
      -var gDocsListLength = 0;
      -
      -function onSuggestionClick(link) {
      -  // When user clicks a suggested document, track it
      -  ga('send', 'event', 'Suggestion Click', 'clicked: ' + $(link).attr('href'),
      -                'query: ' + $("#search_autocomplete").val().toLowerCase());
      -}
      -
      -function set_item_selected($li, selected)
      -{
      -    if (selected) {
      -        $li.attr('class','jd-autocomplete jd-selected');
      -    } else {
      -        $li.attr('class','jd-autocomplete');
      -    }
      -}
      -
      -function set_item_values(toroot, $li, match)
      -{
      -    var $link = $('a',$li);
      -    $link.html(match.__hilabel || match.label);
      -    $link.attr('href',toroot + match.link);
      -}
      -
      -function set_item_values_jd(toroot, $li, match)
      -{
      -    var $link = $('a',$li);
      -    $link.html(match.title);
      -    $link.attr('href',toroot + match.url);
      -}
      -
      -function new_suggestion($list) {
      -    var $li = $("<li class='jd-autocomplete'></li>");
      -    $list.append($li);
      -
      -    $li.mousedown(function() {
      -        window.location = this.firstChild.getAttribute("href");
      -    });
      -    $li.mouseover(function() {
      -        $('.search_filtered_wrapper li').removeClass('jd-selected');
      -        $(this).addClass('jd-selected');
      -        gSelectedColumn = $(".search_filtered:visible").index($(this).closest('.search_filtered'));
      -        gSelectedIndex = $("li", $(".search_filtered:visible")[gSelectedColumn]).index(this);
      -    });
      -    $li.append("<a onclick='onSuggestionClick(this)'></a>");
      -    $li.attr('class','show-item');
      -    return $li;
      -}
      -
      -function sync_selection_table(toroot)
      -{
      -    var $li; //list item jquery object
      -    var i; //list item iterator
      -
      -    // if there are NO results at all, hide all columns
      -    if (!(gMatches.length > 0) && !(gGoogleMatches.length > 0) && !(gDocsMatches.length > 0)) {
      -        $('.suggest-card').hide(300);
      -        return;
      -    }
      -
      -    // if there are api results
      -    if ((gMatches.length > 0) || (gGoogleMatches.length > 0)) {
      -      // reveal suggestion list
      -      $('.suggest-card.reference').show();
      -      var listIndex = 0; // list index position
      -
      -      // reset the lists
      -      $(".suggest-card.reference li").remove();
      -
      -      // ########### ANDROID RESULTS #############
      -      if (gMatches.length > 0) {
      -
      -          // determine android results to show
      -          gListLength = gMatches.length < ROW_COUNT_FRAMEWORK ?
      -                        gMatches.length : ROW_COUNT_FRAMEWORK;
      -          for (i=0; i<gListLength; i++) {
      -              var $li = new_suggestion($(".suggest-card.reference ul"));
      -              set_item_values(toroot, $li, gMatches[i]);
      -              set_item_selected($li, i == gSelectedIndex);
      -          }
      -      }
      -
      -      // ########### GOOGLE RESULTS #############
      -      if (gGoogleMatches.length > 0) {
      -          // show header for list
      -          $(".suggest-card.reference ul").append("<li class='header'>in Google Services:</li>");
      -
      -          // determine google results to show
      -          gGoogleListLength = gGoogleMatches.length < ROW_COUNT_GOOGLE ? gGoogleMatches.length : ROW_COUNT_GOOGLE;
      -          for (i=0; i<gGoogleListLength; i++) {
      -              var $li = new_suggestion($(".suggest-card.reference ul"));
      -              set_item_values(toroot, $li, gGoogleMatches[i]);
      -              set_item_selected($li, i == gSelectedIndex);
      -          }
      -      }
      -    } else {
      -      $('.suggest-card.reference').hide();
      -    }
      -
      -    // ########### JD DOC RESULTS #############
      -    if (gDocsMatches.length > 0) {
      -        // reset the lists
      -        $(".suggest-card:not(.reference) li").remove();
      -
      -        // determine google results to show
      -        // NOTE: The order of the conditions below for the sugg.type MUST BE SPECIFIC:
      -        // The order must match the reverse order that each section appears as a card in
      -        // the suggestion UI... this may be only for the "develop" grouped items though.
      -        gDocsListLength = gDocsMatches.length < ROW_COUNT_DOCS ? gDocsMatches.length : ROW_COUNT_DOCS;
      -        for (i=0; i<gDocsListLength; i++) {
      -            var sugg = gDocsMatches[i];
      -            var $li;
      -            if (sugg.type == "design") {
      -                $li = new_suggestion($(".suggest-card.design ul"));
      -            } else
      -            if (sugg.type == "distribute") {
      -                $li = new_suggestion($(".suggest-card.distribute ul"));
      -            } else
      -            if (sugg.type == "samples") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.samples"));
      -            } else
      -            if (sugg.type == "training") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.training"));
      -            } else
      -            if (sugg.type == "about"||"guide"||"tools"||"google") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.guides"));
      -            } else {
      -              continue;
      -            }
      -
      -            set_item_values_jd(toroot, $li, sugg);
      -            set_item_selected($li, i == gSelectedIndex);
      -        }
      -
      -        // add heading and show or hide card
      -        if ($(".suggest-card.design li").length > 0) {
      -          $(".suggest-card.design ul").prepend("<li class='header'>Design:</li>");
      -          $(".suggest-card.design").show(300);
      -        } else {
      -          $('.suggest-card.design').hide(300);
      -        }
      -        if ($(".suggest-card.distribute li").length > 0) {
      -          $(".suggest-card.distribute ul").prepend("<li class='header'>Distribute:</li>");
      -          $(".suggest-card.distribute").show(300);
      -        } else {
      -          $('.suggest-card.distribute').hide(300);
      -        }
      -        if ($(".child-card.guides li").length > 0) {
      -          $(".child-card.guides").prepend("<li class='header'>Guides:</li>");
      -          $(".child-card.guides li").appendTo(".suggest-card.develop ul");
      -        }
      -        if ($(".child-card.training li").length > 0) {
      -          $(".child-card.training").prepend("<li class='header'>Training:</li>");
      -          $(".child-card.training li").appendTo(".suggest-card.develop ul");
      -        }
      -        if ($(".child-card.samples li").length > 0) {
      -          $(".child-card.samples").prepend("<li class='header'>Samples:</li>");
      -          $(".child-card.samples li").appendTo(".suggest-card.develop ul");
      -        }
      -
      -        if ($(".suggest-card.develop li").length > 0) {
      -          $(".suggest-card.develop").show(300);
      -        } else {
      -          $('.suggest-card.develop').hide(300);
      -        }
      -
      -    } else {
      -      $('.suggest-card:not(.reference)').hide(300);
      -    }
      -}
      -
      -/** Called by the search input's onkeydown and onkeyup events.
      -  * Handles navigation with keyboard arrows, Enter key to invoke search,
      -  * otherwise invokes search suggestions on key-up event.
      -  * @param e       The JS event
      -  * @param kd      True if the event is key-down
      -  * @param toroot  A string for the site's root path
      -  * @returns       True if the event should bubble up
      -  */
      -function search_changed(e, kd, toroot)
      -{
      -    var currentLang = getLangPref();
      -    var search = document.getElementById("search_autocomplete");
      -    var text = search.value.replace(/(^ +)|( +$)/g, '');
      -    // get the ul hosting the currently selected item
      -    gSelectedColumn = gSelectedColumn >= 0 ? gSelectedColumn :  0;
      -    var $columns = $(".search_filtered_wrapper").find(".search_filtered:visible");
      -    var $selectedUl = $columns[gSelectedColumn];
      -
      -    // show/hide the close button
      -    if (text != '') {
      -        $("#search-close").removeClass("hide");
      -    } else {
      -        $("#search-close").addClass("hide");
      -    }
      -    // 27 = esc
      -    if (e.keyCode == 27) {
      -        // close all search results
      -        if (kd) $('#search-close').trigger('click');
      -        return true;
      -    }
      -    // 13 = enter
      -    else if (e.keyCode == 13) {
      -        if (gSelectedIndex < 0) {
      -            $('.suggest-card').hide();
      -            if ($("#searchResults").is(":hidden") && (search.value != "")) {
      -              // if results aren't showing (and text not empty), return true to allow search to execute
      -              $('body,html').animate({scrollTop:0}, '500', 'swing');
      -              return true;
      -            } else {
      -              // otherwise, results are already showing, so allow ajax to auto refresh the results
      -              // and ignore this Enter press to avoid the reload.
      -              return false;
      -            }
      -        } else if (kd && gSelectedIndex >= 0) {
      -            // click the link corresponding to selected item
      -            $("a",$("li",$selectedUl)[gSelectedIndex]).get()[0].click();
      -            return false;
      -        }
      -    }
      -    // If Google results are showing, return true to allow ajax search to execute
      -    else if ($("#searchResults").is(":visible")) {
      -        // Also, if search_results is scrolled out of view, scroll to top to make results visible
      -        if ((sticky ) && (search.value != "")) {
      -          $('body,html').animate({scrollTop:0}, '500', 'swing');
      -        }
      -        return true;
      -    }
      -    // 38 UP ARROW
      -    else if (kd && (e.keyCode == 38)) {
      -        // if the next item is a header, skip it
      -        if ($($("li", $selectedUl)[gSelectedIndex-1]).hasClass("header")) {
      -            gSelectedIndex--;
      -        }
      -        if (gSelectedIndex >= 0) {
      -            $('li', $selectedUl).removeClass('jd-selected');
      -            gSelectedIndex--;
      -            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -            // If user reaches top, reset selected column
      -            if (gSelectedIndex < 0) {
      -              gSelectedColumn = -1;
      -            }
      -        }
      -        return false;
      -    }
      -    // 40 DOWN ARROW
      -    else if (kd && (e.keyCode == 40)) {
      -        // if the next item is a header, skip it
      -        if ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header")) {
      -            gSelectedIndex++;
      -        }
      -        if ((gSelectedIndex < $("li", $selectedUl).length-1) ||
      -                        ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header"))) {
      -            $('li', $selectedUl).removeClass('jd-selected');
      -            gSelectedIndex++;
      -            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -        }
      -        return false;
      -    }
      -    // Consider left/right arrow navigation
      -    // NOTE: Order of suggest columns are reverse order (index position 0 is on right)
      -    else if (kd && $columns.length > 1 && gSelectedColumn >= 0) {
      -      // 37 LEFT ARROW
      -      // go left only if current column is not left-most column (last column)
      -      if (e.keyCode == 37 && gSelectedColumn < $columns.length - 1) {
      -        $('li', $selectedUl).removeClass('jd-selected');
      -        gSelectedColumn++;
      -        $selectedUl = $columns[gSelectedColumn];
      -        // keep or reset the selected item to last item as appropriate
      -        gSelectedIndex = gSelectedIndex >
      -                $("li", $selectedUl).length-1 ?
      -                $("li", $selectedUl).length-1 : gSelectedIndex;
      -        // if the corresponding item is a header, move down
      -        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
      -          gSelectedIndex++;
      -        }
      -        // set item selected
      -        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -        return false;
      -      }
      -      // 39 RIGHT ARROW
      -      // go right only if current column is not the right-most column (first column)
      -      else if (e.keyCode == 39 && gSelectedColumn > 0) {
      -        $('li', $selectedUl).removeClass('jd-selected');
      -        gSelectedColumn--;
      -        $selectedUl = $columns[gSelectedColumn];
      -        // keep or reset the selected item to last item as appropriate
      -        gSelectedIndex = gSelectedIndex >
      -                $("li", $selectedUl).length-1 ?
      -                $("li", $selectedUl).length-1 : gSelectedIndex;
      -        // if the corresponding item is a header, move down
      -        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
      -          gSelectedIndex++;
      -        }
      -        // set item selected
      -        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -        return false;
      -      }
      -    }
      -
      -    // if key-up event and not arrow down/up/left/right,
      -    // read the search query and add suggestions to gMatches
      -    else if (!kd && (e.keyCode != 40)
      -                 && (e.keyCode != 38)
      -                 && (e.keyCode != 37)
      -                 && (e.keyCode != 39)) {
      -        gSelectedIndex = -1;
      -        gMatches = new Array();
      -        matchedCount = 0;
      -        gGoogleMatches = new Array();
      -        matchedCountGoogle = 0;
      -        gDocsMatches = new Array();
      -        matchedCountDocs = 0;
      -
      -        // Search for Android matches
      -        for (var i=0; i<DATA.length; i++) {
      -            var s = DATA[i];
      -            if (text.length != 0 &&
      -                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
      -                gMatches[matchedCount] = s;
      -                matchedCount++;
      -            }
      -        }
      -        rank_autocomplete_api_results(text, gMatches);
      -        for (var i=0; i<gMatches.length; i++) {
      -            var s = gMatches[i];
      -        }
      -
      -
      -        // Search for Google matches
      -        for (var i=0; i<GOOGLE_DATA.length; i++) {
      -            var s = GOOGLE_DATA[i];
      -            if (text.length != 0 &&
      -                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
      -                gGoogleMatches[matchedCountGoogle] = s;
      -                matchedCountGoogle++;
      -            }
      -        }
      -        rank_autocomplete_api_results(text, gGoogleMatches);
      -        for (var i=0; i<gGoogleMatches.length; i++) {
      -            var s = gGoogleMatches[i];
      -        }
      -
      -        highlight_autocomplete_result_labels(text);
      -
      -
      -
      -        // Search for matching JD docs
      -        if (text.length >= 2) {
      -          // match only the beginning of a word
      -          var queryStr = text.toLowerCase();
      -
      -          // Search for Training classes
      -          for (var i=0; i<TRAINING_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = TRAINING_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Don't consider doc title for lessons (only for class landing pages),
      -            // unless the lesson has a tag that already matches
      -            if ((s.lang == currentLang) &&
      -                  (!(s.type == "training" && s.url.indexOf("index.html") == -1) || matched)) {
      -              // it matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for API Guides
      -          for (var i=0; i<GUIDE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = GUIDE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for Tools Guides
      -          for (var i=0; i<TOOLS_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = TOOLS_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -                if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -                if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for About docs
      -          for (var i=0; i<ABOUT_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = ABOUT_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for Design guides
      -          for (var i=0; i<DESIGN_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = DESIGN_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for Distribute guides
      -          for (var i=0; i<DISTRIBUTE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = DISTRIBUTE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for Google guides
      -          for (var i=0; i<GOOGLE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = GOOGLE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -
      -          // Search for Samples
      -          for (var i=0; i<SAMPLES_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = SAMPLES_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title.t
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -          // Search for Preview Guides
      -          for (var i=0; i<PREVIEW_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = _RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      -
      -          // Rank/sort all the matched pages
      -          rank_autocomplete_doc_results(text, gDocsMatches);
      -        }
      -
      -        // draw the suggestions
      -        sync_selection_table(toroot);
      -        return true; // allow the event to bubble up to the search api
      -    }
      -}
      -
      -/* Order the jd doc result list based on match quality */
      -function rank_autocomplete_doc_results(query, matches) {
      -    query = query || '';
      -    if (!matches || !matches.length)
      -      return;
      -
      -    var _resultScoreFn = function(match) {
      -        var score = 1.0;
      -
      -        // if the query matched a tag
      -        if (match.matched_tag > 0) {
      -          // multiply score by factor relative to position in tags list (max of 3)
      -          score *= 3 / match.matched_tag;
      -
      -          // if it also matched the title
      -          if (match.matched_title > 0) {
      -            score *= 2;
      -          }
      -        } else if (match.matched_title > 0) {
      -          score *= 3;
      -        }
      -
      -        return score;
      -    };
      -
      -    for (var i=0; i<matches.length; i++) {
      -        matches[i].__resultScore = _resultScoreFn(matches[i]);
      -    }
      -
      -    matches.sort(function(a,b){
      -        var n = b.__resultScore - a.__resultScore;
      -        if (n == 0) // lexicographical sort if scores are the same
      -            n = (a.label < b.label) ? -1 : 1;
      -        return n;
      -    });
      -}
      -
      -/* Order the result list based on match quality */
      -function rank_autocomplete_api_results(query, matches) {
      -    query = query || '';
      -    if (!matches || !matches.length)
      -      return;
      -
      -    // helper function that gets the last occurence index of the given regex
      -    // in the given string, or -1 if not found
      -    var _lastSearch = function(s, re) {
      -      if (s == '')
      -        return -1;
      -      var l = -1;
      -      var tmp;
      -      while ((tmp = s.search(re)) >= 0) {
      -        if (l < 0) l = 0;
      -        l += tmp;
      -        s = s.substr(tmp + 1);
      -      }
      -      return l;
      -    };
      -
      -    // helper function that counts the occurrences of a given character in
      -    // a given string
      -    var _countChar = function(s, c) {
      -      var n = 0;
      -      for (var i=0; i<s.length; i++)
      -        if (s.charAt(i) == c) ++n;
      -      return n;
      -    };
      -
      -    var queryLower = query.toLowerCase();
      -    var queryAlnum = (queryLower.match(/\w+/) || [''])[0];
      -    var partPrefixAlnumRE = new RegExp('\\b' + queryAlnum);
      -    var partExactAlnumRE = new RegExp('\\b' + queryAlnum + '\\b');
      -
      -    var _resultScoreFn = function(result) {
      -        // scores are calculated based on exact and prefix matches,
      -        // and then number of path separators (dots) from the last
      -        // match (i.e. favoring classes and deep package names)
      -        var score = 1.0;
      -        var labelLower = result.label.toLowerCase();
      -        var t;
      -        t = _lastSearch(labelLower, partExactAlnumRE);
      -        if (t >= 0) {
      -            // exact part match
      -            var partsAfter = _countChar(labelLower.substr(t + 1), '.');
      -            score *= 200 / (partsAfter + 1);
      -        } else {
      -            t = _lastSearch(labelLower, partPrefixAlnumRE);
      -            if (t >= 0) {
      -                // part prefix match
      -                var partsAfter = _countChar(labelLower.substr(t + 1), '.');
      -                score *= 20 / (partsAfter + 1);
      -            }
      -        }
      -
      -        return score;
      -    };
      -
      -    for (var i=0; i<matches.length; i++) {
      -        // if the API is deprecated, default score is 0; otherwise, perform scoring
      -        if (matches[i].deprecated == "true") {
      -          matches[i].__resultScore = 0;
      -        } else {
      -          matches[i].__resultScore = _resultScoreFn(matches[i]);
      -        }
      -    }
      -
      -    matches.sort(function(a,b){
      -        var n = b.__resultScore - a.__resultScore;
      -        if (n == 0) // lexicographical sort if scores are the same
      -            n = (a.label < b.label) ? -1 : 1;
      -        return n;
      -    });
      -}
      -
      -/* Add emphasis to part of string that matches query */
      -function highlight_autocomplete_result_labels(query) {
      -    query = query || '';
      -    if ((!gMatches || !gMatches.length) && (!gGoogleMatches || !gGoogleMatches.length))
      -      return;
      -
      -    var queryLower = query.toLowerCase();
      -    var queryAlnumDot = (queryLower.match(/[\w\.]+/) || [''])[0];
      -    var queryRE = new RegExp(
      -        '(' + queryAlnumDot.replace(/\./g, '\\.') + ')', 'ig');
      -    for (var i=0; i<gMatches.length; i++) {
      -        gMatches[i].__hilabel = gMatches[i].label.replace(
      -            queryRE, '<b>$1</b>');
      -    }
      -    for (var i=0; i<gGoogleMatches.length; i++) {
      -        gGoogleMatches[i].__hilabel = gGoogleMatches[i].label.replace(
      -            queryRE, '<b>$1</b>');
      -    }
      -}
      -
      -function search_focus_changed(obj, focused)
      -{
      -    if (!focused) {
      -        if(obj.value == ""){
      -          $("#search-close").addClass("hide");
      -        }
      -        $(".suggest-card").hide();
      -    }
      -}
      -
      -function submit_search() {
      -  var query = document.getElementById('search_autocomplete').value;
      -  location.hash = 'q=' + query;
      -  loadSearchResults();
      -  $("#searchResults").slideDown('slow', setStickyTop);
      -  return false;
      -}
      -
      -
      -function hideResults() {
      -  $("#searchResults").slideUp('fast', setStickyTop);
      -  $("#search-close").addClass("hide");
      -  location.hash = '';
      -
      -  $("#search_autocomplete").val("").blur();
      -
      -  // reset the ajax search callback to nothing, so results don't appear unless ENTER
      -  searchControl.setSearchStartingCallback(this, function(control, searcher, query) {});
      -
      -  // forcefully regain key-up event control (previously jacked by search api)
      -  $("#search_autocomplete").keyup(function(event) {
      -    return search_changed(event, false, toRoot);
      -  });
      -
      -  return false;
      -}
      -
      -
      -
      -/* ########################################################## */
      -/* ################  CUSTOM SEARCH ENGINE  ################## */
      -/* ########################################################## */
      -
      -var searchControl;
      -google.load('search', '1', {"callback" : function() {
      -            searchControl = new google.search.SearchControl();
      -          } });
      -
      -function loadSearchResults() {
      -  document.getElementById("search_autocomplete").style.color = "#000";
      -
      -  searchControl = new google.search.SearchControl();
      -
      -  // use our existing search form and use tabs when multiple searchers are used
      -  drawOptions = new google.search.DrawOptions();
      -  drawOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED);
      -  drawOptions.setInput(document.getElementById("search_autocomplete"));
      -
      -  // configure search result options
      -  searchOptions = new google.search.SearcherOptions();
      -  searchOptions.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
      -
      -  // configure each of the searchers, for each tab
      -  devSiteSearcher = new google.search.WebSearch();
      -  devSiteSearcher.setUserDefinedLabel("All");
      -  devSiteSearcher.setSiteRestriction("001482626316274216503:zu90b7s047u");
      -
      -  designSearcher = new google.search.WebSearch();
      -  designSearcher.setUserDefinedLabel("Design");
      -  designSearcher.setSiteRestriction("http://developer.android.com/design/");
      -
      -  trainingSearcher = new google.search.WebSearch();
      -  trainingSearcher.setUserDefinedLabel("Training");
      -  trainingSearcher.setSiteRestriction("http://developer.android.com/training/");
      -
      -  guidesSearcher = new google.search.WebSearch();
      -  guidesSearcher.setUserDefinedLabel("Guides");
      -  guidesSearcher.setSiteRestriction("http://developer.android.com/guide/");
      -
      -  referenceSearcher = new google.search.WebSearch();
      -  referenceSearcher.setUserDefinedLabel("Reference");
      -  referenceSearcher.setSiteRestriction("http://developer.android.com/reference/");
      -
      -  googleSearcher = new google.search.WebSearch();
      -  googleSearcher.setUserDefinedLabel("Google Services");
      -  googleSearcher.setSiteRestriction("http://developer.android.com/google/");
      -
      -  blogSearcher = new google.search.WebSearch();
      -  blogSearcher.setUserDefinedLabel("Blog");
      -  blogSearcher.setSiteRestriction("http://android-developers.blogspot.com");
      -
      -  // add each searcher to the search control
      -  searchControl.addSearcher(devSiteSearcher, searchOptions);
      -  searchControl.addSearcher(designSearcher, searchOptions);
      -  searchControl.addSearcher(trainingSearcher, searchOptions);
      -  searchControl.addSearcher(guidesSearcher, searchOptions);
      -  searchControl.addSearcher(referenceSearcher, searchOptions);
      -  searchControl.addSearcher(googleSearcher, searchOptions);
      -  searchControl.addSearcher(blogSearcher, searchOptions);
      -
      -  // configure result options
      -  searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
      -  searchControl.setLinkTarget(google.search.Search.LINK_TARGET_SELF);
      -  searchControl.setTimeoutInterval(google.search.SearchControl.TIMEOUT_SHORT);
      -  searchControl.setNoResultsString(google.search.SearchControl.NO_RESULTS_DEFAULT_STRING);
      -
      -  // upon ajax search, refresh the url and search title
      -  searchControl.setSearchStartingCallback(this, function(control, searcher, query) {
      -    updateResultTitle(query);
      -    var query = document.getElementById('search_autocomplete').value;
      -    location.hash = 'q=' + query;
      -  });
      -
      -  // once search results load, set up click listeners
      -  searchControl.setSearchCompleteCallback(this, function(control, searcher, query) {
      -    addResultClickListeners();
      -  });
      -
      -  // draw the search results box
      -  searchControl.draw(document.getElementById("leftSearchControl"), drawOptions);
      -
      -  // get query and execute the search
      -  searchControl.execute(decodeURI(getQuery(location.hash)));
      -
      -  document.getElementById("search_autocomplete").focus();
      -  addTabListeners();
      -}
      -// End of loadSearchResults
      -
      -
      -google.setOnLoadCallback(function(){
      -  if (location.hash.indexOf("q=") == -1) {
      -    // if there's no query in the url, don't search and make sure results are hidden
      -    $('#searchResults').hide();
      -    return;
      -  } else {
      -    // first time loading search results for this page
      -    $('#searchResults').slideDown('slow', setStickyTop);
      -    $("#search-close").removeClass("hide");
      -    loadSearchResults();
      -  }
      -}, true);
      -
      -/* Adjust the scroll position to account for sticky header, only if the hash matches an id.
      -   This does not handle <a name=""> tags. Some CSS fixes those, but only for reference docs. */
      -function offsetScrollForSticky() {
      -  // Ignore if there's no search bar (some special pages have no header)
      -  if ($("#search-container").length < 1) return;
      -
      -  var hash = escape(location.hash.substr(1));
      -  var $matchingElement = $("#"+hash);
      -  // Sanity check that there's an element with that ID on the page
      -  if ($matchingElement.length) {
      -    // If the position of the target element is near the top of the page (<20px, where we expect it
      -    // to be because we need to move it down 60px to become in view), then move it down 60px
      -    if (Math.abs($matchingElement.offset().top - $(window).scrollTop()) < 20) {
      -      $(window).scrollTop($(window).scrollTop() - 60);
      -    }
      -  }
      -}
      -
      -// when an event on the browser history occurs (back, forward, load) requery hash and do search
      -$(window).hashchange( function(){
      -  // Ignore if there's no search bar (some special pages have no header)
      -  if ($("#search-container").length < 1) return;
      -
      -  // If the hash isn't a search query or there's an error in the query,
      -  // then adjust the scroll position to account for sticky header, then exit.
      -  if ((location.hash.indexOf("q=") == -1) || (query == "undefined")) {
      -    // If the results pane is open, close it.
      -    if (!$("#searchResults").is(":hidden")) {
      -      hideResults();
      -    }
      -    offsetScrollForSticky();
      -    return;
      -  }
      -
      -  // Otherwise, we have a search to do
      -  var query = decodeURI(getQuery(location.hash));
      -  searchControl.execute(query);
      -  $('#searchResults').slideDown('slow', setStickyTop);
      -  $("#search_autocomplete").focus();
      -  $("#search-close").removeClass("hide");
      -
      -  updateResultTitle(query);
      -});
      -
      -function updateResultTitle(query) {
      -  $("#searchTitle").html("Results for <em>" + escapeHTML(query) + "</em>");
      -}
      -
      -// forcefully regain key-up event control (previously jacked by search api)
      -$("#search_autocomplete").keyup(function(event) {
      -  return search_changed(event, false, toRoot);
      -});
      -
      -// add event listeners to each tab so we can track the browser history
      -function addTabListeners() {
      -  var tabHeaders = $(".gsc-tabHeader");
      -  for (var i = 0; i < tabHeaders.length; i++) {
      -    $(tabHeaders[i]).attr("id",i).click(function() {
      -    /*
      -      // make a copy of the page numbers for the search left pane
      -      setTimeout(function() {
      -        // remove any residual page numbers
      -        $('#searchResults .gsc-tabsArea .gsc-cursor-box.gs-bidi-start-align').remove();
      -        // move the page numbers to the left position; make a clone,
      -        // because the element is drawn to the DOM only once
      -        // and because we're going to remove it (previous line),
      -        // we need it to be available to move again as the user navigates
      -        $('#searchResults .gsc-webResult .gsc-cursor-box.gs-bidi-start-align:visible')
      -                        .clone().appendTo('#searchResults .gsc-tabsArea');
      -        }, 200);
      -      */
      -    });
      -  }
      -  setTimeout(function(){$(tabHeaders[0]).click()},200);
      -}
      -
      -// add analytics tracking events to each result link
      -function addResultClickListeners() {
      -  $("#searchResults a.gs-title").each(function(index, link) {
      -    // When user clicks enter for Google search results, track it
      -    $(link).click(function() {
      -      ga('send', 'event', 'Google Click', 'clicked: ' + $(this).attr('href'),
      -                'query: ' + $("#search_autocomplete").val().toLowerCase());
      -    });
      -  });
      -}
      -
      -
      -function getQuery(hash) {
      -  var queryParts = hash.split('=');
      -  return queryParts[1];
      -}
      -
      -/* returns the given string with all HTML brackets converted to entities
      -    TODO: move this to the site's JS library */
      -function escapeHTML(string) {
      -  return string.replace(/</g,"&lt;")
      -                .replace(/>/g,"&gt;");
      -}
      -
      -
      -
      -
      -
      -
      -
      -/* ######################################################## */
      -/* #################  JAVADOC REFERENCE ################### */
      -/* ######################################################## */
      -
      -/* Initialize some droiddoc stuff, but only if we're in the reference */
      -if (location.pathname.indexOf("/reference") == 0) {
      -  if(!(location.pathname.indexOf("/reference-gms/packages.html") == 0)
      -    && !(location.pathname.indexOf("/reference-gcm/packages.html") == 0)
      -    && !(location.pathname.indexOf("/reference/com/google") == 0)) {
      -    $(document).ready(function() {
      -      // init available apis based on user pref
      -      changeApiLevel();
      -      initSidenavHeightResize()
      -      });
      -  }
      -}
      -
      -var API_LEVEL_COOKIE = "api_level";
      -var minLevel = 1;
      -var maxLevel = 1;
      -
      -/******* SIDENAV DIMENSIONS ************/
      -
      -  function initSidenavHeightResize() {
      -    // Change the drag bar size to nicely fit the scrollbar positions
      -    var $dragBar = $(".ui-resizable-s");
      -    $dragBar.css({'width': $dragBar.parent().width() - 5 + "px"});
      -
      -    $( "#resize-packages-nav" ).resizable({
      -      containment: "#nav-panels",
      -      handles: "s",
      -      alsoResize: "#packages-nav",
      -      resize: function(event, ui) { resizeNav(); }, /* resize the nav while dragging */
      -      stop: function(event, ui) { saveNavPanels(); } /* once stopped, save the sizes to cookie  */
      -      });
      -
      -  }
      -
      -function updateSidenavFixedWidth() {
      -  if (!sticky) return;
      -  $('#devdoc-nav').css({
      -    'width' : $('#side-nav').css('width'),
      -    'margin' : $('#side-nav').css('margin')
      -  });
      -  $('#devdoc-nav a.totop').css({'display':'block','width':$("#nav").innerWidth()+'px'});
      -
      -  initSidenavHeightResize();
      -}
      -
      -function updateSidenavFullscreenWidth() {
      -  if (!sticky) return;
      -  $('#devdoc-nav').css({
      -    'width' : $('#side-nav').css('width'),
      -    'margin' : $('#side-nav').css('margin')
      -  });
      -  $('#devdoc-nav .totop').css({'left': 'inherit'});
      -
      -  initSidenavHeightResize();
      -}
      -
      -function buildApiLevelSelector() {
      -  maxLevel = SINCE_DATA.length;
      -  var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE));
      -  userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
      -
      -  minLevel = parseInt($("#doc-api-level").attr("class"));
      -  // Handle provisional api levels; the provisional level will always be the highest possible level
      -  // Provisional api levels will also have a length; other stuff that's just missing a level won't,
      -  // so leave those kinds of entities at the default level of 1 (for example, the R.styleable class)
      -  if (isNaN(minLevel) && minLevel.length) {
      -    minLevel = maxLevel;
      -  }
      -  var select = $("#apiLevelSelector").html("").change(changeApiLevel);
      -  for (var i = maxLevel-1; i >= 0; i--) {
      -    var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
      -  //  if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
      -    select.append(option);
      -  }
      -
      -  // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
      -  var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0);
      -  selectedLevelItem.setAttribute('selected',true);
      -}
      -
      -function changeApiLevel() {
      -  maxLevel = SINCE_DATA.length;
      -  var selectedLevel = maxLevel;
      -
      -  selectedLevel = parseInt($("#apiLevelSelector option:selected").val());
      -  toggleVisisbleApis(selectedLevel, "body");
      -
      -  writeCookie(API_LEVEL_COOKIE, selectedLevel, null);
      -
      -  if (selectedLevel < minLevel) {
      -    var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
      -    $("#naMessage").show().html("<div><p><strong>This " + thing
      -              + " requires API level " + minLevel + " or higher.</strong></p>"
      -              + "<p>This document is hidden because your selected API level for the documentation is "
      -              + selectedLevel + ". You can change the documentation API level with the selector "
      -              + "above the left navigation.</p>"
      -              + "<p>For more information about specifying the API level your app requires, "
      -              + "read <a href='" + toRoot + "training/basics/supporting-devices/platforms.html'"
      -              + ">Supporting Different Platform Versions</a>.</p>"
      -              + "<input type='button' value='OK, make this page visible' "
      -              + "title='Change the API level to " + minLevel + "' "
      -              + "onclick='$(\"#apiLevelSelector\").val(\"" + minLevel + "\");changeApiLevel();' />"
      -              + "</div>");
      -  } else {
      -    $("#naMessage").hide();
      -  }
      -}
      -
      -function toggleVisisbleApis(selectedLevel, context) {
      -  var apis = $(".api",context);
      -  apis.each(function(i) {
      -    var obj = $(this);
      -    var className = obj.attr("class");
      -    var apiLevelIndex = className.lastIndexOf("-")+1;
      -    var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
      -    apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
      -    var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
      -    if (apiLevel.length == 0) { // for odd cases when the since data is actually missing, just bail
      -      return;
      -    }
      -    apiLevel = parseInt(apiLevel);
      -
      -    // Handle provisional api levels; if this item's level is the provisional one, set it to the max
      -    var selectedLevelNum = parseInt(selectedLevel)
      -    var apiLevelNum = parseInt(apiLevel);
      -    if (isNaN(apiLevelNum)) {
      -        apiLevelNum = maxLevel;
      -    }
      -
      -    // Grey things out that aren't available and give a tooltip title
      -    if (apiLevelNum > selectedLevelNum) {
      -      obj.addClass("absent").attr("title","Requires API Level \""
      -            + apiLevel + "\" or higher. To reveal, change the target API level "
      -              + "above the left navigation.");
      -    }
      -    else obj.removeClass("absent").removeAttr("title");
      -  });
      -}
      -
      -
      -
      -
      -/* #################  SIDENAV TREE VIEW ################### */
      -
      -function new_node(me, mom, text, link, children_data, api_level)
      -{
      -  var node = new Object();
      -  node.children = Array();
      -  node.children_data = children_data;
      -  node.depth = mom.depth + 1;
      -
      -  node.li = document.createElement("li");
      -  mom.get_children_ul().appendChild(node.li);
      -
      -  node.label_div = document.createElement("div");
      -  node.label_div.className = "label";
      -  if (api_level != null) {
      -    $(node.label_div).addClass("api");
      -    $(node.label_div).addClass("api-level-"+api_level);
      -  }
      -  node.li.appendChild(node.label_div);
      -
      -  if (children_data != null) {
      -    node.expand_toggle = document.createElement("a");
      -    node.expand_toggle.href = "javascript:void(0)";
      -    node.expand_toggle.onclick = function() {
      -          if (node.expanded) {
      -            $(node.get_children_ul()).slideUp("fast");
      -            node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
      -            node.expanded = false;
      -          } else {
      -            expand_node(me, node);
      -          }
      -       };
      -    node.label_div.appendChild(node.expand_toggle);
      -
      -    node.plus_img = document.createElement("img");
      -    node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
      -    node.plus_img.className = "plus";
      -    node.plus_img.width = "8";
      -    node.plus_img.border = "0";
      -    node.expand_toggle.appendChild(node.plus_img);
      -
      -    node.expanded = false;
      -  }
      -
      -  var a = document.createElement("a");
      -  node.label_div.appendChild(a);
      -  node.label = document.createTextNode(text);
      -  a.appendChild(node.label);
      -  if (link) {
      -    a.href = me.toroot + link;
      -  } else {
      -    if (children_data != null) {
      -      a.className = "nolink";
      -      a.href = "javascript:void(0)";
      -      a.onclick = node.expand_toggle.onclick;
      -      // This next line shouldn't be necessary.  I'll buy a beer for the first
      -      // person who figures out how to remove this line and have the link
      -      // toggle shut on the first try. --joeo@android.com
      -      node.expanded = false;
      -    }
      -  }
      -
      -
      -  node.children_ul = null;
      -  node.get_children_ul = function() {
      -      if (!node.children_ul) {
      -        node.children_ul = document.createElement("ul");
      -        node.children_ul.className = "children_ul";
      -        node.children_ul.style.display = "none";
      -        node.li.appendChild(node.children_ul);
      -      }
      -      return node.children_ul;
      -    };
      -
      -  return node;
      -}
      -
      -
      -
      -
      -function expand_node(me, node)
      -{
      -  if (node.children_data && !node.expanded) {
      -    if (node.children_visited) {
      -      $(node.get_children_ul()).slideDown("fast");
      -    } else {
      -      get_node(me, node);
      -      if ($(node.label_div).hasClass("absent")) {
      -        $(node.get_children_ul()).addClass("absent");
      -      }
      -      $(node.get_children_ul()).slideDown("fast");
      -    }
      -    node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
      -    node.expanded = true;
      -
      -    // perform api level toggling because new nodes are new to the DOM
      -    var selectedLevel = $("#apiLevelSelector option:selected").val();
      -    toggleVisisbleApis(selectedLevel, "#side-nav");
      -  }
      -}
      -
      -function get_node(me, mom)
      -{
      -  mom.children_visited = true;
      -  for (var i in mom.children_data) {
      -    var node_data = mom.children_data[i];
      -    mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
      -        node_data[2], node_data[3]);
      -  }
      -}
      -
      -function this_page_relative(toroot)
      -{
      -  var full = document.location.pathname;
      -  var file = "";
      -  if (toroot.substr(0, 1) == "/") {
      -    if (full.substr(0, toroot.length) == toroot) {
      -      return full.substr(toroot.length);
      -    } else {
      -      // the file isn't under toroot.  Fail.
      -      return null;
      -    }
      -  } else {
      -    if (toroot != "./") {
      -      toroot = "./" + toroot;
      -    }
      -    do {
      -      if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
      -        var pos = full.lastIndexOf("/");
      -        file = full.substr(pos) + file;
      -        full = full.substr(0, pos);
      -        toroot = toroot.substr(0, toroot.length-3);
      -      }
      -    } while (toroot != "" && toroot != "/");
      -    return file.substr(1);
      -  }
      -}
      -
      -function find_page(url, data)
      -{
      -  var nodes = data;
      -  var result = null;
      -  for (var i in nodes) {
      -    var d = nodes[i];
      -    if (d[1] == url) {
      -      return new Array(i);
      -    }
      -    else if (d[2] != null) {
      -      result = find_page(url, d[2]);
      -      if (result != null) {
      -        return (new Array(i).concat(result));
      -      }
      -    }
      -  }
      -  return null;
      -}
      -
      -function init_default_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_navtree("tree-list", toroot, NAVTREE_DATA);
      -      }
      -  });
      -
      -  // perform api level toggling because because the whole tree is new to the DOM
      -  var selectedLevel = $("#apiLevelSelector option:selected").val();
      -  toggleVisisbleApis(selectedLevel, "#side-nav");
      -}
      -
      -function init_navtree(navtree_id, toroot, root_nodes)
      -{
      -  var me = new Object();
      -  me.toroot = toroot;
      -  me.node = new Object();
      -
      -  me.node.li = document.getElementById(navtree_id);
      -  me.node.children_data = root_nodes;
      -  me.node.children = new Array();
      -  me.node.children_ul = document.createElement("ul");
      -  me.node.get_children_ul = function() { return me.node.children_ul; };
      -  //me.node.children_ul.className = "children_ul";
      -  me.node.li.appendChild(me.node.children_ul);
      -  me.node.depth = 0;
      -
      -  get_node(me, me.node);
      -
      -  me.this_page = this_page_relative(toroot);
      -  me.breadcrumbs = find_page(me.this_page, root_nodes);
      -  if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
      -    var mom = me.node;
      -    for (var i in me.breadcrumbs) {
      -      var j = me.breadcrumbs[i];
      -      mom = mom.children[j];
      -      expand_node(me, mom);
      -    }
      -    mom.label_div.className = mom.label_div.className + " selected";
      -    addLoadEvent(function() {
      -      scrollIntoView("nav-tree");
      -      });
      -  }
      -}
      -
      -
      -
      -
      -
      -
      -
      -
      -/* TODO: eliminate redundancy with non-google functions */
      -function init_google_navtree(navtree_id, toroot, root_nodes)
      -{
      -  var me = new Object();
      -  me.toroot = toroot;
      -  me.node = new Object();
      -
      -  me.node.li = document.getElementById(navtree_id);
      -  if (!me.node.li) {
      -    return;
      -  }
      -
      -  me.node.children_data = root_nodes;
      -  me.node.children = new Array();
      -  me.node.children_ul = document.createElement("ul");
      -  me.node.get_children_ul = function() { return me.node.children_ul; };
      -  //me.node.children_ul.className = "children_ul";
      -  me.node.li.appendChild(me.node.children_ul);
      -  me.node.depth = 0;
      -
      -  get_google_node(me, me.node);
      -}
      -
      -function new_google_node(me, mom, text, link, children_data, api_level)
      -{
      -  var node = new Object();
      -  var child;
      -  node.children = Array();
      -  node.children_data = children_data;
      -  node.depth = mom.depth + 1;
      -  node.get_children_ul = function() {
      -      if (!node.children_ul) {
      -        node.children_ul = document.createElement("ul");
      -        node.children_ul.className = "tree-list-children";
      -        node.li.appendChild(node.children_ul);
      -      }
      -      return node.children_ul;
      -    };
      -  node.li = document.createElement("li");
      -
      -  mom.get_children_ul().appendChild(node.li);
      -
      -
      -  if(link) {
      -    child = document.createElement("a");
      -
      -  }
      -  else {
      -    child = document.createElement("span");
      -    child.className = "tree-list-subtitle";
      -
      -  }
      -  if (children_data != null) {
      -    node.li.className="nav-section";
      -    node.label_div = document.createElement("div");
      -    node.label_div.className = "nav-section-header-ref";
      -    node.li.appendChild(node.label_div);
      -    get_google_node(me, node);
      -    node.label_div.appendChild(child);
      -  }
      -  else {
      -    node.li.appendChild(child);
      -  }
      -  if(link) {
      -    child.href = me.toroot + link;
      -  }
      -  node.label = document.createTextNode(text);
      -  child.appendChild(node.label);
      -
      -  node.children_ul = null;
      -
      -  return node;
      -}
      -
      -function get_google_node(me, mom)
      -{
      -  mom.children_visited = true;
      -  var linkText;
      -  for (var i in mom.children_data) {
      -    var node_data = mom.children_data[i];
      -    linkText = node_data[0];
      -
      -    if(linkText.match("^"+"com.google.android")=="com.google.android"){
      -      linkText = linkText.substr(19, linkText.length);
      -    }
      -      mom.children[i] = new_google_node(me, mom, linkText, node_data[1],
      -          node_data[2], node_data[3]);
      -  }
      -}
      -
      -
      -
      -
      -
      -
      -/****** NEW version of script to build google and sample navs dynamically ******/
      -// TODO: update Google reference docs to tolerate this new implementation
      -
      -var NODE_NAME = 0;
      -var NODE_HREF = 1;
      -var NODE_GROUP = 2;
      -var NODE_TAGS = 3;
      -var NODE_CHILDREN = 4;
      -
      -function init_google_navtree2(navtree_id, data)
      -{
      -  var $containerUl = $("#"+navtree_id);
      -  for (var i in data) {
      -    var node_data = data[i];
      -    $containerUl.append(new_google_node2(node_data));
      -  }
      -
      -  // Make all third-generation list items 'sticky' to prevent them from collapsing
      -  $containerUl.find('li li li.nav-section').addClass('sticky');
      -
      -  initExpandableNavItems("#"+navtree_id);
      -}
      -
      -function new_google_node2(node_data)
      -{
      -  var linkText = node_data[NODE_NAME];
      -  if(linkText.match("^"+"com.google.android")=="com.google.android"){
      -    linkText = linkText.substr(19, linkText.length);
      -  }
      -  var $li = $('<li>');
      -  var $a;
      -  if (node_data[NODE_HREF] != null) {
      -    $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >'
      -        + linkText + '</a>');
      -  } else {
      -    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
      -        + linkText + '/</a>');
      -  }
      -  var $childUl = $('<ul>');
      -  if (node_data[NODE_CHILDREN] != null) {
      -    $li.addClass("nav-section");
      -    $a = $('<div class="nav-section-header">').append($a);
      -    if (node_data[NODE_HREF] == null) $a.addClass('empty');
      -
      -    for (var i in node_data[NODE_CHILDREN]) {
      -      var child_node_data = node_data[NODE_CHILDREN][i];
      -      $childUl.append(new_google_node2(child_node_data));
      -    }
      -    $li.append($childUl);
      -  }
      -  $li.prepend($a);
      -
      -  return $li;
      -}
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -function showGoogleRefTree() {
      -  init_default_google_navtree(toRoot);
      -  init_default_gcm_navtree(toRoot);
      -}
      -
      -function init_default_google_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'gms_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -      }
      -  });
      -}
      -
      -function init_default_gcm_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'gcm_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -      }
      -  });
      -}
      -
      -function showSamplesRefTree() {
      -  init_default_samples_navtree(toRoot);
      -}
      -
      -function init_default_samples_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          // hack to remove the "about the samples" link then put it back in
      -          // after we nuke the list to remove the dummy static list of samples
      -          var $firstLi = $("#nav.samples-nav > li:first-child").clone();
      -          $("#nav.samples-nav").empty();
      -          $("#nav.samples-nav").append($firstLi);
      -
      -          init_google_navtree2("nav.samples-nav", SAMPLES_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -          if ($("#jd-content #samples").length) {
      -            showSamples();
      -          }
      -      }
      -  });
      -}
      -
      -/* TOGGLE INHERITED MEMBERS */
      -
      -/* Toggle an inherited class (arrow toggle)
      - * @param linkObj  The link that was clicked.
      - * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      - *                'null' to simply toggle.
      - */
      -function toggleInherited(linkObj, expand) {
      -    var base = linkObj.getAttribute("id");
      -    var list = document.getElementById(base + "-list");
      -    var summary = document.getElementById(base + "-summary");
      -    var trigger = document.getElementById(base + "-trigger");
      -    var a = $(linkObj);
      -    if ( (expand == null && a.hasClass("closed")) || expand ) {
      -        list.style.display = "none";
      -        summary.style.display = "block";
      -        trigger.src = toRoot + "assets/images/triangle-opened.png";
      -        a.removeClass("closed");
      -        a.addClass("opened");
      -    } else if ( (expand == null && a.hasClass("opened")) || (expand == false) ) {
      -        list.style.display = "block";
      -        summary.style.display = "none";
      -        trigger.src = toRoot + "assets/images/triangle-closed.png";
      -        a.removeClass("opened");
      -        a.addClass("closed");
      -    }
      -    return false;
      -}
      -
      -/* Toggle all inherited classes in a single table (e.g. all inherited methods)
      - * @param linkObj  The link that was clicked.
      - * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      - *                'null' to simply toggle.
      - */
      -function toggleAllInherited(linkObj, expand) {
      -  var a = $(linkObj);
      -  var table = $(a.parent().parent().parent()); // ugly way to get table/tbody
      -  var expandos = $(".jd-expando-trigger", table);
      -  if ( (expand == null && a.text() == "[Expand]") || expand ) {
      -    expandos.each(function(i) {
      -      toggleInherited(this, true);
      -    });
      -    a.text("[Collapse]");
      -  } else if ( (expand == null && a.text() == "[Collapse]") || (expand == false) ) {
      -    expandos.each(function(i) {
      -      toggleInherited(this, false);
      -    });
      -    a.text("[Expand]");
      -  }
      -  return false;
      -}
      -
      -/* Toggle all inherited members in the class (link in the class title)
      - */
      -function toggleAllClassInherited() {
      -  var a = $("#toggleAllClassInherited"); // get toggle link from class title
      -  var toggles = $(".toggle-all", $("#body-content"));
      -  if (a.text() == "[Expand All]") {
      -    toggles.each(function(i) {
      -      toggleAllInherited(this, true);
      -    });
      -    a.text("[Collapse All]");
      -  } else {
      -    toggles.each(function(i) {
      -      toggleAllInherited(this, false);
      -    });
      -    a.text("[Expand All]");
      -  }
      -  return false;
      -}
      -
      -/* Expand all inherited members in the class. Used when initiating page search */
      -function ensureAllInheritedExpanded() {
      -  var toggles = $(".toggle-all", $("#body-content"));
      -  toggles.each(function(i) {
      -    toggleAllInherited(this, true);
      -  });
      -  $("#toggleAllClassInherited").text("[Collapse All]");
      -}
      -
      -
      -/* HANDLE KEY EVENTS
      - * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search)
      - */
      -var agent = navigator['userAgent'].toLowerCase();
      -var mac = agent.indexOf("macintosh") != -1;
      -
      -$(document).keydown( function(e) {
      -var control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key
      -  if (control && e.which == 70) {  // 70 is "F"
      -    ensureAllInheritedExpanded();
      -  }
      -});
      -
      -
      -
      -
      -
      -
      -/* On-demand functions */
      -
      -/** Move sample code line numbers out of PRE block and into non-copyable column */
      -function initCodeLineNumbers() {
      -  var numbers = $("#codesample-block a.number");
      -  if (numbers.length) {
      -    $("#codesample-line-numbers").removeClass("hidden").append(numbers);
      -  }
      -
      -  $(document).ready(function() {
      -    // select entire line when clicked
      -    $("span.code-line").click(function() {
      -      if (!shifted) {
      -        selectText(this);
      -      }
      -    });
      -    // invoke line link on double click
      -    $(".code-line").dblclick(function() {
      -      document.location.hash = $(this).attr('id');
      -    });
      -    // highlight the line when hovering on the number
      -    $("#codesample-line-numbers a.number").mouseover(function() {
      -      var id = $(this).attr('href');
      -      $(id).css('background','#e7e7e7');
      -    });
      -    $("#codesample-line-numbers a.number").mouseout(function() {
      -      var id = $(this).attr('href');
      -      $(id).css('background','none');
      -    });
      -  });
      -}
      -
      -// create SHIFT key binder to avoid the selectText method when selecting multiple lines
      -var shifted = false;
      -$(document).bind('keyup keydown', function(e){shifted = e.shiftKey; return true;} );
      -
      -// courtesy of jasonedelman.com
      -function selectText(element) {
      -    var doc = document
      -        , range, selection
      -    ;
      -    if (doc.body.createTextRange) { //ms
      -        range = doc.body.createTextRange();
      -        range.moveToElementText(element);
      -        range.select();
      -    } else if (window.getSelection) { //all others
      -        selection = window.getSelection();
      -        range = doc.createRange();
      -        range.selectNodeContents(element);
      -        selection.removeAllRanges();
      -        selection.addRange(range);
      -    }
      -}
      -
      -
      -
      -
      -/** Display links and other information about samples that match the
      -    group specified by the URL */
      -function showSamples() {
      -  var group = $("#samples").attr('class');
      -  $("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>");
      -
      -  var $ul = $("<ul>");
      -  $selectedLi = $("#nav li.selected");
      -
      -  $selectedLi.children("ul").children("li").each(function() {
      -      var $li = $("<li>").append($(this).find("a").first().clone());
      -      $ul.append($li);
      -  });
      -
      -  $("#samples").append($ul);
      -
      -}
      -
      -
      -
      -/* ########################################################## */
      -/* ###################  RESOURCE CARDS  ##################### */
      -/* ########################################################## */
      -
      -/** Handle resource queries, collections, and grids (sections). Requires
      -    jd_tag_helpers.js and the *_unified_data.js to be loaded. */
      -
      -(function() {
      -  // Prevent the same resource from being loaded more than once per page.
      -  var addedPageResources = {};
      -
      -  $(document).ready(function() {
      -    // Need to initialize hero carousel before other sections for dedupe
      -    // to work correctly.
      -    $('[data-carousel-query]').dacCarouselQuery();
      -
      -    $('.resource-widget').each(function() {
      -      initResourceWidget(this);
      -    });
      -
      -    /* Pass the line height to ellipsisfade() to adjust the height of the
      -    text container to show the max number of lines possible, without
      -    showing lines that are cut off. This works with the css ellipsis
      -    classes to fade last text line and apply an ellipsis char. */
      -
      -    //card text currently uses 20px line height.
      -    var lineHeight = 20;
      -    $('.card-info .text').ellipsisfade(lineHeight);
      -  });
      -
      -  /*
      -    Three types of resource layouts:
      -    Flow - Uses a fixed row-height flow using float left style.
      -    Carousel - Single card slideshow all same dimension absolute.
      -    Stack - Uses fixed columns and flexible element height.
      -  */
      -  function initResourceWidget(widget) {
      -    var $widget = $(widget);
      -    var isFlow = $widget.hasClass('resource-flow-layout'),
      -        isCarousel = $widget.hasClass('resource-carousel-layout'),
      -        isStack = $widget.hasClass('resource-stack-layout');
      -
      -    // remove illegal col-x class which is not relevant anymore thanks to responsive styles.
      -    var m = $widget.get(0).className.match(/\bcol-(\d+)\b/);
      -    if (m && !$widget.is('.cols > *')) {
      -      $widget.removeClass('col-' + m[1]);
      -    }
      -
      -    var opts = {
      -      cardSizes: ($widget.data('cardsizes') || '').split(','),
      -      maxResults: parseInt($widget.data('maxresults') || '100', 10),
      -      initialResults: $widget.data('initialResults'),
      -      itemsPerPage: $widget.data('itemsperpage'),
      -      sortOrder: $widget.data('sortorder'),
      -      query: $widget.data('query'),
      -      section: $widget.data('section'),
      -      /* Added by LFL 6/6/14 */
      -      resourceStyle: $widget.data('resourcestyle') || 'card',
      -      stackSort: $widget.data('stacksort') || 'true'
      -    };
      -
      -    // run the search for the set of resources to show
      -
      -    var resources = buildResourceList(opts);
      -
      -    if (isFlow) {
      -      drawResourcesFlowWidget($widget, opts, resources);
      -    } else if (isCarousel) {
      -      drawResourcesCarouselWidget($widget, opts, resources);
      -    } else if (isStack) {
      -      /* Looks like this got removed and is not used, so repurposing for the
      -          homepage style layout.
      -          Modified by LFL 6/6/14
      -      */
      -      //var sections = buildSectionList(opts);
      -      opts['numStacks'] = $widget.data('numstacks');
      -      drawResourcesStackWidget($widget, opts, resources/*, sections*/);
      -    }
      -  }
      -
      -  /* Initializes a Resource Carousel Widget */
      -  function drawResourcesCarouselWidget($widget, opts, resources) {
      -    $widget.empty();
      -    var plusone = false; // stop showing plusone buttons on cards
      -
      -    $widget.addClass('resource-card slideshow-container')
      -      .append($('<a>').addClass('slideshow-prev').text('Prev'))
      -      .append($('<a>').addClass('slideshow-next').text('Next'));
      -
      -    var css = { 'width': $widget.width() + 'px',
      -                'height': $widget.height() + 'px' };
      -
      -    var $ul = $('<ul>');
      -
      -    for (var i = 0; i < resources.length; ++i) {
      -      var $card = $('<a>')
      -        .attr('href', cleanUrl(resources[i].url))
      -        .decorateResourceCard(resources[i],plusone);
      -
      -      $('<li>').css(css)
      -          .append($card)
      -          .appendTo($ul);
      -    }
      -
      -    $('<div>').addClass('frame')
      -      .append($ul)
      -      .appendTo($widget);
      -
      -    $widget.dacSlideshow({
      -      auto: true,
      -      btnPrev: '.slideshow-prev',
      -      btnNext: '.slideshow-next'
      -    });
      -  };
      -
      -  /* Initializes a Resource Card Stack Widget (column-based layout)
      -     Modified by LFL 6/6/14
      -   */
      -  function drawResourcesStackWidget($widget, opts, resources, sections) {
      -    // Don't empty widget, grab all items inside since they will be the first
      -    // items stacked, followed by the resource query
      -    var plusone = false; // stop showing plusone buttons on cards
      -    var cards = $widget.find('.resource-card').detach().toArray();
      -    var numStacks = opts.numStacks || 1;
      -    var $stacks = [];
      -    var urlString;
      -
      -    for (var i = 0; i < numStacks; ++i) {
      -      $stacks[i] = $('<div>').addClass('resource-card-stack')
      -          .appendTo($widget);
      -    }
      -
      -    var sectionResources = [];
      -
      -    // Extract any subsections that are actually resource cards
      -    if (sections) {
      -      for (var i = 0; i < sections.length; ++i) {
      -        if (!sections[i].sections || !sections[i].sections.length) {
      -          // Render it as a resource card
      -          sectionResources.push(
      -            $('<a>')
      -              .addClass('resource-card section-card')
      -              .attr('href', cleanUrl(sections[i].resource.url))
      -              .decorateResourceCard(sections[i].resource,plusone)[0]
      -          );
      -
      -        } else {
      -          cards.push(
      -            $('<div>')
      -              .addClass('resource-card section-card-menu')
      -              .decorateResourceSection(sections[i],plusone)[0]
      -          );
      -        }
      -      }
      -    }
      -
      -    cards = cards.concat(sectionResources);
      -
      -    for (var i = 0; i < resources.length; ++i) {
      -      var $card = createResourceElement(resources[i], opts);
      -
      -      if (opts.resourceStyle.indexOf('related') > -1) {
      -        $card.addClass('related-card');
      -      }
      -
      -      cards.push($card[0]);
      -    }
      -
      -    if (opts.stackSort != 'false') {
      -      for (var i = 0; i < cards.length; ++i) {
      -        // Find the stack with the shortest height, but give preference to
      -        // left to right order.
      -        var minHeight = $stacks[0].height();
      -        var minIndex = 0;
      -
      -        for (var j = 1; j < numStacks; ++j) {
      -          var height = $stacks[j].height();
      -          if (height < minHeight - 45) {
      -            minHeight = height;
      -            minIndex = j;
      -          }
      -        }
      -
      -        $stacks[minIndex].append($(cards[i]));
      -      }
      -    }
      -
      -  };
      -
      -  /*
      -    Create a resource card using the given resource object and a list of html
      -     configured options. Returns a jquery object containing the element.
      -  */
      -  function createResourceElement(resource, opts, plusone) {
      -    var $el;
      -
      -    // The difference here is that generic cards are not entirely clickable
      -    // so its a div instead of an a tag, also the generic one is not given
      -    // the resource-card class so it appears with a transparent background
      -    // and can be styled in whatever way the css setup.
      -    if (opts.resourceStyle == 'generic') {
      -      $el = $('<div>')
      -        .addClass('resource')
      -        .attr('href', cleanUrl(resource.url))
      -        .decorateResource(resource, opts);
      -    } else {
      -      var cls = 'resource resource-card';
      -
      -      $el = $('<a>')
      -        .addClass(cls)
      -        .attr('href', cleanUrl(resource.url))
      -        .decorateResourceCard(resource, plusone);
      -    }
      -
      -    return $el;
      -  }
      -
      -  function createResponsiveFlowColumn(cardSize) {
      -    var cardWidth = parseInt(cardSize.match(/(\d+)/)[1], 10);
      -    var column = $('<div>').addClass('col-' + (cardWidth / 3) + 'of6');
      -    if (cardWidth < 9) {
      -      column.addClass('col-tablet-1of2');
      -    } else if (cardWidth > 9 && cardWidth < 18) {
      -      column.addClass('col-tablet-1of1');
      -    }
      -    if (cardWidth < 18) {
      -      column.addClass('col-mobile-1of1')
      -    }
      -    return column;
      -  }
      -
      -  /* Initializes a flow widget, see distribute.scss for generating accompanying css */
      -  function drawResourcesFlowWidget($widget, opts, resources) {
      -    $widget.empty().addClass('cols');
      -    var cardSizes = opts.cardSizes || ['6x6'];
      -    var initialResults = opts.initialResults || resources.length;
      -    var i = 0, j = 0;
      -    var plusone = false; // stop showing plusone buttons on cards
      -    var cardParent = $widget;
      -
      -    while (i < resources.length) {
      -
      -      if (i === initialResults && initialResults < resources.length) {
      -        // Toggle remaining cards
      -        cardParent = $('<div class="dac-toggle-content clearfix">').appendTo($widget);
      -        $widget.addClass('dac-toggle');
      -        $('<div class="col-1of1 dac-section-links dac-text-center">')
      -          .append(
      -            $('<div class="dac-section-link" data-toggle="section">')
      -              .append('<span class="dac-toggle-expand">More<i class="dac-sprite dac-auto-unfold-more"></i></span>')
      -              .append('<span class="dac-toggle-collapse">Less<i class="dac-sprite dac-auto-unfold-less"></i></span>')
      -          )
      -          .appendTo($widget)
      -      }
      -
      -      var cardSize = cardSizes[j++ % cardSizes.length];
      -      cardSize = cardSize.replace(/^\s+|\s+$/,'');
      -
      -      var column = createResponsiveFlowColumn(cardSize).appendTo(cardParent);
      -
      -      // A stack has a third dimension which is the number of stacked items
      -      var isStack = cardSize.match(/(\d+)x(\d+)x(\d+)/);
      -      var stackCount = 0;
      -      var $stackDiv = null;
      -
      -      if (isStack) {
      -        // Create a stack container which should have the dimensions defined
      -        // by the product of the items inside.
      -        $stackDiv = $('<div>').addClass('resource-card-stack resource-card-' + isStack[1]
      -            + 'x' + isStack[2] * isStack[3]) .appendTo(column);
      -      }
      -
      -      // Build each stack item or just a single item
      -      do {
      -        var resource = resources[i];
      -
      -        var $card = createResourceElement(resources[i], opts, plusone);
      -
      -        $card.addClass('resource-card-' + cardSize +
      -          ' resource-card-' + resource.type);
      -
      -        if (isStack) {
      -          $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]);
      -          if (++stackCount == parseInt(isStack[3])) {
      -            $card.addClass('resource-card-row-stack-last');
      -            stackCount = 0;
      -          }
      -        } else {
      -          stackCount = 0;
      -        }
      -
      -        $card.appendTo($stackDiv || column);
      -
      -      } while (++i < resources.length && stackCount > 0);
      -    }
      -  }
      -
      -  /* Build a site map of resources using a section as a root. */
      -  function buildSectionList(opts) {
      -    if (opts.section && SECTION_BY_ID[opts.section]) {
      -      return SECTION_BY_ID[opts.section].sections || [];
      -    }
      -    return [];
      -  }
      -
      -  function buildResourceList(opts) {
      -    return $.queryResources(opts);
      -  }
      -
      -  $.queryResources = function(opts) {
      -    var maxResults = opts.maxResults || 100;
      -
      -    var query = opts.query || '';
      -    var expressions = parseResourceQuery(query);
      -    var addedResourceIndices = {};
      -    var results = [];
      -
      -    for (var i = 0; i < expressions.length; i++) {
      -      var clauses = expressions[i];
      -
      -      // build initial set of resources from first clause
      -      var firstClause = clauses[0];
      -      var resources = [];
      -      switch (firstClause.attr) {
      -        case 'type':
      -          resources = ALL_RESOURCES_BY_TYPE[firstClause.value];
      -          break;
      -        case 'lang':
      -          resources = ALL_RESOURCES_BY_LANG[firstClause.value];
      -          break;
      -        case 'tag':
      -          resources = ALL_RESOURCES_BY_TAG[firstClause.value];
      -          break;
      -        case 'collection':
      -          var urls = RESOURCE_COLLECTIONS[firstClause.value].resources || [];
      -          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
      -          break;
      -        case 'section':
      -          var urls = SITE_MAP[firstClause.value].sections || [];
      -          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
      -          break;
      -      }
      -      // console.log(firstClause.attr + ':' + firstClause.value);
      -      resources = resources || [];
      -
      -      // use additional clauses to filter corpus
      -      if (clauses.length > 1) {
      -        var otherClauses = clauses.slice(1);
      -        resources = resources.filter(getResourceMatchesClausesFilter(otherClauses));
      -      }
      -
      -      // filter out resources already added
      -      if (i > 1) {
      -        resources = resources.filter(getResourceNotAlreadyAddedFilter(addedResourceIndices));
      -      }
      -
      -      // add to list of already added indices
      -      for (var j = 0; j < resources.length; j++) {
      -        if (resources[j]) {
      -          addedResourceIndices[resources[j].index] = 1;
      -        }
      -      }
      -
      -      // concat to final results list
      -      results = results.concat(resources);
      -    }
      -
      -    if (opts.sortOrder && results.length) {
      -      var attr = opts.sortOrder;
      -
      -      if (opts.sortOrder == 'random') {
      -        var i = results.length, j, temp;
      -        while (--i) {
      -          j = Math.floor(Math.random() * (i + 1));
      -          temp = results[i];
      -          results[i] = results[j];
      -          results[j] = temp;
      -        }
      -      } else {
      -        var desc = attr.charAt(0) == '-';
      -        if (desc) {
      -          attr = attr.substring(1);
      -        }
      -        results = results.sort(function(x,y) {
      -          return (desc ? -1 : 1) * (parseInt(x[attr], 10) - parseInt(y[attr], 10));
      -        });
      -      }
      -    }
      -
      -    results = results.filter(getResourceNotAlreadyAddedFilter(addedPageResources));
      -    results = results.slice(0, maxResults);
      -
      -    for (var j = 0; j < results.length; ++j) {
      -      addedPageResources[results[j].index] = 1;
      -    }
      -
      -    return results;
      -  }
      -
      -
      -  function getResourceNotAlreadyAddedFilter(addedResourceIndices) {
      -    return function(resource) {
      -      return resource && !addedResourceIndices[resource.index];
      -    };
      -  }
      -
      -
      -  function getResourceMatchesClausesFilter(clauses) {
      -    return function(resource) {
      -      return doesResourceMatchClauses(resource, clauses);
      -    };
      -  }
      -
      -
      -  function doesResourceMatchClauses(resource, clauses) {
      -    for (var i = 0; i < clauses.length; i++) {
      -      var map;
      -      switch (clauses[i].attr) {
      -        case 'type':
      -          map = IS_RESOURCE_OF_TYPE[clauses[i].value];
      -          break;
      -        case 'lang':
      -          map = IS_RESOURCE_IN_LANG[clauses[i].value];
      -          break;
      -        case 'tag':
      -          map = IS_RESOURCE_TAGGED[clauses[i].value];
      -          break;
      -      }
      -
      -      if (!map || (!!clauses[i].negative ? map[resource.index] : !map[resource.index])) {
      -        return clauses[i].negative;
      -      }
      -    }
      -    return true;
      -  }
      -
      -  function cleanUrl(url)
      -  {
      -    if (url && url.indexOf('//') === -1) {
      -      url = toRoot + url;
      -    }
      -
      -    return url;
      -  }
      -
      -
      -  function parseResourceQuery(query) {
      -    // Parse query into array of expressions (expression e.g. 'tag:foo + type:video')
      -    var expressions = [];
      -    var expressionStrs = query.split(',') || [];
      -    for (var i = 0; i < expressionStrs.length; i++) {
      -      var expr = expressionStrs[i] || '';
      -
      -      // Break expression into clauses (clause e.g. 'tag:foo')
      -      var clauses = [];
      -      var clauseStrs = expr.split(/(?=[\+\-])/);
      -      for (var j = 0; j < clauseStrs.length; j++) {
      -        var clauseStr = clauseStrs[j] || '';
      -
      -        // Get attribute and value from clause (e.g. attribute='tag', value='foo')
      -        var parts = clauseStr.split(':');
      -        var clause = {};
      -
      -        clause.attr = parts[0].replace(/^\s+|\s+$/g,'');
      -        if (clause.attr) {
      -          if (clause.attr.charAt(0) == '+') {
      -            clause.attr = clause.attr.substring(1);
      -          } else if (clause.attr.charAt(0) == '-') {
      -            clause.negative = true;
      -            clause.attr = clause.attr.substring(1);
      -          }
      -        }
      -
      -        if (parts.length > 1) {
      -          clause.value = parts[1].replace(/^\s+|\s+$/g,'');
      -        }
      -
      -        clauses.push(clause);
      -      }
      -
      -      if (!clauses.length) {
      -        continue;
      -      }
      -
      -      expressions.push(clauses);
      -    }
      -
      -    return expressions;
      -  }
      -})();
      -
      -(function($) {
      -
      -  /*
      -    Utility method for creating dom for the description area of a card.
      -    Used in decorateResourceCard and decorateResource.
      -  */
      -  function buildResourceCardDescription(resource, plusone) {
      -    var $description = $('<div>').addClass('description ellipsis');
      -
      -    $description.append($('<div>').addClass('text').html(resource.summary));
      -
      -    if (resource.cta) {
      -      $description.append($('<a>').addClass('cta').html(resource.cta));
      -    }
      -
      -    if (plusone) {
      -      var plusurl = resource.url.indexOf("//") > -1 ? resource.url :
      -        "//developer.android.com/" + resource.url;
      -
      -      $description.append($('<div>').addClass('util')
      -        .append($('<div>').addClass('g-plusone')
      -          .attr('data-size', 'small')
      -          .attr('data-align', 'right')
      -          .attr('data-href', plusurl)));
      -    }
      -
      -    return $description;
      -  }
      -
      -
      -  /* Simple jquery function to create dom for a standard resource card */
      -  $.fn.decorateResourceCard = function(resource,plusone) {
      -    var section = resource.group || resource.type;
      -    var imgUrl = resource.image ||
      -      'assets/images/resource-card-default-android.jpg';
      -
      -    if (imgUrl.indexOf('//') === -1) {
      -      imgUrl = toRoot + imgUrl;
      -    }
      -
      -    if (resource.type === 'youtube') {
      -      $('<div>').addClass('play-button')
      -        .append($('<i class="dac-sprite dac-play-white">'))
      -        .appendTo(this);
      -    }
      -
      -    $('<div>').addClass('card-bg')
      -      .css('background-image', 'url(' + (imgUrl || toRoot +
      -        'assets/images/resource-card-default-android.jpg') + ')')
      -      .appendTo(this);
      -
      -    $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
      -      .append($('<div>').addClass('section').text(section))
      -      .append($('<div>').addClass('title').html(resource.title))
      -      .append(buildResourceCardDescription(resource, plusone))
      -      .appendTo(this);
      -
      -    return this;
      -  };
      -
      -  /* Simple jquery function to create dom for a resource section card (menu) */
      -  $.fn.decorateResourceSection = function(section,plusone) {
      -    var resource = section.resource;
      -    //keep url clean for matching and offline mode handling
      -    var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot;
      -    var $base = $('<a>')
      -        .addClass('card-bg')
      -        .attr('href', resource.url)
      -        .append($('<div>').addClass('card-section-icon')
      -          .append($('<div>').addClass('icon'))
      -          .append($('<div>').addClass('section').html(resource.title)))
      -      .appendTo(this);
      -
      -    var $cardInfo = $('<div>').addClass('card-info').appendTo(this);
      -
      -    if (section.sections && section.sections.length) {
      -      // Recurse the section sub-tree to find a resource image.
      -      var stack = [section];
      -
      -      while (stack.length) {
      -        if (stack[0].resource.image) {
      -          $base.css('background-image', 'url(' + urlPrefix + stack[0].resource.image + ')');
      -          break;
      -        }
      -
      -        if (stack[0].sections) {
      -          stack = stack.concat(stack[0].sections);
      -        }
      -
      -        stack.shift();
      -      }
      -
      -      var $ul = $('<ul>')
      -        .appendTo($cardInfo);
      -
      -      var max = section.sections.length > 3 ? 3 : section.sections.length;
      -
      -      for (var i = 0; i < max; ++i) {
      -
      -        var subResource = section.sections[i];
      -        if (!plusone) {
      -          $('<li>')
      -            .append($('<a>').attr('href', subResource.url)
      -              .append($('<div>').addClass('title').html(subResource.title))
      -              .append($('<div>').addClass('description ellipsis')
      -                .append($('<div>').addClass('text').html(subResource.summary))
      -                .append($('<div>').addClass('util'))))
      -          .appendTo($ul);
      -        } else {
      -          $('<li>')
      -            .append($('<a>').attr('href', subResource.url)
      -              .append($('<div>').addClass('title').html(subResource.title))
      -              .append($('<div>').addClass('description ellipsis')
      -                .append($('<div>').addClass('text').html(subResource.summary))
      -                .append($('<div>').addClass('util')
      -                  .append($('<div>').addClass('g-plusone')
      -                    .attr('data-size', 'small')
      -                    .attr('data-align', 'right')
      -                    .attr('data-href', resource.url)))))
      -          .appendTo($ul);
      -        }
      -      }
      -
      -      // Add a more row
      -      if (max < section.sections.length) {
      -        $('<li>')
      -          .append($('<a>').attr('href', resource.url)
      -            .append($('<div>')
      -              .addClass('title')
      -              .text('More')))
      -        .appendTo($ul);
      -      }
      -    } else {
      -      // No sub-resources, just render description?
      -    }
      -
      -    return this;
      -  };
      -
      -
      -
      -
      -  /* Render other types of resource styles that are not cards. */
      -  $.fn.decorateResource = function(resource, opts) {
      -    var imgUrl = resource.image ||
      -      'assets/images/resource-card-default-android.jpg';
      -    var linkUrl = resource.url;
      -
      -    if (imgUrl.indexOf('//') === -1) {
      -      imgUrl = toRoot + imgUrl;
      -    }
      -
      -    if (linkUrl && linkUrl.indexOf('//') === -1) {
      -      linkUrl = toRoot + linkUrl;
      -    }
      -
      -    $(this).append(
      -      $('<div>').addClass('image')
      -        .css('background-image', 'url(' + imgUrl + ')'),
      -      $('<div>').addClass('info').append(
      -        $('<h4>').addClass('title').html(resource.title),
      -        $('<p>').addClass('summary').html(resource.summary),
      -        $('<a>').attr('href', linkUrl).addClass('cta').html('Learn More')
      -      )
      -    );
      -
      -    return this;
      -  };
      -})(jQuery);
      -
      -
      -/* Calculate the vertical area remaining */
      -(function($) {
      -    $.fn.ellipsisfade= function(lineHeight) {
      -        this.each(function() {
      -            // get element text
      -            var $this = $(this);
      -            var remainingHeight = $this.parent().parent().height();
      -            $this.parent().siblings().each(function ()
      -            {
      -              if ($(this).is(":visible")) {
      -                var h = $(this).outerHeight(true);
      -                remainingHeight = remainingHeight - h;
      -              }
      -            });
      -
      -            adjustedRemainingHeight = ((remainingHeight)/lineHeight>>0)*lineHeight
      -            $this.parent().css({'height': adjustedRemainingHeight});
      -            $this.css({'height': "auto"});
      -        });
      -
      -        return this;
      -    };
      -}) (jQuery);
      -
      -/*
      -  Fullscreen Carousel
      -
      -  The following allows for an area at the top of the page that takes over the
      -  entire browser height except for its top offset and an optional bottom
      -  padding specified as a data attribute.
      -
      -  HTML:
      -
      -  <div class="fullscreen-carousel">
      -    <div class="fullscreen-carousel-content">
      -      <!-- content here -->
      -    </div>
      -    <div class="fullscreen-carousel-content">
      -      <!-- content here -->
      -    </div>
      -
      -    etc ...
      -
      -  </div>
      -
      -  Control over how the carousel takes over the screen can mostly be defined in
      -  a css file. Setting min-height on the .fullscreen-carousel-content elements
      -  will prevent them from shrinking to far vertically when the browser is very
      -  short, and setting max-height on the .fullscreen-carousel itself will prevent
      -  the area from becoming to long in the case that the browser is stretched very
      -  tall.
      -
      -  There is limited functionality for having multiple sections since that request
      -  was removed, but it is possible to add .next-arrow and .prev-arrow elements to
      -  scroll between multiple content areas.
      -*/
      -
      -(function() {
      -  $(document).ready(function() {
      -    $('.fullscreen-carousel').each(function() {
      -      initWidget(this);
      -    });
      -  });
      -
      -  function initWidget(widget) {
      -    var $widget = $(widget);
      -
      -    var topOffset = $widget.offset().top;
      -    var padBottom = parseInt($widget.data('paddingbottom')) || 0;
      -    var maxHeight = 0;
      -    var minHeight = 0;
      -    var $content = $widget.find('.fullscreen-carousel-content');
      -    var $nextArrow = $widget.find('.next-arrow');
      -    var $prevArrow = $widget.find('.prev-arrow');
      -    var $curSection = $($content[0]);
      -
      -    if ($content.length <= 1) {
      -      $nextArrow.hide();
      -      $prevArrow.hide();
      -    } else {
      -      $nextArrow.click(function() {
      -        var index = ($content.index($curSection) + 1);
      -        $curSection.hide();
      -        $curSection = $($content[index >= $content.length ? 0 : index]);
      -        $curSection.show();
      -      });
      -
      -      $prevArrow.click(function() {
      -        var index = ($content.index($curSection) - 1);
      -        $curSection.hide();
      -        $curSection = $($content[index < 0 ? $content.length - 1 : 0]);
      -        $curSection.show();
      -      });
      -    }
      -
      -    // Just hide all content sections except first.
      -    $content.each(function(index) {
      -      if ($(this).height() > minHeight) minHeight = $(this).height();
      -      $(this).css({position: 'absolute',  display: index > 0 ? 'none' : ''});
      -    });
      -
      -    // Register for changes to window size, and trigger.
      -    $(window).resize(resizeWidget);
      -    resizeWidget();
      -
      -    function resizeWidget() {
      -      var height = $(window).height() - topOffset - padBottom;
      -      $widget.width($(window).width());
      -      $widget.height(height < minHeight ? minHeight :
      -        (maxHeight && height > maxHeight ? maxHeight : height));
      -    }
      -  }
      -})();
      -
      -
      -
      -
      -
      -/*
      -  Tab Carousel
      -
      -  The following allows tab widgets to be installed via the html below. Each
      -  tab content section should have a data-tab attribute matching one of the
      -  nav items'. Also each tab content section should have a width matching the
      -  tab carousel.
      -
      -  HTML:
      -
      -  <div class="tab-carousel">
      -    <ul class="tab-nav">
      -      <li><a href="#" data-tab="handsets">Handsets</a>
      -      <li><a href="#" data-tab="wearable">Wearable</a>
      -      <li><a href="#" data-tab="tv">TV</a>
      -    </ul>
      -
      -    <div class="tab-carousel-content">
      -      <div data-tab="handsets">
      -        <!--Full width content here-->
      -      </div>
      -
      -      <div data-tab="wearable">
      -        <!--Full width content here-->
      -      </div>
      -
      -      <div data-tab="tv">
      -        <!--Full width content here-->
      -      </div>
      -    </div>
      -  </div>
      -
      -*/
      -(function() {
      -  $(document).ready(function() {
      -    $('.tab-carousel').each(function() {
      -      initWidget(this);
      -    });
      -  });
      -
      -  function initWidget(widget) {
      -    var $widget = $(widget);
      -    var $nav = $widget.find('.tab-nav');
      -    var $anchors = $nav.find('[data-tab]');
      -    var $li = $nav.find('li');
      -    var $contentContainer = $widget.find('.tab-carousel-content');
      -    var $tabs = $contentContainer.find('[data-tab]');
      -    var $curTab = $($tabs[0]); // Current tab is first tab.
      -    var width = $widget.width();
      -
      -    // Setup nav interactivity.
      -    $anchors.click(function(evt) {
      -      evt.preventDefault();
      -      var query = '[data-tab=' + $(this).data('tab') + ']';
      -      transitionWidget($tabs.filter(query));
      -    });
      -
      -    // Add highlight for navigation on first item.
      -    var $highlight = $('<div>').addClass('highlight')
      -      .css({left:$li.position().left + 'px', width:$li.outerWidth() + 'px'})
      -      .appendTo($nav);
      -
      -    // Store height since we will change contents to absolute.
      -    $contentContainer.height($contentContainer.height());
      -
      -    // Absolutely position tabs so they're ready for transition.
      -    $tabs.each(function(index) {
      -      $(this).css({position: 'absolute', left: index > 0 ? width + 'px' : '0'});
      -    });
      -
      -    function transitionWidget($toTab) {
      -      if (!$curTab.is($toTab)) {
      -        var curIndex = $tabs.index($curTab[0]);
      -        var toIndex = $tabs.index($toTab[0]);
      -        var dir = toIndex > curIndex ? 1 : -1;
      -
      -        // Animate content sections.
      -        $toTab.css({left:(width * dir) + 'px'});
      -        $curTab.animate({left:(width * -dir) + 'px'});
      -        $toTab.animate({left:'0'});
      -
      -        // Animate navigation highlight.
      -        $highlight.animate({left:$($li[toIndex]).position().left + 'px',
      -          width:$($li[toIndex]).outerWidth() + 'px'})
      -
      -        // Store new current section.
      -        $curTab = $toTab;
      -      }
      -    }
      -  }
      -})();
      -
      -/**
      - * Auto TOC
      - *
      - * Upgrades h2s on the page to have a rule and be toggle-able on mobile.
      - */
      -(function($) {
      -  var upgraded = false;
      -  var h2Titles;
      -
      -  function initWidget() {
      -    // add HRs below all H2s (except for a few other h2 variants)
      -    // Consider doing this with css instead.
      -    h2Titles = $('h2').not('#qv h2, #tb h2, .sidebox h2, #devdoc-nav h2, h2.norule');
      -    h2Titles.css({marginBottom:0}).after('<hr/>');
      -
      -    // Exit early if on older browser.
      -    if (!window.matchMedia) {
      -      return;
      -    }
      -
      -    // Only run logic in mobile layout.
      -    var query = window.matchMedia('(max-width: 719px)');
      -    if (query.matches) {
      -      makeTogglable();
      -    } else {
      -      query.addListener(makeTogglable);
      -    }
      -  }
      -
      -  function makeTogglable() {
      -    // Only run this logic once.
      -    if (upgraded) { return; }
      -    upgraded = true;
      -
      -    // Only make content h2s togglable.
      -    var contentTitles = h2Titles.filter('#jd-content *');
      -
      -    // If there are more than 1
      -    if (contentTitles.size() < 2) {
      -      return;
      -    }
      -
      -    contentTitles.each(function() {
      -      // Find all the relevant nodes.
      -      var $title = $(this);
      -      var $hr = $title.next();
      -      var $contents = $hr.nextUntil('h2, .next-docs');
      -      var $section = $($title)
      -        .add($hr)
      -        .add($title.prev('a[name]'))
      -        .add($contents);
      -      var $anchor = $section.first().prev();
      -      var anchorMethod = 'after';
      -      if ($anchor.length === 0) {
      -        $anchor = $title.parent();
      -        anchorMethod = 'prepend';
      -      }
      -
      -      // Some h2s are in their own container making it pretty hard to find the end, so skip.
      -      if ($contents.length === 0) {
      -        return;
      -      }
      -
      -      // Remove from DOM before messing with it. DOM is slow!
      -      $section.detach();
      -
      -      // Add mobile-only expand arrows.
      -      $title.prepend('<span class="dac-visible-mobile-inline-block">' +
      -          '<i class="dac-toggle-expand dac-sprite dac-expand-more-black"></i>' +
      -          '<i class="dac-toggle-collapse dac-sprite dac-expand-less-black"></i>' +
      -          '</span>')
      -        .attr('data-toggle', 'section');
      -
      -      // Wrap in magic markup.
      -      $section = $section.wrapAll('<div class="dac-toggle dac-mobile">').parent();
      -      $contents.wrapAll('<div class="dac-toggle-content"><div>'); // extra div used for max-height calculation.
      -
      -      // Pre-expand section if requested.
      -      if ($title.hasClass('is-expanded')) {
      -        $section.addClass('is-expanded');
      -      }
      -
      -      // Pre-expand section if targetted by hash.
      -      if (location.hash && $section.find(location.hash).length) {
      -        $section.addClass('is-expanded');
      -      }
      -
      -      // Add it back to the dom.
      -      $anchor[anchorMethod].call($anchor, $section);
      -    });
      -  }
      -
      -  $(function() {
      -    initWidget();
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  /**
      -   * Toggle Floating Label state.
      -   * @param {HTMLElement} el - The DOM element.
      -   * @param options
      -   * @constructor
      -   */
      -  function FloatingLabel(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, FloatingLabel.DEFAULTS_, options);
      -    this.group = this.el.closest('.dac-form-input-group');
      -    this.input = this.group.find('.dac-form-input');
      -
      -    this.checkValue_ = this.checkValue_.bind(this);
      -    this.checkValue_();
      -
      -    this.input.on('focus', function() {
      -      this.group.addClass('dac-focused');
      -    }.bind(this));
      -    this.input.on('blur', function() {
      -      this.group.removeClass('dac-focused');
      -      this.checkValue_();
      -    }.bind(this));
      -    this.input.on('keyup', this.checkValue_);
      -  }
      -
      -  /**
      -   * The label is moved out of the textbox when it has a value.
      -   */
      -  FloatingLabel.prototype.checkValue_ = function() {
      -    if (this.input.val().length) {
      -      this.group.addClass('dac-has-value');
      -    } else {
      -      this.group.removeClass('dac-has-value');
      -    }
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacFloatingLabel = function(options) {
      -    return this.each(function() {
      -      new FloatingLabel(this, options);
      -    });
      -  };
      -
      -  $(document).on('ready.aranja', function() {
      -    $('.dac-form-floatlabel').each(function() {
      -      $(this).dacFloatingLabel($(this).data());
      -    });
      -  });
      -})(jQuery);
      -
      -/* global toRoot, CAROUSEL_OVERRIDE */
      -(function($) {
      -  // Ordering matters
      -  var TAG_MAP = [
      -    {from: 'developerstory', to: 'Android Developer Story'},
      -    {from: 'googleplay', to: 'Google Play'}
      -  ];
      -
      -  function DacCarouselQuery(el) {
      -    this.el = $(el);
      -
      -    var opts = this.el.data();
      -    opts.maxResults = parseInt(opts.maxResults || '100', 10);
      -    opts.query = opts.carouselQuery;
      -    var resources = $.queryResources(opts);
      -
      -    this.el.empty();
      -    $(resources).map(function() {
      -      var resource = $.extend({}, this, CAROUSEL_OVERRIDE[this.url]);
      -      var slide = $('<article class="dac-expand dac-hero">');
      -      var image = cleanUrl(resource.heroImage || resource.image);
      -      var fullBleed = image && !resource.heroColor;
      -
      -      // Configure background
      -      slide.css({
      -        backgroundImage: fullBleed ? 'url(' + image + ')' : '',
      -        backgroundColor: resource.heroColor || ''
      -      });
      -
      -      // Should copy be inverted
      -      slide.toggleClass('dac-invert', resource.heroInvert || fullBleed);
      -      slide.toggleClass('dac-darken', fullBleed);
      -
      -      // Should be clickable
      -      slide.append($('<a class="dac-hero-carousel-action">').attr('href', cleanUrl(resource.url)));
      -
      -      var cols = $('<div class="cols dac-hero-content">');
      -
      -      // inline image column
      -      var rightCol = $('<div class="col-1of2 col-push-1of2 dac-hero-figure">')
      -        .appendTo(cols);
      -
      -      if (!fullBleed && image) {
      -        rightCol.append($('<img>').attr('src', image));
      -      }
      -
      -      // info column
      -      $('<div class="col-1of2 col-pull-1of2">')
      -        .append($('<div class="dac-hero-tag">').text(formatTag(resource)))
      -        .append($('<h1 class="dac-hero-title">').text(formatTitle(resource)))
      -        .append($('<p class="dac-hero-description">').text(resource.summary))
      -        .append($('<a class="dac-hero-cta">')
      -          .text(formatCTA(resource))
      -          .attr('href', cleanUrl(resource.url))
      -          .prepend($('<span class="dac-sprite dac-auto-chevron">'))
      -        )
      -        .appendTo(cols);
      -
      -      slide.append(cols.wrap('<div class="wrap">').parent());
      -      return slide[0];
      -    }).prependTo(this.el);
      -
      -    // Pagination element.
      -    this.el.append('<div class="dac-hero-carousel-pagination"><div class="wrap" data-carousel-pagination>');
      -
      -    this.el.dacCarousel();
      -  }
      -
      -  function cleanUrl(url) {
      -    if (url && url.indexOf('//') === -1) {
      -      url = toRoot + url;
      -    }
      -    return url;
      -  }
      -
      -  function formatTag(resource) {
      -    // Hmm, need a better more scalable solution for this.
      -    for (var i = 0, mapping; mapping = TAG_MAP[i]; i++) {
      -      if (resource.tags.indexOf(mapping.from) > -1) {
      -        return mapping.to;
      -      }
      -    }
      -    return resource.type;
      -  }
      -
      -  function formatTitle(resource) {
      -    return resource.title.replace(/android developer story: /i, '');
      -  }
      -
      -  function formatCTA(resource) {
      -    return resource.type === 'youtube' ? 'Watch the video' : 'Learn more';
      -  }
      -
      -  // jQuery plugin
      -  $.fn.dacCarouselQuery = function() {
      -    return this.each(function() {
      -      var el = $(this);
      -      var data = el.data('dac.carouselQuery');
      -
      -      if (!data) { el.data('dac.carouselQuery', (data = new DacCarouselQuery(el))); }
      -    });
      -  };
      -
      -  // Data API
      -  $(function() {
      -    $('[data-carousel-query]').dacCarouselQuery();
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  /**
      -   * A CSS based carousel, inspired by SequenceJS.
      -   * @param {jQuery} el
      -   * @param {object} options
      -   * @constructor
      -   */
      -  function DacCarousel(el, options) {
      -    this.el = $(el);
      -    this.options = options = $.extend({}, DacCarousel.OPTIONS, this.el.data(), options || {});
      -    this.frames = this.el.find(options.frameSelector);
      -    this.count = this.frames.size();
      -    this.current = options.start;
      -
      -    this.initPagination();
      -    this.initEvents();
      -    this.initFrame();
      -  }
      -
      -  DacCarousel.OPTIONS = {
      -    auto:      true,
      -    autoTime:  10000,
      -    autoMinTime: 5000,
      -    btnPrev:   '[data-carousel-prev]',
      -    btnNext:   '[data-carousel-next]',
      -    frameSelector: 'article',
      -    loop:      true,
      -    start:     0,
      -    swipeThreshold: 160,
      -    pagination: '[data-carousel-pagination]'
      -  };
      -
      -  DacCarousel.prototype.initPagination = function() {
      -    this.pagination = $([]);
      -    if (!this.options.pagination) { return; }
      -
      -    var pagination = $('<ul class="dac-pagination">');
      -    var parent = this.el;
      -    if (typeof this.options.pagination === 'string') { parent = this.el.find(this.options.pagination); }
      -
      -    if (this.count > 1) {
      -      for (var i = 0; i < this.count; i++) {
      -        var li = $('<li class="dac-pagination-item">').text(i);
      -        if (i === this.options.start) { li.addClass('active'); }
      -        li.click(this.go.bind(this, i));
      -
      -        pagination.append(li);
      -      }
      -      this.pagination = pagination.children();
      -      parent.append(pagination);
      -    }
      -  };
      -
      -  DacCarousel.prototype.initEvents = function() {
      -    var that = this;
      -
      -    this.touch = {
      -      start: {x: 0, y: 0},
      -      end:   {x: 0, y: 0}
      -    };
      -
      -    this.el.on('touchstart', this.touchstart_.bind(this));
      -    this.el.on('touchend', this.touchend_.bind(this));
      -    this.el.on('touchmove', this.touchmove_.bind(this));
      -
      -    this.el.hover(function() {
      -      that.pauseRotateTimer();
      -    }, function() {
      -      that.startRotateTimer();
      -    });
      -
      -    $(this.options.btnPrev).click(function(e) {
      -      e.preventDefault();
      -      that.prev();
      -    });
      -
      -    $(this.options.btnNext).click(function(e) {
      -      e.preventDefault();
      -      that.next();
      -    });
      -  };
      -
      -  DacCarousel.prototype.touchstart_ = function(event) {
      -    var t = event.originalEvent.touches[0];
      -    this.touch.start = {x: t.screenX, y: t.screenY};
      -  };
      -
      -  DacCarousel.prototype.touchend_ = function() {
      -    var deltaX = this.touch.end.x - this.touch.start.x;
      -    var deltaY = Math.abs(this.touch.end.y - this.touch.start.y);
      -    var shouldSwipe = (deltaY < Math.abs(deltaX)) && (Math.abs(deltaX) >= this.options.swipeThreshold);
      -
      -    if (shouldSwipe) {
      -      if (deltaX > 0) {
      -        this.prev();
      -      } else {
      -        this.next();
      -      }
      -    }
      -  };
      -
      -  DacCarousel.prototype.touchmove_ = function(event) {
      -    var t = event.originalEvent.touches[0];
      -    this.touch.end = {x: t.screenX, y: t.screenY};
      -  };
      -
      -  DacCarousel.prototype.initFrame = function() {
      -    this.frames.removeClass('active').eq(this.options.start).addClass('active');
      -  };
      -
      -  DacCarousel.prototype.startRotateTimer = function() {
      -    if (!this.options.auto || this.rotateTimer) { return; }
      -    this.rotateTimer = setTimeout(this.next.bind(this), this.options.autoTime);
      -  };
      -
      -  DacCarousel.prototype.pauseRotateTimer = function() {
      -    clearTimeout(this.rotateTimer);
      -    this.rotateTimer = null;
      -  };
      -
      -  DacCarousel.prototype.prev = function() {
      -    this.go(this.current - 1);
      -  };
      -
      -  DacCarousel.prototype.next = function() {
      -    this.go(this.current + 1);
      -  };
      -
      -  DacCarousel.prototype.go = function(next) {
      -    // Figure out what the next slide is.
      -    while (this.count > 0 && next >= this.count) { next -= this.count; }
      -    while (next < 0) { next += this.count; }
      -
      -    // Cancel if we're already on that slide.
      -    if (next === this.current) { return; }
      -
      -    // Prepare next slide.
      -    this.frames.eq(next).removeClass('out');
      -
      -    // Recalculate styles before starting slide transition.
      -    this.el.resolveStyles();
      -    // Update pagination
      -    this.pagination.removeClass('active').eq(next).addClass('active');
      -
      -    // Transition out current frame
      -    this.frames.eq(this.current).toggleClass('active out');
      -
      -    // Transition in a new frame
      -    this.frames.eq(next).toggleClass('active');
      -
      -    this.current = next;
      -  };
      -
      -  // Helper which resolves new styles for an element, so it can start transitioning
      -  // from the new values.
      -  $.fn.resolveStyles = function() {
      -    /*jshint expr:true*/
      -    this[0] && this[0].offsetTop;
      -    return this;
      -  };
      -
      -  // jQuery plugin
      -  $.fn.dacCarousel = function() {
      -    this.each(function() {
      -      var $el = $(this);
      -      $el.data('dac-carousel', new DacCarousel(this));
      -    });
      -    return this;
      -  };
      -
      -  // Data API
      -  $(function() {
      -    $('[data-carousel]').dacCarousel();
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  function Modal(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleModal.DEFAULTS_, options);
      -    this.isOpen = false;
      -
      -    this.el.on('click', function(event) {
      -      if (!$.contains($('.dac-modal-window')[0], event.target)) {
      -        return this.el.trigger('modal-close');
      -      }
      -    }.bind(this));
      -
      -    this.el.on('modal-open', this.open_.bind(this));
      -    this.el.on('modal-close', this.close_.bind(this));
      -    this.el.on('modal-toggle', this.toggle_.bind(this));
      -  }
      -
      -  Modal.prototype.toggle_ = function() {
      -    this.el.trigger('modal-' + (this.isOpen ? 'close' : 'open'));
      -  };
      -
      -  Modal.prototype.close_ = function() {
      -    this.el.removeClass('dac-active');
      -    $('body').removeClass('dac-modal-open');
      -    this.isOpen = false;
      -  };
      -
      -  Modal.prototype.open_ = function() {
      -    this.el.addClass('dac-active');
      -    $('body').addClass('dac-modal-open');
      -    this.isOpen = true;
      -  };
      -
      -  function ToggleModal(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleModal.DEFAULTS_, options);
      -    this.modal = this.options.modalToggle ? $('[data-modal="' + this.options.modalToggle + '"]') :
      -      this.el.closest('[data-modal]');
      -
      -    this.el.on('click', this.clickHandler_.bind(this));
      -  }
      -
      -  ToggleModal.prototype.clickHandler_ = function(event) {
      -    event.preventDefault();
      -    this.modal.trigger('modal-toggle');
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacModal = function(options) {
      -    return this.each(function() {
      -      new Modal(this, options);
      -    });
      -  };
      -
      -  $.fn.dacToggleModal = function(options) {
      -    return this.each(function() {
      -      new ToggleModal(this, options);
      -    });
      -  };
      -
      -  /**
      -   * Data Attribute API
      -   */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-modal]').each(function() {
      -      $(this).dacModal($(this).data());
      -    });
      -
      -    $('[data-modal-toggle]').each(function() {
      -      $(this).dacToggleModal($(this).data());
      -    });
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  /**
      -   * Toggle the visabilty of the mobile navigation.
      -   * @param {HTMLElement} el - The DOM element.
      -   * @param options
      -   * @constructor
      -   */
      -  function ToggleNav(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleNav.DEFAULTS_, options);
      -    this.options.target = [this.options.navigation];
      -
      -    if (this.options.body) {this.options.target.push('body')}
      -    if (this.options.dimmer) {this.options.target.push(this.options.dimmer)}
      -
      -    this.el.on('click', this.clickHandler_.bind(this));
      -  }
      -
      -  /**
      -   * ToggleNav Default Settings
      -   * @type {{body: boolean, dimmer: string, navigation: string, toggleClass: string}}
      -   * @private
      -   */
      -  ToggleNav.DEFAULTS_ = {
      -    body: true,
      -    dimmer: '.dac-nav-dimmer',
      -    navigation: '[data-dac-nav]',
      -    toggleClass: 'dac-nav-open'
      -  };
      -
      -  /**
      -   * The actual toggle logic.
      -   * @param event
      -   * @private
      -   */
      -  ToggleNav.prototype.clickHandler_ = function(event) {
      -    event.preventDefault();
      -    $(this.options.target.join(', ')).toggleClass(this.options.toggleClass);
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacToggleMobileNav = function(options) {
      -    return this.each(function() {
      -      new ToggleNav(this, options);
      -    });
      -  };
      -
      -  /**
      -   * Data Attribute API
      -   */
      -  $(window).on('load.aranja', function() {
      -    $('[data-dac-toggle-nav]').each(function() {
      -      $(this).dacToggleMobileNav($(this).data());
      -    });
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  /**
      -   * Submit the newsletter form to a Google Form.
      -   * @param {HTMLElement} el - The Form DOM element.
      -   * @constructor
      -   */
      -  function NewsletterForm(el) {
      -    this.el = $(el);
      -    this.form = this.el.find('form');
      -    $('<iframe/>').hide()
      -      .attr('name', 'dac-newsletter-iframe')
      -      .attr('src', '')
      -      .insertBefore(this.form);
      -    this.form.on('submit', this.submitHandler_.bind(this));
      -  }
      -
      -  /**
      -   * Milliseconds until modal has vanished after modal-close is triggered.
      -   * @type {number}
      -   * @private
      -   */
      -  NewsletterForm.CLOSE_DELAY_ = 300;
      -
      -  /**
      -   * Switch view to display form after close.
      -   * @private
      -   */
      -  NewsletterForm.prototype.closeHandler_ = function() {
      -    setTimeout(function() {
      -      this.el.trigger('swap-reset');
      -    }.bind(this), NewsletterForm.CLOSE_DELAY_);
      -  };
      -
      -  /**
      -   * Reset the modal to initial state.
      -   * @private
      -   */
      -  NewsletterForm.prototype.reset_ = function() {
      -    this.form.trigger('reset');
      -    this.el.one('modal-close', this.closeHandler_.bind(this));
      -  };
      -
      -  /**
      -   * Display a success view on submit.
      -   * @private
      -   */
      -  NewsletterForm.prototype.submitHandler_ = function() {
      -    this.el.one('swap-complete', this.reset_.bind(this));
      -    this.el.trigger('swap-content');
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacNewsletterForm = function(options) {
      -    return this.each(function() {
      -      new NewsletterForm(this, options);
      -    });
      -  };
      -
      -  /**
      -   * Data Attribute API
      -   */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-newsletter]').each(function() {
      -      $(this).dacNewsletterForm();
      -    });
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  /**
      -   * Smoothly scroll to location on current page.
      -   * @param el
      -   * @param options
      -   * @constructor
      -   */
      -  function ScrollButton(el, options) {
      -    this.el = $(el);
      -    this.target = $(this.el.attr('href'));
      -    this.options = $.extend({}, ScrollButton.DEFAULTS_, options);
      -
      -    if (typeof this.options.offset === 'string') {
      -      this.options.offset = $(this.options.offset).height();
      -    }
      -
      -    this.el.on('click', this.clickHandler_.bind(this));
      -  }
      -
      -  /**
      -   * Default options
      -   * @type {{duration: number, easing: string, offset: number, scrollContainer: string}}
      -   * @private
      -   */
      -  ScrollButton.DEFAULTS_ = {
      -    duration: 300,
      -    easing: 'swing',
      -    offset: 0,
      -    scrollContainer: 'html, body'
      -  };
      -
      -  /**
      -   * Scroll logic
      -   * @param event
      -   * @private
      -   */
      -  ScrollButton.prototype.clickHandler_ = function(event) {
      -    if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
      -      return;
      -    }
      -
      -    event.preventDefault();
      -
      -    $(this.options.scrollContainer).animate({
      -      scrollTop: this.target.offset().top - this.options.offset
      -    }, this.options);
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacScrollButton = function(options) {
      -    return this.each(function() {
      -      new ScrollButton(this, options);
      -    });
      -  };
      -
      -  /**
      -   * Data Attribute API
      -   */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-scroll-button]').each(function() {
      -      $(this).dacScrollButton($(this).data());
      -    });
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      -
      -  /**
      -   * A component that swaps two dynamic height views with an animation.
      -   * Listens for the following events:
      -   * * swap-content: triggers SwapContent.swap_()
      -   * * swap-reset: triggers SwapContent.reset()
      -   * @param el
      -   * @param options
      -   * @constructor
      -   */
      -  function SwapContent(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, SwapContent.DEFAULTS_, options);
      -    this.containers = this.el.find(this.options.container);
      -    this.initiallyActive = this.containers.children('.' + this.options.activeClass).eq(0);
      -    this.el.on('swap-content', this.swap.bind(this));
      -    this.el.on('swap-reset', this.reset.bind(this));
      -  }
      -
      -  /**
      -   * SwapContent's default settings.
      -   * @type {{activeClass: string, container: string, transitionSpeed: number}}
      -   * @private
      -   */
      -  SwapContent.DEFAULTS_ = {
      -    activeClass: 'dac-active',
      -    container: '[data-swap-container]',
      -    transitionSpeed: 500
      -  };
      -
      -  /**
      -   * Returns container's visible height.
      -   * @param container
      -   * @returns {number}
      -   */
      -  SwapContent.prototype.currentHeight = function(container) {
      -    return container.children('.' + this.options.activeClass).outerHeight();
      -  };
      -
      -  /**
      -   * Reset to show initial content
      -   */
      -  SwapContent.prototype.reset = function() {
      -    if (!this.initiallyActive.hasClass(this.initiallyActive)) {
      -      this.containers.children().toggleClass(this.options.activeClass);
      -    }
      -  };
      -
      -  /**
      -   * Complete the swap.
      -   */
      -  SwapContent.prototype.complete = function() {
      -    this.containers.height('auto');
      -    this.containers.trigger('swap-complete');
      -  };
      -
      -  /**
      -   * Perform the swap of content.
      -   */
      -  SwapContent.prototype.swap = function() {
      -    console.log(this.containers);
      -    this.containers.each(function(index, container) {
      -      container = $(container);
      -      container.height(this.currentHeight(container)).children().toggleClass(this.options.activeClass);
      -      container.animate({height: this.currentHeight(container)}, this.options.transitionSpeed,
      -        this.complete.bind(this));
      -    }.bind(this));
      -  };
      -
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacSwapContent = function(options) {
      -    return this.each(function() {
      -      new SwapContent(this, options);
      -    });
      -  };
      -
      -  /**
      -   * Data Attribute API
      -   */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-swap]').each(function() {
      -      $(this).dacSwapContent($(this).data());
      -    });
      -  });
      -})(jQuery);
      -
      -(function($) {
      -  function Toggle(el) {
      -    $(el).on('click.dac.togglesection', this.toggle);
      -  }
      -
      -  Toggle.prototype.toggle = function() {
      -    var $this = $(this);
      -
      -    var $parent = getParent($this);
      -    var isExpanded = $parent.hasClass('is-expanded');
      -
      -    transitionMaxHeight($parent.find('.dac-toggle-content'), !isExpanded);
      -    $parent.toggleClass('is-expanded');
      -
      -    return false;
      -  };
      -
      -  function getParent($this) {
      -    var selector = $this.attr('data-target');
      -
      -    if (!selector) {
      -      selector = $this.attr('href');
      -      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '');
      -    }
      -
      -    var $parent = selector && $(selector);
      -
      -    $parent = $parent && $parent.length ? $parent : $this.closest('.dac-toggle');
      -
      -    return $parent.length ? $parent : $this.parent();
      -  }
      -
      -  /**
      -   * Runs a transition of max-height along with responsive styles which hide or expand the element.
      -   * @param $el
      -   * @param visible
      -   */
      -  function transitionMaxHeight($el, visible) {
      -    var contentHeight = $el.prop('scrollHeight');
      -    var targetHeight = visible ? contentHeight : 0;
      -    var duration = $el.transitionDuration();
      -
      -    // If we're hiding, first set the maxHeight we're transitioning from.
      -    if (!visible) {
      -      $el.css('maxHeight', contentHeight + 'px')
      -        .resolveStyles();
      -    }
      -
      -    // Transition to new state
      -    $el.css('maxHeight', targetHeight);
      -
      -    // Reset maxHeight to css value after transition.
      -    setTimeout(function() {
      -      $el.css('maxHeight', '');
      -    }, duration);
      -  }
      -
      -  // Utility to get the transition duration for the element.
      -  $.fn.transitionDuration = function() {
      -    var d = $(this).css('transitionDuration') || '0s';
      -
      -    return +(parseFloat(d) * (/ms/.test(d) ? 1 : 1000)).toFixed(0);
      -  };
      -
      -  // jQuery plugin
      -  $.fn.toggleSection = function(option) {
      -    return this.each(function() {
      -      var $this = $(this);
      -      var data = $this.data('dac.togglesection');
      -      if (!data) {$this.data('dac.togglesection', (data = new Toggle(this)));}
      -      if (typeof option === 'string') {data[option].call($this);}
      -    });
      -  };
      -
      -  // Data api
      -  $(document)
      -    .on('click.toggle', '[data-toggle="section"]', Toggle.prototype.toggle);
      -})(jQuery);
      diff --git a/tools/droiddoc/templates-sdk-refonly/assets/js/prettify.js b/tools/droiddoc/templates-sdk-refonly/assets/js/prettify.js
      deleted file mode 100644
      index eef5ad7e6a0..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/assets/js/prettify.js
      +++ /dev/null
      @@ -1,28 +0,0 @@
      -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
      -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
      -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
      -f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
      -(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
      -{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
      -t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
      -"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
      -l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
      -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
      -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
      -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
      -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
      -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
      -m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
      -a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
      -j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
      -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
      -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
      -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
      -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
      -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
      -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
      -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
      -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
      -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
      -250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
      -PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
      diff --git a/tools/droiddoc/templates-sdk-refonly/class.cs b/tools/droiddoc/templates-sdk-refonly/class.cs
      deleted file mode 100644
      index 93fcf88ad8c..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/class.cs
      +++ /dev/null
      @@ -1,676 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<?cs include:"macros_override.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/Article">
      -  <div id="doc-api-level" class="<?cs var:class.since ?>" style="display:none"></div>
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -<div class="col-12"  id="doc-col">
      -
      -<div id="api-info-block">
      -
      -<?cs # are there inherited members ?>
      -<?cs each:cl=class.inherited ?>
      -  <?cs if:subcount(cl.methods) ?>
      -   <?cs set:inhmethods = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.constants) ?>
      -   <?cs set:inhconstants = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.fields) ?>
      -   <?cs set:inhfields = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.attrs) ?>
      -   <?cs set:inhattrs = #1 ?>
      -  <?cs /if ?>
      -<?cs /each ?>
      -
      -<div class="sum-details-links">
      -<?cs if:inhattrs || inhconstants || inhfields || inhmethods || (!class.subclasses.hidden &&
      -     (subcount(class.subclasses.direct) || subcount(class.subclasses.indirect))) ?>
      -Summary:
      -<?cs if:subcount(class.inners) ?>
      -  <a href="#nestedclasses">Nested Classes</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.attrs) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lattrs">XML Attrs</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhattrs ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhattrs">Inherited XML Attrs</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.enumConstants) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#enumconstants">Enums</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.constants) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#constants">Constants</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhconstants ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhconstants">Inherited Constants</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.fields) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lfields">Fields</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhfields ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhfields">Inherited Fields</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.ctors.public) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubctors">Ctors</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.ctors.protected) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#proctors">Protected Ctors</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.methods.public) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubmethods">Methods</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.methods.protected) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#promethods">Protected Methods</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhmethods ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhmethods">Inherited Methods</a>
      -<?cs /if ?>
      -&#124; <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
      -<?cs /if ?>
      -</div><!-- end sum-details-links -->
      -<div class="api-level">
      -  <?cs call:since_tags(class) ?><?cs
      -  if:class.deprecatedsince
      -    ?><br>Deprecated since <a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html#ApiLevels"
      -        >API level <?cs var:class.deprecatedsince ?></a><?cs
      -  /if ?>
      -  <?cs call:federated_refs(class) ?>
      -</div>
      -</div><!-- end api-info-block -->
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ======== START OF CLASS DATA ======== -->
      -
      -<div id="jd-header">
      -    <?cs var:class.scope ?>
      -    <?cs var:class.static ?> 
      -    <?cs var:class.final ?> 
      -    <?cs var:class.abstract ?>
      -    <?cs var:class.kind ?>
      -<h1 itemprop="name"><?cs var:class.name ?></h1>
      -
      -<?cs set:colspan = subcount(class.inheritance) ?>
      -<?cs each:supr = class.inheritance ?>
      -  <?cs if:colspan == 2 ?>
      -    extends <?cs call:type_link(supr.short_class) ?><br/>
      -  <?cs /if ?>
      -  <?cs if:last(supr) && subcount(supr.interfaces) ?>
      -      implements 
      -      <?cs each:t=supr.interfaces ?>
      -        <?cs call:type_link(t) ?> 
      -      <?cs /each ?>
      -  <?cs /if ?>
      -  <?cs set:colspan = colspan-1 ?>
      -<?cs /each ?>
      -<?cs call:show_annotations_list(class) ?>
      -
      -</div><!-- end header -->
      -
      -<div id="naMessage"></div>
      -
      -<div id="jd-content" class="api apilevel-<?cs var:class.since ?>">
      -<table class="jd-inheritance-table">
      -<?cs set:colspan = subcount(class.inheritance) ?>
      -<?cs each:supr = class.inheritance ?>
      -    <tr>
      -        <?cs loop:i = 1, (subcount(class.inheritance)-colspan), 1 ?>
      -            <td class="jd-inheritance-space">&nbsp;<?cs if:(subcount(class.inheritance)-colspan) == i ?>&nbsp;&nbsp;&#x21b3;<?cs /if ?></td>
      -        <?cs /loop ?> 	
      -        <td colspan="<?cs var:colspan ?>" class="jd-inheritance-class-cell"><?cs
      -            if:colspan == 1
      -                ?><?cs call:class_name(class.qualifiedType) ?><?cs 
      -            else 
      -                ?><?cs call:type_link(supr.class) ?><?cs
      -            /if ?></td>
      -    </tr>
      -    <?cs set:colspan = colspan-1 ?>
      -<?cs /each ?>
      -</table>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -
      -<?cs if:subcount(class.subclasses.direct) && !class.subclasses.hidden ?>
      -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
      -<?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses
      -<?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?>
      -</td></tr></table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.subclasses.indirect) && !class.subclasses.hidden ?>
      -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
      -<?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses
      -<?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?>
      -</td></tr></table>
      -<?cs /if ?>
      -
      -<div class="jd-descr">
      -<?cs call:deprecated_warning(class) ?>
      -<?cs if:subcount(class.descr) ?>
      -<h2>Class Overview</h2>
      -<p itemprop="articleBody"><?cs call:tag_list(class.descr) ?></p>
      -<?cs /if ?>
      -
      -<?cs call:see_also_tags(class.seeAlso) ?>
      -
      -</div><!-- jd-descr -->
      -
      -
      -<?cs # summary macros ?>
      -
      -<?cs def:write_method_summary(methods, included) ?>
      -<?cs set:count = #1 ?>
      -<?cs each:method = methods ?>
      -	 <?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:method.since ?>" >
      -        <td class="jd-typecol"><nobr>
      -            <?cs var:method.abstract ?>
      -            <?cs var:method.final ?>
      -            <?cs var:method.static ?>
      -            <?cs call:type_link(method.generic) ?>
      -            <?cs call:type_link(method.returnType) ?></nobr>
      -        </td>
      -        <td class="jd-linkcol" width="100%"><nobr>
      -        <span class="sympad"><?cs call:cond_link(method.name, toroot, method.href, included) ?></span>(<?cs call:parameter_list(method.params) ?>)</nobr>
      -        <?cs if:subcount(method.shortDescr) || subcount(method.deprecated) ?>
      -        <div class="jd-descrdiv">
      -          <?cs call:short_descr(method) ?>
      -          <?cs call:show_annotations_list(method) ?>
      -        </div>
      -  <?cs /if ?>
      -  </td></tr>
      -<?cs set:count = count + #1 ?>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_field_summary(fields, included) ?>
      -<?cs set:count = #1 ?>
      -    <?cs each:field=fields ?>
      -      <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -          <td class="jd-typecol"><nobr>
      -          <?cs var:field.scope ?>
      -          <?cs var:field.static ?>
      -          <?cs var:field.final ?>
      -          <?cs call:type_link(field.type) ?></nobr></td>
      -          <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
      -          <td class="jd-descrcol" width="100%">
      -            <?cs call:short_descr(field) ?>
      -            <?cs call:show_annotations_list(field) ?>
      -          </td>
      -      </tr>
      -      <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_constant_summary(fields, included) ?>
      -<?cs set:count = #1 ?>
      -    <?cs each:field=fields ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -        <td class="jd-typecol"><?cs call:type_link(field.type) ?></td>
      -        <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(field) ?>
      -          <?cs call:show_annotations_list(field) ?>
      -        </td>
      -    </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_attr_summary(attrs, included) ?>
      -<?cs set:count = #1 ?>
      -    <tr>
      -        <td><nobr><em>Attribute Name</em></nobr></td>
      -        <td><nobr><em>Related Method</em></nobr></td>
      -        <td><nobr><em>Description</em></nobr></td>
      -    </tr>
      -    <?cs each:attr=attrs ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:attr.since ?>" >
      -        <td class="jd-linkcol"><?cs if:included ?><a href="<?cs var:toroot ?><?cs var:attr.href ?>"><?cs /if ?><?cs var:attr.name ?><?cs if:included ?></a><?cs /if ?></td>
      -        <td class="jd-linkcol"><?cs each:m=attr.methods ?>
      -            <?cs call:cond_link(m.name, toroot, m.href, included) ?>
      -            <?cs /each ?>
      -        </td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(attr) ?>&nbsp;
      -          <?cs call:show_annotations_list(attr) ?>
      -        </td>
      -    </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_inners_summary(classes) ?>
      -<?cs set:count = #1 ?>
      -  <?cs each:cl=class.inners ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
      -      <td class="jd-typecol"><nobr>
      -        <?cs var:cl.scope ?>
      -        <?cs var:cl.static ?> 
      -        <?cs var:cl.final ?> 
      -        <?cs var:cl.abstract ?>
      -        <?cs var:cl.kind ?></nobr></td>
      -      <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
      -      <td class="jd-descrcol" width="100%">
      -        <?cs call:short_descr(cl) ?>&nbsp;
      -        <?cs call:show_annotations_list(cl) ?>
      -      </td>
      -    </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs # end macros ?>
      -
      -<div class="jd-descr">
      -<?cs # make sure there's a summary view to display ?>
      -<?cs if:subcount(class.inners)
      -     || subcount(class.attrs)
      -     || inhattrs
      -     || subcount(class.enumConstants)
      -     || subcount(class.constants)
      -     || inhconstants
      -     || subcount(class.fields)
      -     || inhfields
      -     || subcount(class.ctors.public)
      -     || subcount(class.ctors.protected)
      -     || subcount(class.methods.public)
      -     || subcount(class.methods.protected)
      -     || inhmethods ?>
      -<h2>Summary</h2>
      -
      -<?cs if:subcount(class.inners) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ======== NESTED CLASS SUMMARY ======== -->
      -<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
      -<?cs call:write_inners_summary(class.inners) ?>
      -<?cs /if ?>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<?cs if:subcount(class.attrs) ?>
      -<!-- =========== FIELD SUMMARY =========== -->
      -<table id="lattrs" class="jd-sumtable"><tr><th colspan="12">XML Attributes</th></tr>
      -<?cs call:write_attr_summary(class.attrs, 1) ?>
      -<?cs /if ?>
      -
      -<?cs # if there are inherited attrs, write the table ?>
      -<?cs if:inhattrs ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== FIELD SUMMARY =========== -->
      -<table id="inhattrs" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited XML Attributes</div></th></tr>
      -<?cs each:cl=class.inherited ?>
      -<?cs if:subcount(cl.attrs) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      -<div id="inherited-attrs-<?cs var:cl.qualified ?>">
      -  <div id="inherited-attrs-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-attrs-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_attr_summary(cl.attrs, cl.included) ?></table>
      -  </div>
      -</div>
      -</td></tr>
      -<?cs /if ?>
      -<?cs /each ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.enumConstants) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="enumconstants" class="jd-sumtable"><tr><th colspan="12">Enum Values</th></tr>
      -<?cs set:count = #1 ?>
      -    <?cs each:field=class.enumConstants ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -        <td class="jd-descrcol"><?cs call:type_link(field.type) ?>&nbsp;</td>
      -        <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, cl.included) ?>&nbsp;</td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(field) ?>&nbsp;
      -          <?cs call:show_annotations_list(field) ?>
      -        </td>
      -    </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.constants) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr>
      -<?cs call:write_constant_summary(class.constants, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs # if there are inherited constants, write the table ?>
      -<?cs if:inhconstants ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="inhconstants" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Constants</div></th></tr>
      -<?cs each:cl=class.inherited ?>
      -<?cs if:subcount(cl.constants) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      -<div id="inherited-constants-<?cs var:cl.qualified ?>">
      -  <div id="inherited-constants-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-constants-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_constant_summary(cl.constants, cl.included) ?></table>
      -  </div>
      -</div>
      -</td></tr>
      -<?cs /if ?>
      -<?cs /each ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.fields) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== FIELD SUMMARY =========== -->
      -<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr>
      -<?cs call:write_field_summary(class.fields, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs # if there are inherited fields, write the table ?>
      -<?cs if:inhfields ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- =========== FIELD SUMMARY =========== -->
      -<table id="inhfields" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Fields</div></th></tr>
      -<?cs each:cl=class.inherited ?>
      -<?cs if:subcount(cl.fields) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      -<div id="inherited-fields-<?cs var:cl.qualified ?>">
      -  <div id="inherited-fields-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-fields-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_field_summary(cl.fields, cl.included) ?></table>
      -  </div>
      -</div>
      -</td></tr>
      -<?cs /if ?>
      -<?cs /each ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.ctors.public) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ======== CONSTRUCTOR SUMMARY ======== -->
      -<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
      -<?cs call:write_method_summary(class.ctors.public, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.ctors.protected) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ======== CONSTRUCTOR SUMMARY ======== -->
      -<table id="proctors" class="jd-sumtable"><tr><th colspan="12">Protected Constructors</th></tr>
      -<?cs call:write_method_summary(class.ctors.protected, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.methods.public) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========== METHOD SUMMARY =========== -->
      -<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
      -<?cs call:write_method_summary(class.methods.public, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.methods.protected) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========== METHOD SUMMARY =========== -->
      -<table id="promethods" class="jd-sumtable"><tr><th colspan="12">Protected Methods</th></tr>
      -<?cs call:write_method_summary(class.methods.protected, 1) ?>
      -</table>
      -<?cs /if ?>
      -
      -<?cs # if there are inherited methods, write the table ?>
      -<?cs if:inhmethods ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========== METHOD SUMMARY =========== -->
      -<table id="inhmethods" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Methods</div></th></tr>
      -<?cs each:cl=class.inherited ?>
      -<?cs if:subcount(cl.methods) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12"><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?>
      -From <?cs var:cl.kind ?>
      -<?cs if:cl.included ?>
      -  <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      -<?cs elif:cl.federated ?>
      -  <a href="<?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      -<?cs else ?>
      -  <?cs var:cl.qualified ?>
      -<?cs /if ?>
      -<div id="inherited-methods-<?cs var:cl.qualified ?>">
      -  <div id="inherited-methods-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-methods-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_method_summary(cl.methods, cl.included) ?></table>
      -  </div>
      -</div>
      -</td></tr>
      -<?cs /if ?>
      -<?cs /each ?>
      -</table>
      -<?cs /if ?>
      -<?cs /if ?>
      -</div><!-- jd-descr (summary) -->
      -
      -<!-- Details -->
      -
      -<?cs def:write_field_details(fields) ?>
      -<?cs each:field=fields ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:field.anchor ?>"></A>
      -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -<div class="jd-details api apilevel-<?cs var:field.since ?>"> 
      -    <h4 class="jd-details-title">
      -      <span class="normal">
      -        <?cs var:field.scope ?> 
      -        <?cs var:field.static ?> 
      -        <?cs var:field.final ?> 
      -        <?cs call:type_link(field.type) ?>
      -      </span>
      -        <?cs var:field.name ?>
      -    </h4>
      -      <div class="api-level">
      -        <?cs call:since_tags(field) ?>
      -        <?cs call:federated_refs(field) ?>
      -      </div>
      -    <div class="jd-details-descr">
      -      <?cs call:show_annotations_list(field) ?>
      -      <?cs call:description(field) ?>
      -    <?cs if:subcount(field.constantValue) ?>
      -        <div class="jd-tagdata">
      -        <span class="jd-tagtitle">Constant Value: </span>
      -        <span>
      -            <?cs if:field.constantValue.isString ?>
      -                <?cs var:field.constantValue.str ?>
      -            <?cs else ?>
      -                <?cs var:field.constantValue.dec ?>
      -                (<?cs var:field.constantValue.hex ?>)
      -            <?cs /if ?>
      -        </span>
      -        </div>
      -    <?cs /if ?>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_method_details(methods) ?>
      -<?cs each:method=methods ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:method.anchor ?>"></A>
      -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -<div class="jd-details api apilevel-<?cs var:method.since ?>"> 
      -    <h4 class="jd-details-title">
      -      <span class="normal">
      -        <?cs var:method.scope ?> 
      -        <?cs var:method.static ?> 
      -        <?cs var:method.final ?> 
      -        <?cs var:method.abstract ?> 
      -        <?cs call:type_link(method.returnType) ?>
      -      </span>
      -      <span class="sympad"><?cs var:method.name ?></span>
      -      <span class="normal">(<?cs call:parameter_list(method.params) ?>)</span>
      -    </h4>
      -      <div class="api-level">
      -        <div><?cs call:since_tags(method) ?></div>
      -        <?cs call:federated_refs(method) ?>
      -      </div>
      -    <div class="jd-details-descr">
      -      <?cs call:show_annotations_list(method) ?>
      -      <?cs call:description(method) ?>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_attr_details(attrs) ?>
      -<?cs each:attr=attrs ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:attr.anchor ?>"></A>
      -<div class="jd-details"> 
      -    <h4 class="jd-details-title"><?cs var:attr.name ?>
      -    </h4>
      -    <div class="jd-details-descr">
      -        <?cs call:show_annotations_list(attr) ?>
      -        <?cs call:description(attr) ?>
      -
      -        <div class="jd-tagdata">
      -            <h5 class="jd-tagtitle">Related Methods</h5>
      -            <ul class="nolist">
      -            <?cs each:m=attr.methods ?>
      -                <li><a href="<?cs var:toroot ?><?cs var:m.href ?>"><?cs var:m.name ?></a></li>
      -            <?cs /each ?>
      -            </ul>
      -        </div>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -
      -<!-- XML Attributes -->
      -<?cs if:subcount(class.attrs) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= FIELD DETAIL ======== -->
      -<h2>XML Attributes</h2>
      -<?cs call:write_attr_details(class.attrs) ?>
      -<?cs /if ?>
      -
      -<!-- Enum Values -->
      -<?cs if:subcount(class.enumConstants) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= ENUM CONSTANTS DETAIL ======== -->
      -<h2>Enum Values</h2>
      -<?cs call:write_field_details(class.enumConstants) ?>
      -<?cs /if ?>
      -
      -<!-- Constants -->
      -<?cs if:subcount(class.constants) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= ENUM CONSTANTS DETAIL ======== -->
      -<h2>Constants</h2>
      -<?cs call:write_field_details(class.constants) ?>
      -<?cs /if ?>
      -
      -<!-- Fields -->
      -<?cs if:subcount(class.fields) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= FIELD DETAIL ======== -->
      -<h2>Fields</h2>
      -<?cs call:write_field_details(class.fields) ?>
      -<?cs /if ?>
      -
      -<!-- Public ctors -->
      -<?cs if:subcount(class.ctors.public) ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= CONSTRUCTOR DETAIL ======== -->
      -<h2>Public Constructors</h2>
      -<?cs call:write_method_details(class.ctors.public) ?>
      -<?cs /if ?>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= CONSTRUCTOR DETAIL ======== -->
      -<!-- Protected ctors -->
      -<?cs if:subcount(class.ctors.protected) ?>
      -<h2>Protected Constructors</h2>
      -<?cs call:write_method_details(class.ctors.protected) ?>
      -<?cs /if ?>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= METHOD DETAIL ======== -->
      -<!-- Public methdos -->
      -<?cs if:subcount(class.methods.public) ?>
      -<h2>Public Methods</h2>
      -<?cs call:write_method_details(class.methods.public) ?>
      -<?cs /if ?>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= METHOD DETAIL ======== -->
      -<?cs if:subcount(class.methods.protected) ?>
      -<h2>Protected Methods</h2>
      -<?cs call:write_method_details(class.methods.protected) ?>
      -<?cs /if ?>
      -
      -<?cs # the next two lines must be exactly like this to be parsed by eclipse ?>
      -<!-- ========= END OF CLASS DATA ========= -->
      -<A NAME="navbar_top"></A>
      -</div> <!-- jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/classes.cs b/tools/droiddoc/templates-sdk-refonly/classes.cs
      deleted file mode 100644
      index 32966a0fe4e..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/classes.cs
      +++ /dev/null
      @@ -1,54 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<?cs include:"macros_override.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/Article">
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -<div class="col-12" id="doc-col">
      -
      -<div id="jd-header">
      -<h1><?cs var:page.title ?></h1>
      -</div>
      -
      -<div id="jd-content">
      -<p>These are the Android API classes. See all <a href="packages.html">API packages</a>.</p>
      -<div class="jd-letterlist"><?cs each:letter=docs.classes ?>
      -    <a href="#letter_<?cs name:letter ?>"><?cs name:letter ?></a>&nbsp;&nbsp;<?cs /each?>
      -</div>
      -
      -<?cs each:letter=docs.classes ?>
      -<?cs set:count = #1 ?>
      -<h2 id="letter_<?cs name:letter ?>"><?cs name:letter ?></h2>
      -<table class="jd-sumtable">
      -    <?cs set:cur_row = #0 ?>
      -    <?cs each:cl = letter ?>
      -        <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
      -            <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
      -            <td class="jd-descrcol" width="100%">
      -              <?cs call:short_descr(cl) ?>&nbsp;
      -              <?cs call:show_annotations_list(cl) ?>
      -            </td>
      -        </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -</table>
      -<?cs /each ?>
      -
      -</div><!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/components/masthead.cs b/tools/droiddoc/templates-sdk-refonly/components/masthead.cs
      deleted file mode 100644
      index f61d2900375..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/components/masthead.cs
      +++ /dev/null
      @@ -1,174 +0,0 @@
      -<?cs def:custom_masthead() ?>
      -<a name="top"></a>
      -
      -<!-- dialog to prompt lang pref change when loaded from hardcoded URL
      -<div id="langMessage" style="display:none">
      -  <div>
      -    <div class="lang en">
      -      <p>You requested a page in English, would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang es">
      -      <p>You requested a page in Spanish (Español), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ja">
      -      <p>You requested a page in Japanese (日本語), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ko">
      -      <p>You requested a page in Korean (한국어), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ru">
      -      <p>You requested a page in Russian (Русский), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang zh-cn">
      -      <p>You requested a page in Simplified Chinese (简体中文), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang zh-tw">
      -      <p>You requested a page in Traditional Chinese (繁體中文), would you like to proceed with this language setting?</p>
      -    </div>
      -    <a href="#" class="button yes" onclick="return false;">
      -      <span class="lang en">Yes</span>
      -      <span class="lang es">Sí</span>
      -      <span class="lang ja">Yes</span>
      -      <span class="lang ko">Yes</span>
      -      <span class="lang ru">Yes</span>
      -      <span class="lang zh-cn">是的</span>
      -      <span class="lang zh-tw">没有</span>
      -    </a>
      -    <a href="#" class="button" onclick="$('#langMessage').hide();return false;">
      -      <span class="lang en">No</span>
      -      <span class="lang es">No</span>
      -      <span class="lang ja">No</span>
      -      <span class="lang ko">No</span>
      -      <span class="lang ru">No</span>
      -      <span class="lang zh-cn">没有</span>
      -      <span class="lang zh-tw">没有</span>
      -    </a>
      -  </div>
      -</div> -->
      -
      -<?cs if:!devsite ?><?cs # leave out the global header for devsite; it is in devsite template ?>
      -  <!-- Header -->
      -  <div id="header-wrapper">
      -    <div class="dac-header" id="header"><?cs call:butter_bar() ?>
      -      <div class="dac-header-inner">
      -        <a class="dac-nav-toggle" data-dac-toggle-nav href="javascript:;" title="Open navigation">
      -          <span class="dac-nav-hamburger">
      -            <span class="dac-nav-hamburger-top"></span>
      -            <span class="dac-nav-hamburger-mid"></span>
      -            <span class="dac-nav-hamburger-bot"></span>
      -          </span>
      -        </a>
      -        <?cs if:ndk ?><a class="dac-header-logo" href="<?cs var:toroot ?>ndk/index.html">
      -          <img class="dac-header-logo-image" src="<?cs var:toroot ?>assets/images/android_logo_ndk.png"
      -              srcset="<?cs var:toroot ?>assets/images/android_logo_ndk@2x.png 2x"
      -              width="32" height="36" alt="Android" /> NDK
      -          </a><?cs else ?><a class="dac-header-logo" href="<?cs var:toroot ?>index.html">
      -          <img class="dac-header-logo-image" src="<?cs var:toroot ?>assets/images/android_logo.png"
      -              srcset="<?cs var:toroot ?>assets/images/android_logo@2x.png 2x"
      -              width="32" height="36" alt="Android" /> Developers
      -          </a><?cs /if ?>
      -
      -        <ul class="dac-header-crumbs">
      -          <?cs # More <li> elements added here with javascript ?>
      -          <?cs if:!section.landing ?><li class="dac-header-crumbs-item"><span class="dac-header-crumbs-link current <?cs
      -            if:ndk ?>ndk<?cs /if ?>"><?cs var:page.title ?></a></li><?cs
      -          /if ?>
      -        </ul>
      -
      -        <?cs # ADD SEARCH AND MENU ?>
      -        <?cs if:!ndk ?>
      -        <?cs call:header_search_widget() ?>
      -        <?cs /if ?>
      -
      -        <?cs if:ndk ?><a class="dac-header-console-btn" href="http://developer.android.com">
      -          <span class="dac-visible-desktop-inline">Back to Android Developers</span>
      -        </a><?cs else ?><a class="dac-header-console-btn" href="https://play.google.com/apps/publish/">
      -          <span class="dac-sprite dac-google-play"></span>
      -          <span class="dac-visible-desktop-inline">Developer</span>
      -          Console
      -        </a><?cs /if ?>
      -
      -      </div><!-- end header-wrap.wrap -->
      -    </div><!-- end header -->
      -
      -    <div id="searchResults" class="wrap" style="display:none;">
      -      <h2 id="searchTitle">Results</h2>
      -      <div id="leftSearchControl" class="search-control">Loading...</div>
      -    </div>
      -  </div> <!--end header-wrapper -->
      -
      -  <?cs if:ndk ?>
      -  <!-- NDK Navigation-->
      -  <nav class="dac-nav">
      -    <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
      -
      -    <ul class="dac-nav-list" data-dac-nav>
      -      <li class="dac-nav-item dac-nav-head">
      -        <a class="dac-nav-link dac-nav-logo" data-dac-toggle-nav href="javascript:;" title="Close navigation">
      -          <img class="dac-logo-image" src="<?cs var:toroot ?>assets/images/android_logo_ndk.png"
      -               srcset="<?cs var:toroot ?>assets/images/android_logo_ndk@2x.png 2x"
      -               width="32" height="36" alt="Android" /> NDK
      -        </a>
      -      </li>
      -      <li class="dac-nav-item reference">
      -        <a class="dac-nav-link" href="<?cs var:toroot ?>ndk/reference/index.html"
      -           zh-tw-lang="參考資源"
      -           zh-cn-lang="参考"
      -           ru-lang="Справочник"
      -           ko-lang="참조문서"
      -           ja-lang="リファレンス"
      -           es-lang="Referencia">Reference</a>
      -      </li>
      -    </ul>
      -  </nav>
      -  <!-- end NDK navigation-->
      -  <?cs else ?>
      -  <!-- Navigation-->
      -  <nav class="dac-nav">
      -    <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
      -
      -    <ul class="dac-nav-list" data-dac-nav>
      -      <li class="dac-nav-item dac-nav-head">
      -        <a class="dac-nav-link dac-nav-logo" data-dac-toggle-nav href="javascript:;" title="Close navigation">
      -          <img class="dac-logo-image" src="<?cs var:toroot ?>assets/images/android_logo.png"
      -               srcset="<?cs var:toroot ?>assets/images/android_logo@2x.png 2x"
      -               width="32" height="36" alt="Android" /> Developers
      -        </a>
      -      </li>
      -      <li class="dac-nav-item develop">
      -        <a class="dac-nav-link has-subnav" href="/reference/packages.html" zh-tw-lang="參考資源" 
      -        zh-cn-lang="参考" ru-lang="Справочник" ko-lang="참조문서" ja-lang="リファレンス" 
      -        es-lang="Referencia">API Reference</a>
      -      <div class="dac-nav-secondary develop">
      -        <h1 style="font-size: 20px; line-height: 24px; margin: 20px; color:#444"
      -          >Android <?cs var:sdk.version ?> r<?cs var:sdk.rel.id ?>
      -        </h1>
      -      </div>
      -      </li>
      -    </ul>
      -  </nav>
      -  <!-- end navigation-->
      -  <?cs /if ?>
      -<?cs /if ?><?cs # end if/else !devsite ?>
      -
      -<?cs
      -/def ?><?cs # end custom_masthead() ?>
      -
      -
      -<?cs # (UN)COMMENT THE INSIDE OF THIS METHOD TO TOGGLE VISIBILITY ?>
      -<?cs def:butter_bar() ?>
      -
      -<?cs # HIDE THE BUTTER BAR
      -
      -    <div style="height:20px"><!-- spacer to bump header down --></div>
      -    <div id="butterbar-wrapper">
      -      <div id="butterbar">
      -        <a href="http://googleblog.blogspot.com/" id="butterbar-message">
      -          The Android 5.0 SDK will be available on October 17th!
      -        </a>
      -      </div>
      -    </div>
      -
      -?>
      -
      -<?cs /def ?>
      diff --git a/tools/droiddoc/templates-sdk-refonly/customizations.cs b/tools/droiddoc/templates-sdk-refonly/customizations.cs
      deleted file mode 100644
      index 16469ac7355..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/customizations.cs
      +++ /dev/null
      @@ -1,620 +0,0 @@
      -<?cs
      -def:mobile_nav_toggle() ?>
      -  <div class="dac-visible-mobile-block" data-toggle="section">
      -    <span class="dac-toggle-expand dac-devdoc-toggle"><i class="dac-sprite dac-expand-more-black"></i> Show navigation</span>
      -    <span class="dac-toggle-collapse dac-devdoc-toggle" data-toggle-section><i class="dac-sprite dac-expand-less-black"></i> Hide navigation</span>
      -  </div>
      -<?cs /def ?><?cs
      -
      -def:fullpage() ?>
      -  <div id="body-content">
      -    <div>
      -<?cs /def ?>
      -<?cs
      -def:sdk_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -<?cs /def ?><?cs
      -
      -def:no_nav() ?>
      -  <div class="wrap clearfix" id="body-content">
      -    <div>
      -<?cs /def ?><?cs
      -
      -def:tools_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:training_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:googleplay_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:preview_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:essentials_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:users_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:engage_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:analyze_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:monetize_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:disttools_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:stories_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:guide_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:design_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:distribute_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/distribute_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:samples_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?>
      -        </div>
      -      </div>
      -
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:google_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
      -        </div>
      -      </div>
      -      <script type="text/javascript">
      -       showGoogleRefTree();
      -
      -      </script>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:about_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -
      -<?cs
      -def:wear_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/wear/wear_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -
      -<?cs # The default side navigation for the reference docs ?><?cs
      -def:default_left_nav() ?>
      -<?cs if:reference.gcm || reference.gms ?>
      -  <?cs call:google_nav() ?>
      -<?cs else ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-hidden-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <div id="devdoc-nav">
      -      <div id="api-nav-header">
      -        <div id="api-level-toggle">
      -          <label for="apiLevelCheckbox" class="disabled"
      -            title="Select your target API level to dim unavailable APIs">API level: </label>
      -          <div class="select-wrapper">
      -            <select id="apiLevelSelector">
      -              <!-- option elements added by buildApiLevelSelector() -->
      -            </select>
      -          </div>
      -        </div><!-- end toggle -->
      -        <div id="api-nav-title">Android APIs</div>
      -        </div><!-- end nav header -->
      -      <script>
      -        var SINCE_DATA = [ <?cs
      -          each:since = since ?>'<?cs
      -            var:since.name ?>'<?cs
      -            if:!last(since) ?>, <?cs /if ?><?cs
      -          /each
      -        ?> ];
      -        buildApiLevelSelector();
      -      </script>
      -
      -      <div id="swapper">
      -        <div id="nav-panels">
      -          <div id="resize-packages-nav">
      -            <div id="packages-nav" class="scroll-pane">
      -
      -              <ul>
      -                <?cs call:package_link_list(docs.packages) ?>
      -              </ul><br/>
      -
      -            </div> <!-- end packages-nav -->
      -          </div> <!-- end resize-packages -->
      -          <div id="classes-nav" class="scroll-pane">
      -
      -
      -<?cs
      -            if:subcount(class.package) ?>
      -            <ul>
      -              <?cs call:list("Annotations", class.package.annotations) ?>
      -              <?cs call:list("Interfaces", class.package.interfaces) ?>
      -              <?cs call:list("Classes", class.package.classes) ?>
      -              <?cs call:list("Enums", class.package.enums) ?>
      -              <?cs call:list("Exceptions", class.package.exceptions) ?>
      -              <?cs call:list("Errors", class.package.errors) ?>
      -            </ul><?cs
      -            elif:subcount(package) ?>
      -            <ul>
      -              <?cs call:class_link_list("Annotations", package.annotations) ?>
      -              <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      -              <?cs call:class_link_list("Classes", package.classes) ?>
      -              <?cs call:class_link_list("Enums", package.enums) ?>
      -              <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      -              <?cs call:class_link_list("Errors", package.errors) ?>
      -            </ul><?cs
      -            else ?>
      -              <p style="padding:10px">Select a package to view its members</p><?cs
      -            /if ?><br/>
      -
      -
      -          </div><!-- end classes -->
      -        </div><!-- end nav-panels -->
      -        <div id="nav-tree" style="display:none" class="scroll-pane">
      -          <div id="tree-list"></div>
      -        </div><!-- end nav-tree -->
      -      </div><!-- end swapper -->
      -      <div id="nav-swap">
      -      <a class="fullscreen">fullscreen</a>
      -      <a href='#' onclick='swapNav();return false;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a>
      -      </div>
      -    </div> <!-- end devdoc-nav -->
      -    </div> <!-- end side-nav -->
      -    <script type="text/javascript">
      -      // init fullscreen based on user pref
      -      var fullscreen = readCookie("fullscreen");
      -      if (fullscreen != 0) {
      -        if (fullscreen == "false") {
      -          toggleFullscreen(false);
      -        } else {
      -          toggleFullscreen(true);
      -        }
      -      }
      -      // init nav version for mobile
      -      if (isMobile) {
      -        swapNav(); // tree view should be used on mobile
      -        $('#nav-swap').hide();
      -      } else {
      -        chooseDefaultNav();
      -        if ($("#nav-tree").is(':visible')) {
      -          init_default_navtree("<?cs var:toroot ?>");
      -        }
      -      }
      -      // scroll the selected page into view
      -      $(document).ready(function() {
      -        scrollIntoView("packages-nav");
      -        scrollIntoView("classes-nav");
      -        });
      -    </script>
      -<?cs /if ?>
      -    <?cs
      -/def ?>
      -
      -<?cs
      -def:ndk_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs
      -if:guide ?><?cs include:"../../../../frameworks/base/docs/html/ndk/guides/guides_toc.cs" ?><?cs
      -elif:reference ?><?cs include:"../../../../frameworks/base/docs/html/ndk/reference/reference_toc.cs" ?><?cs
      -elif:downloads ?><?cs include:"../../../../frameworks/base/docs/html/ndk/downloads/downloads_toc.cs" ?><?cs
      -elif:samples ?><?cs include:"../../../../frameworks/base/docs/html/ndk/samples/samples_toc.cs" ?><?cs
      -/if ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:header_search_widget() ?>
      -  <div class="dac-header-search" id="search-container">
      -    <div class="dac-header-search-inner">
      -      <div class="dac-sprite dac-search dac-header-search-btn" id="search-btn"></div>
      -      <form class="dac-header-search-form" onsubmit="return submit_search()">
      -        <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
      -          onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
      -          onkeydown="return search_changed(event, true, '<?cs var:toroot ?>')"
      -          onkeyup="return search_changed(event, false, '<?cs var:toroot ?>')"
      -          class="dac-header-search-input" placeholder="Search" />
      -          <a class="dac-header-search-close hide" id="search-close">close</a>
      -      </form>
      -    </div><!-- end dac-header-search-inner -->
      -  </div><!-- end dac-header-search -->
      -
      -  <div class="search_filtered_wrapper">
      -    <div class="suggest-card reference no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -    </div>
      -    <div class="suggest-card develop no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -      <div class="child-card guides no-display">
      -      </div>
      -      <div class="child-card training no-display">
      -      </div>
      -      <div class="child-card samples no-display">
      -      </div>
      -    </div>
      -    <div class="suggest-card design no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -    </div>
      -    <div class="suggest-card distribute no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -    </div>
      -  </div>
      -<?cs /def ?>
      -
      -
      -<?cs
      -def:custom_left_nav() ?><?cs
      -  if:ndk ?><?cs
      -    if:fullpage ?><?cs
      -      call:fullpage() ?><?cs
      -    elif:nonavpage ?><?cs
      -      call:no_nav() ?><?cs
      -    elif:guide || reference || samples || downloads ?><?cs
      -      call:ndk_nav() ?><?cs
      -    else ?><?cs
      -      call:default_left_nav() ?> <?cs
      -    /if ?><?cs
      -  else ?><?cs
      -    if:fullpage ?><?cs
      -      call:fullpage() ?><?cs
      -    elif:nonavpage ?><?cs
      -      call:no_nav() ?><?cs
      -    elif:guide ?><?cs
      -      call:guide_nav() ?><?cs
      -    elif:design ?><?cs
      -      call:design_nav() ?><?cs
      -    elif:training ?><?cs
      -      call:training_nav() ?><?cs
      -    elif:tools ?><?cs
      -      call:tools_nav() ?><?cs
      -    elif:google ?><?cs
      -      call:google_nav() ?><?cs
      -    elif:samples ?><?cs
      -      call:samples_nav() ?><?cs
      -    elif:preview ?><?cs
      -      call:preview_nav() ?><?cs
      -    elif:distribute ?><?cs
      -      if:googleplay ?><?cs
      -        call:googleplay_nav() ?><?cs
      -      elif:essentials ?><?cs
      -        call:essentials_nav() ?><?cs
      -      elif:users ?><?cs
      -        call:users_nav() ?><?cs
      -      elif:engage ?><?cs
      -        call:engage_nav() ?><?cs
      -      elif:monetize ?><?cs
      -        call:monetize_nav() ?><?cs
      -      elif:analyze ?><?cs
      -        call:analyze_nav() ?><?cs
      -      elif:disttools ?><?cs
      -        call:disttools_nav() ?><?cs
      -      elif:stories ?><?cs
      -        call:stories_nav() ?><?cs
      -      /if ?><?cs
      -    elif:about ?><?cs
      -      call:about_nav() ?><?cs
      -    elif:distribute ?><?cs
      -      call:distribute_nav() ?><?cs
      -    elif:wear ?><?cs
      -      call:wear_nav() ?><?cs
      -    else ?><?cs
      -      call:default_left_nav() ?> <?cs
      -    /if ?><?cs
      -  /if ?><?cs
      -/def ?>
      -
      -<?cs # appears at the bottom of every page ?><?cs
      -def:custom_cc_copyright() ?>
      -  Except as noted, this content is
      -  licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
      -  Creative Commons Attribution 2.5</a>. For details and
      -  restrictions, see the <a href="<?cs var:toroot ?>license.html">Content
      -  License</a>.<?cs
      -/def ?>
      -
      -<?cs
      -def:custom_copyright() ?>
      -  Except as noted, this content is licensed under <a
      -  href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
      -  For details and restrictions, see the <a href="<?cs var:toroot ?>license.html">
      -  Content License</a>.<?cs
      -/def ?>
      -
      -<?cs
      -def:custom_footerlinks() ?>
      -  <a href="<?cs var:toroot ?>about/index.html">About Android</a>
      -  <a href="<?cs var:toroot ?>auto/index.html">Auto</a>
      -  <a href="<?cs var:toroot ?>tv/index.html">TV</a>
      -  <a href="<?cs var:toroot ?>wear/index.html">Wear</a>
      -  <a href="<?cs var:toroot ?>legal.html">Legal</a>
      -  <?cs
      -/def ?>
      -
      -<?cs # appears on the right side of the blue bar at the bottom off every page ?><?cs
      -def:custom_buildinfo() ?><?cs
      -  if:!google && !reference.gcm && !reference.gms ?>
      -    Android <?cs var:sdk.version ?>&nbsp;r<?cs var:sdk.rel.id ?> &mdash; <?cs
      -  /if ?>
      -<script src="<?cs var:toroot ?>timestamp.js" type="text/javascript"></script>
      -<script>document.write(BUILD_TIMESTAMP)</script>
      -<?cs /def ?>
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/data.hdf b/tools/droiddoc/templates-sdk-refonly/data.hdf
      deleted file mode 100644
      index 9411b787182..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/data.hdf
      +++ /dev/null
      @@ -1,4 +0,0 @@
      -template {
      -    which = normal
      -}
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/designpage.cs b/tools/droiddoc/templates-sdk-refonly/designpage.cs
      deleted file mode 100644
      index b945a1ce717..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/designpage.cs
      +++ /dev/null
      @@ -1,108 +0,0 @@
      -<!DOCTYPE html>
      -<?cs include:"macros.cs" ?>
      -<html lang="en">
      -  <head>
      -    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      -    <title>
      -      Android Design<?cs if:page.title ?> - <?cs var:page.title ?><?cs /if ?>
      -    </title>
      -    <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
      -    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic">
      -    <link rel="stylesheet" href="<?cs var:toroot ?>assets/yui-3.3.0-reset-min.css">
      -    <link rel="stylesheet" href="<?cs var:toroot ?>assets/design/default.css">
      -    <script src="<?cs var:toroot ?>assets/jquery-1.6.2.min.js"></script>
      -    <script>var SITE_ROOT = '<?cs var:toroot ?>design';</script>
      -    <script src="<?cs var:toroot ?>assets/design/default.js"></script>
      -  </head>
      -  <body class="gc-documentation 
      -    <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    elif:design ?>design<?cs
      -    elif:distribute ?>distribute<?cs
      -    /if ?>" itemscope itemtype="http://schema.org/Article">
      -    <a name="top"></a>
      -
      -    <div id="page-container">
      -
      -      <div id="page-header" itemscope itemtype="http://schema.org/WPHeader"><a href="<?cs var:toroot ?>design/index.html">Android Design</a></div>
      -
      -      <div id="main-row">
      -
      -        <div id="nav-container" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -
      -        <?cs call:design_nav() ?>
      -
      -        </div>
      -
      -        <div id="content">
      -
      -<?cs if:header.hide ?>
      -<?cs else ?>
      -<div class="content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
      -    <?cs if:header.justLinks ?>&nbsp;
      -      <?cs elif:header.title ?><h2><?cs var:header.title ?></h2>
      -                   <?cs else ?><h2><?cs var:page.title ?></h2>
      -    <?cs /if ?>
      -  <div class="paging-links" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -    <a href="#" class="prev-page-link">Previous</a>
      -    <a href="#" class="next-page-link">Next</a>
      -  </div>
      -</div>
      -<?cs /if ?>
      -
      -<?cs call:tag_list(root.descr) ?>
      -
      -<?cs if:footer.hide ?>
      -<?cs else ?>
      -<div class="cols content-footer" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -  <div class="paging-links col-9">&nbsp;</div>
      -  <div class="paging-links col-4">
      -    <a href="#" class="prev-page-link">Previous</a>
      -    <a href="#" class="next-page-link">Next</a>
      -  </div>
      -</div>
      -<?cs /if ?>
      -
      -        </div>
      -
      -      </div>
      -
      -      <div id="page-footer" itemscope itemtype="http://schema.org/WPFooter">
      -
      -        <p id="copyright">
      -          Except as noted, this content is licensed under
      -          <a href="http://creativecommons.org/licenses/by/2.5/">
      -          Creative Commons Attribution 2.5</a>.<br>
      -          For details and restrictions, see the
      -          <a href="http://developer.android.com/license.html">Content License</a>.
      -        </p>
      -
      -        <p>
      -          <a href="http://www.android.com/terms.html">Site Terms of Service</a> &ndash;
      -          <a href="http://www.android.com/privacy.html">Privacy Policy</a> &ndash;
      -          <a href="http://www.android.com/branding.html">Brand Guidelines</a>
      -        </p>
      -
      -      </div>
      -    </div>
      -
      -    <script type="text/javascript">
      -    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
      -    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
      -    </script>
      -    <script type="text/javascript">
      -    var pageTracker = _gat._getTracker("UA-5831155-1");
      -    pageTracker._trackPageview();
      -    </script>
      -
      -<!-- Start of Tag -->
      -<script type="text/javascript">
      -var axel = Math.random() + "";
      -var a = axel * 10000000000000;
      -document.write('<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>');
      -</script>
      -<noscript>
      -<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=1?" width="1" height="1" frameborder="0" style="display:none"></iframe>
      -</noscript>
      -<!-- End of Tag -->
      -  </body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/docpage.cs b/tools/droiddoc/templates-sdk-refonly/docpage.cs
      deleted file mode 100644
      index 0019dfce094..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/docpage.cs
      +++ /dev/null
      @@ -1,203 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation
      -
      -<?cs # add document classes for navigation header selection (and other stuff) ?>
      -<?cs
      -  if:(google || reference.gms || reference.gcm) ?>google <?cs /if ?><?cs
      -  if:ndk ?>ndk<?cs
      -    if:guide ?> guide<?cs /if ?><?cs
      -    if:samples ?> samples<?cs /if ?><?cs
      -    if:reference ?> reference<?cs /if ?><?cs
      -    if:downloads ?> downloads<?cs /if ?><?cs
      -  else ?><?cs
      -    if:(guide||develop||training||reference||tools||sdk||google||samples||preview) ?>develop<?cs
      -      if:guide ?> guide<?cs /if ?><?cs
      -      if:samples ?> samples<?cs /if ?><?cs
      -      if:preview ?> preview<?cs /if ?><?cs
      -    elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?>distribute<?cs
      -      if:googleplay ?> googleplay<?cs /if ?><?cs
      -      if:essentials ?> essentials<?cs /if ?><?cs
      -      if:users ?> users<?cs /if ?><?cs
      -      if:engage ?> engage<?cs /if ?><?cs
      -      if:monetize ?> monetize<?cs /if ?><?cs
      -      if:disttools ?> disttools<?cs /if ?><?cs
      -      if:stories ?> stories<?cs /if ?><?cs
      -      if:analyze ?> analyze<?cs /if ?><?cs
      -    elif:(about||wear||tv||auto) ?>about<?cs
      -    elif:design ?>design<?cs
      -    /if ?><?cs
      -    if:page.trainingcourse ?> trainingcourse<?cs /if ?><?cs
      -/if ?>" itemscope itemtype="http://schema.org/Article"><?cs
      -include:"header.cs" ?>
      -
      -<div <?cs
      -  if:fullpage
      -    ?>class="fullpage"<?cs
      -  elif:(design||tools||about||sdk||googleplay||essentials||users||engage||monetize||disttools||stories) && !nonavpage
      -    ?>class="col-13" id="doc-col"<?cs
      -  elif:!nonavpage
      -    ?>class="col-12" id="doc-col"<?cs /if ?> >
      -
      -<?cs if:(design||training||walkthru) && !page.trainingcourse && !page.article ?><?cs # header logic for docs that provide previous/next buttons ?>
      -  <?cs if:header.hide ?>
      -  <?cs else ?>
      -  <div class="content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
      -      <?cs if:header.justLinks ?>&nbsp;
      -      <?cs else ?><h1 itemprop="name"><?cs var:page.title ?></h1>
      -      <?cs /if ?>
      -    <?cs if:training ?>
      -      <div class="training-nav-top" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -        <a href="#" class="prev-page-link hide"
      -            zh-tw-lang="上一堂課"
      -            zh-cn-lang="上一课"
      -            ru-lang="Предыдущий"
      -            ko-lang="이전"
      -            ja-lang="前へ"
      -            es-lang="Anterior"
      -            >Previous</a>
      -        <a href="#" class="next-page-link hide"
      -            zh-tw-lang="下一堂課"
      -            zh-cn-lang="下一课"
      -            ru-lang="Следующий"
      -            ko-lang="다음"
      -            ja-lang="次へ"
      -            es-lang="Siguiente"
      -            >Next</a>
      -        <a href="#" class="start-class-link hide"
      -            zh-tw-lang="開始上課"
      -            zh-cn-lang="开始"
      -            ru-lang="Начало работы"
      -            ko-lang="시작하기"
      -            ja-lang="開始する"
      -            es-lang="Empezar"
      -            >Get started</a>
      -      </div>
      -    <?cs elif:!page.trainingcourse ?>
      -      <div class="paging-links" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -        <a href="#" class="prev-page-link hide"
      -            zh-tw-lang="上一堂課"
      -            zh-cn-lang="上一课"
      -            ru-lang="Предыдущий"
      -            ko-lang="이전"
      -            ja-lang="前へ"
      -            es-lang="Anterior"
      -            >Previous</a>
      -        <a href="#" class="next-page-link hide"
      -            zh-tw-lang="下一堂課"
      -            zh-cn-lang="下一课"
      -            ru-lang="Следующий"
      -            ko-lang="다음"
      -            ja-lang="次へ"
      -            es-lang="Siguiente"
      -            >Next</a>
      -      </div>
      -    <?cs /if ?><?cs # end if training ?>
      -  </div>
      -  <?cs /if ?><?cs # end if header.hide ?>
      -
      -<?cs elif:samplesProjectIndex ?>
      -  <div id="api-info-block">
      -  <div class="sum-details-links">
      -  Overview
      -  &#124; <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/project.html">Project</a>
      -  &#124; <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip">Download</a>
      -  </div><!-- end sum-details-links -->
      -  </div><!-- end breadcurmb block -->
      -  <h1 itemprop="name"><?cs var:projectDir ?></h1>
      -
      -<?cs else ?>
      -  <?cs if:training ?>
      -<?cs # horrible horrible hack to move TOC up when the next/prev links are not there ?>
      -<style>
      -  #tb-wrapper {
      -    margin-top:6px;
      -  }
      -</style>
      -  <?cs /if ?>
      -
      -  <?cs if:(!fullpage && !header.hide) ?>
      -    <?cs if:page.landing ?><?cs # header logic for docs that are landing pages ?>
      -      <div class="landing-banner">
      -        <?cs if:page.landing.image ?><?cs # use two-column layout only if there is an image ?>
      -        <div class="cols">
      -          <div class="col-6">
      -            <img src="<?cs var:toroot ?><?cs var:page.landing.image ?>" alt="" />
      -          </div>
      -          <div class="col-6">
      -        <?cs /if ?>
      -          <h1 itemprop="name" style="margin-bottom:0;"><?cs var:page.title ?></h1>
      -          <p itemprop="description"><?cs var:page.landing.intro ?></p>
      -
      -          <p><a class="next-page-link topic-start-link"></a></p>
      -        <?cs if:page.landing.image ?>
      -          </div>
      -        </div>
      -        <?cs /if ?>
      -      </div>
      -    <?cs else ?>
      -      <?cs if:tab1 ?><div id="title-tabs-wrapper"><?cs /if ?>
      -        <h1 itemprop="name" <?cs if:tab1 ?>class="with-title-tabs"<?cs /if ?>><?cs var:page.title ?></h1><?cs
      -          if:tab1 ?><ul id="title-tabs">
      -              <li class="selected"><a href="<?cs var:tab1.link ?>"><?cs var:tab1 ?></a></li>
      -              <?cs if:tab2 ?>
      -              <li><a href="<?cs var:tab2.link ?>"><?cs var:tab2 ?></a></li><?cs /if ?>
      -              <?cs if:tab3 ?>
      -              <li><a href="<?cs var:tab3.link ?>"><?cs var:tab3 ?></a></li><?cs /if ?>
      -            </ul>
      -          <?cs /if ?>
      -      <?cs if:tab1 ?></div><!-- end tab-wrapper --><?cs /if ?>
      -    <?cs /if ?>
      -  <?cs /if ?>
      -<?cs /if ?><?cs # end if design ?>
      -
      -  <?cs # THIS IS THE MAIN DOC CONTENT ?>
      -  <div id="jd-content">
      -
      -
      -    <div class="jd-descr" itemprop="articleBody">
      -    <?cs call:tag_list(root.descr) ?>
      -    </div>
      -
      -    <?cs if:!fullscreen && (design||training||walkthru) && !page.landing && !page.trainingcourse && !footer.hide ?>
      -      <div class="content-footer <?cs
      -                    if:fullpage ?>wrap<?cs /if ?>"
      -                    itemscope itemtype="http://schema.org/SiteNavigationElement">
      -          <div class="paging-links">
      -            <a href="#" class="next-page-link hide"
      -                zh-tw-lang="下一堂課"
      -                zh-cn-lang="下一课"
      -                ru-lang="Следующий"
      -                ko-lang="다음"
      -                ja-lang="次へ"
      -                es-lang="Siguiente"
      -                >Next</a>
      -            <a href="#" class="start-class-link hide"
      -                zh-tw-lang="開始上課"
      -                zh-cn-lang="开始"
      -                ru-lang="Начало работы"
      -                ko-lang="시작하기"
      -                ja-lang="開始する"
      -                es-lang="Empezar"
      -                >Get started</a>
      -            <a href="#" class="next-class-link hide">Next class</a>
      -          </div>
      -      </div>
      -    <?cs /if ?>
      -
      -  </div> <!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -  <script src="https://developer.android.com/ytblogger_lists_unified.js?v=17" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_lists_unified.js?v=17" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_extras.js?v=17" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_collections.js?v=17" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_tag_helpers.js?v=17" type="text/javascript"></script>
      -
      -</body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/footer.cs b/tools/droiddoc/templates-sdk-refonly/footer.cs
      deleted file mode 100644
      index 666f594ceaf..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/footer.cs
      +++ /dev/null
      @@ -1,174 +0,0 @@
      -<div class="wrap">
      -  <div class="dac-footer<?cs if:fullpage ?> dac-landing<?cs /if ?>">
      -    <div class="cols dac-footer-main">
      -      <div class="col-1of2">
      -        <a class="dac-footer-getnews" data-modal-toggle="newsletter" href="javascript:;">Get news &amp; tips <span
      -          class="dac-fab dac-primary"><i class="dac-sprite dac-mail"></i></span></a>
      -      </div>
      -      <div class="col-1of2 dac-footer-reachout">
      -        <div class="dac-footer-contact">
      -          <a class="dac-footer-contact-link" href="http://android-developers.blogspot.com/">Blog</a>
      -          <a class="dac-footer-contact-link" href="/support.html">Support</a>
      -        </div>
      -        <div class="dac-footer-social">
      -          <a class="dac-fab dac-footer-social-link" href="https://www.youtube.com/user/androiddevelopers"><i class="dac-sprite dac-youtube"></i></a>
      -          <a class="dac-fab dac-footer-social-link" href="https://plus.google.com/+AndroidDevelopers"><i class="dac-sprite dac-gplus"></i></a>
      -          <a class="dac-fab dac-footer-social-link" href="https://twitter.com/AndroidDev"><i class="dac-sprite dac-twitter"></i></a>
      -        </div>
      -      </div>
      -    </div>
      -
      -    <hr class="dac-footer-separator"/>
      -
      -    <?cs if:reference ?>
      -      <p class="dac-footer-copyright">
      -        <?cs call:custom_copyright() ?>
      -      </p>
      -      <p class="dac-footer-build">
      -        <?cs call:custom_buildinfo() ?>
      -      </p>
      -    <?cs elif:!hide_license_footer ?>
      -      <p class="dac-footer-copyright">
      -        <?cs call:custom_cc_copyright() ?>
      -      </p>
      -    <?cs /if ?>
      -
      -    <p class="dac-footer-links">
      -      <a href="/about/index.html">About Android</a>
      -      <a href="/auto/index.html">Auto</a>
      -      <a href="/tv/index.html">TV</a>
      -      <a href="/wear/index.html">Wear</a>
      -      <a href="/legal.html">Legal</a>
      -
      -      <span id="language" class="locales">
      -        <select name="language" onchange="changeLangPref(this.value, true)">
      -          <option value="en" selected="selected">English</option>
      -          <option value="es">Español</option>
      -          <option value="in">Bahasa Indonesia</option>
      -          <option value="ja">日本語</option>
      -          <option value="ko">한국어</option>
      -          <option value="pt-br">Português Brasileiro</option>
      -          <option value="ru">Русский</option>
      -          <option value="vi">tiếng Việt</option>
      -          <option value="zh-cn">中文(简体)</option>
      -          <option value="zh-tw">中文(繁體)</option>
      -        </select>
      -      </span>
      -    </p>
      -  </div>
      -</div> <!-- end footer -->
      -
      -<div data-modal="newsletter" data-newsletter data-swap class="dac-modal newsletter">
      -  <div class="dac-modal-container">
      -    <div class="dac-modal-window">
      -      <header class="dac-modal-header">
      -        <button class="dac-modal-header-close" data-modal-toggle><i class="dac-sprite dac-close"></i></button>
      -        <div class="dac-swap" data-swap-container>
      -          <section class="dac-swap-section dac-active dac-down">
      -            <h2 class="norule dac-modal-header-title">Get the latest Android developer news and tips that will help you find success on Google Play.</h2>
      -            <p class="dac-modal-header-subtitle">&#42; Required Fields</p>
      -          </section>
      -          <section class="dac-swap-section dac-up">
      -            <h2 class="norule dac-modal-header-title">Hooray!</h2>
      -          </section>
      -        </div>
      -      </header>
      -      <div class="dac-swap" data-swap-container>
      -        <section class="dac-swap-section dac-active dac-left">
      -          <form action="https://docs.google.com/forms/d/1QgnkzbEJIDu9lMEea0mxqWrXUJu0oBCLD7ar23V0Yys/formResponse" class="dac-form" method="post" target="dac-newsletter-iframe">
      -            <section class="dac-modal-content">
      -              <fieldset class="dac-form-fieldset">
      -                <div class="cols">
      -                  <div class="col-1of2 newsletter-leftCol">
      -                    <div class="dac-form-input-group">
      -                      <label for="newsletter-full-name" class="dac-form-floatlabel">Full name</label>
      -                      <input type="text" class="dac-form-input" name="entry.1357890476" id="newsletter-full-name" required>
      -                      <span class="dac-form-required">*</span>
      -                    </div>
      -                    <div class="dac-form-input-group">
      -                      <label for="newsletter-email" class="dac-form-floatlabel">Email address</label>
      -                      <input type="email" class="dac-form-input" name="entry.472100832" id="newsletter-email" required>
      -                      <span class="dac-form-required">*</span>
      -                    </div>
      -                  </div>
      -                  <div class="col-1of2 newsletter-rightCol">
      -                    <div class="dac-form-input-group">
      -                      <label for="newsletter-company" class="dac-form-floatlabel">Company / developer name</label>
      -                      <input type="text" class="dac-form-input" name="entry.1664780309" id="newsletter-company">
      -                    </div>
      -                    <div class="dac-form-input-group">
      -                      <label for="newsletter-play-store" class="dac-form-floatlabel">One of your Play Store app URLs</label>
      -                      <input type="url" class="dac-form-input" name="entry.47013838" id="newsletter-play-store" required>
      -                      <span class="dac-form-required">*</span>
      -                    </div>
      -                  </div>
      -                </div>
      -              </fieldset>
      -              <fieldset class="dac-form-fieldset">
      -                <div class="cols">
      -                  <div class="col-1of2 newsletter-leftCol">
      -                    <legend class="dac-form-legend">Which best describes your business:<span class="dac-form-required">*</span>
      -                    </legend>
      -                    <div class="dac-form-radio-group">
      -                      <input type="radio" value="Apps" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-app" required>
      -                      <label for="newsletter-business-type-app" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-app" class="dac-form-label">Apps</label>
      -                    </div>
      -                    <div class="dac-form-radio-group">
      -                      <input type="radio" value="Games" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-games" required>
      -                      <label for="newsletter-business-type-games" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-games" class="dac-form-label">Games</label>
      -                    </div>
      -                    <div class="dac-form-radio-group">
      -                      <input type="radio" value="Apps and Games" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-appsgames" required>
      -                      <label for="newsletter-business-type-appsgames" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-appsgames" class="dac-form-label">Apps &amp; Games</label>
      -                    </div>
      -                  </div>
      -                  <div class="col-1of2 newsletter-rightCol newsletter-checkboxes">
      -                    <div class="dac-form-radio-group">
      -                      <div class="dac-media">
      -                        <div class="dac-media-figure">
      -                          <input type="checkbox" class="dac-form-checkbox" name="entry.732309842" id="newsletter-add" required value="Add me to the mailing list for the monthly newsletter and occasional emails about development and Google Play opportunities.">
      -                          <label for="newsletter-add" class="dac-form-checkbox-button"></label>
      -                        </div>
      -                        <div class="dac-media-body">
      -                          <label for="newsletter-add" class="dac-form-label dac-form-aside">Add me to the mailing list for the monthly newsletter and occasional emails about development and Google Play opportunities.<span class="dac-form-required">*</span></label>
      -                        </div>
      -                      </div>
      -                    </div>
      -                    <div class="dac-form-radio-group">
      -                      <div class="dac-media">
      -                        <div class="dac-media-figure">
      -                          <input type="checkbox" class="dac-form-checkbox" name="entry.2045036090" id="newsletter-terms" required value="I acknowledge that the information provided in this form will be subject to Google's privacy policy (https://www.google.com/policies/privacy/).">
      -                          <label for="newsletter-terms" class="dac-form-checkbox-button"></label>
      -                        </div>
      -                        <div class="dac-media-body">
      -                          <label for="newsletter-terms" class="dac-form-label dac-form-aside">I acknowledge that the information provided in this form will be subject to <a href="https://www.google.com/policies/privacy/">Google's privacy policy</a>.<span class="dac-form-required">*</span></label>
      -                        </div>
      -                      </div>
      -                    </div>
      -                  </div>
      -                </div>
      -              </fieldset>
      -            </section>
      -            <footer class="dac-modal-footer">
      -              <div class="cols">
      -                <div class="col-2of5">
      -                </div>
      -              </div>
      -              <button type="submit" value="Submit" class="dac-fab dac-primary dac-large dac-modal-action"><i class="dac-sprite dac-arrow-right"></i></button>
      -            </footer>
      -          </form>
      -        </section>
      -        <section class="dac-swap-section dac-right">
      -          <div class="dac-modal-content">
      -            <p class="newsletter-success-message">
      -              You have successfully signed up for the latest Android developer news and tips.
      -            </p>
      -          </div>
      -        </section>
      -      </div>
      -    </div>
      -  </div>
      -</div> <!-- end footer -->
      diff --git a/tools/droiddoc/templates-sdk-refonly/gcm_navtree_data.cs b/tools/droiddoc/templates-sdk-refonly/gcm_navtree_data.cs
      deleted file mode 100644
      index 6f33d8850be..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/gcm_navtree_data.cs
      +++ /dev/null
      @@ -1,3 +0,0 @@
      -var GCM_NAVTREE_DATA =
      -<?cs var:reference_tree ?>
      -;
      diff --git a/tools/droiddoc/templates-sdk-refonly/gms_navtree_data.cs b/tools/droiddoc/templates-sdk-refonly/gms_navtree_data.cs
      deleted file mode 100644
      index 66b7d553fb3..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/gms_navtree_data.cs
      +++ /dev/null
      @@ -1,3 +0,0 @@
      -var GMS_NAVTREE_DATA =
      -<?cs var:reference_tree ?>
      -;
      diff --git a/tools/droiddoc/templates-sdk-refonly/head_tag.cs b/tools/droiddoc/templates-sdk-refonly/head_tag.cs
      deleted file mode 100644
      index 100b0bcf703..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/head_tag.cs
      +++ /dev/null
      @@ -1,101 +0,0 @@
      -<head>
      -<?cs
      -  ####### If building devsite, add some meta data needed for when generating the top nav ######### ?>
      -<?cs
      -  if:devsite ?><?cs
      -    if:guide||develop||training||reference||tools||sdk||google||samples
      -      ?><meta name="top_category" value="develop" /><?cs
      -    elif:google
      -      ?><meta name="top_category" value="google" /><?cs
      -    elif:reference && !(reference.gms || reference.gcm)
      -      ?><meta name="top_category" value="css-fullscreen" /><?cs
      -    /if ?>
      -  <?cs
      -  /if
      -?><?cs
      -  # END if/else devsite ?>
      -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      -<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
      -<meta content="IE=edge" http-equiv="X-UA-Compatible">
      -<?cs
      -  if:page.metaDescription ?>
      -<meta name="Description" content="<?cs var:page.metaDescription ?>"><?cs
      -  /if ?>
      -<link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>favicon.ico" />
      -<link rel="alternate" href="http://developer.android.com/<?cs var:path.canonical ?>" hreflang="en" />
      -<link rel="alternate" href="http://developer.android.com/intl/es/<?cs var:path.canonical ?>" hreflang="es" />
      -<link rel="alternate" href="http://developer.android.com/intl/id/<?cs var:path.canonical ?>" hreflang="id" />
      -<link rel="alternate" href="http://developer.android.com/intl/ja/<?cs var:path.canonical ?>" hreflang="ja" />
      -<link rel="alternate" href="http://developer.android.com/intl/ko/<?cs var:path.canonical ?>" hreflang="ko" />
      -<link rel="alternate" href="http://developer.android.com/intl/pt-br/<?cs var:path.canonical ?>" hreflang="pt-br" />
      -<link rel="alternate" href="http://developer.android.com/intl/ru/<?cs var:path.canonical ?>" hreflang="ru" />
      -<link rel="alternate" href="http://developer.android.com/intl/vi/<?cs var:path.canonical ?>" hreflang="vi" />
      -<link rel="alternate" href="http://developer.android.com/intl/zh-cn/<?cs var:path.canonical ?>" hreflang="zh-cn" />
      -<link rel="alternate" href="http://developer.android.com/intl/zh-tw/<?cs var:path.canonical ?>" hreflang="zh-tw" />
      -
      -<title><?cs
      -  if:page.title ?><?cs
      -    var:page.title ?> | <?cs
      -  /if ?>Android Developers</title>
      -
      -<!-- STYLESHEETS -->
      -<link rel="stylesheet"
      -href="<?cs
      -if:android.whichdoc != 'online' ?>http:<?cs
      -/if ?>//fonts.googleapis.com/css?family=Roboto+Condensed">
      -<link rel="stylesheet" href="<?cs
      -if:android.whichdoc != 'online' ?>http:<?cs
      -/if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
      -  title="roboto">
      -<?cs 
      -  if:ndk ?><link rel="stylesheet" href="<?cs
      -  if:android.whichdoc != 'online' ?>http:<?cs
      -  /if ?>//fonts.googleapis.com/css?family=Roboto+Mono:400,500,700" title="roboto-mono" type="text/css"><?cs
      -/if ?>
      -<link href="<?cs var:toroot ?>assets/css/default.css?v=17" rel="stylesheet" type="text/css">
      -
      -<?cs if:reference && !(reference.gms || reference.gcm || preview) ?>
      -<!-- FULLSCREEN STYLESHEET -->
      -<link href="<?cs var:toroot ?>assets/css/fullscreen.css" rel="stylesheet" class="fullscreen"
      -type="text/css">
      -<?cs /if ?>
      -
      -<!-- JAVASCRIPT -->
      -<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script>
      -<?cs
      -if:devsite
      -  ?><script src="<?cs var:toroot ?>_static/js/android_3p-bundle.js" type="text/javascript"></script><?cs
      -else
      -  ?><script src="<?cs var:toroot ?>assets/js/android_3p-bundle.js" type="text/javascript"></script><?cs
      -/if ?><?cs
      -  if:page.customHeadTag ?>
      -<?cs var:page.customHeadTag ?><?cs
      -  /if ?>
      -<script type="text/javascript">
      -  var toRoot = "<?cs var:toroot ?>";
      -  var metaTags = [<?cs var:meta.tags ?>];
      -  var devsite = <?cs if:devsite ?>true<?cs else ?>false<?cs /if ?>;
      -  var useUpdatedTemplates = <?cs if:useUpdatedTemplates ?>true<?cs else ?>false<?cs /if ?>;
      -</script>
      -<script src="<?cs var:toroot ?>assets/js/docs.js?v=17" type="text/javascript"></script>
      -
      -<?cs if:helpoutsWidget ?>
      -<script type="text/javascript" src="https://helpouts.google.com/ps/res/embed.js" defer async
      -    data-helpouts-embed data-helpouts-vertical="programming"
      -    data-helpouts-tags="<?cs var:page.tags ?>" data-helpouts-prefix="android"
      -    data-helpouts-standalone="true"></script>
      -<?cs /if ?>
      -
      -<script>
      -  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      -  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      -  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      -  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
      -
      -  ga('create', 'UA-5831155-1', 'android.com');
      -  ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'});  // New tracker);
      -  ga('send', 'pageview');
      -  ga('universal.send', 'pageview'); // Send page view for new tracker.
      -</script>
      -
      -</head>
      diff --git a/tools/droiddoc/templates-sdk-refonly/header.cs b/tools/droiddoc/templates-sdk-refonly/header.cs
      deleted file mode 100644
      index e8301bed93d..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/header.cs
      +++ /dev/null
      @@ -1,3 +0,0 @@
      -<?cs call:custom_masthead() ?>
      -<?cs call:custom_left_nav() ?>
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/header_tabs.cs b/tools/droiddoc/templates-sdk-refonly/header_tabs.cs
      deleted file mode 100644
      index 38c9da80fc4..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/header_tabs.cs
      +++ /dev/null
      @@ -1,2 +0,0 @@
      -
      -<!-- CURRENTLY NOT USED... ALL TABS ARE IN masthead.cs -->
      diff --git a/tools/droiddoc/templates-sdk-refonly/jd_lists_unified.cs b/tools/droiddoc/templates-sdk-refonly/jd_lists_unified.cs
      deleted file mode 100644
      index 417a5c1b2ef..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/jd_lists_unified.cs
      +++ /dev/null
      @@ -1 +0,0 @@
      -<?cs var:reference_tree ?>
      diff --git a/tools/droiddoc/templates-sdk-refonly/macros_override.cs b/tools/droiddoc/templates-sdk-refonly/macros_override.cs
      deleted file mode 100644
      index 08c0de1ce14..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/macros_override.cs
      +++ /dev/null
      @@ -1,41 +0,0 @@
      -<?cs # Create a comma separated list of annotations on obj that were in showAnnotations in Doclava ?>
      -<?cs # pre is an HTML string to start the list, post is an HTML string to close the list ?>
      -<?cs # for example call:show_annotations_list(cl, "<td>Annotations: ", "</td>") ?>
      -<?cs # if obj has nothing on obj.showAnnotations, nothing will be output ?>
      -<?cs def:show_annotations_list(obj) ?>
      -    <?cs each:anno = obj.showAnnotations ?>
      -      <?cs if:first(anno) ?>
      -        <span class='annotation-message'>
      -          Included in documentation by the annotations:
      -      <?cs /if ?>
      -      @<?cs var:anno.type.label ?>
      -      <?cs if:last(anno) == 0 ?>
      -        , &nbsp;
      -      <?cs /if ?>
      -      <?cs if:last(anno)?>
      -        </span>
      -      <?cs /if ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs # Override default class_link_table to display annotations ?>
      -<?cs def:class_link_table(classes) ?>
      -  <?cs set:count = #1 ?>
      -  <table class="jd-sumtable-expando">
      -    <?cs each:cl=classes ?>
      -      <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.type.since ?>" >
      -        <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(cl) ?>&nbsp;
      -          <?cs call:show_annotations_list(cl) ?>
      -        </td>
      -      </tr>
      -      <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      -  </table>
      -<?cs /def ?>
      -
      -
      -<?cs def:doc_root_override()
      -  ?>https://developer.android.com/<?cs
      -/def ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk-refonly/navtree_data.cs b/tools/droiddoc/templates-sdk-refonly/navtree_data.cs
      deleted file mode 100644
      index 73aa19963d6..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/navtree_data.cs
      +++ /dev/null
      @@ -1,3 +0,0 @@
      -var NAVTREE_DATA =
      -<?cs var:reference_tree ?>
      -;
      diff --git a/tools/droiddoc/templates-sdk-refonly/nosidenavpage.cs b/tools/droiddoc/templates-sdk-refonly/nosidenavpage.cs
      deleted file mode 100644
      index 61754f05b54..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/nosidenavpage.cs
      +++ /dev/null
      @@ -1,28 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation 
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/Article">
      -<a name="top"></a>
      -<?cs call:custom_masthead() ?>
      -
      -<div id="body-content">
      -<div>
      -<div id="doc-content" style="position:relative;">
      -
      -<?cs call:tag_list(root.descr) ?>
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      -
      -
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/package.cs b/tools/droiddoc/templates-sdk-refonly/package.cs
      deleted file mode 100644
      index 72d5538ad52..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/package.cs
      +++ /dev/null
      @@ -1,66 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<?cs include:"macros_override.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>">
      -  <div id="doc-api-level" class="<?cs var:package.since ?>" style="display:none"></div>
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -<div class="col-12" id="doc-col">
      -
      -<div id="api-info-block">
      -<div class="api-level">
      -  <?cs call:since_tags(package) ?>
      -  <?cs call:federated_refs(package) ?>
      -</div>
      -</div>
      -
      -<div id="jd-header">
      -  package
      -  <h1><?cs var:package.name ?></h1>
      -</div><!-- end header -->
      -
      -<div id="naMessage"></div>
      -
      -<div id="jd-content" class="api apilevel-<?cs var:package.since ?>">
      -
      -<?cs if:subcount(package.descr) ?>
      -  <div class="jd-descr">
      -    <?cs call:tag_list(package.descr) ?>
      -  </div>
      -<?cs /if ?>
      -
      -<?cs def:class_table(label, classes) ?>
      -  <?cs if:subcount(classes) ?>
      -    <h2><?cs var:label ?></h2>
      -    <div class="jd-sumtable">
      -    <?cs call:class_link_table(classes) ?>
      -    </div>
      -  <?cs /if ?>
      -<?cs /def ?>
      -
      -<?cs call:class_table("Annotations", package.annotations) ?>
      -<?cs call:class_table("Interfaces", package.interfaces) ?>
      -<?cs call:class_table("Classes", package.classes) ?>
      -<?cs call:class_table("Enums", package.enums) ?>
      -<?cs call:class_table("Exceptions", package.exceptions) ?>
      -<?cs call:class_table("Errors", package.errors) ?>
      -
      -</div><!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/packages.cs b/tools/droiddoc/templates-sdk-refonly/packages.cs
      deleted file mode 100644
      index fe6a5aa64a0..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/packages.cs
      +++ /dev/null
      @@ -1,46 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>">
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -<div class="col-12" id="doc-col">
      -
      -<div id="jd-header">
      -<h1><?cs var:page.title ?></h1>
      -</div>
      -
      -<div id="jd-content">
      -
      -<div class="jd-descr">
      -<p><?cs call:tag_list(root.descr) ?></p>
      -</div>
      -
      -<?cs set:count = #1 ?>
      -<table class="jd-sumtable">
      -<?cs each:pkg = docs.packages ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:pkg.since ?>" >
      -        <td class="jd-linkcol"><?cs call:package_link(pkg) ?></td>
      -        <td class="jd-descrcol" width="100%"><?cs call:tag_list(pkg.shortDescr) ?></td>
      -    </tr>
      -<?cs set:count = count + #1 ?>
      -<?cs /each ?>
      -</table>
      -
      -</div><!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div> <!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      diff --git a/tools/droiddoc/templates-sdk-refonly/sample.cs b/tools/droiddoc/templates-sdk-refonly/sample.cs
      deleted file mode 100644
      index 7b4bf0f88e4..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/sample.cs
      +++ /dev/null
      @@ -1,151 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation develop samples" itemscope itemtype="http://schema.org/Article">
      -<?cs include:"header.cs" ?>
      -
      -<div <?cs if:fullpage
      -?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute
      -?>class="col-13" id="doc-col"<?cs else
      -?>class="col-12" id="doc-col"<?cs /if ?> >
      -
      -<!-- start breadcrumb block -->
      -<div id="api-info-block">
      -  <div class="sum-details-links">
      -
      -  <!-- related links -->
      -  <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/index.html">Overview</a>
      -  &#124; <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/project.html">Project</a>
      -  &#124; <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip"
      -    onclick="ga('send', 'event', 'Samples', 'Download', <?cs var:projectDir ?>);"
      -    >Download</a>
      -
      -</div><!-- end sum-details-links -->
      -
      -</div><!-- end breadcurmb block -->
      -
      -<div id="jd-header" style="border:0;">
      -
      -<div id="pathCrumb">
      -<?cs each:item = parentdirs ?>
      -  <?cs if:LinkifyPathCrumb
      -    ?><a href="<?cs var:toroot ?><?cs var:item.Link ?>"><?cs var:item.Name ?></a> / 
      -  <?cs else
      -    ?><?cs var:item.Name ?> / <?cs /if ?>
      -<?cs /each ?>
      -</div>
      -
      -  <h1 itemprop="name"><?cs var:page.title ?></h1>
      -</div>
      -<!-- end breadcrumb block -->
      -
      -
      -<?cs # THIS IS THE MAIN DOC CONTENT ?>
      -<div id="jd-content">
      -
      -<?cs if:android.whichdoc == "online" ?>
      -
      -<?cs # If this is the online docs, build the src code navigation links ?>
      -
      -
      -<?cs var:summary ?>
      -
      -<!-- begin file contents -->
      -
      -<?cs # embed image/videos if below maxsize (show message otherwise), else display source code ?>
      -<?cs if:resType == "img" ?>
      -  <div id="codesample-resource"
      -    <?cs if:noDisplay ?>
      -      class="noDisplay"><div class="noDisplay-message"></div>
      -    <?cs else ?>
      -      ><img src="<?cs var:realFile ?>" title="<?cs var:page.title ?>">
      -    <?cs /if ?>
      -  </div>
      -<?cs elif:resType == "video" ?>
      -  <div id="codesample-resource"
      -    <?cs if:noDisplay ?>
      -      class="noDisplay"><div class="noDisplay-message"></div>
      -    <?cs else ?>
      -      ><video class="play-on-hover" controls style="border:1px solid #ececec;background-color:#f9f9f9;" poster="">
      -        <source src="<?cs var:page.title ?>">
      -      </video>
      -    <?cs /if ?>
      -  </div>
      -<?cs else ?>
      -  <div id="codesample-wrapper">
      -    <pre id="codesample-line-numbers" class="no-pretty-print hidden"></pre>
      -    <pre id="codesample-block"><?cs var:fileContents ?></pre>
      -  </div>
      -  <script type="text/javascript">
      -  initCodeLineNumbers();
      -  </script>
      -<?cs /if ?>
      -
      -<!-- end file contents -->
      -
      -<?cs else ?><?cs
      -  # else, this means it's offline docs,
      -          so don't show src links (we dont have the pages!) ?>
      -
      -<?cs /if ?><?cs # end if/else online docs ?>
      -
      -      <div class="content-footer <?cs
      -                    if:fullpage ?>wrap<?cs
      -                    else ?>cols<?cs /if ?>"
      -                    itemscope itemtype="http://schema.org/SiteNavigationElement">
      -        <div class="<?cs
      -                    if:fullpage ?>col-16<?cs
      -                    elif:training||guide ?>col-8<?cs
      -                    else ?>col-9<?cs /if ?>" style="padding-top:4px">
      -          <?cs if:!page.noplus ?><?cs if:fullpage ?><style>#___plusone_0 {float:right !important;}</style><?cs /if ?>
      -            <div class="g-plusone" data-size="medium"></div>
      -          <?cs /if ?>
      -        </div>
      -        <?cs if:!fullscreen ?>
      -        <div class="paging-links col-4">
      -          <?cs if:(design||training||walkthru) && !page.landing && !page.trainingcourse && !footer.hide ?>
      -            <a href="#" class="prev-page-link hide"
      -                zh-tw-lang="上一堂課"
      -                zh-cn-lang="上一课"
      -                ru-lang="Предыдущий"
      -                ko-lang="이전"
      -                ja-lang="前へ"
      -                es-lang="Anterior"
      -                >Previous</a>
      -            <a href="#" class="next-page-link hide"
      -                zh-tw-lang="下一堂課"
      -                zh-cn-lang="下一课"
      -                ru-lang="Следующий"
      -                ko-lang="다음"
      -                ja-lang="次へ"
      -                es-lang="Siguiente"
      -                >Next</a>
      -          <?cs /if ?>
      -        </div>
      -        <?cs /if ?>
      -      </div>
      -
      -      <?cs # for training classes, provide a different kind of link when the next page is a different class ?>
      -      <?cs if:training && !page.article ?>
      -      <div class="content-footer next-class" style="display:none" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -          <a href="#" class="next-class-link hide">Next class: </a>
      -      </div>
      -      <?cs /if ?>
      -
      -  </div> <!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      -
      -
      -
      -
      -
      -
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/sampleindex.cs b/tools/droiddoc/templates-sdk-refonly/sampleindex.cs
      deleted file mode 100644
      index e62d3fe9de5..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/sampleindex.cs
      +++ /dev/null
      @@ -1,136 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation develop samples" itemscope itemtype="http://schema.org/Article">
      -<?cs include:"header.cs" ?>
      -
      -<div <?cs if:fullpage
      -?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute
      -?>class="col-13" id="doc-col"<?cs else 
      -?>class="col-12" id="doc-col"<?cs /if ?> >
      -
      -<!-- start breadcrumb block -->
      -<div id="api-info-block">
      -<div class="sum-details-links">
      -
      -<!-- related links -->
      -<?cs if:projectStructure ?>
      -<a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/index.html">Overview</a>
      -&#124; Project<?cs else ?>Overview
      -&#124; <a href="<?cs var:toroot ?>samples/<?cs var:projectDir ?>/project.html">Project</a>
      -<?cs /if ?>
      -&#124; <a href="<?cs var:toroot ?>downloads/samples/<?cs var:projectDir ?>.zip"
      -    onclick="ga('send', 'event', 'Samples', 'Download', <?cs var:projectDir ?>);"
      -    >Download</a>
      -
      -</div><!-- end sum-details-links -->
      -
      -</div><!-- end breadcurmb block -->
      -
      -<h1 itemprop="name"><?cs var:projectDir ?></h1>
      -  
      -<div id="jd-content">
      -<?cs def:display_files(files) ?>
      -
      -    <?cs each:file = files ?>
      -        <?cs if:file.Type != "dir" ?>
      -            <div class="structure-<?cs var:file.Type ?>">
      -            <a href="<?cs var:toroot ?><?cs var:file.Href ?>"><?cs var:file.Name ?></a>
      -            </div>
      -        <?cs else ?>
      -            <div class="toggle-content opened structure-dir">
      -               <a href="#" onclick="return toggleContent(this)">
      -               <img src="<?cs var:toroot ?>assets/images/triangle-opened.png"
      -                  class="toggle-content-img structure-toggle-img" height="9px" width="9px" />
      -               <?cs var:file.Name ?></a><?cs 
      -                  if:file.SummaryFlag == "true" ?><span class="dirInfo"
      -                    >[&nbsp;<a href="file.SummaryHref">Info</a>&nbsp;]</a></span><?cs 
      -                  /if ?>
      -               <div class="toggle-content-toggleme structure-toggleme"> 
      -            <?cs if:file.Sub.0.Name ?>
      -                 <?cs call:display_files(file.Sub) ?>
      -            <?cs /if ?>
      -               </div> <?cs # /toggleme ?>
      -            </div> <?cs # /toggle-content ?>
      -         <?cs /if ?>
      -    <?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs if:android.whichdoc == "online" ?>
      -  <?cs # If this is the online docs, build the src code navigation links ?>
      -
      -  <?cs if:projectStructure ?>
      -
      -    <?cs call:display_files(Files) ?>
      -
      -  <?cs else ?> <?cs # else not project structure doc ?>
      -
      -    <?cs var:summary ?>
      -
      -    <?cs # Remove project structure from landing pages for now
      -         # <h2>Project Structure</h2>
      -         # <p>Decide what to do with this ...</p>
      -         # <?cs call:display_files(Files) ?>
      -
      -  <?cs /if ?> <?cs # end if projectStructure ?>
      -
      -<?cs else ?><?cs
      -  # else, this means it's offline docs,
      -          so don't show src links (we dont have the pages!) ?>
      -
      -<?cs /if ?><?cs # end if/else online docs ?>
      -      <div class="content-footer <?cs
      -                    if:fullpage ?>wrap<?cs
      -                    else ?>cols<?cs /if ?>"
      -                    itemscope itemtype="http://schema.org/SiteNavigationElement">
      -        <div class="<?cs
      -                    if:fullpage ?>col-16<?cs
      -                    elif:training||guide ?>col-8<?cs
      -                    else ?>col-9<?cs /if ?>" style="padding-top:4px">
      -          <?cs if:!page.noplus ?><?cs if:fullpage ?><style>#___plusone_0 {float:right !important;}</style><?cs /if ?>
      -            <div class="g-plusone" data-size="medium"></div>
      -          <?cs /if ?>
      -        </div>
      -        <?cs if:!fullscreen ?>
      -        <div class="paging-links col-4">
      -          <?cs if:(design||training||walkthru) && !page.landing && !page.trainingcourse && !footer.hide ?>
      -            <a href="#" class="prev-page-link hide"
      -                zh-tw-lang="上一堂課"
      -                zh-cn-lang="上一课"
      -                ru-lang="Предыдущий"
      -                ko-lang="이전"
      -                ja-lang="前へ"
      -                es-lang="Anterior"
      -                >Previous</a>
      -            <a href="#" class="next-page-link hide"
      -                zh-tw-lang="下一堂課"
      -                zh-cn-lang="下一课"
      -                ru-lang="Следующий"
      -                ko-lang="다음"
      -                ja-lang="次へ"
      -                es-lang="Siguiente"
      -                >Next</a>
      -          <?cs /if ?>
      -        </div>
      -        <?cs /if ?>
      -      </div>
      -
      -      <?cs # for training classes, provide a different kind of link when the next page is a different class ?>
      -      <?cs if:training && !page.article ?>
      -      <div class="content-footer next-class" style="display:none" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -          <a href="#" class="next-class-link hide">Next class: </a>
      -      </div>
      -      <?cs /if ?>
      -
      -  </div> <!-- end jd-content -->
      -
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -</body>
      -</html>
      -
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/samples_navtree_data.cs b/tools/droiddoc/templates-sdk-refonly/samples_navtree_data.cs
      deleted file mode 100644
      index 24ac7b77cbd..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/samples_navtree_data.cs
      +++ /dev/null
      @@ -1,3 +0,0 @@
      -var SAMPLES_NAVTREE_DATA =
      -<?cs var:reference_tree ?>
      -;
      diff --git a/tools/droiddoc/templates-sdk-refonly/sdkpage.cs b/tools/droiddoc/templates-sdk-refonly/sdkpage.cs
      deleted file mode 100644
      index 90763877056..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/sdkpage.cs
      +++ /dev/null
      @@ -1,588 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<?cs include:"../../../../frameworks/base/docs/html/sdk/sdk_vars.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs if:sdk.redirect ?>
      -  <head>
      -    <title>Redirecting...</title>
      -    <meta http-equiv="refresh" content="0;url=<?cs var:toroot ?>sdk/<?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>index.html<?cs /if ?>">
      -  </head>
      -<?cs else ?>
      -  <?cs include:"head_tag.cs" ?>
      -<?cs /if ?>
      -<body class="gc-documentation
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/CreativeWork">
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -
      -<div <?cs if:fullpage
      -?><?cs else
      -?>class="col-13" id="doc-col"<?cs /if ?> >
      -
      -<?cs if:sdk.redirect ?>
      -
      -<div class="g-unit">
      -  <div id="jd-content">
      -    <p>Redirecting to
      -    <a href="<?cs var:toroot ?>sdk/<?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>index.html<?cs /if ?>"><?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>Download the SDK<?cs /if ?>
      -    </a> ...</p>
      -
      -<?cs else ?>
      -<?cs # else, if NOT redirect ...
      -#
      -#
      -# The following is for SDK/NDK pages
      -#
      -#
      -?>
      -
      -<?cs if:header.hide ?><?cs else ?>
      -<h1 itemprop="name"><?cs var:page.title ?></h1>
      -<?cs /if ?>
      -  <div id="jd-content" itemprop="description">
      -
      -<?cs if:sdk.not_latest_version ?>
      -  <div class="special">
      -    <p><strong>This is NOT the current Android SDK release.</strong></p>
      -    <p><a href="/sdk/index.html">Download the current Android SDK</a></p>
      -  </div>
      -<?cs /if ?>
      -
      -
      -<?cs if:ndk ?>
      -<?cs #
      -#
      -#
      -#
      -#
      -#
      -#
      -# the following is for the NDK
      -#
      -# (nested in if/else redirect)
      -#
      -#
      -#
      -#
      -?>
      -
      -  <table class="download" id="download-table">
      -    <tr>
      -      <th>Platform</th>
      -      <th>Package</th>
      -      <th style="white-space:nowrap">Size (Bytes)</th>
      -      <th>MD5 Checksum</th>
      -  </tr>
      -  <tr>
      -    <td>Windows 32-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.win32_download ?>"><?cs var:ndk.win32_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win32_bytes ?></td>
      -    <td><?cs var:ndk.win32_checksum ?></td>
      -  </tr>
      - <!-- <tr>
      -   <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.win32.legacy_download ?>"><?cs var:ndk.win32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.win32.legacy_checksum ?></td>
      -  </tr> -->
      -  <tr>
      -    <td>Windows 64-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.win64_download ?>"><?cs var:ndk.win64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win64_bytes ?></td>
      -    <td><?cs var:ndk.win64_checksum ?></td>
      -  </tr>
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.win64.legacy_download ?>"><?cs var:ndk.win64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.win64.legacy_checksum ?></td>
      -  </tr> -->
      -<!--   (this item is deprecated)
      -  <tr>
      -    <td>Mac OS X 32-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac32_download ?>"><?cs var:ndk.mac32_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac32_bytes ?></td>
      -    <td><?cs var:ndk.mac32_checksum ?></td>
      -  </tr> -->
      - <!-- (this item is deprecated)
      -  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac32.legacy_download ?>"><?cs var:ndk.mac32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.mac32.legacy_checksum ?></td>
      -  </tr> -->
      -    <td>Mac OS X 64-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac64_download ?>"><?cs var:ndk.mac64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac64_bytes ?></td>
      -    <td><?cs var:ndk.mac64_checksum ?></td>
      -  </tr>
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac64.legacy_download ?>"><?cs var:ndk.mac64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.mac64.legacy_checksum ?></td>
      -  </tr> -->
      -  <tr>
      -    <td>Linux 32-bit (x86)</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux32_download ?>"><?cs var:ndk.linux32_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux32_bytes ?></td>
      -    <td><?cs var:ndk.linux32_checksum ?></td>
      -  </tr>
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux32.legacy_download ?>"><?cs var:ndk.linux32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.linux32.legacy_checksum ?></td>
      -  </tr> -->
      -  <tr>
      -    <td>Linux 64-bit (x86)</td>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux64_download ?>"><?cs var:ndk.linux64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux64_bytes ?></td>
      -    <td><?cs var:ndk.linux64_checksum ?></td>
      -  </tr>
      -  <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)"
      -     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux64.legacy_download ?>"><?cs var:ndk.linux64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.linux64.legacy_checksum ?></td>
      -  </tr> -->
      -
      -  </table>
      -
      -  <?cs ########  HERE IS THE JD DOC CONTENT ######### ?>
      -  <?cs call:tag_list(root.descr) ?>
      -
      -
      -
      -<script>
      -  function onDownload(link) {
      -
      -    $("#downloadForRealz").html("Download " + $(link).text());
      -    $("#downloadForRealz").attr('href',$(link).attr('href'));
      -
      -    $("#tos").fadeIn('slow');
      -
      -    location.hash = "download";
      -    return false;
      -  }
      -
      -
      -  function onAgreeChecked() {
      -    if ($("input#agree").is(":checked")) {
      -      $("a#downloadForRealz").removeClass('disabled');
      -    } else {
      -      $("a#downloadForRealz").addClass('disabled');
      -    }
      -  }
      -
      -  function onDownloadNdkForRealz(link) {
      -    if ($("input#agree").is(':checked')) {
      -      $("#tos").fadeOut('slow');
      -
      -      $('html, body').animate({
      -          scrollTop: $("#Installing").offset().top
      -        }, 800, function() {
      -          $("#Installing").click();
      -      });
      -
      -      return true;
      -    } else {
      -      $("label#agreeLabel").parent().stop().animate({color: "#258AAF"}, 200,
      -        function() {$("label#agreeLabel").parent().stop().animate({color: "#222"}, 200)}
      -      );
      -      return false;
      -    }
      -  }
      -
      -  $(window).hashchange( function(){
      -    if (location.hash == "") {
      -      location.reload();
      -    }
      -  });
      -
      -</script>
      -
      -  <?cs else ?>
      -<?cs # end if NDK ...
      -#
      -#
      -#
      -#
      -#
      -#
      -# the following is for the SDK
      -#
      -# (nested in if/else redirect and if/else NDK)
      -#
      -#
      -#
      -#
      -?>
      -  <?cs if:android.whichdoc == "online" ?>
      -
      -
      -<?cs ########  HERE IS THE JD DOC CONTENT FOR ONLINE ######### ?>
      -<?cs call:tag_list(root.descr) ?>
      -
      -
      -
      -
      -<div class="pax col-13 online" style="margin:0;">
      -
      -
      -<h3>SDK Tools Only</h3>
      -
      -<p>If you prefer to use a different IDE or run the tools from the
      -command line or with build scripts, you can instead download the stand-alone Android SDK Tools.
      -These packages provide the basic SDK tools for app development, without an IDE.
      -Also see the <a href="<?cs var:toroot ?>tools/sdk/tools-notes.html">SDK tools release notes</a>.</p>
      -
      -  <table class="download">
      -    <tr>
      -      <th>Platform</th>
      -      <th>Package</th>
      -      <th>Size</th>
      -      <th>SHA-1 Checksum</th>
      -  </tr>
      -  <tr>
      -    <td rowspan="2">Windows</td>
      -    <td>
      -  <a onclick="return onDownload(this)" id="win-tools" href="http://dl.google.com/android/<?cs
      -var:sdk.win_installer
      -?>"><?cs var:sdk.win_installer ?></a> (Recommended)
      -    </td>
      -    <td><?cs var:sdk.win_installer_bytes ?> bytes</td>
      -    <td><?cs var:sdk.win_installer_checksum ?></td>
      -  </tr>
      -  <tr>
      -    <!-- blank TD from Windows rowspan -->
      -    <td>
      -  <a onclick="return onDownload(this)" href="http://dl.google.com/android/<?cs var:sdk.win_download
      -?>"><?cs var:sdk.win_download ?></a>
      -    </td>
      -    <td><?cs var:sdk.win_bytes ?> bytes</td>
      -    <td><?cs var:sdk.win_checksum ?></td>
      -  </tr>
      -  <tr>
      -    <td><nobr>Mac OS X</nobr></td>
      -    <td>
      -  <a onclick="return onDownload(this)" id="mac-tools" href="http://dl.google.com/android/<?cs
      -var:sdk.mac_download
      -?>"><?cs var:sdk.mac_download ?></a>
      -    </td>
      -    <td><?cs var:sdk.mac_bytes ?> bytes</td>
      -    <td><?cs var:sdk.mac_checksum ?></td>
      -  </tr>
      -  <tr>
      -    <td>Linux</td>
      -    <td>
      -  <a onclick="return onDownload(this)" id="linux-tools" href="http://dl.google.com/android/<?cs
      -var:sdk.linux_download
      -?>"><?cs var:sdk.linux_download ?></a>
      -    </td>
      -    <td><?cs var:sdk.linux_bytes ?> bytes</td>
      -    <td><?cs var:sdk.linux_checksum ?></td>
      -  </tr>
      -  </table>
      -
      -
      -
      -<h3>All Android Studio Packages</h3>
      -
      -<p>Select a specific Android Studio package for your platform. Also see the
      -<a href="<?cs var:toroot ?>tools/revisions/studio.html">Android Studio release notes</a>.</p>
      -
      -  <table class="download">
      -    <tr>
      -      <th>Platform</th>
      -      <th>Package</th>
      -      <th>Size</th>
      -      <th>SHA-1 Checksum</th>
      -  </tr>
      -
      -  <tr>
      -    <td rowspan="3">Windows</td>
      -    <td>
      -  <a onclick="return onDownload(this,false,true)" id="win-bundle"
      -    href="https://dl.google.com/dl/android/studio/install/<?cs var:studio.version ?>/<?cs var:studio.win_bundle_exe_download ?>"
      -    ><?cs var:studio.win_bundle_exe_download ?></a><br>(Recommended)
      -    </td>
      -    <td><?cs var:studio.win_bundle_exe_bytes ?> bytes</td>
      -    <td><?cs var:studio.win_bundle_exe_checksum ?></td>
      -  </tr>
      -
      -  <tr>
      -    <!-- blank TD from Windows rowspan -->
      -    <td>
      -  <a onclick="return onDownload(this,false,true)" id="win-bundle-notools"
      -    href="https://dl.google.com/dl/android/studio/install/<?cs var:studio.version ?>/<?cs var:studio.win_notools_exe_download ?>"
      -    ><?cs var:studio.win_notools_exe_download ?></a><br>(No SDK tools included)
      -    </td>
      -    <td><?cs var:studio.win_notools_exe_bytes ?> bytes</td>
      -    <td><?cs var:studio.win_notools_exe_checksum ?></td>
      -  </tr>
      -
      -  <tr>
      -    <!-- blank TD from Windows rowspan -->
      -    <td>
      -  <a onclick="return onDownload(this,false,true)" id="win-bundle-zip"
      -    href="https://dl.google.com/dl/android/studio/ide-zips/<?cs var:studio.version ?>/<?cs var:studio.win_bundle_download ?>"
      -    ><?cs var:studio.win_bundle_download ?></a>
      -    </td>
      -    <td><?cs var:studio.win_bundle_bytes ?> bytes</td>
      -    <td><?cs var:studio.win_bundle_checksum ?></td>
      -  </tr>
      -
      -  <tr>
      -    <td><nobr>Mac OS X</nobr></td>
      -    <td>
      -  <a onclick="return onDownload(this,false,true)" id="mac-bundle"
      -    href="https://dl.google.com/dl/android/studio/install/<?cs var:studio.version ?>/<?cs var:studio.mac_bundle_download ?>"
      -    ><?cs var:studio.mac_bundle_download ?></a>
      -    </td>
      -    <td><?cs var:studio.mac_bundle_bytes ?> bytes</td>
      -    <td><?cs var:studio.mac_bundle_checksum ?></td>
      -  </tr>
      -
      -  <tr>
      -    <td>Linux</td>
      -    <td>
      -  <a onclick="return onDownload(this,false,true)" id="linux-bundle"
      -    href="https://dl.google.com/dl/android/studio/ide-zips/<?cs var:studio.version ?>/<?cs var:studio.linux_bundle_download ?>"
      -    ><?cs var:studio.linux_bundle_download ?></a>
      -    </td>
      -    <td><?cs var:studio.linux_bundle_bytes ?> bytes</td>
      -    <td><?cs var:studio.linux_bundle_checksum ?></td>
      -  </tr>
      -  </table>
      -
      -
      -
      -</div><!-- end pax -->
      -
      -
      -
      -
      -
      -<script>
      -
      -  if (location.hash == "#Requirements") {
      -    $('.reqs').show();
      -  } else if (location.hash == "#ExistingIDE") {
      -	 $('.ide').show();
      -  }
      -
      -  var os;
      -  var bundlename;
      -  var $toolslink;
      -
      -  if (navigator.appVersion.indexOf("Mobile")!=-1) {
      -    // Do nothing for any "mobile" user agent
      -  } else if (navigator.appVersion.indexOf("Win")!=-1) {
      -    os = "Windows";
      -    bundlename = '#win-bundle';
      -    $toolslink = $('#win-tools');
      -  } else if (navigator.appVersion.indexOf("Mac")!=-1) {
      -    os = "Mac";
      -    bundlename = '#mac-bundle';
      -    $toolslink = $('#mac-tools');
      -  } else if (navigator.appVersion.indexOf("Linux")!=-1 && navigator.appVersion.indexOf("Android")==-1) {
      -    os = "Linux";
      -    bundlename = '#linux-bundle';
      -    $toolslink = $('#linux-tools');
      -  }
      -
      -  if (os != undefined) {
      -    $('#not-supported').hide();
      -
      -    /* set up primary Android Studio download button */
      -    $('.download-bundle-button > .small').html(" for " + os);
      -    $('.download-bundle-button').click(function() {return onDownload(this,true,true);}).attr('href', bundlename);
      -  }
      -
      -
      -  function onDownload(link, button, bundle) {
      -
      -    /* set text for download button */
      -    if (button) {
      -      $("#downloadForRealz").html($(link).text());
      -    } else {
      -      $("#downloadForRealz").html("Download " + $(link).text());
      -    }
      -
      -    $("#downloadForRealz").attr('bundle', bundle);
      -    if (bundle && !button) {
      -      $("a#downloadForRealz").attr("name", "#" + $(link).attr('id'));
      -    } else {
      -      $("a#downloadForRealz").attr("name", $(link).attr('href'));
      -    }
      -
      -    $("#tos").show();
      -    $("#landing").hide();
      -
      -    location.hash = "top";
      -    return false;
      -  }
      -
      -
      -  function onAgreeChecked() {
      -    /* verify that the TOS is agreed */
      -    if ($("input#agree").is(":checked")) {
      -
      -      /* if downloading the bundle */
      -      if ($("#downloadForRealz").attr('bundle')) {
      -        /* construct the name of the link we want */
      -        linkId = $("a#downloadForRealz").attr("name");
      -        /* set the real url for download */
      -        $("a#downloadForRealz").attr("href", $(linkId).attr("href"));
      -      } else {
      -        $("a#downloadForRealz").attr("href", $("a#downloadForRealz").attr("name"));
      -      }
      -
      -      /* reveal the download button */
      -      $("a#downloadForRealz").removeClass('disabled');
      -    } else {
      -      $("a#downloadForRealz").addClass('disabled');
      -    }
      -  }
      -
      -  function onDownloadForRealz(link) {
      -    if ($("input#agree").is(':checked')) {
      -      location.hash = "";
      -      location.hash = "top";
      -      $("div.sdk-terms").slideUp();
      -      $("h1#tos-header").text('Now downloading...');
      -      $(".sdk-terms-intro").text('You\'ll be redirected to the install instructions in a moment.');
      -      $("#sdk-terms-form").fadeOut('slow', function() {
      -        setTimeout(function() {
      -          if ($("#downloadForRealz").attr('bundle') == 'true') {
      -            // User downloaded the studio Bundle
      -            window.location = "/sdk/installing/index.html?pkg=studio";
      -          } else {
      -            // User downloaded the SDK Tools
      -            window.location = "/sdk/installing/index.html?pkg=tools";
      -          }
      -        }, 3000);
      -      });
      -      ga('send', 'event', 'SDK', 'IDE and Tools', $("#downloadForRealz").html());
      -      return true;
      -    } else {
      -      return false;
      -    }
      -  }
      -
      -  $(window).hashchange( function(){
      -    if (location.hash == "") {
      -      location.reload();
      -    }
      -  });
      -
      -</script>
      -
      -
      -
      -</div><!-- end the wrapper used for relative/absolute positions  -->
      -<?cs # THIS DIV WAS OPENED IN INDEX.JD ?>
      -
      -
      -
      -
      -  <?cs else ?> <?cs # end if online ?>
      -
      -    <?cs if:sdk.preview ?><?cs # it's preview offline docs ?>
      -      <p>Welcome developers! We are pleased to provide you with a preview SDK for the upcoming
      -    Android 3.0 release, to give you a head-start on developing applications for it.
      -    </p>
      -
      -      <p>See the <a
      -    href="<?cs var:toroot ?>sdk/preview/start.html">Getting Started</a> document for more information
      -    about how to set up the preview SDK and get started.</p>
      -    <style type="text/css">
      -    .non-preview { display:none; }
      -    </style>
      -
      -    <?cs else ?><?cs # it's normal offline docs ?>
      -
      -      <?cs ########  HERE IS THE JD DOC CONTENT FOR OFFLINE ######### ?>
      -      <?cs call:tag_list(root.descr) ?>
      -      <style type="text/css">
      -        body .offline { display:block; }
      -        body .online { display:none; }
      -      </style>
      -      <script>
      -        $('.reqs').show();
      -      </script>
      -    <?cs /if ?>
      -
      -  <?cs /if ?> <?cs # end if/else online ?>
      -
      -<?cs /if ?> <?cs # end if/else NDK ?>
      -
      -<?cs /if ?> <?cs # end if/else redirect ?>
      -
      -
      -</div><!-- end jd-content -->
      -
      -<?cs if:!sdk.redirect ?>
      -<?cs include:"footer.cs" ?>
      -<?cs /if ?>
      -
      -</div><!-- end g-unit -->
      -
      -<?cs include:"trailer.cs" ?>
      -
      -<!-- Start of Tag -->
      -<script type="text/javascript">
      -var axel = Math.random() + "";
      -var a = axel * 10000000000000;
      -document.write('<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>');
      -</script>
      -<noscript>
      -<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=1?" width="1" height="1" frameborder="0" style="display:none"></iframe>
      -</noscript>
      -<!-- End of Tag -->
      -</body>
      -</html>
      -
      -
      -
      diff --git a/tools/droiddoc/templates-sdk-refonly/timestamp.cs b/tools/droiddoc/templates-sdk-refonly/timestamp.cs
      deleted file mode 100644
      index 4bf502a0bf2..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/timestamp.cs
      +++ /dev/null
      @@ -1 +0,0 @@
      -var BUILD_TIMESTAMP = "<?cs var:page.now ?>";
      diff --git a/tools/droiddoc/templates-sdk-refonly/trailer.cs b/tools/droiddoc/templates-sdk-refonly/trailer.cs
      deleted file mode 100644
      index 225b2c16944..00000000000
      --- a/tools/droiddoc/templates-sdk-refonly/trailer.cs
      +++ /dev/null
      @@ -1,21 +0,0 @@
      -</div> <!-- end .cols --> <?cs # normally opened by header.cs ?>
      -</div> <!-- end body-content --> <?cs # normally opened by header.cs ?>
      -
      -<?cs if:carousel ?>
      -<script type="text/javascript">
      -$('.slideshow-container').dacSlideshow({
      -    btnPrev: '.slideshow-prev',
      -    btnNext: '.slideshow-next',
      -    btnPause: '#pauseButton'
      -});
      -</script>
      -<?cs /if ?>
      -<?cs if:tabbedList ?>
      -<script type="text/javascript">
      -$(".feed").dacTabbedList({
      -    nav_id: '.feed-nav',
      -    frame_id: '.feed-frame'
      -});
      -</script>
      -<?cs /if ?>
      -
      diff --git a/tools/droiddoc/templates-sdk/assets/css/default.css b/tools/droiddoc/templates-sdk/assets/css/default.css
      index accf7bffa45..e422d75cec7 100644
      --- a/tools/droiddoc/templates-sdk/assets/css/default.css
      +++ b/tools/droiddoc/templates-sdk/assets/css/default.css
      @@ -30,7 +30,7 @@ body {
         font: 14px/24px Roboto, sans-serif;
         font-weight: 400;
         letter-spacing:.1;
      -  padding:0 20px;
      +  padding: 0 20px;
       }
       
       @media (max-width: 719px) {
      @@ -40,7 +40,8 @@ body {
         }
       
         body {
      -    padding: 0 10px;
      +    padding-left: 10px;
      +    padding-right: 10px;
         }
       }
       
      @@ -85,21 +86,17 @@ body {
         #page-footer #copyright {
           margin-bottom: 10px; }
       
      +.hide-text {
      +  position: absolute;
      +  text-indent: -9999px;
      +}
      +
       #nav-container {
         width: 160px;
         min-height: 10px;
         margin-right: 20px;
         float: left; }
       
      -#nav {
      -  margin:0;
      -  padding:0 0 30px;
      -}
      -
      -#side-nav {
      -  padding-top: 20px;
      -}
      -
       #devdoc-nav h2 {
         border:0;
       }
      @@ -158,10 +155,44 @@ img {
         max-width: 100%;
         vertical-align: middle;
       }
      +
       video {
      +  cursor: pointer;
      +  margin-bottom: 10px; /* same as img */
         max-width: 100%;
         object-fit: cover;
       }
      +
      +.video-wrapper {
      +  line-height: 0;
      +  margin-bottom: 10px; /* same as img */
      +  position: relative;
      +}
      +
      +.video-wrapper video {
      +  margin:0;
      +}
      +
      +.video-wrapper:before {
      +  background: rgba(0, 0, 0, 0.5) url(//material-design.storage.googleapis.com/images/play.svg) no-repeat center center;
      +  background-size: 72px 72px;
      +  bottom: 0;
      +  content: "";
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +  transition: opacity .2s;
      +}
      +
      +.video-wrapper:hover:before {
      +  opacity: .7;
      +}
      +
      +.video-wrapper.playing:before {
      +  opacity: 0;
      +}
      +
       q {
         quotes: none;
       }
      @@ -191,11 +222,12 @@ h1, h2, h3 {
       h1 {
         font-size: 44px;
         line-height: 56px;
      -  margin: 24px 0 12px;
         font-weight: 300;
      +  margin: 0;
      +  padding: 24px 0 12px;
       }
       h1.short {
      -  margin-right:320px;
      +  padding-right:320px;
       }
       @media (max-width: 719px) {
         h1 {
      @@ -208,30 +240,49 @@ h2 {
         font-size: 28px;
         font-weight: 400;
         line-height: 32px;
      -  margin: 24px 0 16px;
      +  margin: 0;
      +  padding: 12px 0 16px;
       }
       h3 {
         font-size: 24px;
         line-height: 32px;
         font-weight: 400;
      -  margin: 16px 0;
      +  margin: 0;
      +  padding: 8px 0 12px;
       }
       h4 {
         font-size: 18px;
         line-height: 24px;
      -  margin: 12px 0;
      +  margin: 0;
      +  padding: 4px 0 8px;
         font-weight: 500;
       }
       h5, h6 {
         font-size: 16px;
         line-height: 24px;
      -  margin: 8px 0;
      +  margin: 0;
      +  padding: 4px 0 8px;
      +}
      +th>h3 {
      +  font-size:inherit;
      +  line-height:inherit;
      +  font-weight:inherit;
      +  margin:0;
      +  padding:0;
      +  color:inherit;
       }
       hr { /* applied to the bottom of h2 elements */
         height: 1px;
         margin: 7px 0 12px;
         border: 0;
      -  background: #e5e5e5;
      +  background: rgba(0, 0, 0, 0.1);
      +}
      +h2[id], h3[id], h4[id], h5[id], h6[id] {
      +  margin-top: -64px;
      +  border-top: 64px solid transparent;
      +  -webkit-background-clip: padding-box;
      +  -moz-background-clip: padding;
      +  background-clip: padding-box;
       }
       p, pre, table, form {
         margin: 0 0 12px;
      @@ -271,7 +322,8 @@ li p,
       li pre,
       li ul,
       li ol,
      -li dl {
      +li dl,
      +#body-content li img {
         margin-top: 6px;
         margin-bottom: 6px;
       }
      @@ -283,15 +335,10 @@ pre strong, pre b, a strong, a b, a code {
       }
       pre, code {
         color: #060;
      -  font: 13px/18px Consolas, "Liberation Mono", Menlo, Courier, monospace;
      +  font: 13px/18px Consolas, "Liberation Mono", Menlo, Monaco, Courier, monospace;
         -webkit-font-smoothing: subpixel-antialiased;
         -moz-osx-font-smoothing: auto;
       }
      -code {
      -  background-color: #f7f7f7;
      -  padding: 3px 5px;
      -}
      -
       legend {
         display: none;
       }
      @@ -339,6 +386,10 @@ th {
         border:solid 1px #DDD;
         font-weight: normal;
       }
      +tr.alt th {
      +  color:inherit;
      +  background-color: #e0e0e0;
      +}
       tr:first-of-type th:first-of-type:empty {
         visibility: hidden;
       }
      @@ -348,8 +399,18 @@ a.external-link {
         padding-right:16px;
       }
       
      -#jd-content img {
      -  margin-bottom:15px;
      +#body-content img {
      +  margin-bottom:12px;
      +}
      +
      +#body-content p>img {
      +  margin-bottom:0;
      +}
      +
      +#body-content img.inline-icon {
      +  vertical-align:sub;
      +  margin:0;
      +  height:16px;
       }
       
       em {
      @@ -385,7 +446,7 @@ video.with-shadow {
           margin-left: 0; }
         .layout-content-col h3,
         .layout-content-col h4 {
      -    margin-top:0; }
      +    padding-top:0; }
       
       .layout-content-col.span-1 {
         width: 40px; }
      @@ -474,158 +535,6 @@ video.with-shadow {
       .vspace.size-16 {
         height: 160px; }
       
      -/* nav */
      -#nav {
      -  /* section header divs */
      -  /* expanded section header divs */
      -  /* sublinks */ }
      -  #nav li {
      -    list-style-type: none;
      -    font-size: 12px;
      -    margin:0;
      -    padding:0;
      -    line-height: 18px; }
      -  #nav a {
      -    color: #505050;
      -    text-decoration: none;
      -    word-wrap:break-word; }
      -  #nav .nav-section-header {
      -    position: relative;
      -    margin-bottom: 1px;
      -    padding: 0 30px 0 0; }
      -  #nav li.selected a {
      -    color: #039BE5;
      -  }
      -  #nav li.selected ul li a {
      -  /* don't highlight child items */
      -    color: #505050; }
      -  #nav .nav-section .nav-section .nav-section-header {
      -    /* no white line between second level sections */
      -    margin-bottom: 0; }
      -    /* section header links */
      -    #nav > li > div > a {
      -      display: block;
      -      font-weight: 700;
      -      padding: 13px 0 12px 10px; }
      -    #nav .nav-section-header:after {
      -      content: '';
      -      background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%;
      -      width: 34px;
      -      height: 34px;
      -      display: block;
      -      position: absolute;
      -      top: 6px;
      -      right: 0; }
      -    #nav .nav-section-header.empty {
      -      padding:0; }
      -    #nav .nav-section-header.empty:after {
      -      display: none; }
      -    /* nested nav headers */
      -    #nav .nav-section .nav-section {
      -      position: relative;
      -      padding: 0;
      -      margin: 0; }
      -    #nav .nav-section li a {
      -    /* first gen child (2nd level li) */
      -      display:block;
      -      font-weight: 700;
      -      text-transform: none;
      -      padding: 13px 5px 13px 10px;
      -       }
      -    #nav .nav-section li li a {
      -    /* second gen child (3rd level li) */
      -      font-weight: 400;
      -      padding: 7px 5px 7px 10px;
      -       }
      -  #nav li.expanded .nav-section-header {
      -    background: #f0f0f0; }
      -  #nav li.expanded .nav-section-header.empty {
      -    background: none; }
      -  #nav li.expanded li .nav-section-header {
      -    background: none; }
      -  #nav li.expanded li ul {
      -  /* 3rd level ul */
      -    padding:6px 0 1px 20px;
      -  }
      -    #nav li.expanded > .nav-section-header:after {
      -      content: '';
      -      background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%;
      -      width: 34px;
      -      height: 34px; }
      -  #nav li.expanded li ul.tree-list-children {
      -    padding: 0;
      -  }
      -  #nav li.expanded li ul.tree-list-children .tree-list-children {
      -    padding:0 0 0 10px;
      -  }
      -  #nav li span.tree-list-subtitle {
      -    display:inline-block;
      -    padding:5px 0 0 10px;
      -    color:#555;
      -    text-transform:uppercase;
      -    font-size:12px;
      -  }
      -  #nav li span.tree-list-subtitle:before {
      -    content: '—';
      -  }
      -  #nav li span.tree-list-subtitle:after {
      -    content: '—';
      -  }
      -  #nav li span.tree-list-subtitle.package {
      -    padding-top:15px;
      -    cursor:default;
      -  }
      -  #nav li span.tree-list-subtitle.package:before {
      -    content: '';
      -  }
      -  #nav li span.tree-list-subtitle.package:after {
      -    content: '';
      -  }
      -  #nav li ul.tree-list-children.classes {
      -    padding-left:10px;
      -  }
      -  #nav li ul {
      -    display:none;
      -    overflow: hidden;
      -    margin: 0; }
      -    #nav li ul.animate-height-in {
      -      -webkit-transition: height 0.25s ease-in;
      -      -moz-transition: height 0.25s ease-in;
      -      transition: height 0.25s ease-in; }
      -    #nav li ul.animate-height-out {
      -      -webkit-transition: height 0.25s ease-out;
      -      -moz-transition: height 0.25s ease-out;
      -      transition: height 0.25s ease-out; }
      -    #nav li ul li {
      -      padding: 0; }
      -      #nav li li li {
      -        padding: 0; }
      -  #nav li.expanded ul {
      -    }
      -    #nav li ul > li {
      -      padding:0;
      -    }
      -    #nav li ul > li:last-child {
      -      padding-bottom:5px;
      -    }
      -    #nav li ul.tree-list-children > li:last-child {
      -      padding-bottom:0;
      -    }
      -    #nav li.expanded ul > li {
      -      background:#f7f7f7; }
      -    #nav li.expanded ul > li li {
      -      background:inherit; }
      -  #nav li ul.tree-list-children ul {
      -    display:block; }
      -
      -#nav.samples-nav li li li a {
      -  padding-top:3px;
      -  padding-bottom:3px;
      -}
      -#nav.samples-nav li li ul > li:last-child {
      -  padding-bottom:3px;
      -}
      -
       .new,
       .new-child {
         font-size: .78em;
      @@ -682,13 +591,10 @@ a.back-link {
       }
       .paging-links {
         position: relative;
      -  height:30px; }
      -  .paging-links a {
      -    position: absolute; }
      +  min-height:30px; }
         .paging-links a,
         .training-nav-top a {
           text-decoration: none; }
      -    .paging-links .prev-page-link:before,
           .training-nav-top .prev-page-link:before,
           a.back-link:before {
             content: '';
      @@ -697,14 +603,9 @@ a.back-link {
             height: 10px;
             display: inline-block;
             margin-right: 5px; }
      -    .paging-links .prev-page-link {
      -      left: -15px; }
      -    .paging-links .next-page-link {
      -      right: 0; }
      -    .next-page-link:after,
      -    .start-class-link:after,
      -    .start-course-link:after,
      -    .next-class-link:after,
      +    .training-nav-top .next-page-link:after,
      +    .training-nav-top .start-class-link:after,
      +    .training-nav-top .start-course-link:after,
           .go-link:after {
             content: '';
             background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%;
      @@ -717,7 +618,7 @@ a.back-link {
           .next-page-link.inline:after {
             content: none; }
       
      -  .content-footer .paging-links .next-page-link {
      +  .content-footer {
           left:0;
         }
       
      @@ -757,8 +658,7 @@ a.back-link {
         }
       
         .training-nav-top a.start-class-link,
      -  .training-nav-top a.start-course-link,
      -  .paging-links a.start-class-link {
      +  .training-nav-top a.start-course-link {
           width:100%;
         }
       
      @@ -780,7 +680,6 @@ a.back-link {
           font-size: 20px;
           font-weight: 500;
           height: 32px;
      -    margin: 0;
           padding: 52px 16px 12px;
           position: relative;
         }
      @@ -802,7 +701,7 @@ a.back-link {
           color: currentColor;
           font-size: inherit;
           font-weight: inherit;
      -    margin:0 0 10px;
      +    padding:0 0 10px;
           display:block;
           float:left;
           width:675px;
      @@ -898,7 +797,7 @@ div#title-tabs-wrapper {
       }
       h1.with-title-tabs {
         display:inline-block;
      -  margin:0 0 -1px 0;
      +  margin-bottom: -1px;
         padding:0 60px 0 0;
         border-bottom:1px solid #F9F9F9;
       }
      @@ -979,7 +878,7 @@ h3:target {
           animation-timing-function: ease-out; }
       
       .design ol h4 {
      -  margin-bottom:0;
      +  padding-bottom:0;
       }
       .design ol {
         counter-reset: item; }
      @@ -1162,6 +1061,35 @@ scroll top left;
         overflow:hidden;
       }
       
      +#api-info-block {
      +  color: #999;
      +  float: right;
      +  font-size: 12px;
      +  font-weight: normal;
      +  line-height: 14px;
      +  margin: 20px 0 0;
      +  max-width: 80%;
      +  padding: 0 10px 6px;
      +  text-align: right;
      +}
      +
      +#api-info-block a,
      +#api-info-block a:active,
      +#api-info-block a:visited {
      +  color: #222;
      +}
      +
      +#jd-header {
      +  font-size: 12px;
      +  margin: 20px 0 12px;
      +  padding: 0 0 12px;
      +}
      +
      +#jd-header h1 {
      +  margin: 0;
      +  padding: 0 0 6px;
      +}
      +
       #jd-content
       .framed-wear-square img {
         height:222px;
      @@ -1248,15 +1176,6 @@ scroll top left;
         .download-button:active {
           background-color: #006699; }
       
      -.button.disabled,
      -.button.disabled:hover,
      -.button.disabled:active {
      -  background:#ebebeb;
      -  color:#999 !important;
      -  border-color:#999;
      -  cursor:default;
      -}
      -
       /* UI tables and other things found in Writing style and Settings pattern */
       .ui-table {
         width: 100%;
      @@ -1382,6 +1301,12 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       .locales form {
           margin: 0;
       }
      +
      +.locales select,
      +.locales option {
      +  text-transform: capitalize;
      +}
      +
       .locales select, .sites select {
         line-height: 3.08;
         margin: 0px 0;
      @@ -1438,7 +1363,7 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       
         /* bump up spacing above subheadings */
         h2 {
      -      margin-top: 40px !important;
      +      padding-top: 40px !important;
         }
       
         /* print link URLs where possible and give links default text color */
      @@ -1577,7 +1502,8 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
         width:226px;
         font-size:13px;
         line-height:18px;
      -  border-left:3px solid #a9e27d;
      +  border-left:3px solid #96ca7c;
      +  border-left-color: rgba(106, 179, 68, .7); /* #6ab344 * 70% */
         float:right;
         padding:0 0 0 20px;
         margin:0 0 1em 20px;
      @@ -1588,7 +1514,7 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       .sidebox h4,
       .sidebox h5 {
         font-weight:bold;
      -  margin:0 0 10px;
      +  padding: 0 0 10px;
         line-height: 16px;
       }
       
      @@ -1602,6 +1528,7 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       
       #tb ol,
       #tb ul,
      +#tb p,
       #qv ul {
         list-style-type: none;
         margin:0 15px 10px 15px;
      @@ -1614,10 +1541,6 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
         position: relative;
       }
       
      -#tb p {
      -  margin:0 15px 10px;
      -}
      -
       #qv ol {
         list-style:none;
         margin:0 15px 15px;
      @@ -1635,8 +1558,7 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       }
       
       .sidebox p,
      -#qv p,
      -#tb p {
      +#qv p {
         margin: 0 0 10px;
       }
       
      @@ -1647,7 +1569,7 @@ color-stop(50%, #acbc00), color-stop(50%, #bdde00), color-stop(100%, #bdde00));
       
       
       h3.rel-resources {
      -margin:1.25em auto;
      +  padding:1.25em auto;
       }
       
       /* --------------------------------------------------------------------------
      @@ -1823,7 +1745,7 @@ div.sdk-terms.fullsize {
       
       div.sdk-terms h3,
       div.sdk-terms h2 {
      -  margin:0;
      +  padding: 0;
       }
       
       div#sdk-terms-form {
      @@ -1846,6 +1768,46 @@ pre {
         border: solid 1px #ddd;
         background: #f7f7f7;
       }
      +
      +p.package-name {
      +  margin:1em 0;
      +}
      +
      +h1.api-title {
      +  padding-bottom:0;
      +}
      +
      +h2.api-section {
      +  margin: 60px 0 0;
      +}
      +
      +h2.api-section+hr {
      +  margin-bottom: 30px;
      +}
      +
      +h3.api-name {
      +  margin: 80px 0 12px;
      +  padding: 0;
      +}
      +
      +/* remove top padding when this h3 (visibly) follows an h2.
      +   This accounts for the variation in structure,
      +   including the collapsed mobile headings */
      +h2+hr+div>div>a+div>h3.api-name,
      +h2+hr+a+div>h3.api-name,
      +h2+hr+a+h3.api-name {
      +  margin-top: 0;
      +}
      +
      +pre.api-signature,
      +code.api-signature {
      +  color:inherit;
      +  padding:0;
      +  margin:1em 0;
      +  border:0;
      +  background:transparent;
      +}
      +
       .str { color: #800; } /* Code string */
       .kwd { color: #008; }
       .typ { color: #606; }
      @@ -1897,8 +1859,7 @@ Three-Pane
         padding: 0 0 0 4px;
       }
       #packages-nav li a, #packages-nav li a:active, #packages-nav li a:visited,
      -#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited,
      -#nav-tree li a, #nav-tree li a:active, #nav-tree li a:visited {
      +#classes-nav li li a, #classes-nav li li a:active, #classes-nav li li a:visited {
         color: #222;
         font-weight: normal;
       }
      @@ -1909,8 +1870,7 @@ Three-Pane
       #packages-nav li.selected a, #packages-nav li.selected a:active, #packages-nav li.selected
       a:visited,
       #classes-nav li li.selected a, #classes-nav li li.selected a:active, #classes-nav li li.selected
      -a:visited,
      -#nav-tree li div.selected {
      +a:visited {
           font-weight: 500;
           color: #0099cc;
           background-color:#fff; }
      @@ -1918,10 +1878,7 @@ a:visited,
         #classes-nav li.selected ul li a {
         /* don't highlight child items */
           color: #555555; }
      -#nav-tree li div.selected a {
      -    font-weight: 500;
      -    color: #0099cc;
      -}
      +
       #nav-swap {
         height:30px;
         border-top:1px solid #ccc;
      @@ -1951,72 +1908,6 @@ a:visited,
         cursor:pointer;
       }
       
      -
      -/* nav tree */
      -#swapper, #nav-tree, #tree-list {
      -  overflow:hidden;
      -  margin-left:0;
      -}
      -
      -#nav-tree ul {
      -  list-style:none;
      -  padding:0;
      -  margin:10px 0;
      -}
      -
      -#nav-tree ul li div {
      -  padding:0 0 0 4px;
      -}
      -
      -#side-nav #nav-tree ul li a,
      -#side-nav #nav-tree ul li span.no-children {
      -  padding: 0;
      -  margin: 0;
      -}
      -
      -#nav-tree .plus {
      -  margin: 0 3px 0 0;
      -}
      -
      -#nav-tree ul ul {
      -  list-style: none;
      -  margin: 0;
      -  padding: 0 0 0 0;
      -}
      -
      -#nav-tree ul li {
      -  margin: 0;
      -  padding: 0 0 0 0;
      -  white-space: nowrap;
      -}
      -
      -#nav-tree .children_ul {
      -  padding:0;
      -  margin:0;
      -}
      -#nav-tree .children_ul li div {
      -  padding:0 0 0 10px;
      -}
      -#nav-tree .children_ul .children_ul li div {
      -  padding:0 0 0 20px;
      -}
      -
      -#nav-tree a.nolink {
      -  color: #222;
      -  text-decoration: none;
      -}
      -
      -#nav-tree span.label {
      -  width: 100%;
      -}
      -
      -#nav-tree {
      -  overflow-x: auto;
      -  overflow-y: scroll;
      -  outline:0;
      -}
      -
      -
       /* Content */
       #doc-col {
         margin-right:0;
      @@ -2031,26 +1922,34 @@ a:visited,
       #doc-content-container {
         margin-left: 291px
       }
      +
       #doc-header, #doc-content {
      -  padding: 1em 2em;
      +  padding: 0;
       }
      +
       #doc-header {
         background: #f7f7f7;
       }
      +
       #doc-header h1 {
         line-height: 0;
      -  margin-bottom: 15px;
      +  padding-bottom: 15px;
       }
      +
      +
       #api-info-block {
         float: right;
         font-weight: bold;
       }
      +
       #api-info-block a, #api-info-block a:active, #api-info-block a:visited {
         color: #222;
       }
      +
       #api-info-block a:hover, #api-info-block a:focus {
         color: #33B5E5;
       }
      +
       #api-nav-header {
         height:19px; /* plus 16px padding = 35; same as #nav li */
         font-size:14px;
      @@ -2061,6 +1960,7 @@ a:visited,
         background: rgba(0, 0, 0, 0.05); /* matches #nav li.expanded */
         line-height: 19px; /* Fix regression after page line-height is bumped to 24px */
       }
      +
       #api-nav-title {
         padding:0 5px;
         white-space:nowrap;
      @@ -2084,6 +1984,7 @@ a:visited,
         display: inline-block;
         overflow: hidden;
       }
      +
       #api-level-toggle select {
         border: 0;
         appearance:none;
      @@ -2091,10 +1992,11 @@ a:visited,
         -webkit-appearance: none;
         background: transparent url(../images/arrows-up-down.png) 23px 5px no-repeat;
         color: #222;
      -  height: 19px;
      -  line-height: 19px;
      +  /* remove the lines below after xp testing
      +     height: 19px;
      +     line-height: 19px; */
         padding: 0;
      -  margin:1px 0 0 0;
      +  margin: .5px 0 0 0;
         width:150%;
         font-size:13px;
         vertical-align:top;
      @@ -2268,7 +2170,7 @@ div#codesample-resource .noDisplay-message:after {
       Styles for project structure (treeview) page
       */
       .structure-dir {
      -background-image:url(../../assets/images/folder.png);
      +background-image:url(../images/folder.png);
       background-repeat:no-repeat;
       background-position:16px 2px;
         margin:.25em 0 0 0;
      @@ -2282,7 +2184,7 @@ background-position:16px 2px;
       }
       
       .structure-java{
      -background-image:url(../../assets/images/file-java.png);
      +background-image:url(../images/file-java.png);
       background-repeat:no-repeat;
       background-position:0px 2px;
         margin:.3em 0 0 0;
      @@ -2290,7 +2192,7 @@ background-position:0px 2px;
       }
       
       .structure-file {
      -background-image:url(../../assets/images/file-generic.png);
      +background-image:url(../images/file-generic.png);
       background-repeat:no-repeat;
       background-position:0px 2px;
         margin:.3em 0 0 0;
      @@ -2298,7 +2200,7 @@ background-position:0px 2px;
       }
       
       .structure-xml {
      -background-image:url(../../assets/images/file-xml.png);
      +background-image:url(../images/file-xml.png);
       background-repeat:no-repeat;
       background-position:0px 2px;
         margin:.3em 0 0 0;
      @@ -2306,7 +2208,7 @@ background-position:0px 2px;
       }
       
       .structure-img {
      -background-image:url(../../assets/images/file-image.png);
      +background-image:url(../images/file-image.png);
       background-repeat:no-repeat;
       background-position:0px 2px;
         margin:.3em 0 0 0;
      @@ -2314,7 +2216,7 @@ background-position:0px 2px;
       }
       
       .structure-manifest {
      -background-image:url(../../assets/images/file-manifest.png);
      +background-image:url(../images/file-manifest.png);
       background-repeat:no-repeat;
         margin:.0 0 0 1.25em;
         padding:0 0 0 22px;
      @@ -2383,33 +2285,6 @@ div.sampleLine {
         margin:0;
       }*/
       
      -/* --------------------------------------------------------------------------
      -Butterbar
      -*/
      -#butterbar-wrapper {
      -  position:absolute;
      -  top:0;
      -  left:0;
      -  width:100%;
      -}
      -#butterbar {
      -  width:100%;
      -  margin:0 auto;
      -}
      -#butterbar-message {
      -  background-color:rgba(255, 187, 51, .4);
      -  font-size:13px;
      -  padding: 5px 0;
      -  text-align:center;
      -}
      -a#butterbar-message {
      -  cursor:pointer;
      -  display:block;
      -}
      -a#butterbar-message:hover {
      -  text-decoration:underline;
      -}
      -
       /* --------------------------------------------------------------------------
       Misc and article typography
       */
      @@ -2439,6 +2314,25 @@ table.blank th, table.blank td {
         list-style:none;
         margin-left:0;
       }
      +
      +ol.callouts {
      +  counter-reset: item;
      +  list-style-type: none;
      +  margin-left:44px;
      +}
      +ol.callouts>li:before {
      +  counter-increment: item;
      +  content: counter(item);
      +  position: absolute;
      +  color:#fff;
      +  font-weight:bold;
      +  background-image:url(../images/styles/callout-bg_2x.png);
      +  background-size:24px;
      +  width:16px;
      +  padding-left:8px;
      +  margin-left:-34px;
      +}
      +
       #tb .nolist {
         margin-left:15px;
       }
      @@ -2597,27 +2491,30 @@ p.warning, div.warning {
       }
       
       p.note, div.note {
      -  border-color: #66c2ff;
      +  border-color: #4eb9ed;
      +  border-color: rgba(3, 155, 229, .7); /* #039be5 * 70% */
       }
       
       p.caution, div.caution {
      -  border-color: #f81;
      +  border-color: #ffbc4c;
      +  border-color: rgba(255, 160, 0, .7); /* #ffa000 * 70% */
       }
       
       p.warning, div.warning {
      -  border-color: #f55;
      +  border-color: #f48684;
      +  border-color: rgba(239, 83, 80, .7); /* #ef5350 * 70% */
       }
       
       div.note.design {
      -  border-left: 4px solid #33B5E5;
      +  border-left: 4px solid #00bcd4;
       }
       
       div.note.develop {
      -  border-left: 4px solid #F80;
      +  border-left: 4px solid #ff7043;
       }
       
       div.note.distribute {
      -  border-left: 4px solid #9C0;
      +  border-left: 4px solid #afb42b;
       }
       
       .note p, .caution p, .warning p {
      @@ -2629,13 +2526,10 @@ div.note.distribute {
       }
       
       .summary-table {
      -  background-color:#e1e4e6;
      +  background-color:#eceff1;
         padding:1em;
         margin-bottom:1.5em;
       }
      -.summary-table p {
      -  font-size:.98em;
      -}
       
       .summary-table h5 {
         line-height:1em;
      @@ -2701,20 +2595,20 @@ a.notice-developers div,
       a.notice-designers-video div,
       a.notice-designers div {
         min-height:40px;
      -  background:url('../images/styles/notice-developers@2x.png') no-repeat 10px 10px;
      +  background:url('../images/styles/notice-developers_2x.png') no-repeat 10px 10px;
         background-size:40px 40px;
         padding:10px 10px 10px 60px;
       }
       a.notice-designers div {
      -  background:url('../images/styles/notice-designers@2x.png') no-repeat 10px 10px;
      +  background:url('../images/styles/notice-designers_2x.png') no-repeat 10px 10px;
         background-size:40px 40px;
       }
       a.notice-designers-video div {
      -  background:url('../images/styles/notice-designers-video@2x.png') no-repeat 10px 10px;
      +  background:url('../images/styles/notice-designers-video_2x.png') no-repeat 10px 10px;
         background-size:40px 40px;
       }
       a.notice-developers-video div {
      -  background:url('../images/styles/notice-developers-video@2x.png') no-repeat 10px 10px;
      +  background:url('../images/styles/notice-developers-video_2x.png') no-repeat 10px 10px;
         background-size:40px 40px;
       }
       a.notice-developers-video:hover,
      @@ -2732,7 +2626,7 @@ a.notice-designers h3 {
         font-weight:bold;
         text-transform:uppercase;
         color:#000 !important;
      -  margin:0 0 1px;
      +  padding:0 0 1px;
       }
       a.notice-developers-video p,
       a.notice-developers p,
      @@ -2886,7 +2780,7 @@ div#naMessage div {
         z-index:99;
         width:450px;
         position:fixed;
      -  margin:50px 0;
      +  margin:80px 0;
         padding:4em 4em 3em;
         background:#FFF;
         border:1px solid #999;
      @@ -3074,8 +2968,7 @@ Feature Boxes
       
       .feature-box h4,
       .dialog h4 {
      -    margin: 15px 18px 10px;
      -    padding:0;
      +    padding: 15px 18px 10px;
       }
       
       .feature-box p,
      @@ -3152,19 +3045,6 @@ Page-Specific Styles
         padding:0 0 0 4px;
       }
       
      -#jd-header {
      -  padding: 0 0 12px;
      -  margin: 20px 0 12px;
      -  font-size:12px;
      -  padding-bottom:12px;
      -  border-bottom:solid 1px #ccc;
      -}
      -
      -#jd-header h1 {
      -  margin:0;
      -  padding:0 0 6px 0;
      -}
      -
       /* not sure if this is needed in the ref docs, disabling for now
       .jd-descr h2 {
         margin:16px 0;
      @@ -3185,12 +3065,11 @@ links to summary tables) */
       #api-info-block {
         font-size:12px;
         margin:20px 0 0;
      -  padding:0 10px 6px;
         font-weight:normal;
         float:right;
         text-align:right;
         color:#999;
      -  max-width:80%;
      +  max-width:300px;
         font-size: 12px;
         line-height:14px;
       }
      @@ -3205,12 +3084,17 @@ links to summary tables) */
       }
       
       /* inheritance table */
      +table.inhtable>tbody>tr>td {
      +  padding-left:0;
      +}
      +table.inhtable>tbody>tr>td div:first-of-type {
      +  padding-left:12px;
      +}
      +
       .jd-inheritance-table {
         border-spacing:0;
      -  margin:0;
      +  margin:1em 0;
         padding:0;
      -  font-size:12px;
      -  line-height:14px;
         background-color:transparent;
       }
       .jd-inheritance-table tr td {
      @@ -3220,23 +3104,13 @@ links to summary tables) */
         background-color:transparent;
       }
       .jd-inheritance-table .jd-inheritance-space {
      -  font-weight:bold;
      -  width:1em;
      +  width:2em;
       }
       .jd-inheritance-table .jd-inheritance-interface-cell {
         padding-left: 17px;
       }
       
       
      -
      -.jd-sumtable a {
      -  text-decoration:none;
      -}
      -
      -.jd-sumtable a:hover {
      -  text-decoration:underline;
      -}
      -
       /* the link inside a sumtable for "Show All/Hide All" */
       .toggle-all {
         display:block;
      @@ -3246,11 +3120,10 @@ links to summary tables) */
       }
       
       /* adjustments for in/direct subclasses tables */
      -.jd-sumtable.jd-sumtable-subclasses {
      +.jd-sumtable-subclasses {
         margin: 1em 0 0 0;
         max-width:968px;
         background-color:transparent;
      -  font-size:13px;
       }
       
       /* extra space between end of method name and open-paren */
      @@ -3258,11 +3131,6 @@ links to summary tables) */
         margin-right: 2px;
       }
       
      -/* right alignment for the return type in sumtable */
      -.jd-sumtable .jd-typecol {
      -  text-align:right;
      -}
      -
       /* adjustments for the expando table-in-table */
       .jd-sumtable-expando {
         margin:.5em 0;
      @@ -3283,7 +3151,9 @@ links to summary tables) */
       
       .jd-sumtable-subclasses div#subclasses-direct,
       .jd-sumtable-subclasses div#subclasses-indirect {
      -  margin:0 0 0 13px;
      +  /* left margin matches width of the toggle image,
      +     so this section aligns with the text above */
      +  margin:0 0 0 34px;
       }
       
       
      @@ -3344,7 +3214,7 @@ attrs, methods, etc. */
       h4.jd-details-title {
         font-size:1.15em;
         background-color: #E2E2E2;
      -  margin:4em 0 .6em;
      +  margin:1.5em 0 .6em;
         padding:3px 95px 3px 3px; /* room for api-level */
       }
       body.google h4.jd-details-title {
      @@ -3352,13 +3222,9 @@ body.google h4.jd-details-title {
         padding-top:5px;
         border-top: 1px solid #ccc;
       }
      -body.google table.jd-sumtable th {
      -  background-color: #FFF;
      -  color:#000;
      -}
       
       h4.jd-tagtitle {
      -  margin:0;
      +  padding:0;
       }
       
       h4 .normal {
      @@ -3368,7 +3234,7 @@ h4 .normal {
       /* API reference: heading for "Parameters", "See Also", etc.,
       in details sections */
       h5.jd-tagtitle {
      -  margin:0 0 .25em 0;
      +  padding:0 0 .25em 0;
         font-size:1em;
       }
       
      @@ -3399,7 +3265,7 @@ div.api-level {
         color:#999;
         float:right;
         padding:0 8px 0;
      -  margin-top:-30px;
      +  margin-top:-35px;
       }
       
       table.jd-tagtable td,
      @@ -3411,372 +3277,6 @@ table.jd-tagtable th {
         color:inherit;
       }
       
      -
      -/* SEARCH FILTER */
      -
      -.menu-container {
      -  position:relative;
      -}
      -#search_autocomplete {
      -  font-weight:normal;
      -}
      -
      -.search_filtered_wrapper {
      -  position: absolute;
      -  right: 18px;
      -  top: 64px;
      -}
      -.suggest-card {
      -  float:right;
      -  position:relative;
      -  width:170px;
      -  min-height:90px;
      -  border: solid 1px #C5C5C5;
      -  background: white;
      -  margin-right:-5px;
      -  -moz-box-shadow: 0 0 10px rgba(0,0,0,0.2);
      -  -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
      -  box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
      -}
      -.suggest-card.reference {
      -  z-index: 998;
      -  width: auto;
      -}
      -.suggest-card.develop {
      -  z-index:997;
      -  border-top: solid 4px #ff7043;
      -}
      -.suggest-card.design {
      -  z-index:996;
      -  border-top: solid 4px #00bcd4;
      -}
      -.suggest-card.distribute {
      -  z-index:995;
      -  border-top: solid 4px #afb42b;
      -}
      -.child-card {
      -  width:100%;
      -}
      -.suggest-card.dummy {
      -  width:172px;
      -  float:right;
      -  border:0;
      -  background:transparent;
      -  -moz-box-shadow: none;
      -  -webkit-box-shadow: none;
      -  box-shadow: none;
      -}
      -
      -ul.search_filtered {
      -  min-width:100%;
      -  list-style: none;
      -  margin: 5px 0;
      -  padding: 0;
      -}
      -.search_filtered .jd-selected {
      -  background:#efefef;
      -  cursor:pointer;
      -}
      -.search_filtered .jd-selected,
      -.search_filtered .jd-selected a {
      -    color:#039BE5 !important;
      -}
      -
      -.no-display {
      -  display: none;
      -}
      -
      -.search_filtered li.jd-autocomplete {
      -  font-size: 0.81em;
      -  border: none;
      -  margin: 0;
      -  padding: 0;
      -  line-height:1.5em;
      -}
      -
      -.search_filtered li a {
      -  padding: 2px 10px;
      -  color:#222 !important;
      -  display:inline-block;
      -  line-height:12px;
      -}
      -
      -.search_filtered li.header {
      -  font-weight:bold;
      -  color:#444;
      -  border: none;
      -  margin: 0;
      -  padding: 2px 10px;
      -  line-height:1.5em;
      -}
      -.search_filtered li.header.small {
      -  font-size:0.85em;
      -}
      -
      -.suggest-card.reference
      -.search_filtered li.header {
      -  color:#aaa;
      -  font-size: 0.81em;
      -}
      -
      -.search_filtered li.header:first-child {
      -  margin: 0 0 2px;
      -}
      -
      -@media (max-width: 719px) {
      -  .search_filtered_wrapper {
      -    left: 24px;
      -    right: 24px;
      -    top: 44px;
      -  }
      -
      -  .suggest-card {
      -    box-shadow: 0 2px 1px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1);
      -    float: none;
      -    margin-right: 0;
      -    min-height: 0;
      -    max-height: 204px;
      -    overflow: hidden;
      -  }
      -
      -  .suggest-card.develop,
      -  .suggest-card.design,
      -  .suggest-card.distribute {
      -    display: none !important;
      -  }
      -
      -  ul.search_filtered {
      -    margin: 0;
      -  }
      -
      -  .search_filtered li.jd-autocomplete {
      -    border-top: solid 1px #C5C5C5;
      -    font-size: inherit;
      -    text-align: left;
      -  }
      -
      -  .search_filtered li.jd-autocomplete:first-child {
      -    border-top: 0;
      -  }
      -
      -  .search_filtered li a {
      -    display: block;
      -    overflow: hidden;
      -    padding: 14px 10px;
      -    text-overflow: ellipsis;
      -    white-space: nowrap;
      -  }
      -}
      -
      -.show-item {
      -  display: table-row;
      -}
      -.hide-item {
      -  display: hidden;
      -}
      -
      -
      -
      -/* SEARCH RESULTS */
      -
      -
      -#leftSearchControl .gsc-twiddle {
      -  background-image : none;
      -}
      -
      -#leftSearchControl td, #searchForm td {
      -  border: 0px solid #000;
      -  padding:0;
      -}
      -
      -#leftSearchControl .gsc-resultsHeader .gsc-title {
      -  padding-left : 0px;
      -  font-weight : bold;
      -  font-size : 13px;
      -  color:#006699;
      -  display : none;
      -}
      -
      -#leftSearchControl .gsc-resultsHeader div.gsc-results-selector {
      -  display : none;
      -}
      -
      -#leftSearchControl .gsc-resultsRoot {
      -  padding-top : 6px;
      -}
      -
      -#leftSearchControl div.gs-visibleUrl-long {
      -  display : block;
      -  color:#006699;
      -}
      -
      -#leftSearchControl .gsc-webResult {
      -  padding:0 0 20px 0;
      -}
      -
      -.gsc-webResult div.gs-visibleUrl-short,
      -table.gsc-branding,
      -.gsc-clear-button {
      -  display : none;
      -}
      -
      -.gsc-cursor-box .gsc-cursor div.gsc-cursor-page,
      -.gsc-cursor-box .gsc-trailing-more-results a.gsc-trailing-more-results,
      -#leftSearchControl a,
      -#leftSearchControl a b {
      -  color:#006699;
      -}
      -
      -.gsc-resultsHeader {
      -  display: none;
      -}
      -
      -/* Disable built in search forms */
      -.gsc-control form.gsc-search-box {
      -  display : none;
      -}
      -table.gsc-search-box {
      -  margin:6px 0 0 0;
      -  border-collapse:collapse;
      -}
      -
      -td.gsc-input {
      -  padding:0 2px;
      -  width:100%;
      -  vertical-align:middle;
      -}
      -
      -input.gsc-input {
      -  border:1px solid #BCCDF0;
      -  width:99%;
      -  padding-left:2px;
      -  font-size:.95em;
      -}
      -
      -td.gsc-search-button {
      -  text-align: right;
      -  padding:0;
      -  vertical-align:top;
      -}
      -
      -
      -#searchResults {
      -  overflow:hidden; /* because the repositioned page links makes the section think it needs to scroll
      -(it doesn't) */
      -  height:auto;
      -}
      -
      -#searchResults .gsc-control {
      -  position:relative;
      -  width:auto;
      -  padding:0 0 10px;
      -}
      -
      -#searchResults .gsc-tabsArea {
      -  position: relative;
      -  white-space: nowrap;
      -  float: left;
      -  width: 25%;
      -}
      -
      -#searchResults .gsc-above-wrapper-area {
      -  display:none;
      -}
      -
      -#searchResults .gsc-resultsbox-visible {
      -  box-sizing: border-box;
      -  float: left;
      -  padding-left:20px;
      -  width: 75%;
      -}
      -
      -@media (max-width: 719px) {
      -  #searchResults .gsc-tabsArea {
      -    display: none;
      -  }
      -
      -  #searchResults .gsc-resultsbox-visible {
      -    float: none;
      -    padding-left: 0;
      -    width: auto;
      -  }
      -}
      -
      -#searchResults .gsc-tabHeader {
      -  margin-top: 4px;
      -  padding: 3px 6px;
      -  position:relative;
      -  width:auto;
      -  display:block;
      -}
      -
      -#searchResults h2#searchTitle {
      -  padding:0;
      -  margin:30px 0 5px;
      -  border:none;
      -}
      -
      -#searchResults h2#searchTitle em {
      -  font-style:normal;
      -  color:#33B5E5;
      -}
      -
      -#searchResults .gsc-table-result {
      -  margin:5px 0 10px 0;
      -  background-color:transparent;
      -}
      -#searchResults .gs-web-image-box, .gs-promotion-image-box {
      -  width:120px;
      -}
      -#searchResults .gs-web-image-box img.gs-image, .gs-promotion-image-box img.gs-promotion-image {
      -  max-width:120px;
      -}
      -
      -#searchResults .gsc-table-result .gsc-thumbnail {
      -  padding:0 20px 0 0;
      -}
      -
      -#searchResults td {
      -  background-color:transparent;
      -}
      -
      -#searchResults .gsc-expansionArea {
      -  position:relative;
      -}
      -#searchResults .gsc-tabsArea .gsc-cursor-box {
      -  width:200px;
      -  padding:20px 0 0 1px;
      -}
      -#searchResults .gsc-cursor-page {
      -  display:inline-block;
      -  float:left;
      -  margin:-1px 0 0 -1px;
      -  padding:0;
      -  height:27px;
      -  width:27px;
      -  text-align:center;
      -  line-height:2;
      -}
      -
      -#searchResults .gsc-tabHeader.gsc-tabhInactive,
      -#searchResults .gsc-cursor-page {
      -  background: #F0F0F0;
      -  border: 0;
      -  color: #039BE5;
      -}
      -
      -#searchResults .gsc-tabHeader.gsc-tabhActive,
      -#searchResults .gsc-tabHeader.gsc-tabhActive:hover,
      -#searchResults .gsc-cursor-page.gsc-cursor-current-page,
      -#searchResults .gsc-cursor-page.gsc-cursor-current-page:hover {
      -  background-color: #039BE5;
      -  border: 0;
      -  color: #fff;
      -}
      -
      -
      -
      -
       /************ STICKY NAV BAR ******************/
       
       #context {
      @@ -3823,11 +3323,16 @@ td.gsc-search-button {
       }
       
       /* offset the <a name=""> tags to account for sticky nav */
      -body.reference a[name] {
      +body.reference a[name]:not(.nav-start-marker) {
         visibility: hidden;
         display: block;
         position: relative;
         top: -56px;
      +
      +}
      +
      +.nav-start-marker {
      +  position: absolute;
       }
       
       
      @@ -4130,7 +3635,7 @@ body.reference a[name] {
       
       
       #landing h1 {
      -  margin:17px 0 20px 0 !important;
      +  padding:17px 0 20px 0 !important;
       }
       
       a.download-sdk {
      @@ -4326,7 +3831,7 @@ a.download-sdk {
       }
       .slideshow-develop .content-right h2 {
         padding:0;
      -  margin-bottom:10px;
      +  padding-bottom:10px;
         border:none;
         font-size:24px;
       }
      @@ -4419,7 +3924,7 @@ a.download-sdk {
       .feed .feed-container .feed-frame li.playlist-video h5 {
         font-size:12px;
         line-height:13px;
      -  margin:0;
      +  padding:0;
       }
       .feed .feed-container .feed-frame li.playlist-video p {
         margin:5px 0 0;
      @@ -4517,7 +4022,7 @@ a.download-sdk {
         margin-bottom:0;
       }
       .landing-banner h1 {
      -  margin-top:16px;
      +  padding-top:16px;
         padding-bottom:24px;
       }
       .landing-docs,
      @@ -4531,7 +4036,7 @@ a.download-sdk {
         color:#555;
         text-transform:uppercase;
         border-bottom:1px solid #CCC;
      -  margin:0 0 20px;
      +  padding:0 0 20px;
       }
       .landing-docs a {
         color:#333 !important;
      @@ -4572,8 +4077,7 @@ a.download-sdk {
         color:#555;
         text-transform:uppercase;
         border-bottom:none;
      -  margin:0 0 1em;
      -  padding:5px 0 0;
      +  padding:5px 0 1em;
       }
       
       
      @@ -4681,8 +4185,7 @@ a.download-sdk {
         color:#555;
         text-transform:uppercase;
         border-bottom:1px solid #CCC;
      -  padding:8px 0 0 1px;
      -  margin-bottom:14px;
      +  padding:8px 0 14px 1px;
         clear:both;
       }
       
      @@ -4727,7 +4230,7 @@ a.download-sdk {
         line-height: 80px;
         text-align: center;
         letter-spacing: -1px;
      -  margin-bottom: 6px;
      +  padding-bottom: 6px;
       }
       
       .landing-pre-h1 {
      @@ -5063,152 +4566,9 @@ a.download-sdk {
       }
       
       
      -
      -/**
      - * VIDEO
      - */
      -
      -#video-container {
      -  display:none;
      -  position:fixed;
      -  top:0;
      -  left:0;
      -  width:100%;
      -  height:100%;
      -  background-color:rgba(0,0,0,0.8);
      -  z-index:9999;
      -}
      -
      -#video-frame {
      -  max-width:940px;
      -  height:100%;
      -  margin:72px auto;
      -  display:none;
      -  position:relative;
      -}
      -
      -.video-close {
      -  cursor: pointer;
      -  position: absolute;
      -  right: -49px;
      -  top: -49px;
      -  pointer-events: all;
      -}
      -
      -#icon-video-close {
      -  background-image: url("../images/close-white.png");
      -  background-image: -webkit-image-set(url(../images/close-white.png) 1x, url(../images/close-white_2x.png) 2x);
      -  background-repeat: no-repeat;
      -  background-position: 0 0;
      -  background-size: 36px 36px;
      -  height: 36px;
      -  width: 36px;
      -  display:block;
      -}
      -
      -#icon-video-close:hover {
      -  background-image: url("../images/close-grey.png");
      -  background-image: -webkit-image-set(url(../images/close-grey.png) 1x, url(../images/close-grey_2x.png) 2x);
      -}
      -
      -/* Preload the hover images */
      -a.video-shadowbox-button.white:after {
      -  display:none;
      -  content:url("../images/close-grey.png") url("../images/close-grey_2x.png");
      -}
      -
      -a.video-shadowbox-button.white {
      -  background-image: url("../images/play-circle-white.png");
      -  background-image: -webkit-image-set(url(../images/play-circle-white.png) 1x, url(../images/play-circle-white_2x.png) 2x);
      -  background-size: 36px 36px;
      -  background-repeat: no-repeat;
      -  background-position: right;
      -  padding: 16px 42px 16px 8px;
      -  font-size: 18px;
      -  font-weight: 500;
      -  line-height: 24px;
      -  color: #fff;
      -  text-decoration:none;
      -}
      -
      -a.video-shadowbox-button.white:hover {
      -  color:#bababa !important;
      -  background-image: url("../images/play-circle-grey.png");
      -  background-image: -webkit-image-set(url(../images/play-circle-grey.png) 1x, url(../images/play-circle-grey_2x.png) 2x);
      -}
      -
      -/* Preload the hover images */
      -a.video-shadowbox-button.white:after {
      -  display:none;
      -  content:url("../images/play-circle-grey.png") url("../images/play-circle-grey_2x.png");
      -}
      -
      -/*
      - * Responsive YouTube embeds from DevSite
      - *
      - * When applied to a <div> that wraps a video, "video-wrapper" forces the video
      - * to float right at 50% of the column width on desktop, but appear as a block
      - * element at 100% of the column width on smaller screens.
      - * "video-wrapper-full-width" works the same but is always 100% width.
      - */
      -.video-wrapper,
      -.video-wrapper-left {
      -  float: right;
      -  margin: 0 0 40px 40px;
      -  padding-top: calc(((100% - 40px) / 2) / 16 * 9); /* 16:9 including margin */
      -  position: relative;
      -  width: calc((100% - 40px) / 2);                  /* 50% including margin */
      -}
      -
      -/*
      - * "video-wrapper-left" forces 50% without the float
      - * This is useful for heading content when you want the video to
      - * appear next to an element that is already floated right
      - * (e.g. tb-wrapper <div>)
      - */
      -.video-wrapper-left {
      -  float: none;
      -  margin: 16px 0 20px 0;
      -}
      -
      -.video-wrapper-full-width {
      -  margin: 16px 0;
      -  padding-top: 56.25%; /* Forces div to 16:9 at 100% width */
      -  position: relative;
      -  width: 100%;
      -}
      -
      -.video-wrapper embed,
      -.video-wrapper iframe,
      -.video-wrapper object,
      -.video-wrapper-full-width embed,
      -.video-wrapper-full-width iframe,
      -.video-wrapper-full-width object,
      -.video-wrapper-left embed,
      -.video-wrapper-left iframe,
      -.video-wrapper-left object {
      -  height: 100%;
      -  left: 0;
      -  position: absolute;
      -  top: 0;
      -  width: 100%;
      -}
      -
      -@media screen and (max-width: 1000px) {
      -
      -  .video-wrapper,
      -  .video-wrapper-left {
      -    float: none;
      -    margin: 16px 0;
      -    padding-top: 56.25%; /* Forces div to 16:9 at 100% width */
      -    width: 100%;
      -  }
      -}
      -
      -
      -/******************
      -Styles for d.a.c/index:
      -*******************/
      +/******************
      +Styles for d.a.c/index:
      +*******************/
       
       
       
      @@ -5246,7 +4606,7 @@ Styles for d.a.c/index:
         font-size: 60px;
         line-height: 68px;
         letter-spacing: -1px;
      -  margin-top: 0;
      +  padding-top: 0;
       }
       
       .fullscreen-carousel .hero p {
      @@ -5385,62 +4745,6 @@ Styles for d.a.c/index:
         margin-bottom: 26px;
       }
       
      -
      -/*
      -  Styles for the actions bar.
      -*/
      -.actions-bar {
      -  background: #b0bec5;
      -  text-align: center;
      -}
      -
      -.actions-bar .actions {
      -  padding: 24px 0;
      -  font-size: 0.1px;
      -  line-height: 0.1px;
      -}
      -
      -.actions-bar .actions:after {
      -  content: '';
      -  width: 100%;
      -  display: inline-block;
      -}
      -
      -.actions-bar .actions > div {
      -  display: inline-block;
      -  margin: 0 16px;
      -}
      -
      -.actions-bar .actions a {
      -  color: #fff;
      -  font-size: 24px;
      -  font-weight: 300;
      -  line-height: 50px;
      -  -webkit-transition: opacity .3s;
      -  transition: opacity .3s;
      -}
      -
      -.actions-bar .actions a:hover {
      -  opacity: .54;
      -}
      -
      -.actions-bar .actions .dac-sprite {
      -  margin: 0 -8px 0 -12px;
      -}
      -
      -@media (max-width: 719px) {
      -  .actions-bar {
      -    text-align: left;
      -  }
      -
      -  .actions-bar .actions > div {
      -    display: block;
      -    margin: 0;
      -  }
      -}
      -
      -
      -
       /*
         Specific styles for new home page layout of the carousels.
       */
      @@ -5602,7 +4906,100 @@ a.home-new-cta-btn:hover,
         display:none;
       }
       
      -.dac-visible-mobile-block, .dac-mobile-only, .dac-visible-mobile-inline, .dac-visible-mobile-inline-block, .dac-visible-tablet-block, .dac-visible-tablet-inline, .dac-visible-tablet-inline-block, .dac-visible-desktop-block, .dac-visible-desktop-inline, .dac-visible-desktop-inline-block {
      +#tb li:before, #qv li:before {
      +  background-position: 0px -196px;
      +  height: 24px;
      +  width: 24px;
      +  content: '';
      +  left: -8px;
      +  opacity: .7;
      +  position: absolute;
      +  top: -4px;
      +}
      +
      +/* CHANGE EXISTING SELECTOR FOR ANDROID M HERO ONLY
      +   REMOVE THE BELOW STYLES WHEN THE ANDROID M CAROUSEL
      +   GRAPHIC ON THE MAIN LANDING IS TAKEN DOWN */
      +.dac-hero.mprev {
      +  background-color: #fff;
      +  background-position: 50% 53%;
      +  background-size: cover;
      +  background-image: url(../images/home/android_m_hero_1200.jpg);
      +  box-sizing: border-box;
      +  font-size: 16px;
      +  min-height: 550px;
      +  padding-top: 88px;
      +}
      +.dac-hero.dac-darken.mprev::before {
      +  background: rgba(0, 0, 0, 0.3);
      +  bottom: 0;
      +  content: '';
      +  display: block;
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +}
      +
      +.dac-hero.dac-darken.mprev::before {
      +  background: -webkit-linear-gradient(top, rgba(0, 0, 0, .05), rgba(0, 0, 0, .05), #000 950px);
      +  background: linear-gradient(to bottom, rgba(0, 0, 0, .05), rgba(0, 0, 0, 0.05), #000 950px);
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero.dac-darken.mprev {
      +    background-size: auto 600px;
      +    background-position: 55% 0;
      +    background-repeat: no-repeat;
      +  }
      +
      +  .dac-hero-figure.mprev {
      +    height: 10px;
      +    margin: 15px 0;
      +  }
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero.dac-darken.mprev {
      +    background-size: auto 600px;
      +    background-position: 55% 0;
      +    background-repeat: no-repeat;
      +  }
      +
      +  .dac-hero-figure.mprev {
      +    height: 10px;
      +    margin: 15px 0;
      +  }
      +}
      +
      +@media (max-width: 1200px) {
      +  .dac-hero.dac-darken.mprev {
      +    background-size: auto 700px;
      +    background-position: 55% 0;
      +    background-repeat: no-repeat;
      +  }
      +
      +  .dac-hero-cta.mprev {
      +    white-space:nowrap;
      +  }
      +}
      +
      +@charset "UTF-8";
      +/**
      + * Fades out an element.
      + * Applies visibility hidden when the transition is finished.
      + *
      + * Use opacity: 1; to show the element.
      + */
      +.dac-visible-mobile-block, .dac-mobile-only,
      +.dac-visible-mobile-inline,
      +.dac-visible-mobile-inline-block,
      +.dac-visible-tablet-block,
      +.dac-visible-tablet-inline,
      +.dac-visible-tablet-inline-block,
      +.dac-visible-desktop-block,
      +.dac-visible-desktop-inline,
      +.dac-visible-desktop-inline-block {
         display: none !important;
       }
       
      @@ -5664,6 +5061,13 @@ a.home-new-cta-btn:hover,
         position: relative !important;
       }
       
      +/**
      + * Hide from browsers/screenreaders on all sizes.
      + */
      +.dac-hidden {
      +  display: none !important;
      +}
      +
       /**
        * Break strings when their length exceeds the width of their container.
        */
      @@ -5754,8 +5158,6 @@ a.home-new-cta-btn:hover,
         box-sizing: border-box;
         display: none;
         height: 70px;
      -  left: 50%;
      -  margin-left: -35px;
         line-height: 65px;
         padding-left: 4px;
         position: absolute;
      @@ -5763,11 +5165,20 @@ a.home-new-cta-btn:hover,
         text-align: center;
         -webkit-transition: opacity .5s;
                 transition: opacity .5s;
      -  top: 50px;
         width: 70px;
         z-index: 1; }
      +  .resource-card-6x2 .play-button {
      +    display: block;
      +    left: 10px;
      +    top: 15px;
      +    -webkit-transform: scale(0.73);
      +        -ms-transform: scale(0.73);
      +            transform: scale(0.73); }
         .resource-card-6x6 .play-button {
      -    display: block; }
      +    display: block;
      +    left: 50%;
      +    margin-left: -35px;
      +    top: 50px; }
       
       /* Styling for background image including tinting and section icons in stacks */
       .card-bg {
      @@ -5825,74 +5236,152 @@ a.home-new-cta-btn:hover,
         left: 0;
         overflow: hidden;
         background: #fefefe;
      -  padding: 6px 12px; }
      -  .card-info .section {
      -    color: #898989;
      -    font-size: 11px;
      -    font-weight: 700;
      -    letter-spacing: .3px;
      -    line-height: 20px;
      -    text-transform: uppercase; }
      -  .card-info .title {
      -    color: #333;
      -    font-size: 18px;
      -    font-weight: 500;
      -    line-height: 24px;
      -    margin-bottom: 2px;
      -    max-height: 48px;
      -    overflow: hidden;
      -    padding-bottom: 5px;
      -    text-overflow: ellipsis;
      -    white-space: normal; }
      -  .card-info .description {
      -    overflow: hidden; }
      -    .card-info .description .text {
      -      color: #666;
      -      font-size: 14px;
      -      height: 60px;
      -      line-height: 20px;
      -      overflow: hidden;
      -      width: 100%; }
      -    .card-info .description .util {
      -      position: absolute;
      -      right: 5px;
      -      bottom: 70px;
      -      opacity: 0;
      -      -webkit-transition: opacity 0.5s;
      -              transition: opacity 0.5s; }
      -  .card-info.empty-desc .title {
      -    white-space: normal;
      -    overflow: visible; }
      -  .card-info.empty-desc .description {
      -    display: none; }
      +  padding: 6px 12px;
      +}
       
      -/* Truncate card summaries at bounding box and
      - * and apply ellipsis at lower right */
      -.ellipsis {
      +.card-info .section {
      +  color: #898989;
      +  font-size: 11px;
      +  font-weight: 700;
      +  letter-spacing: .3px;
      +  line-height: 20px;
      +  text-transform: uppercase;
      +}
      +
      +.card-info .title {
      +  color: #333;
      +  font-size: 18px;
      +  font-weight: 500;
      +  line-height: 23px;
      +  margin-bottom: 7px;
      +  max-height: 46px;
         overflow: hidden;
      -  float: right;
      -  line-height: 15px;
      -  width: 100%; }
      -  .ellipsis:before {
      -    content: "";
      -    float: left;
      -    width: 5px;
      -    height: 100%; }
      -  .ellipsis > *:first-child.text {
      -    float: right;
      -    width: 100% !important;
      -    margin-left: -5px; }
      -  .ellipsis:after {
      -    content: "\02026";
      -    height: 17px;
      -    padding-bottom: 4px;
      -    box-sizing: content-box;
      -    float: right;
      -    position: relative;
      -    top: -16px;
      -    left: 100%;
      -    width: 4em;
      -    margin-left: -4em;
      +  text-overflow: ellipsis;
      +  white-space: normal;
      +}
      +
      +.card-info .description {
      +  overflow: hidden;
      +}
      +
      +.card-info .description .text {
      +  color: #666;
      +  font-size: 14px;
      +  height: 60px;
      +  line-height: 20px;
      +  overflow: hidden;
      +  width: 100%;
      +}
      +
      +.card-info .description .util {
      +  position: absolute;
      +  right: 5px;
      +  bottom: 70px;
      +  opacity: 0;
      +  -webkit-transition: opacity 0.5s;
      +  transition: opacity 0.5s;
      +}
      +
      +.card-info.empty-desc .title {
      +  white-space: normal;
      +  overflow: visible;
      +}
      +
      +.card-info.empty-desc .description {
      +  display: none;
      +}
      +
      +/* Resource card with icon instead of bg image */
      +.resource-widget-card-icon {
      +  text-align: center;
      +}
      +
      +.card-icon {
      +  margin: 20px 0 0;
      +}
      +
      +.resource-widget-card-icon .card-info {
      +  height: 210px;
      +}
      +
      +.resource-widget-card-icon .card-info .title {
      +  color: #333;
      +  line-height: 24px;
      +}
      +
      +.resource-widget-card-icon .card-bg {
      +  background: none;
      +  bottom: 220px;
      +  opacity: 1;
      +  top: 30px;
      +  -webkit-transition: opacity .3s;
      +  transition: opacity .3s;
      +}
      +
      +.resource-widget-card-icon .resource-card:hover .card-bg {
      +  opacity: .5;
      +}
      +
      +.resource-widget-card-icon .card-bg img {
      +  max-height: 100%;
      +}
      +
      +.resource-widget-card-icon .card-bg::after {
      +  background: transparent;
      +}
      +
      +@media (min-width: 1210px) {
      +  .resource-widget-card-icon .resource {
      +    height: 240px;
      +  }
      +  .resource-widget-card-icon .card-bg {
      +    bottom: 160px;
      +  }
      +  .resource-widget-card-icon .card-info {
      +    height: 160px;
      +  }
      +}
      +
      +@media (max-width: 979px) {
      +  .resource-widget-card-icon .resource {
      +    height: 240px;
      +  }
      +  .resource-widget-card-icon .card-bg {
      +    bottom: 160px;
      +  }
      +
      +  .resource-widget-card-icon .card-info {
      +    height: 160px;
      +  }
      +}
      +
      +/* Truncate card summaries at bounding box and
      + * and apply ellipsis at lower right */
      +.ellipsis {
      +  overflow: hidden;
      +  float: right;
      +  line-height: 15px;
      +  width: 100%; }
      +  .ellipsis:before {
      +    content: "";
      +    float: left;
      +    width: 5px;
      +    height: 100%; }
      +  .ellipsis > *:first-child.text {
      +    float: right;
      +    width: 100% !important;
      +    margin-left: -5px; }
      +  .ellipsis:after {
      +    content: "\02026";
      +    height: 17px;
      +    padding-bottom: 4px;
      +    box-sizing: content-box;
      +    float: right;
      +    position: relative;
      +    top: -16px;
      +    left: 100%;
      +    width: 4em;
      +    margin-left: -4em;
           padding-right: 5px;
           background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), to(white), color-stop(65%, white));
           background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0), white 65%, white);
      @@ -5959,7 +5448,7 @@ a.home-new-cta-btn:hover,
           /*text-transform: uppercase;*/
           color: #898989;
           font-size: 17px;
      -    line-height: 24px;
      +    line-height: 23px;
           margin-bottom: 6px; }
         .resource-stack-layout .section-card {
           height: 284px; }
      @@ -6253,31 +5742,62 @@ a.home-new-cta-btn:hover,
         height: 558px; }
       
       /* 1/3 row items */
      -.resource-card-3x2 > .card-bg, .resource-card-6x2 > .card-bg, .resource-card-9x2 > .card-bg, .resource-card-12x2 > .card-bg, .resource-card-15x2 > .card-bg, .resource-card-18x2 > .card-bg {
      +.resource-card-3x2 > .card-bg,
      +.resource-card-6x2 > .card-bg,
      +.resource-card-9x2 > .card-bg,
      +.resource-card-12x2 > .card-bg,
      +.resource-card-15x2 > .card-bg,
      +.resource-card-18x2 > .card-bg {
         left: 0;
         top: 0;
         width: 90px;
         height: 100%;
         position: absolute;
      -  display: block; }
      +  display: block;
      +}
      +
       .resource-card-3x2 > .card-info, .resource-card-6x2 > .card-info, .resource-card-9x2 > .card-info, .resource-card-12x2 > .card-info, .resource-card-15x2 > .card-info, .resource-card-18x2 > .card-info {
         height: 100%;
         left: 90px;
         padding: 6px 12px;
      -  overflow: hidden; }
      -  .resource-card-3x2 > .card-info .title, .resource-card-6x2 > .card-info .title, .resource-card-9x2 > .card-info .title, .resource-card-12x2 > .card-info .title, .resource-card-15x2 > .card-info .title, .resource-card-18x2 > .card-info .title {
      -    max-height: 48px;
      -    white-space: normal; }
      -  .resource-card-3x2 > .card-info .description, .resource-card-6x2 > .card-info .description, .resource-card-9x2 > .card-info .description, .resource-card-12x2 > .card-info .description, .resource-card-15x2 > .card-info .description, .resource-card-18x2 > .card-info .description {
      -    display: none; }
      -  .resource-card-3x2 > .card-info .text, .resource-card-6x2 > .card-info .text, .resource-card-9x2 > .card-info .text, .resource-card-12x2 > .card-info .text, .resource-card-15x2 > .card-info .text, .resource-card-18x2 > .card-info .text {
      -    height: auto; }
      +  overflow: hidden;
      +}
      +
      +.resource-card-3x2 > .card-info .title,
      +.resource-card-6x2 > .card-info .title,
      +.resource-card-9x2 > .card-info .title,
      +.resource-card-12x2 > .card-info .title,
      +.resource-card-15x2 > .card-info .title,
      +.resource-card-18x2 > .card-info .title {
      +  max-height: 69px;
      +  white-space: normal;
      +}
      +
      +.resource-card-3x2 > .card-info .description,
      +.resource-card-6x2 > .card-info .description,
      +.resource-card-9x2 > .card-info .description,
      +.resource-card-12x2 > .card-info .description,
      +.resource-card-15x2 > .card-info .description,
      +.resource-card-18x2 > .card-info .description {
      +  display: none;
      +}
      +
      +.resource-card-3x2 > .card-info .text,
      +.resource-card-6x2 > .card-info .text,
      +.resource-card-9x2 > .card-info .text,
      +.resource-card-12x2 > .card-info .text,
      +.resource-card-15x2 > .card-info .text,
      +.resource-card-18x2 > .card-info .text {
      +  height: auto;
      +}
       
       /* Override to show the description instead of the content section */
      -.no-section .resource-card-3x2 > .card-info .section, .no-section .resource-card-6x2 > .card-info .section {
      +.no-section .resource-card-3x2 > .card-info .section,
      +.no-section .resource-card-6x2 > .card-info .section {
         display: none; }
       
      -.no-section .resource-card-3x2 > .card-info .description, .no-section .resource-card-6x2 > .card-info .description {
      +.no-section .resource-card-3x2 > .card-info .description,
      +.no-section .resource-card-6x2 > .card-info .description {
         display: block; }
       
       /* 1/2 row items */
      @@ -6297,7 +5817,7 @@ a.home-new-cta-btn:hover,
           .resource-card-3x3 > .card-info .section, .resource-card-6x3 > .card-info .section, .resource-card-9x3 > .card-info .section, .resource-card-12x3 > .card-info .section, .resource-card-15x3 > .card-info .section, .resource-card-18x3 > .card-info .section {
             display: none; }
           .resource-card-3x3 > .card-info .title, .resource-card-6x3 > .card-info .title, .resource-card-9x3 > .card-info .title, .resource-card-12x3 > .card-info .title, .resource-card-15x3 > .card-info .title, .resource-card-18x3 > .card-info .title {
      -      max-height: 96px;
      +      max-height: 92px;
             white-space: normal; }
           .resource-card-3x3 > .card-info .text, .resource-card-6x3 > .card-info .text, .resource-card-9x3 > .card-info .text, .resource-card-12x3 > .card-info .text, .resource-card-15x3 > .card-info .text, .resource-card-18x3 > .card-info .text {
             height: auto; }
      @@ -6329,16 +5849,31 @@ a.home-new-cta-btn:hover,
       /* Example of card menu tinting */
       .resource-widget[data-section=distribute\/tools] .section-card-menu .card-bg:after {
         background: rgba(126, 55, 148, 0.4) !important; }
      +
       .resource-widget[data-section=distribute\/tools] .section-card-menu .card-section-icon .icon {
         background-color: #7e3794 !important; }
      +
       .resource-widget[data-section=distribute\/tools] .section-card-menu .card-info ul li {
         border-top-color: #7e3794 !important; }
       
       /* tinting for stacks */
      -div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-menu .card-info ul li {
      +div.jd-descr > .resource-widget[data-section=distribute\/tools]
      +.section-card-menu .card-info ul li {
         border-top-color: #7e3794 !important; }
       
      -.dac-fab, .button, .landing-button, .dac-button {
      +/* Show more/less */
      +.dac-show-more,
      +.dac-show-less {
      +  display: none !important; }
      +
      +.dac-has-more .dac-show-more {
      +  display: inline-block !important; }
      +
      +.dac-has-less .dac-show-less {
      +  display: inline-block !important; }
      +
      +.dac-fab, .dac-button-social, .button, .landing-button,
      +.dac-button {
         background: transparent;
         border: 0;
         border-radius: 3px;
      @@ -6369,18 +5904,17 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
                 user-select: none;
         white-space: nowrap; }
       
      -.button, .landing-button, .dac-button.dac-raised {
      +.button, .landing-button,
      +.dac-button.dac-raised {
         background-color: #FAFAFA;
         box-shadow: 0 2px 5px rgba(0, 0, 0, 0.26); }
       
       .dac-button.dac-raised.dac-primary, .landing-secondary, .button {
         background-color: #039bef; }
         .dac-button.dac-raised.dac-primary:hover, .landing-secondary:hover, .button:hover {
      -    background-color: #0288d1;
      -    color:#fff; }
      +    background-color: #0288d1; }
         .dac-button.dac-raised.dac-primary:active, .landing-secondary:active, .button:active {
      -    background-color: #0277bd;
      -    color:#fff; }
      +    background-color: #0277bd; }
         .dac-button.dac-raised.dac-primary.disabled, .button.disabled {
           background-color: #bbb; }
       
      @@ -6392,35 +5926,114 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
           background-color: #822517; }
       
       .dac-button.dac-raised.dac-green, .landing-button.green {
      -  background-color: #90C653; }
      -
      -.dac-button.dac-raised.dac-primary, .landing-secondary, .button, .dac-button.dac-raised.dac-red, .landing-primary, .dac-button.dac-raised.dac-green, .landing-button.green {
      +  background-color: #90c653; }
      +  .dac-button.dac-raised.dac-green:hover, .landing-button.green:hover {
      +    background-color: #79b03b; }
      +  .dac-button.dac-raised.dac-green:active, .landing-button.green:active {
      +    background-color: #699933; }
      +
      +.dac-button.dac-raised.dac-primary, .landing-secondary, .button,
      +.dac-button.dac-raised.dac-red,
      +.landing-primary,
      +.dac-button.dac-raised.dac-green,
      +.landing-button.green {
         color: #fff; }
       
       .dac-button.dac-large, .landing-button {
         padding: 12px 24px; }
       
      -.dac-fab {
      +.landing-button-wrap {
      +  float: left;
      +  margin-right: 40px;
      +  width: auto;
      +}
      +
      +.dac-fab, .dac-button-social {
         background: #fff;
         box-shadow: 0 2px 5px rgba(0, 0, 0, 0.26);
         border-radius: 50%;
      -  font-size: 0;
         height: 36px;
         line-height: 36px;
      +  margin: 0;
         min-width: 0;
         overflow: hidden;
         padding: 0;
         vertical-align: middle;
         width: 36px; }
      -  .dac-fab:hover, a:hover > .dac-fab {
      +  .dac-fab:hover, .dac-button-social:hover,
      +  a:hover > .dac-fab,
      +  a:hover > .dac-button-social {
           box-shadow: 0 3px 8px rgba(0, 0, 0, 0.26); }
      -  .dac-fab.dac-primary {
      +  .dac-fab > .dac-sprite, .dac-button-social > .dac-sprite, .dac-fab > .dac-modal-header-close:before, .dac-button-social > .dac-modal-header-close:before, .paging-links .dac-fab > .prev-page-link:before, .paging-links .dac-button-social > .prev-page-link:before, .paging-links .dac-fab > .next-page-link:before, .paging-links .dac-button-social > .next-page-link:before, .paging-links .dac-fab > .next-class-link:before, .paging-links .dac-button-social > .next-class-link:before, .paging-links .dac-fab > .start-class-link:after, .paging-links .dac-button-social > .start-class-link:after {
      +    margin-top: -2px; }
      +  .dac-fab.dac-primary, .dac-primary.dac-button-social {
           background: #00c7a0; }
      -  .dac-fab.dac-large {
      +  .dac-fab.dac-large, .dac-large.dac-button-social {
           height: 54px;
           line-height: 54px;
           width: 54px; }
       
      +.dac-button-social {
      +  background: #ccc;
      +  box-shadow: none;
      +  position: relative;
      +  overflow: hidden; }
      +  .dac-button-social::after {
      +    background: rgba(0, 0, 0, 0.2);
      +    border-radius: 50%;
      +    bottom: 0;
      +    content: '';
      +    display: block;
      +    left: 0;
      +    opacity: 0;
      +    position: absolute;
      +    right: 0;
      +    top: 0;
      +    -webkit-transition: opacity .3s;
      +            transition: opacity .3s; }
      +  .dac-button-social:hover {
      +    box-shadow: none; }
      +  .dac-button-social:active::after {
      +    opacity: 1; }
      +  .dac-button-social:focus.dac-rss, .dac-button-social:hover.dac-rss {
      +    background: #ff9800; }
      +  .dac-button-social:focus.dac-youtube, .dac-button-social:hover.dac-youtube {
      +    background: #f44336; }
      +  .dac-button-social:focus.dac-gplus, .dac-button-social:hover.dac-gplus {
      +    background: #f44336; }
      +  .dac-button-social:focus.dac-twitter, .dac-button-social:hover.dac-twitter {
      +    background: #55acee; }
      +
      +.dac-action {
      +  display: inline-block;
      +  margin: 0 16px; }
      +  .dac-action-link {
      +    color: inherit;
      +    font-size: 24px;
      +    font-weight: 300;
      +    line-height: 50px;
      +    -webkit-transition: opacity .3s;
      +            transition: opacity .3s; }
      +    .dac-action-link:hover {
      +      color: inherit;
      +      opacity: .54; }
      +  .dac-action-sprite {
      +    margin-left: -12px;
      +    margin-right: -8px; }
      +  .dac-actions {
      +    list-style-type: none;
      +    margin: 0;
      +    padding-bottom: 24px;
      +    padding-top: 24px;
      +    text-align: center; }
      +    @media (max-width: 719px) {
      +      .dac-actions {
      +        text-align: left; } }
      +  @media (max-width: 719px) {
      +    .dac-action {
      +      display: block;
      +      margin: 0; } }
      +
       .dac-scroll-button {
         height: 54px;
         line-height: 54px;
      @@ -6444,64 +6057,130 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
         margin-top: 96px;
         padding-bottom: 20px;
         position: relative;
      -  /* Modifier for landing pages, to snuggle closer to sections. */ }
      -  .dac-footer a {
      -    color: #999; }
      -  .dac-footer p {
      -    margin: 7px 0 0; }
      -  .dac-footer-main {
      -    padding: 30px 0; }
      +}
      +
      +.dac-footer a {
      +  color: #999;
      +}
      +
      +.dac-footer p {
      +  margin: 7px 0 0;
      +}
      +
      +.dac-footer-main {
      +  padding: 30px 0;
      +}
      +
      +.dac-footer-reachout {
      +  text-align: right;
      +}
      +
      +.dac-footer-contact,
      +.dac-footer-social {
      +  display: inline-block;
      +}
      +
      +.dac-footer .dac-footer-getnews,
      +.dac-footer .dac-footer-contact-link {
      +  color: #000;
      +  cursor: pointer;
      +  font-size: 20px;
      +  font-weight: 300;
      +  margin: 8px 0;
      +  vertical-align: middle;
      +}
      +
      +.dac-footer .dac-footer-contact-link,
      +.dac-footer .dac-footer-social-link {
      +  margin-left: 16px;
      +  margin-right: 0;
      +}
      +
      +.dac-footer-getnews > .dac-fab, .dac-footer-getnews > .dac-button-social {
      +  margin-left: 4px;
      +}
      +
      +.dac-footer-separator {
      +  background: #f0f0f0;
      +  margin: 0 0 12px;
      +}
      +
      +.dac-footer-links {
      +  float: left;
      +  margin: 10px 0 60px;
      +  width: 50%;
      +}
      +
      +.dac-footer-links a + a:before {
      +  content: '|';
      +  cursor: default;
      +  margin: 0 10px 0 8px;
      +}
      +
      +.devsite-utility-footer-language {
      +  float: right;
      +  margin: 10px 0 60px;
      +  width: 50%;
      +}
      +
      +.dac-footer .locales {
      +  float: right;
      +  margin: 0;
      +}
      +
      +.dac-footer .locales select {
      +  background-color: #f0f0f0;
      +  border-radius: 3px;
      +  font-size: 12px;
      +  height: auto;
      +  margin-top: -2px;
      +  padding: 8px 12px;
      +  width: 146px;
      +}
      +
      +.dac-footer.dac-landing {
      +  margin-top: 0;
      +  border-top: 0;
      +}
      +
      +@media (max-width: 719px) {
         .dac-footer-reachout {
      -    text-align: right; }
      -  .dac-footer-contact, .dac-footer-social {
      -    display: inline-block; }
      -  .dac-footer .dac-footer-getnews, .dac-footer .dac-footer-contact-link {
      -    color: #000;
      -    cursor: pointer;
      -    font-size: 20px;
      -    font-weight: 300;
      -    margin: 8px 0;
      -    vertical-align: middle; }
      -  .dac-footer .dac-footer-contact-link, .dac-footer .dac-footer-social-link {
      -    margin-left: 16px;
      -    margin-right: 0; }
      -  .dac-footer-getnews > .dac-fab {
      -    margin-left: 4px; }
      -  .dac-footer-separator {
      -    background: #f0f0f0;
      -    margin: 0 0 12px; }
      -  .dac-footer-links a + a:before {
      -    content: '|';
      -    cursor: default;
      -    margin: 0 10px 0 8px; }
      +    text-align: left;
      +  }
      +
      +  .dac-footer-social {
      +    display: block;
      +  }
      +
      +  .dac-footer-social-link,
      +  .dac-footer-contact-link {
      +    display: inline-block;
      +  }
      +
      +  .dac-footer .dac-footer-contact-link,
      +  .dac-footer .dac-footer-social-link {
      +    margin-left: 0;
      +    margin-right: 16px;
      +  }
      +
      +  .dac-footer-links {
      +    display: block;
      +    float: none;
      +    width: 100%;
      +  }
      +
      +  .devsite-utility-footer-language {
      +    float: none;
      +    margin: 0 0 20px;
      +    width: 100%;
      +  }
      +
         .dac-footer .locales {
      -    float: right;
      -    margin: 0; }
      -    .dac-footer .locales select {
      -      background-color: #f0f0f0;
      -      border-radius: 3px;
      -      font-size: 12px;
      -      height: auto;
      -      margin-top: -2px;
      -      padding: 8px 12px;
      -      width: 146px; }
      -  .dac-footer.dac-landing {
      -    margin-top: 0;
      -    border-top: 0; }
      -  @media (max-width: 719px) {
      -    .dac-footer-reachout {
      -      text-align: left; }
      -    .dac-footer-social {
      -      display: block; }
      -    .dac-footer-social-link, .dac-footer-contact-link {
      -      display: inline-block; }
      -    .dac-footer .dac-footer-contact-link, .dac-footer .dac-footer-social-link {
      -      margin-left: 0;
      -      margin-right: 16px; }
      -    .dac-footer .locales {
      -      display: block;
      -      float: none;
      -      margin-top: 15px; } }
      +    display: block;
      +    float: none;
      +    margin-top: 15px;
      +  }
      +}
       
       /* =============================================================================
          Columns
      @@ -6509,7 +6188,16 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
       .wrap {
         margin: 0 auto;
         max-width: 940px;
      -  clear: both; }
      +  clear: both;
      +}
      +
      +.dac-fullscreen-mode .wrap {
      +  max-width: none;
      +}
      +
      +.dac-fullscreen-mode .dac-search-open .wrap {
      +  max-width: 940px;
      +}
       
       .cols {
         margin-left: -10px;
      @@ -6950,7 +6638,7 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
       .col-push-15of16 {
         left: 93.75%; }
       
      -@media (max-width: 960px) and (min-width: 720px) {
      +@media (max-width: 959px) and (min-width: 720px) {
         .col-tablet-1of1, .col-tablet-2of2, .col-tablet-3of3, .col-tablet-4of4, .col-tablet-5of5, .col-tablet-6of6, .col-tablet-8of8, .col-tablet-10of10, .col-tablet-12of12, .col-tablet-16of16 {
           width: 100%; }
         .col-tablet-1of2, .col-tablet-2of4, .col-tablet-3of6, .col-tablet-4of8, .col-tablet-5of10, .col-tablet-6of12, .col-tablet-8of16 {
      @@ -7145,69 +6833,87 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
           left: 93.75%; } }
       
       .col-3-wide {
      -  width: 33.33333333%; }
      +  width: 33.3333333333%; }
       
       @media (max-width: 719px) {
         /* Remove .col-12 and .col-13 backward compatibility support as soon as it's been removed. */
      -[class*=col-], .col-12 [class*=col-], .col-13 [class*=col-] {
      +[class*=col-],
      +  .col-12 [class*=col-],
      +  .col-13 [class*=col-] {
         float: none;
         left: 0;
         width: auto;
       } }
       
      +/**
      + * Fades out an element.
      + * Applies visibility hidden when the transition is finished.
      + *
      + * Use opacity: 1; to show the element.
      + */
       /* Header component */
       .dac-header {
      -  background: #fff;
      +  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.07);
      +  box-sizing: border-box;
      +  background: #6ab344;
         height: 64px;
      -  margin: 0 -20px;
      +  margin: 0;
      +  left: 0;
      +  position: fixed;
      +  right: 0;
      +  top: 0;
      +  -webkit-transition: background 200ms;
      +  transition: background 200ms;
      +  z-index: 61;
       }
       
      -@media (max-width: 719px) {
      -  .dac-header {
      -    margin: 0 -10px;
      -  }
      -}
      -
      -.about .dac-header, .distribute .dac-header, .develop .dac-header {
      -  height: 128px;
      +.dac-ndk .dac-header {
      +  background: #00bcd4;
       }
       
      -.dac-header-inner {
      -  background: #fff;
      -  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.07);
      -  box-sizing: border-box;
      -  height: 64px;
      -  left: 0;
      -  right: 0;
      -  top: 0;
      -  z-index: 52;
      +.dac-studio .dac-header {
      +  background: #424242;
       }
       
      -.dac-header.dac-sub .dac-header-inner {
      -  border-bottom: 1px solid #e5e5e5;
      -  box-shadow: none;
      +.dac-search-mode .dac-header {
      +  background: #b0bec5;
      +  -webkit-transition: background 200ms;
      +  transition: background 200ms;
       }
       
      -.dac-header.is-sticky .dac-header-inner {
      -  position: fixed;
      -  -webkit-animation: .3s dac-header-show;
      -  animation: .3s dac-header-show;
      +.dac-search-mode .dac-header-logo,
      +  .dac-search-mode .dac-header-console-btn {
      +  opacity: 0;
      +  visibility: hidden;
      +  -webkit-transition: visibility 0s linear 200ms, opacity 200ms linear;
      +  transition: visibility 0s linear 200ms, opacity 200ms linear;
       }
       
       .dac-header-logo {
      -  border-right: 1px solid #e5e5e5;
         display: block;
         font-size: 20px;
      -  font-weight: 300;
      +  font-weight: 400;
         float: left;
         letter-spacing: .3px;
         line-height: 36px;
      -  margin-right: 16px;
      -  padding: 14px 24px 14px;
      +  opacity: 1;
      +  padding: 13px 48px 15px 0;
       }
       
       .dac-header-logo, .dac-header-logo:hover, .dac-header-logo:focus {
      -  color: #444;
      +  color: #fff;
      +}
      +
      +@media (min-width: 980px) {
      +  .dac-header-logo {
      +    border-right: 1px solid rgba(0, 0, 0, 0.1);
      +  }
      +}
      +
      +@media (min-width: 720px) and (max-width: 979px) {
      +  .dac-header-logo {
      +    padding-right: 10px;
      +  }
       }
       
       .dac-header-logo-image {
      @@ -7215,26 +6921,96 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
         vertical-align: top;
       }
       
      +.dac-header-tabs {
      +  list-style: none;
      +  margin: 0 10px;
      +  display: none;
      +  opacity: 1;
      +  -webkit-transition: opacity 200ms linear 200ms;
      +  transition: opacity 200ms linear 200ms;
      +}
      +
      +@media (min-width: 720px) {
      +  .dac-header-tabs {
      +    display: inline-block;
      +  }
      +
      +  /* Do not show nav toggle and up-nav button for left nav,
      +     when header tabs are visible (when no sub navigation) */
      +  body.no-subnav .dac-nav-back-button {
      +    display:none;
      +  }
      +  body.no-subnav .dac-nav-sub {
      +    top: 0 !important;
      +  }
      +}
      +
      +.dac-header-tabs li {
      +  display: inline-block;
      +}
      +
      +.dac-header-tab {
      +  display: inline-block;
      +  line-height: 64px;
      +  height: 64px;
      +  padding: 0 9px;
      +  color: #fff;
      +  color: rgba(255, 255, 255, 0.7);
      +  font-size: 14px;
      +  text-transform: uppercase;
      +  font-weight: 500;
      +}
      +
      +.dac-header-tab:hover,
      +.dac-header-tab:focus {
      +  color: #fff;
      +}
      +
      +.dac-header-tab.selected {
      +  border-bottom: 4px solid #fff;
      +  height: 60px;
      +  color: #fff;
      +}
      +
      +.dac-search-mode .dac-header-tabs {
      +  opacity: 0;
      +  -webkit-transition: opacity 0ms linear 0ms;
      +  transition: opacity 0ms linear 0ms;
      +}
      +
       .dac-header-console-btn {
      -  border: 1px solid #c5c5c5;
         border-radius: 3px;
      -  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.11);
      -  background: #fff;
      +  box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
         float: right;
         font-size: 14px;
      +  font-weight: 500;
         line-height: 28px;
      -  margin: 17px 30px 17px 10px;
      -  padding: 0 10px;
      +  margin: 13px 13px 12px 24px;
      +  opacity: 1;
      +  padding: 4px 10px;
         position: relative;
      -  z-index: 52;
      +  text-transform: uppercase;
      +  -webkit-transition: box-shadow .2s;
      +  transition: box-shadow .2s;
      +  z-index: 60;
       }
       
      -.dac-header-console-btn > .dac-sprite {
      +@media (min-width: 720px) and (max-width: 979px) {
      +  .dac-header-console-btn {
      +    display: none;
      +  }
      +}
      +
      +.dac-header-console-btn > .dac-sprite, .dac-header-console-btn > .dac-modal-header-close:before, .paging-links .dac-header-console-btn > .prev-page-link:before, .paging-links .dac-header-console-btn > .next-page-link:before, .paging-links .dac-header-console-btn > .next-class-link:before, .paging-links .dac-header-console-btn > .start-class-link:after {
         margin-right: 5px;
       }
       
       .dac-header-console-btn, .dac-header-console-btn:hover, .dac-header-console-btn:focus {
      -  color: #666;
      +  color: #fff;
      +}
      +
      +.dac-header-console-btn:hover {
      +  box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.3);
       }
       
       .dac-header-console-btn:focus {
      @@ -7242,25 +7018,30 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
         outline: 0;
       }
       
      +.dac-studio .dac-header-console-btn {
      +  color:#fff;
      +  background:rgba(255, 255, 255, 0.3);
      +}
      +.dac-studio .dac-header-console-btn:hover {
      +  background:rgba(255, 255, 255, 0.5);
      +}
      +.dac-studio .dac-header-console-btn:focus {
      +  background:rgba(255, 255, 255, 0.7);
      +  color:#000;
      +}
      +
       @media (max-width: 719px) {
         .dac-header {
      -    height: 64px !important;
           text-align: center;
         }
       
      -  .dac-header-inner {
      -    position: fixed;
      -  }
      -
         .dac-header-logo {
           border-right: 0;
           display: inline-block;
           margin-right: 0;
           float: none;
      -  }
      -
      -  .dac-header.dac-sub {
      -    display: none;
      +    padding-left: 0;
      +    padding-right: 0;
         }
       
         .dac-header-console-btn {
      @@ -7268,57 +7049,41 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
         }
       }
       
      -@-webkit-keyframes dac-header-show {
      -  0% {
      -    -webkit-transform: translateY(-64px);
      -    transform: translateY(-64px);
      -  }
      -
      -  100% {
      -    -webkit-transform: translateY(0);
      -    transform: translateY(0);
      -  }
      -}
      -
      -@keyframes dac-header-show {
      -  0% {
      -    -webkit-transform: translateY(-64px);
      -    transform: translateY(-64px);
      -  }
      -
      -  100% {
      -    -webkit-transform: translateY(0);
      -    transform: translateY(0);
      -  }
      -}
      -
       /* Header Breadcrumbs component */
       .dac-header-crumbs {
      -  display: none;
         list-style-type: none;
      -  margin: 0;
      +  margin: 23px 0 -13px 0;
      +  display: inline-block;
       }
       
      -.is-sticky .dac-header-crumbs {
      -  display: block;
      +body.no-crumbs .dac-header-crumbs {
      +  display:none;
      +}
      +
      +.dac-header-crumbs.dac-has-content {
      +  opacity: 1;
       }
       
       .dac-header-crumbs-item {
         float: left;
         position: relative;
         margin: 0;
      -  padding-left: 10px;
      +  padding: 0;
      +}
      +
      +.dac-header-crumbs-item i, .dac-header-crumbs-item .dac-nav-link-forward {
      +  display: none;
       }
       
       .dac-header-crumbs-item:before {
      -  color: #444;
      -  content: '>';
      -  font-weight: 300;
      -  font-size: 20px;
      -  left: 0;
      -  line-height: 28px;
      -  padding: 16px 0;
      +  content: '';
      +  background: transparent url(../images/styles/disclosure_right.png) no-repeat scroll 50% 50%;
      +  width: 10px;
      +  height: 10px;
      +  display: inline-block;
         position: absolute;
      +  top: 12px;
      +  left: -15px;
       }
       
       .dac-header-crumbs-item:first-child:before {
      @@ -7326,1066 +7091,2268 @@ div.jd-descr > .resource-widget[data-section=distribute\/tools] .section-card-me
       }
       
       .dac-header-crumbs-link {
      -  color: #444;
         display: block;
         font-size: 16px;
      -  font-weight: 300;
         line-height: 32px;
      -  padding: 16px 16px;
      -  -webkit-transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
      -  transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
      +  padding: 0 20px 0 0;
       }
       
      -.dac-header-crumbs-link:hover, .dac-header-crumbs-link:focus {
      -  color: rgba(68, 68, 68, 0.7);
      +.dac-header-crumbs-link, .dac-header-crumbs-link:hover, .dac-header-crumbs-link:focus {
      +  color: #666;
       }
       
       .dac-header-crumbs-link:focus {
      -  background: rgba(63, 81, 181, 0.1);
         outline: 0;
      +  text-decoration: underline;
       }
       
       .dac-header-crumbs-link.current {
      -  color: #6ab344;
         font-weight: 400;
       }
       
      -.dac-header-crumbs-link.current.ndk {
      -  color: #00BCD4;
      -}
      -
      -@media (max-width: 719px) {
      -  .dac-header-crumbs {
      -    display: none;
      -  }
      -}
      -
       /* Header site search component */
       .dac-header-search {
      -  background: #fff;
      -  border-left: 1px solid #e5e5e5;
      -  display: block;
      -  float: right;
      -  height: 28px;
      -  padding: 18px 0;
      -  position: relative;
      -  overflow: hidden;
      -  -webkit-transition: width 0.4s ease, left 0.4s ease;
      -  transition: width 0.4s ease, left 0.4s ease;
      -  width: 64px;
      -  z-index: 52;
      +  bottom: 64px;
      +  position: absolute;
      +  right: 220px;
      +  top: 0;
      +  width: 238px;
      +  -webkit-transition: width 300ms, right 100ms, margin 100ms;
      +  transition: width 300ms, right 100ms, margin 100ms;
       }
       
      -.dac-header-search:hover, .dac-header-search.active {
      -  width: 228px;
      +.dac-studio .dac-header-search {
      +  right: 20px; /* move searchbar farther right, because there's no button */
       }
       
       .dac-header-search-inner {
      -  width: 228px;
      +  margin: 0 auto;
      +  max-width: 940px;
      +  position: relative;
      +  width: 100%;
       }
       
      -.dac-header-search-btn {
      -  left: 20px;
      -  position: absolute;
      -  top: 20px;
      -  opacity: .54;
      -}
      +@media (min-width: 980px) {
      +  .dac-header-search-inner::after {
      +    background: -webkit-linear-gradient(right, #6ab344, rgba(106, 179, 68, 0));
      +    background: linear-gradient(to left, #6ab344, rgba(106, 179, 68, 0));
      +    content: '';
      +    display: block;
      +    height: 64px;
      +    position: absolute;
      +    right: 100%;
      +    top: 0;
      +    -webkit-transition: opacity 200ms, -webkit-transform 300ms;
      +    transition: opacity 200ms, transform 300ms;
      +    -webkit-transform-origin: right center;
      +    -ms-transform-origin: right center;
      +    transform-origin: right center;
      +    width: 64px;
      +  }
      +  .dac-studio .dac-header-search-inner::after {
      +    background: -webkit-linear-gradient(right, #424242, rgba(66, 66, 66, 0));
      +    background: linear-gradient(to left, #424242, rgba(66, 66, 66, 0));
      +  }
       
      -.dac-header-search-form {
      -  left: 54px;
      -  opacity: 0;
      -  position: absolute;
      -  right: 24px;
      -  top: 20px;
      -  -webkit-transition: opacity .4s;
      -  transition: opacity .4s;
      +  .dac-search-mode .dac-header-search-inner::after {
      +    opacity: 0;
      +    -webkit-transform: scaleX(0);
      +    -ms-transform: scaleX(0);
      +    transform: scaleX(0);
      +  }
       }
       
      -.dac-header-search:hover .dac-header-search-form, .dac-header-search.active .dac-header-search-form {
      -  opacity: 1;
      +.dac-header-search-icon {
      +  left: 8px;
      +  pointer-events: none;
      +  position: absolute;
      +  top: 18px;
       }
       
       .dac-header-search-input {
      -  background-color: transparent;
      +  background: #77be53;
      +  border-radius: 3px;
         border: none;
      -  border-bottom: 1px solid #CCC;
      -  border-radius: 0;
         box-sizing: border-box;
      -  color: #2f2f2f;
      +  color: #fff;
         font-size: 14px;
      -  height: 24px;
      -  outline: none;
      -  padding: 4px 20px 4px 0;
      +  font-weight: 600;
      +  margin: 13px 0;
      +  padding: 9px 36px 10px;
      +  -webkit-transition: background 200ms, color 200ms;
      +  transition: background 200ms, color 200ms;
         width: 100%;
      -  z-index: 1500;
       }
       
      -.dac-header-search-input:focus {
      -  color: #222;
      -  font-weight: bold;
      -  outline: 0;
      +.dac-studio .dac-header-search-input {
      +  background: rgba(255, 255, 255, 0.3);
       }
       
      -.dac-header-search-close {
      +.dac-header-search-close, .dac-header-search-clear {
      +  background: none;
      +  border: none;
      +  cursor: pointer;
      +  font-size: 0;
      +  outline: none;
         position: absolute;
      -  right: 4px;
      -  bottom: 4px;
      -  width: 16px;
      -  height: 16px;
         margin: 0;
      -  text-indent: -1000em;
      -  background: url(../images/close.png) no-repeat 0 0;
      -  z-index: 9999;
       }
       
      -.dac-header-search-close:hover, .dac-header-search-close:focus {
      -  background-position: -16px 0;
      -  cursor: pointer;
      +.dac-header-search-clear {
      +  display: inline-block;
      +  opacity: .4;
      +  padding: 8px;
      +  top: 15px;
      +  right: 0;
       }
       
      -@media (max-width: 719px) {
      -  .dac-header-search {
      -    position: absolute;
      -    left: calc(100% - 64px);
      -    right: 0;
      -    top: 0;
      -    width: auto;
      -  }
      +.dac-header-search-clear:hover, .dac-header-search-clear:focus {
      +  opacity: .8;
      +}
       
      -  .dac-header-search:hover, .dac-header-search.active {
      -    left: 64px;
      -    width: auto;
      -  }
      +.dac-header-search-close {
      +  left: -45px;
      +  top: 20px;
      +  -webkit-transform: translateX(45px);
      +  -ms-transform: translateX(45px);
      +  transform: translateX(45px);
      +  visibility: hidden;
       }
       
      -/* Main navigation component */
      -.is-sticky .dac-nav, .dac-nav-head, .dac-nav-toggle {
      -  display: none;
      +.dac-header-search ::-webkit-input-placeholder {
      +  color: #fff;
      +  font-weight: 300;
      +  -webkit-transition: color 200ms;
      +  transition: color 200ms;
       }
       
      -.dac-nav-list {
      -  list-style-type: none;
      -  left: 192px;
      -  margin: 0;
      -  position: absolute;
      -  right: 0;
      -  top: 0;
      -  z-index: 51;
      +.dac-header-search :-moz-placeholder {
      +  color: #fff;
      +  font-weight: 300;
      +  transition: color 200ms;
       }
       
      -.dac-nav-item {
      -  float: left;
      -  margin: 0;
      +.dac-header-search ::-moz-placeholder {
      +  color: #fff;
      +  font-weight: 300;
      +  transition: color 200ms;
       }
       
      -.dac-nav-head {
      -  margin-bottom: 10px;
      +.dac-header-search :-ms-input-placeholder {
      +  color: #fff;
      +  font-weight: 300;
      +  transition: color 200ms;
       }
       
      -.dac-nav-dimmer {
      -  background: #000;
      -  display: none;
      -  height: 100%;
      -  left: 0;
      -  opacity: 0;
      -  position: fixed;
      -  top: 0;
      -  -webkit-transition: visibility 0s linear .3s, opacity .3s linear;
      -  transition: visibility 0s linear .3s, opacity .3s linear;
      -  -webkit-transform: translateZ(0);
      -  transform: translateZ(0);
      -  visibility: hidden;
      -  width: 100%;
      -  z-index: 52;
      -}
      -
      -.dac-nav-hamburger {
      -  display: inline-block;
      -  height: 15px;
      -  width: 16px;
      -}
      -
      -.dac-nav-hamburger-top, .dac-nav-hamburger-mid, .dac-nav-hamburger-bot {
      -  background: #999;
      -  display: block;
      -  height: 3px;
      -  margin: 3px 0 0;
      -  width: 100%;
      -}
      -
      -.dac-nav-link {
      -  color: #444;
      -  display: block;
      -  font-size: 16px;
      -  font-weight: 300;
      -  letter-spacing: .24px;
      -  line-height: 32px;
      -  padding: 18px 16px 14px;
      -  -webkit-transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
      -  transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
      -}
      -
      -.dac-nav-link:hover, .dac-nav-link:focus {
      -  color: rgba(68, 68, 68, 0.7);
      -}
      -
      -.dac-nav-link:focus {
      -  background: rgba(63, 81, 181, 0.1);
      +.dac-header-search-input:focus {
         outline: 0;
       }
       
      -.dac-nav-link.has-subnav, .dac-nav-link.selected {
      -  border-bottom: 3px solid #6ab344;
      -  font-weight: 500;
      -  padding-bottom: 11px;
      +.dac-search-mode .dac-header-search {
      +  width: 940px;
      +  right: 50%;
      +  margin-right: -470px;
       }
       
      -.dac-nav-link.has-subnav.ndk, .dac-nav-link.selected.ndk {
      -  border-bottom: 3px solid #00BCD4;
      +.dac-search-mode .dac-header-search .dac-header-search-input::after {
      +  background: -webkit-linear-gradient(right, #b0bec5, rgba(176, 190, 197, 0));
      +  background: linear-gradient(to left, #b0bec5, rgba(176, 190, 197, 0));
       }
       
      -.dac-nav-secondary {
      -  border-bottom: 1px solid #e5e5e5;
      -  display: none;
      -  left: -192px;
      -  list-style-type: none;
      -  margin: 0;
      -  position: absolute;
      -  top: 64px;
      -  right: 0;
      +.dac-search-mode .dac-header-search .dac-header-search-close {
      +  -webkit-transition: -webkit-transform 200ms ease-out 300ms;
      +  transition: transform 200ms ease-out 300ms;
      +  -webkit-transform: translateX(0);
      +  -ms-transform: translateX(0);
      +  transform: translateX(0);
      +  visibility: visible;
       }
       
      -.dac-nav-link.has-subnav + .dac-nav-secondary, .dac-nav-link.selected + .dac-nav-secondary {
      -  display: block;
      +.dac-search-mode .dac-header-search .dac-header-search-icon {
      +  left: 23px;
       }
       
      -.dac-nav-secondary .dac-nav-link {
      +.dac-search-mode .dac-header-search .dac-header-search-input {
      +  background: #fff;
      +  border-radius: 0;
      +  font-size: 18px;
         color: #666;
      -  padding: 17px 16px 15px;
      +  padding-left: 55px;
      +  margin-top: 11px;
       }
       
      -.dac-nav-secondary .dac-nav-link:hover, .dac-nav-secondary .dac-nav-link:focus {
      -  color: rgba(102, 102, 102, 0.7);
      +.dac-search-mode .dac-header-search ::-webkit-input-placeholder {
      +  color: #505050;
       }
       
      -@media (min-width: 720px) and (max-width: 979px) {
      -  .dac-nav-secondary .dac-nav-link {
      -    padding-left: 8px;
      -    padding-right: 8px;
      -  }
      +.dac-search-mode .dac-header-search :-moz-placeholder {
      +  color: #505050;
       }
       
      -.dac-nav-secondary .dac-nav-link.selected {
      -  border: none;
      -  font-weight: 700;
      +.dac-search-mode .dac-header-search ::-moz-placeholder {
      +  color: #505050;
       }
       
      -.dac-nav-secondary .dac-nav-link.selected.ndk {
      -  border: none;
      -  font-weight: 700;
      +.dac-search-mode .dac-header-search :-ms-input-placeholder {
      +  color: #505050;
       }
       
      -@media (max-width: 719px) {
      -  .dac-nav-open {
      -    overflow: hidden;
      +@media (min-width: 720px) and (max-width: 979px) {
      +  .dac-studio .dac-header-search,
      +  .dac-header-search {
      +    right: 20px;
      +    width: 200px;
      +    -webkit-transition: left 200ms, right 200ms, width 200ms;
      +    transition: left 200ms, right 200ms, width 200ms;
         }
       
      -  .dac-nav-toggle {
      -    border-right: 1px solid #e5e5e5;
      -    display: inline-block;
      -    position: absolute;
      -    left: 0;
      -    line-height: 64px;
      -    text-align: center;
      -    width: 64px;
      +  .dac-search-mode .dac-header-search {
      +    left: 60px;
      +    right: 0;
      +    width: 100%;
         }
       
      -  .dac-nav-head, .dac-nav-secondary, .dac-nav-dimmer {
      -    display: block;
      +  .dac-search-mode .dac-header-search .dac-header-search-inner {
      +    margin: 0;
      +    width: calc(100% - 60px - 10px);
         }
       
      -  .dac-nav-dimmer.dac-nav-open {
      -    opacity: .8;
      -    -webkit-transition-delay: 0s;
      -    transition-delay: 0s;
      -    visibility: visible;
      +  .dac-header-search-close {
      +    left: -42px;
         }
      +}
       
      -  .dac-nav-list {
      -    background: #fff;
      +@media (max-width: 719px) {
      +  .dac-header-search {
           bottom: 0;
      -    left: auto;
      -    max-width: 280px;
      -    -webkit-overflow-scrolling: touch;
      -    overflow-y: scroll;
      -    padding: 0 0 20px 0;
      -    position: fixed;
      -    right: 100%;
      +    border-radius: 0;
      +    border-left: 1px solid rgba(0, 0, 0, 0.1);
      +    cursor: pointer;
      +    left: calc(100% - 64px);
      +    margin: 0;
      +    overflow: hidden;
      +    padding-left: 10px;
      +    padding-right: 10px;
      +    position: absolute;
      +    right: 0;
           top: 0;
      -    -webkit-transition: -webkit-transform .3s ease;
      -    transition: transform .3s ease;
      -    width: 85%;
      -    z-index: 52;
         }
       
      -  .dac-nav-list.dac-nav-open {
      -    -webkit-transform: translate3d(100%, 0, 0);
      -    transform: translate3d(100%, 0, 0);
      +  .dac-header-search-input {
      +    background: none;
      +    cursor: pointer;
      +    opacity: 0;
         }
       
      -  .dac-nav-secondary {
      -    border: none;
      -    position: static;
      +  .dac-search-mode .dac-header-search {
      +    background: #b0bec5;
      +    cursor: default;
      +    overflow: visible;
      +    left: 60px;
      +    right: 0;
           width: 100%;
      +    -webkit-transition: left 200ms, right 200ms, width 200ms;
      +    transition: left 200ms, right 200ms, width 200ms;
      +    padding: 0;
      +    border: none;
         }
       
      -  .dac-nav-item {
      -    float: none;
      +  .dac-search-mode .dac-header-search .dac-header-search-inner {
      +    margin: 0;
      +    width: calc(100% - 60px - 10px);
         }
       
      -  .dac-nav-link {
      -    display: block;
      -    font-size: 12px;
      -    font-weight: 600;
      -    color: #333;
      -    padding: 0 20px;
      +  .dac-search-mode .dac-header-search .dac-header-search-input {
      +    opacity: 1;
         }
      +}
       
      -  .dac-nav-link.selected {
      -    color: #09f;
      -  }
      +.highlighted em {
      +  color: #333;
      +  font-style: normal;
      +  font-weight: 700;
      +}
       
      -  .dac-nav-secondary .dac-nav-link {
      -    font-weight: 400;
      -    margin-left: 20px;
      -    margin-right: 20px;
      -    padding: 0 20px;
      -  }
      +.card-info .title.highlighted {
      +  color: #666;
      +}
       
      -  .dac-nav-link.has-subnav, .dac-nav-link.selected {
      -    border: none;
      -    padding: 0 20px;
      -  }
      +/* Main navigation component */
      +.dac-nav-sidebar {
      +  background: #f5f8fa;
      +  border-right: 1px solid rgba(0, 0, 0, 0.1);
      +  bottom: 0;
      +  left: 0;
      +  overflow: hidden;
      +  padding: 0;
      +  position: fixed;
      +  top: 64px;
      +  -webkit-transform: translate(-100%, 0);
      +  -ms-transform: translate(-100%, 0);
      +  transform: translate(-100%, 0);
      +  width: 250px;
      +  z-index: 60;
      +}
       
      -  .dac-nav-link.has-subnav.ndk, .dac-nav-link.selected.ndk {
      -    border: none;
      -    padding: 0 20px;
      -  }
      +.dac-nav-animating .dac-nav-sidebar {
      +  -webkit-transition: -webkit-transform .3s;
      +  transition: transform .3s;
      +}
       
      -  .dac-logo-image {
      -    margin-right: 5px;
      -    vertical-align: top;
      -  }
      +.dac-nav-open .dac-nav-sidebar {
      +  -webkit-transform: translate(0, 0);
      +  -ms-transform: translate(0, 0);
      +  transform: translate(0, 0);
      +}
       
      -  .dac-nav-logo {
      -    box-shadow: 0 2px 2px rgba(0, 0, 0, 0.04);
      -    font-size: 20px;
      -    font-weight: 300;
      -    letter-spacing: .3px;
      -    line-height: 36px;
      -    padding: 14px 24px;
      -  }
      +.dac-search-mode .dac-nav-sidebar {
      +  -webkit-transition: -webkit-transform .3s;
      +  transition: transform .3s;
      +  -webkit-transform: translate(-100%, 0);
      +  -ms-transform: translate(-100%, 0);
      +  transform: translate(-100%, 0);
      +}
       
      -  .dac-nav-logo, .dac-nav-logo:hover, .dac-nav-logo:focus {
      -    color: #444;
      -  }
      +.dac-nav .dac-swap-section {
      +  -webkit-transition-duration: .3s;
      +  transition-duration: .3s;
       }
       
      -/* Hero carousel */
      -.dac-hero {
      -  background-color: #fff;
      -  background-position: 50% 30%;
      -  background-size: cover;
      -  box-sizing: border-box;
      -  font-size: 16px;
      -  min-height: 550px;
      -  padding-top: 88px;
      +.dac-nav-back {
      +  margin-top: -3px;
      +  margin-right: 10px;
       }
       
      -.dac-hero.dac-darken::before {
      -  background: rgba(0, 0, 0, 0.3);
      -  bottom: 0;
      -  content: '';
      -  display: block;
      -  left: 0;
      +.dac-nav-fullscreen {
      +  background: transparent;
      +  border: none;
      +  bottom: 100%;
      +  cursor: pointer;
      +  display: none;
      +  opacity: .8;
      +  outline: none;
      +  padding: 20px 15px;
         position: absolute;
         right: 0;
      -  top: 0;
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero.dac-darken::before {
      -    background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%);
      -    background: linear-gradient(to bottom, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%);
      +@media (min-width: 980px) {
      +  .dac-nav-fullscreen {
      +    display: inline-block;
         }
       }
       
      -.dac-hero.dac-darken .dac-hero-content {
      -  position: relative;
      +.dac-nav-fullscreen:hover {
      +  opacity: 1;
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero {
      -    padding-bottom: 20px;
      -    padding-top: 20px;
      -  }
      +.dac-nav-sub-slider {
      +  cursor: pointer;
      +  opacity: .5;
      +  position: absolute;
      +  right: 7px;
      +  top: 5px;
       }
       
      -.dac-hero-tag {
      -  font-size: 11px;
      -  font-weight: 700;
      -  letter-spacing: .07em;
      -  margin-bottom: 2px;
      -  text-transform: uppercase;
      +.dac-nav-back-button {
      +  background: #546e7a;
      +  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
      +  display: block;
      +  font-weight: 500;
      +  font-size: 18px;
      +  left: 0;
      +  margin: 0;
      +  padding: 20px;
      +  position: absolute !important;
      +  right: 0;
      +  top: 0;
      +  z-index: 1;
       }
       
      -.dac-hero-title {
      -  margin: 0 0 14px;
      +.dac-nav-back-button,
      +.dac-nav-back-button:hover,
      +.dac-nav-back-button:active,
      +.dac-nav-back-button:focus     {
      +  color: rgba(255, 255, 255, 0.7);
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero-title {
      -    font-size: 28px;
      -    line-height: 35px;
      -  }
      +/* The back button in Studio and NDK left nav */
      +.dac-nav-back-button.back-to-dev {
      +  background: none;
      +  color: #444;
      +  position: relative !important;
      +  top: -16px;
       }
       
      -.dac-hero-description {
      -  margin-bottom: 16px;
      +.dac-nav-back-button.back-to-dev:hover,
      +.dac-nav-back-button.back-to-dev:active,
      +.dac-nav-back-button.back-to-dev:focus {
      +  color: rgba(68, 68, 68, .7);
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero-description {
      -    font-size: 14px;
      -  }
      +.dac-nav-back-button:focus .dac-nav-back {
      +  outline-color: rgb(77, 144, 254);
      +  outline-offset: 15px;
      +  outline-style: auto;
       }
       
      -.dac-hero-cta {
      -  display: inline-block;
      -  line-height: 40px;
      -  margin-right: 20px;
      -  -webkit-transition: opacity .3s;
      -  transition: opacity .3s;
      +.dac-nav-back-button > .dac-sprite, .dac-nav-back-button > .dac-modal-header-close:before, .paging-links .dac-nav-back-button > .prev-page-link:before, .paging-links .dac-nav-back-button > .next-page-link:before, .paging-links .dac-nav-back-button > .next-class-link:before, .paging-links .dac-nav-back-button > .start-class-link:after {
      +  opacity: .7;
       }
       
      -.dac-hero-cta:hover {
      -  color: currentColor;
      -  opacity: .54;
      +.dac-nav-logo {
      +  font-size: 20px;
      +  font-weight: 300;
      +  letter-spacing: .3px;
      +  line-height: 36px;
      +  margin: 0;
      +  padding: 14px 24px;
       }
       
      -.dac-hero-cta .dac-sprite {
      -  margin-left: -8px;
      +.dac-nav-logo, .dac-nav-logo:hover, .dac-nav-logo:focus {
      +  color: #444;
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero-cta {
      -    line-height: 28px;
      -  }
      +.dac-nav-list {
      +  bottom: 0;
      +  left: 0;
      +  list-style-type: none;
      +  margin: 0;
      +  -webkit-overflow-scrolling: touch;
      +  overflow-y: scroll;
      +  padding: 16px 0;
      +  position: absolute !important;
      +  right: 0;
      +  top: 0 !important;
      +  scrollbar-face-color: #b7baba;
      +  scrollbar-track-color: #e5e8e9;
       }
       
      -.dac-hero-figure {
      -  text-align: center;
      +.dac-nav-list::-webkit-scrollbar {
      +  width: 4px;
      +  height: 4px;
       }
       
      -/* Android Studio download page */
      -section#features {
      -  padding-top:0;
      +.dac-nav-list::-webkit-scrollbar-thumb {
      +  background: #b7baba;
       }
      -.wrap.feature {
      -  margin:80px auto;
      +
      +.dac-nav-list::-webkit-scrollbar-track {
      +  background: #e5e8e9;
       }
      -.dac-section-links.feature-more {
      -  margin-top:-20px;
      +
      +.dac-nav-secondary {
      +  margin: 0;
       }
      -.dac-toggle-content .wrap.feature {
      -  margin-top:0;
      +
      +.dac-nav-item {
      +  list-style-type: none;
      +  margin: 0 0 10px;
      +  position: relative;
       }
       
      -@media (max-width: 719px) {
      -  .dac-hero-figure {
      -    height: 150px;
      -    margin: 15px 0;
      -  }
      -
      -  .dac-hero-figure img {
      -    max-height: 150px;
      -  }
      -
      -  /* Android Studio download page */
      -  .feature .dac-hero-figure,
      -  .feature .dac-hero-figure img {
      -    height:auto;
      -    max-height:none;
      -  }
      -  .feature .dac-hero-figure img {
      -    width:90%;
      -    margin:0 auto;
      -  }
      +.dac-nav-secondary .dac-nav-item {
      +  margin-bottom: 0;
       }
       
      -.dac-hero-carousel {
      -  height: 550px;
      -  position: relative;
      +.dac-nav-head {
      +  display: block;
      +  font-size: 16px;
      +  font-weight: 300;
      +  letter-spacing: .24px;
      +  line-height: 32px;
      +  margin-bottom: 20px;
      +  margin-top: 0;
       }
       
      -.dac-hero-carousel > .dac-hero {
      -  bottom: 0;
      +.dac-nav-dimmer {
      +  background: #000;
      +  display: block;
      +  height: 100%;
         left: 0;
      -  position: absolute;
      -  right: 0;
      +  opacity: 0;
      +  position: fixed;
         top: 0;
      -  will-change: opacity;
      +  -webkit-transform: translateZ(0);
      +  transform: translateZ(0);
      +  visibility: hidden;
      +  width: 100%;
      +  z-index: 60;
       }
       
      -.dac-hero-carousel > .dac-hero, .dac-hero-carousel > .dac-hero .wrap {
      -  opacity: 0;
      +.dac-nav-animating .dac-nav-dimmer {
      +  -webkit-transition: visibility 0s linear .3s, opacity .3s linear;
      +  transition: visibility 0s linear .3s, opacity .3s linear;
       }
       
      -.dac-hero-carousel > .dac-hero.active {
      -  opacity: 1;
      -  -webkit-transition: opacity .5s;
      -  transition: opacity .5s;
      -  z-index: 1;
      +.dac-nav-open .dac-nav-dimmer {
      +  opacity: .8;
      +  -webkit-transition-delay: 0s;
      +  transition-delay: 0s;
      +  visibility: visible;
       }
       
      -.dac-hero-carousel > .dac-hero.active .wrap {
      -  opacity: 1;
      -  -webkit-transition: opacity .5s .5s;
      -  transition: opacity .5s .5s;
      +@media (min-width: 980px) {
      +  .dac-nav-dimmer {
      +    display: none;
      +  }
       }
       
      -.dac-hero-carousel > .dac-hero.out, .dac-hero-carousel > .dac-hero.out .wrap {
      -  -webkit-transition: opacity 0s .5s;
      -  transition: opacity 0s .5s;
      -  opacity: 0;
      +.dac-nav-hamburger {
      +  display: inline-block;
      +  float: left;
      +  height: 15px;
      +  padding: 22px 20px;
      +  width: 18px;
       }
       
      -.dac-hero-carousel-action {
      -  bottom: 0;
      +@media (max-width: 719px) {
      +  .dac-nav-hamburger {
      +    border-right: 1px solid rgba(0, 0, 0, 0.1);
      +    left: 0;
      +    padding-bottom: 27px;
      +    position: absolute;
      +    top: 0;
      +  }
      +}
      +
      +.dac-nav-hamburger-top, .dac-nav-hamburger-mid, .dac-nav-hamburger-bot {
      +  background: rgba(0, 0, 0, 0.4);
         display: block;
      -  left: 0;
      -  position: absolute;
      -  right: 0;
      -  top: 0;
      -  z-index: 1;
      +  height: 2px;
      +  margin: 3px 0 0;
      +  opacity: .5;
      +  width: 100%;
       }
       
      -.dac-hero-carousel .dac-hero-cta {
      -  position: relative;
      -  z-index: 1;
      +.dac-studio .dac-nav-hamburger-top,
      +.dac-studio .dac-nav-hamburger-mid,
      +.dac-studio .dac-nav-hamburger-bot {
      +  background: rgba(256, 256, 256, 0.4);
       }
       
      -.dac-hero-carousel-pagination {
      -  bottom: 33px;
      -  left: 0;
      -  position: absolute;
      -  right: 0;
      +.dac-nav-animating .dac-nav-hamburger-top, .dac-nav-animating .dac-nav-hamburger-mid, .dac-nav-animating .dac-nav-hamburger-bot {
      +  -webkit-transition: opacity .3s;
      +  transition: opacity .3s;
       }
       
       @media (max-width: 719px) {
      -  .dac-hero-carousel-pagination {
      -    text-align: center;
      -    bottom: 20px;
      +  .dac-nav-hamburger-top, .dac-nav-hamburger-mid, .dac-nav-hamburger-bot {
      +    background: #fff;
      +    opacity: 1;
         }
       }
       
      -.dac-hero-carousel-pagination .dac-pagination-item {
      -  position: relative;
      -  z-index: 1;
      +.dac-nav-open .dac-nav-hamburger-top,
      +  .dac-nav-open .dac-nav-hamburger-mid,
      +  .dac-nav-open .dac-nav-hamburger-bot {
      +  opacity: 1;
       }
       
      -.dac-pagination {
      -  list-style: none;
      -  margin: 0 -6px;
      +.dac-search-mode .dac-nav-hamburger {
      +  opacity: 0;
      +  visibility: hidden;
      +  -webkit-transition: visibility 0s linear 200ms, opacity 200ms linear;
      +  transition: visibility 0s linear 200ms, opacity 200ms linear;
       }
       
      -.dac-pagination-item {
      -  background-clip: content-box;
      -  background-color: rgba(153, 153, 153, 0.4);
      -  border-radius: 50%;
      -  cursor: pointer;
      -  display: inline-block;
      -  height: 14px;
      -  overflow: hidden;
      -  padding: 6px;
      -  pointer-events: all;
      -  text-indent: 100%;
      -  -webkit-transition: background-color .1s ease-in;
      -  transition: background-color .1s ease-in;
      -  white-space: nowrap;
      -  width: 14px;
      -  will-change: background-color;
      +.dac-nav-link {
      +  color: #444;
      +  display: block;
      +  font-size: 14px;
      +  text-transform: uppercase;
      +  font-weight: 500;
      +  letter-spacing: .24px;
      +  padding: 5px 20px;
      +  -webkit-transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
      +  transition: background-color 0.35s cubic-bezier(0.35, 0, 0.25, 1);
       }
       
      -.dac-pagination-item:hover {
      -  background-color: rgba(153, 153, 153, 0.6);
      +.dac-nav-link:hover, .dac-nav-link:focus {
      +  color: rgba(68, 68, 68, 0.7);
       }
       
      -.dac-pagination-item.active, .dac-pagination-item.active:hover {
      -  background-color: #6ab344;
      +.dac-nav-link:focus {
      +  background: rgba(63, 81, 181, 0.1);
      +  outline: 0;
       }
       
      -.dac-invert .dac-pagination-item {
      -  background-color: rgba(204, 204, 204, 0.2);
      +.dac-nav-secondary .dac-nav-link {
      +  font-size: 12px;
      +  font-weight: 400;
      +  padding-left: 40px;
      +  text-transform: none;
       }
       
      -.dac-invert .dac-pagination-item:hover {
      -  background-color: rgba(153, 153, 153, 0.4);
      +.dac-nav-link.selected {
      +  background: rgba(63, 81, 181, 0.1);
      +  color: #039bef;
      +  position: relative;
       }
       
      -@media (max-width: 719px) {
      -  .dac-pagination-item {
      -    height: 12px;
      -    width: 12px;
      -  }
      +.dac-nav-link-forward {
      +  background: #546E7A;
      +  color: #fff;
      +  cursor: pointer;
      +  display: inline-block;
      +  line-height: 34px;
      +  padding: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +  text-align: center;
      +  width: 34px;
       }
       
      -/* Form component */
      -.dac-form {
      -  color: #505050;
      -  font-size: 16px;
      -  /* Modal Responsive */
      +.dac-nav-link-forward > .dac-nav-forward {
      +  opacity: .7;
      +  vertical-align: -3px;
       }
       
      -.dac-form a {
      -  color: #000;
      +.dac-nav-sub {
      +  bottom: 0;
      +  left: 0;
      +  position: absolute !important;
      +  top: 65px !important;
      +  right: 0;
      +  z-index: 1;
       }
       
      -.dac-form-aside {
      -  display: inline-block;
      -  font-size: 12px;
      -  margin-top: 0;
      +#body-content {
      +  padding-top: 64px;
       }
       
      -.dac-form-required {
      -  color: #ef4300;
      +.dac-nav-animating #body-content {
      +  -webkit-transition: padding .3s;
      +  transition: padding .3s;
       }
       
      -.dac-form-fieldset {
      -  padding: 0;
      +@media (min-width: 980px) {
      +  .dac-nav-open #body-content {
      +    padding-left: 250px;
      +  }
      +
      +  /* Do not show nav toggle on large screens (when no subnav) */
      +  body.no-subnav .dac-nav-toggle {
      +    display:none;
      +  }
      +  body.no-subnav .dac-header-logo {
      +    padding-left:20px;
      +  }
      +  /* ...If the page is also full-width, then don't show left nav at all */
      +  body.no-subnav.full-width .dac-nav {
      +    display: none;
      +  }
      +  body.no-subnav.full-width #body-content {
      +    padding-left:0;
      +  }
       }
       
      -.dac-form-legend {
      -  display: block;
      -  color: #333;
      -  font-weight: 500;
      -  margin: 20px 0 12px;
      -  padding: 0;
      -  width: 100%;
      +.dac-nav-open {
      +  overflow: hidden;
       }
       
      -.dac-form-legend > .dac-form-required {
      -  float: right;
      -  margin-top: 3px;
      +@media (min-width: 980px) {
      +  .dac-nav-open {
      +    overflow: visible;
      +  }
       }
       
      -.dac-form-input {
      -  border: 0 solid #e3e3e3;
      -  border-bottom-width: 1px;
      -  display: block;
      -  outline: 0;
      -  padding: 1px 0 8px;
      -  -webkit-transition: border-color .2s;
      -  transition: border-color .2s;
      -  width: 100%;
      +#devdoc-nav {
      +  height: 100%;
       }
       
      -.dac-form-input-group {
      +.data-reference-resources-wrapper {
      +  display: none;
      +}
      +
      +.dac-reference-nav {
      +  height: calc(100% - 36px);
      +  overflow: hidden;
         position: relative;
       }
       
      -.dac-form-input-group > .dac-form-required {
      -  display: block;
      -  bottom: 3px;
      +.dac-reference-nav ul,
      +  .dac-reference-nav li {
      +  margin: 0;
      +  list-style-type: none;
      +}
      +
      +.dac-reference-nav-list {
      +  bottom: 0;
      +  overflow: hidden;
      +  overflow-y: scroll;
      +  left: 0;
      +  padding: 10px;
      +  padding-left: 20px;
         position: absolute;
         right: 0;
      +  top: 0;
      +  scrollbar-face-color: #9da4a7;
      +  scrollbar-track-color: #c4cdd1;
       }
       
      -.dac-form-input:focus {
      -  border-bottom-color: #09f;
      +.dac-reference-nav-list::-webkit-scrollbar {
      +  width: 4px;
      +  height: 4px;
       }
       
      -.dac-form-floatlabel {
      -  display: block;
      -  cursor: text;
      -  margin-top: 5px;
      -  pointer-events: none;
      -  -webkit-transform-origin: 0 100%;
      -  -ms-transform-origin: 0 100%;
      -  transform-origin: 0 100%;
      -  -webkit-transform: translate3d(0, 22px, 0) scale(1);
      -  transform: translate3d(0, 22px, 0) scale(1);
      -  -webkit-transition: -webkit-transform .2s;
      -  transition: transform .2s;
      +.dac-reference-nav-list::-webkit-scrollbar-thumb {
      +  background: #9da4a7;
       }
       
      -.dac-focused > .dac-form-floatlabel, .dac-has-value > .dac-form-floatlabel {
      -  cursor: default;
      -  -webkit-transform: translate3d(0, 0, 0) scale(.75);
      -  transform: translate3d(0, 0, 0) scale(.75);
      +.dac-reference-nav-list::-webkit-scrollbar-track {
      +  background: #c4cdd1;
       }
       
      -.dac-form-radio, .dac-form-checkbox {
      -  opacity: 0;
      +.dac-reference-nav-resources {
      +  display: none;
      +  padding: 0 0 0 13px;
      +}
      +
      +.dac-reference-nav-resource,
      +.dac-reference-nav-toggle {
      +  color: #505050;
      +  cursor: pointer;
      +  display: block;
      +  font-size: 12px;
      +  line-height: 1;
      +  overflow: hidden;
      +  margin: 0;
      +  padding: 3px 0;
      +  position: relative;
      +  text-overflow: ellipsis;
      +  white-space: nowrap;
      +}
      +
      +.dac-reference-nav-toggle {
      +  margin-left: -12px;
      +  padding-left: 12px;
      +}
      +
      +.selected > .dac-reference-nav-resource {
      +  color: #039bef;
      +  font-weight: 600;
      +}
      +
      +.dac-reference-nav-toggle::before {
      +  background: transparent url(../images/styles/disclosure_up.png) no-repeat center center;
      +  content: '';
      +  display: block;
      +  height: 19px;
      +  left: 0;
         position: absolute;
      +  top: 0;
      +  width: 8px;
       }
       
      -.dac-form-radio-group, .dac-form-checkbox-group {
      -  display: table;
      -  margin-top: 10px;
      +.dac-reference-nav-toggle.dac-closed::before {
      +  -webkit-transform: scaleY(-1);
      +  -ms-transform: scaleY(-1);
      +  transform: scaleY(-1);
       }
       
      -.dac-form-radio-button, .dac-form-checkbox-button {
      -  box-sizing: border-box;
      -  cursor: pointer;
      -  display: table-cell;
      -  float: left;
      -  height: 18px;
      -  margin: 2px 10px 0 0;
      +/* nav */
      +#nav {
      +  background: #cfd8dc;
      +  bottom: 0;
      +  left: 0;
      +  margin: 0;
      +  -webkit-overflow-scrolling: touch;
      +  overflow-y: scroll;
      +  position: absolute !important;
      +  right: 0;
      +  top: 0 !important;
      +  padding: 10px;
      +  scrollbar-face-color: #9da4a7;
      +  scrollbar-track-color: #c4cdd1;
      +  /* section header links */
      +  /* nested nav headers */
      +}
      +
      +#nav::-webkit-scrollbar {
      +  width: 4px;
      +  height: 4px;
      +}
      +
      +#nav::-webkit-scrollbar-thumb {
      +  background: #9da4a7;
      +}
      +
      +#nav::-webkit-scrollbar-track {
      +  background: #c4cdd1;
      +}
      +
      +#nav li {
      +  font-size: 12px;
      +  line-height: 18px;
      +  list-style-type: none;
      +  margin: 0;
      +  padding: 0;
      +}
      +
      +#nav a {
      +  color: #505050;
      +  text-decoration: none;
      +  word-wrap: break-word;
      +}
      +
      +#nav .nav-section-header {
      +  padding: 0 30px 0 0;
         position: relative;
      -  width: 18px;
      +  -webkit-transition: background-color .1s;
      +  transition: background-color .1s;
       }
       
      -.dac-form-radio-button::after, .dac-form-radio-button::before, .dac-form-checkbox-button::after, .dac-form-checkbox-button::before {
      +#nav .nav-section-header.empty {
      +  padding: 0;
      +}
      +
      +#nav .nav-section-header.empty::after {
      +  display: none;
      +}
      +
      +#nav .nav-section-header .toggle-icon {
      +  background: transparent url(../images/styles/disclosure_down.png) no-repeat scroll 50% 50%;
      +  content: '';
      +  height: 34px;
      +  display: block;
      +  position: absolute;
      +  right: 0;
      +  top: 1px;
      +  width: 34px;
      +}
      +
      +#nav li.selected a {
      +  color: #0288D1;
      +}
      +
      +#nav li.selected ul li a {
      +  color: #505050;
      +}
      +
      +#nav li.expanded .nav-section-header {
      +  background: #bac2c6;
      +}
      +
      +#nav li.expanded .nav-section-header.empty {
      +  background: none;
      +}
      +
      +#nav li.expanded li .nav-section-header {
      +  background: none;
      +}
      +
      +#nav li.expanded li ul {
      +  padding: 0 10px;
      +}
      +
      +#nav li.expanded > .nav-section-header .toggle-icon {
      +  content: '';
      +  background: transparent url(../images/styles/disclosure_up.png) no-repeat scroll 50% 50%;
      +  width: 34px;
      +  height: 34px;
      +}
      +
      +#nav li.expanded li ul.tree-list-children {
      +  padding: 0;
      +}
      +
      +#nav li.expanded li ul.tree-list-children .tree-list-children {
      +  padding: 0 0 0 10px;
      +}
      +
      +#nav .nav-section .nav-section .nav-section-header {
      +    /* no white line between second level sections */
      +  margin-bottom: 0;
      +}
      +
      +#nav > li > div > a {
      +  display: block;
      +  font-weight: 700;
      +  padding: 10px;
      +}
      +
      +#nav .nav-section .nav-section {
      +  position: relative;
      +  padding: 0;
      +  margin: 0;
      +}
      +
      +#nav .nav-section li a {
      +    /* first gen child (2nd level li) */
      +  display: block;
      +  font-weight: 700;
      +  text-transform: none;
      +  padding: 10px;
      +}
      +
      +#nav .nav-section li li a {
      +    /* second gen child (3rd level li) */
      +  font-weight: 400;
      +  padding: 6px 6px 6px 10px;
      +}
      +
      +#nav li span.tree-list-subtitle {
      +  display: inline-block;
      +  color: #555;
      +  font-size: 12px;
      +  padding: 10px;
      +  text-transform: uppercase;
      +}
      +
      +#nav li span.tree-list-subtitle:before {
      +  content: '—';
      +}
      +
      +#nav li span.tree-list-subtitle:after {
      +  content: '—';
      +}
      +
      +#nav li span.tree-list-subtitle.package {
      +  padding-top: 15px;
      +  cursor: default;
      +}
      +
      +#nav li span.tree-list-subtitle.package:before {
      +  content: '';
      +}
      +
      +#nav li span.tree-list-subtitle.package:after {
      +  content: '';
      +}
      +
      +#nav li ul.tree-list-children.classes {
      +  padding-left: 10px;
      +}
      +
      +#nav li ul {
      +  display: none;
      +  overflow: hidden;
      +  margin: 0;
      +}
      +
      +#nav li ul.animate-height-in {
      +  -webkit-transition: height 0.25s ease-in;
      +  transition: height 0.25s ease-in;
      +}
      +
      +#nav li ul.animate-height-out {
      +  -webkit-transition: height 0.25s ease-out;
      +  transition: height 0.25s ease-out;
      +}
      +
      +#nav li ul li {
      +  padding: 0;
      +}
      +
      +#nav li li li {
      +  padding: 0;
      +}
      +
      +#nav li ul > li {
      +  padding: 0;
      +}
      +
      +#nav li ul > li:last-child {
      +  padding-bottom: 5px;
      +}
      +
      +#nav li ul.tree-list-children > li:last-child {
      +  padding-bottom: 0;
      +}
      +
      +#nav li.expanded ul > li {
      +  background: #c4cdd1;
      +}
      +
      +#nav li.expanded ul > li li {
      +  background: inherit;
      +}
      +
      +#nav li ul.tree-list-children ul {
      +  display: block;
      +}
      +
      +#nav.samples-nav li li li a {
      +  padding-top: 3px;
      +  padding-bottom: 3px;
      +}
      +
      +#nav.samples-nav li li ul > li:last-child {
      +  padding-bottom: 3px;
      +}
      +
      +/* Hero carousel */
      +.dac-hero {
      +  background-color: #fff;
      +  background-position: 50% 30%;
      +  background-size: cover;
         box-sizing: border-box;
      +  font-size: 16px;
      +  min-height: 550px;
      +  padding-top: 88px;
      +}
      +
      +.dac-hero.dac-darken::before {
      +  background: rgba(0, 0, 0, 0.3);
      +  bottom: 0;
         content: '';
      -  border-radius: 50%;
         display: block;
      -  height: 100%;
      -  position: absolute;
      -  width: 100%;
      -}
      -
      -.dac-form-radio-button::before, .dac-form-checkbox-button::before {
      -  background: rgba(0, 0, 0, 0.7);
      -  -webkit-transform: translateZ(0) scale(0);
      -  transform: translateZ(0) scale(0);
      -  -webkit-transition: -webkit-transform .3s;
      -  transition: transform .3s;
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +}
      +
      +.dac-hero {
      +  background-size: cover;
      +  position: relative;
      +}
      +
      +.dac-hero-headline {
      +  background-color: #fff;
      +  bottom: 25px;
      +  float: none !important;
      +  padding: 0 10px 10px;
      +  position: absolute;
      +  right: 0;
      +  z-index: 2;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-headline {
      +    bottom: 0;
      +  }
      +
      +  .dac-hero.dac-darken::before {
      +    background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%);
      +    background: linear-gradient(to bottom, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.9) 80%);
      +  }
      +}
      +
      +.dac-hero.dac-darken .dac-hero-content {
      +  position: relative;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero {
      +    padding-bottom: 20px;
      +    padding-top: 20px;
      +  }
      +}
      +
      +.dac-hero-tag {
      +  font-size: 11px;
      +  font-weight: 700;
      +  letter-spacing: .07em;
      +  margin-bottom: 2px;
      +  text-transform: uppercase;
      +}
      +
      +.dac-hero-title {
      +  margin: 0 0 14px;
      +}
      +
      +.dac-studio .dac-hero-title {
      +  padding-top:0;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-title {
      +    font-size: 28px;
      +    line-height: 35px;
      +  }
      +}
      +
      +.dac-hero-description {
      +  margin-bottom: 16px;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-description {
      +    font-size: 14px;
      +  }
      +}
      +
      +.dac-hero-cta {
      +  display: inline-block;
      +  line-height: 40px;
      +  margin-right: 20px;
      +  -webkit-transition: opacity .3s;
      +  transition: opacity .3s;
      +}
      +
      +.dac-hero-cta:hover {
      +  color: currentColor;
      +  opacity: .54;
      +}
      +
      +.dac-hero-cta .dac-sprite, .dac-hero-cta .dac-modal-header-close:before, .dac-hero-cta .paging-links .prev-page-link:before, .paging-links .dac-hero-cta .prev-page-link:before, .dac-hero-cta .paging-links .next-page-link:before, .paging-links .dac-hero-cta .next-page-link:before, .dac-hero-cta .paging-links .next-class-link:before, .paging-links .dac-hero-cta .next-class-link:before, .dac-hero-cta .paging-links .start-class-link:after, .paging-links .dac-hero-cta .start-class-link:after {
      +  margin-left: -8px;
      +}
      +
      +.dac-hero-cta.col-16 {
      +  line-height: 1.4em;
      +  margin-top: 20px;
      +  padding-left: 0;
      +  position: relative;
      +}
      +
      +.dac-hero-cta.col-16 .dac-sprite {
      +  position: absolute;
      +  left: 0;
      +  top: -3px;
      +}
      +
      +.dac-hero-cta.col-16 .dac-sprite-text {
      +  position: relative;
      +  left: 12px;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-cta {
      +    line-height: 28px;
      +  }
      +}
      +
      +.dac-hero-figure {
      +  text-align: center;
      +}
      +
      +/* Android Studio download page */
      +.dac-studio section#features {
      +  padding-top:0;
      +}
      +.dac-studio .wrap.feature {
      +  margin:80px auto;
      +}
      +.dac-studio .dac-section-links.feature-more {
      +  margin-top:-20px;
      +}
      +.dac-studio .dac-toggle-content .wrap.feature {
      +  margin-top:0;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-figure {
      +    height: 150px;
      +    margin: 15px 0;
      +  }
      +
      +  .dac-hero-figure img {
      +    max-height: 150px;
      +  }
      +
      +  /* Android Studio download page */
      +  .dac-studio .feature .dac-hero-figure,
      +  .dac-studio .feature .dac-hero-figure img {
      +    height:auto;
      +    max-height:none;
      +  }
      +  .dac-studio .feature .dac-hero-figure img {
      +    width:90%;
      +    margin:0 auto;
      +  }
      +}
      +
      +.dac-hero-carousel {
      +  height: 550px;
      +  position: relative;
      +}
      +
      +.dac-hero-carousel > .dac-hero {
      +  bottom: 0;
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +  will-change: opacity;
      +}
      +
      +.dac-hero-carousel > .dac-hero,
      +    .dac-hero-carousel > .dac-hero .wrap {
      +  opacity: 0;
      +}
      +
      +.dac-hero-carousel > .dac-hero.active {
      +  opacity: 1;
      +  -webkit-transition: opacity .5s;
      +  transition: opacity .5s;
      +  z-index: 1;
      +}
      +
      +.dac-hero-carousel > .dac-hero.active .wrap {
      +  opacity: 1;
      +  -webkit-transition: opacity .5s .5s;
      +  transition: opacity .5s .5s;
      +}
      +
      +.dac-hero-carousel > .dac-hero.out,
      +    .dac-hero-carousel > .dac-hero.out .wrap {
      +  -webkit-transition: opacity 0s .5s;
      +  transition: opacity 0s .5s;
      +  opacity: 0;
      +}
      +
      +.dac-hero-carousel-action {
      +  bottom: 0;
      +  display: block;
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +  top: 0;
      +  z-index: 1;
      +}
      +
      +.dac-hero-carousel .dac-hero-cta {
      +  position: relative;
      +  z-index: 1;
      +}
      +
      +.dac-hero-carousel-pagination {
      +  bottom: 33px;
      +  left: 0;
      +  position: absolute;
      +  right: 0;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-carousel-pagination {
      +    text-align: center;
      +    bottom: 20px;
      +  }
      +}
      +
      +.dac-hero-carousel-pagination .dac-pagination-item {
      +  position: relative;
      +  z-index: 1;
      +}
      +
      +.dac-pagination {
      +  list-style: none;
      +  margin: 0 -6px;
      +}
      +
      +.dac-pagination-item {
      +  background-clip: content-box;
      +  background-color: rgba(153, 153, 153, 0.4);
      +  border-radius: 50%;
      +  cursor: pointer;
      +  display: inline-block;
      +  height: 14px;
      +  overflow: hidden;
      +  padding: 6px;
      +  pointer-events: all;
      +  text-indent: 100%;
      +  -webkit-transition: background-color .1s ease-in;
      +  transition: background-color .1s ease-in;
      +  white-space: nowrap;
      +  width: 14px;
      +  will-change: background-color;
      +}
      +
      +.dac-pagination-item:hover {
      +  background-color: rgba(153, 153, 153, 0.6);
      +}
      +
      +.dac-pagination-item.active, .dac-pagination-item.active:hover {
      +  background-color: #6ab344;
      +}
      +
      +.dac-invert .dac-pagination-item {
      +  background-color: rgba(204, 204, 204, 0.2);
      +}
      +
      +.dac-invert .dac-pagination-item:hover {
      +  background-color: rgba(153, 153, 153, 0.4);
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-pagination-item {
      +    height: 12px;
      +    width: 12px;
      +  }
      +}
      +
      +/* Form component */
      +.dac-form {
      +  color: #505050;
      +  font-size: 16px;
      +  /* Modal Responsive */
      +}
      +
      +.dac-form a {
      +  color: #000;
      +}
      +
      +.dac-form-aside {
      +  display: inline-block;
      +  font-size: 12px;
      +  margin-top: 0;
      +}
      +
      +.dac-form-required {
      +  color: #ef4300;
      +}
      +
      +.dac-form-fieldset {
      +  padding: 0;
      +}
      +
      +.dac-form-legend {
      +  display: block;
      +  color: #333;
      +  font-weight: 500;
      +  margin: 20px 0 12px;
      +  padding: 0;
      +  width: 100%;
      +}
      +
      +.dac-form-legend > .dac-form-required {
      +  float: right;
      +  margin-top: 3px;
      +}
      +
      +.dac-form-input {
      +  border: 0 solid #e3e3e3;
      +  border-bottom-width: 1px;
      +  display: block;
      +  outline: 0;
      +  padding: 1px 0 8px;
      +  -webkit-transition: border-color .2s;
      +  transition: border-color .2s;
      +  width: 100%;
      +}
      +
      +.dac-form-input-group {
      +  position: relative;
      +}
      +
      +.dac-form-input-group > .dac-form-required {
      +  display: block;
      +  bottom: 3px;
      +  position: absolute;
      +  right: 0;
      +}
      +
      +.dac-form-input:focus {
      +  border-bottom-color: #09f;
      +}
      +
      +.dac-form-floatlabel {
      +  display: block;
      +  cursor: text;
      +  margin-top: 5px;
      +  pointer-events: none;
      +  -webkit-transform-origin: 0 100%;
      +  -ms-transform-origin: 0 100%;
      +  transform-origin: 0 100%;
      +  -webkit-transform: translate3d(0, 22px, 0) scale(1);
      +  transform: translate3d(0, 22px, 0) scale(1);
      +  -webkit-transition: -webkit-transform .2s;
      +  transition: transform .2s;
      +}
      +
      +.dac-focused > .dac-form-floatlabel,
      +    .dac-has-value > .dac-form-floatlabel {
      +  cursor: default;
      +  -webkit-transform: translate3d(0, 0, 0) scale(0.75);
      +  transform: translate3d(0, 0, 0) scale(0.75);
      +}
      +
      +.dac-form-radio, .dac-form-checkbox {
      +  opacity: 0;
      +  position: absolute;
      +  visibility: hidden;
      +}
      +
      +.dac-form-radio-group, .dac-form-checkbox-group {
      +  display: table;
      +}
      +
      +.dac-form-radio-group + .dac-form-radio-group, .dac-form-checkbox-group + .dac-form-radio-group, .dac-form-radio-group + .dac-form-checkbox-group, .dac-form-checkbox-group + .dac-form-checkbox-group {
      +  margin-top: 10px;
      +}
      +
      +.dac-form-radio-button, .dac-form-checkbox-button {
      +  box-sizing: border-box;
      +  cursor: pointer;
      +  display: table-cell;
      +  float: left;
      +  height: 18px;
      +  margin: 2px 10px 0 0;
      +  position: relative;
      +  width: 18px;
      +}
      +
      +.dac-form-radio-button::after, .dac-form-radio-button::before, .dac-form-checkbox-button::after, .dac-form-checkbox-button::before {
      +  box-sizing: border-box;
      +  content: '';
      +  display: block;
      +  position: absolute;
      +}
      +
      +.dac-form-radio-button::after, .dac-form-radio-button::before {
      +  border-radius: 50%;
      +  height: 100%;
      +  width: 100%;
      +}
      +
      +.dac-form-radio-button::before {
      +  background: rgba(0, 0, 0, 0.7);
      +  -webkit-transform: translateZ(0) scale(0);
      +  transform: translateZ(0) scale(0);
      +  -webkit-transition: -webkit-transform .3s;
      +  transition: transform .3s;
      +}
      +
      +.dac-form-radio-button::after {
      +  border: 2px solid rgba(0, 0, 0, 0.7);
      +}
      +
      +.dac-form-radio:checked + .dac-form-radio-button::before {
      +  -webkit-transform: translateZ(0) scale(0.5);
      +  transform: translateZ(0) scale(0.5);
      +}
      +
      +.dac-form-radio:focus + .dac-form-radio-button::after {
      +  border: 2px solid #09f;
      +}
      +
      +.dac-form-checkbox-button::before {
      +  border: 1px solid #6c6e6f;
      +  border-radius: 3px;
      +  height: 100%;
      +  -webkit-transition: background .1s ease-out, box-shadow .3s ease-out;
      +  transition: background .1s ease-out, box-shadow .3s ease-out;
      +  width: 100%;
      +}
      +
      +.dac-form-checkbox-button::after {
      +  border-bottom: 2px solid #fff;
      +  border-left: 2px solid #fff;
      +  bottom: 7px;
      +  height: 7px;
      +  left: 3px;
      +  -webkit-transform: rotate(-45deg);
      +  -ms-transform: rotate(-45deg);
      +  transform: rotate(-45deg);
      +  width: 12px;
      +}
      +
      +.dac-form-checkbox:checked + .dac-form-checkbox-button::before {
      +  background: #6c6e6f;
      +  -webkit-transition-timing-function: ease-in;
      +  transition-timing-function: ease-in;
      +}
      +
      +.dac-form-checkbox:focus + .dac-form-checkbox-button::before,
      +  .dac-form-checkbox:active + .dac-form-checkbox-button::before {
      +  box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.05);
      +}
      +
      +.dac-form-label {
      +  cursor: pointer;
      +  -webkit-user-select: none;
      +  -moz-user-select: none;
      +  -ms-user-select: none;
      +  user-select: none;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-form-legend {
      +    margin-bottom: 0;
      +  }
      +}
      +
      +/* Filter Resources Component*/
      +.dac-filter {
      +  color: #505050;
      +  margin-bottom: 20px;
      +  position: relative;
      +}
      +
      +.dac-filter.dac-filter-section {
      +  margin-top: -45px;
      +  text-align: right;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-filter.dac-filter-section {
      +    margin-top: 0;
      +    text-align: left;
      +  }
      +}
      +
      +.dac-filter-title {
      +  color: #666;
      +  cursor: default;
      +  display: inline-block;
      +  font-size: 12px;
      +  font-weight: 500;
      +  line-height: 24px;
      +  margin: 0;
      +  text-transform: uppercase;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-filter-title {
      +    margin-bottom: 20px;
      +  }
      +}
      +
      +.dac-filter-message {
      +  color: #78868d;
      +  font-size: 18px;
      +  margin: 0 10px 10px;
      +}
      +
      +.dac-filter-count {
      +  background: #6ab344;
      +  border-radius: 50%;
      +  color: #fff;
      +  display: inline-block;
      +  font-size: 12px;
      +  font-weight: 600;
      +  height: 24px;
      +  text-align: center;
      +  width: 24px;
      +}
      +
      +.dac-filter-count.dac-disabled {
      +  visibility: hidden;
      +}
      +
      +.dac-filter-chip {
      +  background: #bfc7cb;
      +  border-radius: 15px;
      +  color: #333;
      +  cursor: default;
      +  display: inline-block;
      +  line-height: 21px;
      +  margin: 0 10px 10px 0;
      +  padding: 4px 26px 4px 10px;
      +  position: relative;
      +}
      +
      +.dac-filter-chip-close {
      +  background-color: transparent;
      +  border: none;
      +  cursor: pointer;
      +  outline: 0;
      +  padding: 3px;
      +  position: absolute;
      +  right: 5px;
      +  top: 5px;
      +}
      +
      +.dac-filter-chip-close-icon {
      +  opacity: .7;
      +  margin-top: -2px;
      +  -webkit-transform: scale(0.57142857);
      +  -ms-transform: scale(0.57142857);
      +  transform: scale(0.57142857);
      +}
      +
      +.dac-filter-chip-close:hover > .dac-filter-chip-close-icon {
      +  opacity: 1;
      +}
      +
      +.dac-filter-chips {
      +  border-top: 1px solid rgba(0, 0, 0, 0.1);
      +  margin: 0;
      +  list-style-type: none;
      +  padding: 10px 0 0;
      +  position: relative;
      +  text-align: left;
      +}
      +
      +.dac-filter-item {
      +  box-sizing: border-box;
      +  float: left;
      +  margin-bottom: 20px;
      +  padding: 0 10px;
      +  width: 33.33333333%;
      +}
      +
      +@media (min-width: 720px) and (max-width: 979px) {
      +  .dac-filter-item {
      +    width: 50%;
      +  }
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-filter-item {
      +    width: 100%;
      +  }
      +}
      +
      +/* Media component */
      +.dac-media {
      +  display: table;
      +  width: 100%;
      +}
      +
      +.dac-media-body, .dac-media-figure {
      +  display: table-cell;
      +  vertical-align: top;
      +}
      +
      +.dac-media-figure {
      +  padding: 0;
      +}
      +
      +.dac-media-body {
      +  width: 100%;
      +}
      +
      +.dac-swap {
      +  overflow: hidden;
      +  position: relative;
      +}
      +
      +.dac-swap-section {
      +  left: 0;
      +  opacity: 0;
      +  position: absolute;
      +  top: 0;
      +  width: 100%;
      +  -webkit-transition: opacity 1s, -webkit-transform .5s;
      +  transition: opacity 1s, transform .5s;
      +}
      +
      +.dac-swap-section.dac-no-anim {
      +  -webkit-transition: none;
      +  transition: none;
      +}
      +
      +.dac-swap-section.dac-up {
      +  -webkit-transform: translateY(-100%);
      +  -ms-transform: translateY(-100%);
      +  transform: translateY(-100%);
      +}
      +
      +.dac-swap-section.dac-down {
      +  -webkit-transform: translateY(100%);
      +  -ms-transform: translateY(100%);
      +  transform: translateY(100%);
      +}
      +
      +.dac-swap-section.dac-left {
      +  -webkit-transform: translateX(-100%);
      +  -ms-transform: translateX(-100%);
      +  transform: translateX(-100%);
      +}
      +
      +.dac-swap-section.dac-right {
      +  -webkit-transform: translateX(100%);
      +  -ms-transform: translateX(100%);
      +  transform: translateX(100%);
      +}
      +
      +.dac-swap-section.dac-active {
      +  opacity: 1;
      +  position: relative;
      +  -webkit-transform: translate(0, 0);
      +  -ms-transform: translate(0, 0);
      +  transform: translate(0, 0);
      +  width: auto;
      +}
      +
      +/* Modal component */
      +.dac-modal {
      +  opacity: 0;
      +  visibility: hidden;
      +  -webkit-transition: visibility 0s linear 300ms, opacity 300ms linear;
      +  transition: visibility 0s linear 300ms, opacity 300ms linear;
      +  background: rgba(0, 0, 0, 0.8);
      +  bottom: 0;
      +  left: 0;
      +  overflow-x: hidden;
      +  overflow-y: auto;
      +  position: fixed;
      +  right: 0;
      +  top: 0;
      +  z-index: 70;
      +}
      +
      +.dac-modal.dac-active {
      +  opacity: 1;
      +  -webkit-transition-delay: 0s;
      +  transition-delay: 0s;
      +  visibility: visible;
      +}
      +
      +.dac-modal-open {
      +  overflow: hidden;
      +}
      +
      +.dac-modal-container {
      +  -webkit-box-align: center;
      +  -webkit-align-items: center;
      +  -ms-flex-align: center;
      +  align-items: center;
      +  display: -webkit-box;
      +  display: -webkit-flex;
      +  display: -ms-flexbox;
      +  display: flex;
      +  -webkit-filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4));
      +  filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4));
      +  -webkit-box-pack: center;
      +  -webkit-justify-content: center;
      +  -ms-flex-pack: center;
      +  justify-content: center;
      +  min-height: 100%;
      +  width: 100%;
      +}
      +
      +.dac-modal-window {
      +  background: #fff;
      +  box-sizing: border-box;
      +  margin: 20px auto;
      +  -webkit-transition: -webkit-transform .3s;
      +  transition: transform .3s;
      +  -webkit-transform: translate3d(0, -30px, 0);
      +  transform: translate3d(0, -30px, 0);
      +  width: 960px;
      +}
      +
      +.dac-modal.dac-active .dac-modal-window {
      +  -webkit-transform: translate3d(0, 0, 0);
      +  transform: translate3d(0, 0, 0);
      +}
      +
      +.dac-modal-header {
      +  background: #00695c;
      +  padding: 35px 35px 30px;
      +  position: relative;
      +}
      +
      +.dac-has-small-header .dac-modal-header {
      +  padding: 10px 20px;
      +}
      +
      +.dac-modal-header-actions {
      +  padding: 8px;
      +  position: absolute;
      +  right: 5px;
      +  top: 5px;
      +}
      +
      +.dac-modal-header-open, .dac-modal-header-close {
      +  background: none;
      +  border: none;
      +  cursor: pointer;
      +  line-height: 0;
      +  outline: 0;
      +  opacity: .7;
      +  -webkit-transition: background-color .3s;
      +  transition: background-color .3s;
      +}
      +
      +.dac-modal-header-open:active, .dac-modal-header-close:active {
      +  background: rgba(255, 255, 255, 0.2);
      +}
      +
      +.dac-modal-header-close:before {
      +  content: '';
      +  top: -1px;
      +  position: relative;
      +}
      +
      +.dac-modal-header-open {
      +  margin: 10px;
      +}
      +
      +.dac-modal-header-title {
      +  color: #fff;
      +  font-size: 24px;
      +  font-weight: 300;
      +  line-height: 32px;
      +  padding: 0 150px 0 0;
      +}
      +
      +.dac-has-small-header .dac-modal-header-title {
      +  font-size: 16px;
      +  font-weight: 500;
      +}
      +
      +.dac-modal-header-subtitle {
      +  bottom: 0;
      +  color: #fff;
      +  display: inline-block;
      +  font: inherit;
      +  font-size: 14px;
      +  margin: 0;
      +  opacity: .8;
      +  position: absolute;
      +  right: 0;
      +}
      +
      +.dac-modal-content {
      +  padding: 12px 35px;
      +}
      +
      +.dac-modal-action {
      +  margin: 0;
      +}
      +
      +.dac-modal-footer {
      +  padding: 24px 35px;
      +}
      +
      +@media (max-width: 1000px) {
      +  .dac-modal-window {
      +    margin: 20px;
      +    width: auto;
      +  }
      +
      +  .dac-modal-container {
      +    z-index: auto;
      +  }
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-modal-window {
      +    margin: 10px;
      +  }
      +
      +  .dac-modal-header {
      +    padding: 35px 10px 10px;
      +  }
      +
      +  .dac-modal-header-title {
      +    font-size: 16px;
      +    line-height: 24px;
      +    padding: 0;
      +  }
      +
      +  .dac-modal-header-subtitle {
      +    display: block;
      +    margin: 0;
      +    position: static;
      +    text-align: right;
      +  }
      +
      +  .dac-modal-header-actions {
      +    top: 1px;
      +  }
      +
      +  .dac-modal-content {
      +    padding: 10px;
      +  }
      +
      +  .dac-modal-footer {
      +    border-top: 1px solid #e3e3e3;
      +    padding: 35px 10px;
      +  }
      +}
      +
      +.newsletter .dac-modal-footer {
      +  padding-top: 0;
      +  text-align: right;
      +}
      +
      +.newsletter-checkboxes {
      +  padding-top: 20px;
      +}
      +
      +.newsletter-success-message {
      +  font-size: 32px;
      +  line-height: 1.4;
      +  padding: 40px 30px;
      +  text-align: center;
      +}
      +
      +@media (max-width: 719px) {
      +  .newsletter-success-message {
      +    font-size: 16px;
      +    padding: 12px 0 0;
      +  }
      +}
      +
      +@media (min-width: 720px) {
      +  .newsletter-checkboxes {
      +    padding-top: 46px;
      +  }
      +
      +  .newsletter-leftCol {
      +    padding-right: 40px;
      +  }
      +
      +  .newsletter-rightCol {
      +    padding-left: 40px;
      +  }
      +}
      +
      +@media (max-width: 719px) {
      +  .newsletter .dac-modal-footer {
      +    margin-top: 30px;
      +    padding: 30px 10px;
      +    text-align: center;
      +  }
      +}
      +
      +.dac-blog-reader {
      +  padding: 50px 90px;
      +}
      +
      +.dac-blog-reader-title {
      +  color: #333;
      +  font-size: 45px;
      +  font-weight: 300;
      +  line-height: 1.2;
      +  padding: 10px 0;
      +}
      +
      +.dac-blog-reader-date {
      +  color: #b8b8b8;
      +  font-size: 12px;
      +  font-weight: 600;
      +  line-height: 1;
      +  text-transform: uppercase;
      +}
      +
      +.dac-blog-reader-text > p:first-child i {
      +  display: inline-block;
      +  margin-bottom: 40px;
      +}
      +
      +.dac-blog-reader-text li {
      +  margin-bottom: 0;
      +}
      +
      +.dac-blog-reader-text iframe {
      +  margin-left: auto !important;
      +  margin-right: auto !important;
      +  max-width: 100%;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-blog-reader {
      +    padding: 30px 20px;
      +  }
      +}
      +
      +.dac-custom-search {
      +  background: #fff;
      +  margin: 0 -10px;
      +  padding: 20px 10px;
      +  z-index: 1;
      +}
      +
      +.dac-custom-search .dac-fab, .dac-custom-search .dac-button-social {
      +  top: -48px;
      +}
      +
      +.dac-custom-search-section-title {
      +  color: #505050;
      +}
      +
      +.dac-custom-search-entry {
      +  margin-bottom: 36px;
      +  margin-top: 24px;
      +  margin-left:10px;
      +}
      +
      +.dac-custom-search-entry.cols:after {
      +    clear: none; }
      +
      +.dac-custom-search-image-wrapper {
      +  float: left;
      +  position: relative;
      +}
      +
      +.dac-custom-search-image {
      +  background-size: cover;
      +  height: 112px;
      +  width:150px;
      +  margin-right:15px;
      +}
      +
      +.dac-custom-search-text-wrapper {
      +  position: relative;
      +}
      +
      +.dac-custom-search-title {
      +  color: #333;
      +  font-size: 14px;
      +  font-weight: 700;
      +  line-height: 24px;
      +  padding: 0;
      +  clear:none;
      +}
      +
      +.dac-custom-search-title a {
      +  color: inherit;
      +}
      +
      +.dac-custom-search-section {
      +  color: #999;
      +  font-size: 16px;
      +  font-variant: small-caps;
      +  font-weight: 700;
      +  margin: -5px 0 0 0;
      +}
      +
      +.dac-custom-search-snippet {
      +  color: #666;
      +  margin: 0;
      +}
      +
      +.dac-custom-search-link {
      +  font-weight: 500;
      +  word-wrap: break-word;
      +  width: 100%;
      +}
      +
      +.dac-custom-search-load-more {
      +  background: none;
      +  border: none;
      +  color: #333;
      +  cursor: pointer;
      +  display: block;
      +  font-size: 14px;
      +  font-weight: 700;
      +  margin: 75px auto;
      +  outline: none;
      +  padding: 10px;
       }
       
      -.dac-form-radio-button::after, .dac-form-checkbox-button::after {
      -  border: 2px solid rgba(0, 0, 0, 0.7);
      +.dac-custom-search-load-more:hover {
      +  opacity: 0.7;
       }
       
      -.dac-form-radio:checked + .dac-form-radio-button::before, .dac-form-checkbox:checked + .dac-form-checkbox-button::before {
      -  -webkit-transform: translateZ(0) scale(.5);
      -  transform: translateZ(0) scale(.5);
      +.dac-custom-search-no-results {
      +  color: #999;
       }
       
      -.dac-form-radio:focus + .dac-form-radio-button::after, .dac-form-checkbox:focus + .dac-form-checkbox-button::after {
      -  border: 2px solid #09f;
      +.dac-search-hero {
      +  font-size: 16px;
      +  padding: 50px 0 14px 0;
       }
       
      -.dac-form-checkbox-button::after, .dac-form-checkbox-button::before {
      -  border-radius: 0;
      +.dac-search-results {
      +  opacity: 0;
      +  visibility: hidden;
      +  -webkit-transition: visibility 0s linear 300ms, opacity 300ms linear;
      +  transition: visibility 0s linear 300ms, opacity 300ms linear;
      +  background-color: #fff;
      +  bottom: 0;
      +  left: 0;
      +  overflow-y: auto;
      +  padding: 0 10px;
      +  position: fixed;
      +  right: 0;
      +  -webkit-transition: opacity 100ms;
      +  transition: opacity 100ms;
      +  top: 64px;
      +  z-index: 50;
       }
       
      -@media (max-width: 719px) {
      -  .dac-form-legend {
      -    margin-bottom: 0;
      -  }
      +.dac-nav-animating .dac-search-results {
      +  -webkit-transition: opacity 100ms, padding .3s;
      +  transition: opacity 100ms, padding .3s;
       }
       
      -/* Media component */
      -.dac-media {
      -  display: -webkit-box;
      -  display: -webkit-flex;
      -  display: -ms-flexbox;
      -  display: flex;
      -  -webkit-flex-flow: row wrap;
      -  -ms-flex-flow: row wrap;
      -  flex-flow: row wrap;
      +.dac-search-results * {
      +  box-sizing: border-box;
       }
       
      -.dac-media-figure {
      -  margin: 0;
      +.dac-search-open .dac-search-results {
      +  opacity: 1;
      +  visibility: visible;
       }
       
      -.dac-media-body {
      -  -webkit-box-flex: 1;
      -  -webkit-flex: 1;
      -  -ms-flex: 1;
      -  flex: 1;
      +.dac-search-results-content {
      +  background: #eceff1;
      +  margin: 0 -10px;
      +  padding: 0 10px;
       }
       
      -.no-flexbox .dac-media {
      -  display: table;
      -  width: 100%;
      +.dac-search-results-for {
      +  margin-bottom: -5px;
      +  overflow: hidden;
      +  padding-top: 5px;
       }
       
      -.no-flexbox .dac-media-body, .no-flexbox .dac-media-figure {
      -  display: table-cell;
      +.dac-search-results-for span {
      +  color: #039bef;
       }
       
      -.no-flexbox .dac-media-figure {
      -  padding: 0;
      +.dac-search-mode .dac-search-results-for {
      +  display: none;
       }
       
      -.no-flexbox .dac-media-body {
      -  width: 100%;
      +.dac-search-results-history {
      +  background: #eceff1;
      +  min-height: 100%;
      +  margin: 0 -10px;
      +  padding: 0 10px;
       }
       
      -.dac-swap {
      -  overflow: hidden;
      -  position: relative;
      +.dac-search-results-hero {
      +  padding-top: 20px;
       }
       
      -.dac-swap-section {
      -  left: 0;
      -  opacity: 0;
      -  position: absolute;
      -  top: 0;
      -  width: 100%;
      -  -webkit-transition: opacity 1s, -webkit-transform .5s;
      -  transition: opacity 1s, transform .5s;
      +.dac-search-results-metadata {
      +  padding-bottom: 40px;
       }
       
      -.dac-swap-section.dac-up {
      -  -webkit-transform: translateY(-100%);
      -  -ms-transform: translateY(-100%);
      -  transform: translateY(-100%);
      +#dac-search-results-reference {
      +  float:right;
      +  z-index:999;
       }
       
      -.dac-swap-section.dac-down {
      -  -webkit-transform: translateY(100%);
      -  -ms-transform: translateY(100%);
      -  transform: translateY(100%);
      +@media (max-width: 719px) {
      +  #dac-search-results-reference {
      +    float:none;
      +  }
       }
       
      -.dac-swap-section.dac-left {
      -  -webkit-transform: translateX(-100%);
      -  -ms-transform: translateX(-100%);
      -  transform: translateX(-100%);
      +.dac-search-results-reference {
      +  background: white;
      +  box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.21);
      +  margin: 0 0 20px 0;
      +  overflow: hidden;
      +  padding: 6px 0 4px;
       }
       
      -.dac-swap-section.dac-right {
      -  -webkit-transform: translateX(100%);
      -  -ms-transform: translateX(100%);
      -  transform: translateX(100%);
      +.dac-search-results-reference .namespace {
      +  color: #666;
       }
       
      -.dac-swap-section.dac-active {
      -  opacity: 1;
      -  position: relative;
      -  -webkit-transform: translate(0, 0);
      -  -ms-transform: translate(0, 0);
      -  transform: translate(0, 0);
      -  width: auto;
      +.dac-search-results-reference.is-expanded {
      +  height: auto;
       }
       
      -/* Modal component */
      -.dac-modal {
      -  background: rgba(0, 0, 0, 0.8);
      -  bottom: 0;
      -  left: 0;
      -  opacity: 0;
      -  overflow-x: hidden;
      -  overflow-y: auto;
      -  position: fixed;
      -  right: 0;
      -  top: 0;
      -  -webkit-transition: visibility 0s linear .3s, opacity .3s linear;
      -  transition: visibility 0s linear .3s, opacity .3s linear;
      -  visibility: hidden;
      -  z-index: 52;
      +.dac-search-results-reference-header {
      +  color: #999;
      +  font-size: 16px;
      +  font-variant: small-caps;
      +  font-weight: 700;
      +  margin: 0;
      +  padding: 18px 12px 0;
      +  text-transform: lowercase;
       }
       
      -.dac-modal.dac-active {
      -  opacity: 1;
      -  -webkit-transition-delay: 0s;
      -  transition-delay: 0s;
      -  visibility: visible;
      +.dac-search-results-reference-header:first-child {
      +  padding-top: 0;
       }
       
      -.dac-modal-open {
      -  overflow: hidden;
      +.dac-search-results-reference-entry {
      +  margin: 0;
       }
       
      -.dac-modal-container {
      -  -webkit-box-align: center;
      -  -webkit-align-items: center;
      -  -ms-flex-align: center;
      -  align-items: center;
      -  display: -webkit-box;
      -  display: -webkit-flex;
      -  display: -ms-flexbox;
      -  display: flex;
      -  -webkit-filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4));
      -  filter: drop-shadow(0 5px 15px rgba(0, 0, 0, 0.4));
      -  -webkit-box-pack: center;
      -  -webkit-justify-content: center;
      -  -ms-flex-pack: center;
      -  justify-content: center;
      -  min-height: 100%;
      +.dac-search-results-reference-entry a {
      +  color: #333;
      +  display: block;
      +  font-size: 0.81em;
      +  line-height: 1.5em;
      +  padding: 0 12px 5px 12px;
         width: 100%;
      +  white-space: nowrap;
       }
       
      -.dac-modal-window {
      -  background: #fff;
      -  border-radius: 5px;
      -  box-sizing: border-box;
      -  margin: 20px auto;
      -  -webkit-transition: -webkit-transform .3s;
      -  transition: transform .3s;
      -  -webkit-transform: translate(0, -30px);
      -  -ms-transform: translate(0, -30px);
      -  transform: translate(0, -30px);
      -  width: 960px;
      +ul.dac-search-results-reference {
      +list-style: none;
       }
       
      -.dac-modal.dac-active .dac-modal-window {
      -  -webkit-transform: translate(0, 0);
      -  -ms-transform: translate(0, 0);
      -  transform: translate(0, 0);
      +ul.dac-search-results-reference li[data-toggle="show-more"] {
      +  cursor:pointer;
       }
       
      -.dac-modal-header {
      -  background: #00695c;
      -  border-top-left-radius: 5px;
      -  border-top-right-radius: 5px;
      -  padding: 35px 35px 30px;
      -  position: relative;
      +ul.dac-search-results-reference.is-expanded li[data-toggle="show-more"] {
      +  display:none;
       }
       
      -.dac-modal-header-close {
      -  background: none;
      -  border: none;
      -  cursor: pointer;
      -  line-height: 0;
      -  outline: 0;
      -  opacity: .7;
      -  padding: 8px;
      -  position: absolute;
      -  right: 5px;
      -  -webkit-transition: background-color .3s;
      -  transition: background-color .3s;
      -  top: 5px;
      +.dac-search-results-reference-entry a:hover {
      +  background-color: #eceff1;
       }
       
      -.dac-modal-header-close:active {
      -  background: rgba(255, 255, 255, 0.2);
      +.dac-search-results-reference-entry em {
      +  font-style: normal;
      +  font-weight: 700;
       }
       
      -.dac-modal-header-title {
      -  color: #fff;
      -  font-size: 24px;
      -  font-weight: 300;
      -  line-height: 32px;
      +.dac-search-results-reference-entry-empty {
      +  color: #999;
      +  font-size: 0.81em;
         margin: 0;
      -  padding-right: 150px;
      +  padding: 2px 12px 14px;
       }
       
      -.dac-modal-header-subtitle {
      -  bottom: 0;
      -  color: #fff;
      -  display: inline-block;
      -  font: inherit;
      -  font-size: 14px;
      +.dac-search-results-resources {
         margin: 0;
      -  opacity: .8;
      -  position: absolute;
      -  right: 0;
       }
       
      -.dac-modal-content {
      -  padding: 12px 35px;
      +.dac-search-results-resources .resource-card {
      +  border-right: 2px solid #999;
       }
       
      -.dac-modal-action {
      -  margin: 0;
      +.dac-search-results-resources .resource-card-about {
      +  border-right: 2px solid #6ab344;
       }
       
      -.dac-modal-footer {
      -  padding: 24px 35px;
      +.dac-search-results-resources .resource-card-about .section {
      +  color: #6ab344;
       }
       
      -@media (max-width: 1000px) {
      -  .dac-modal-window {
      -    margin: 20px;
      -    width: auto;
      -  }
      -
      -  .dac-modal-container {
      -    z-index: auto;
      -  }
      +.dac-search-results-resources .resource-card-develop {
      +  border-right: 2px solid #ff7043;
       }
       
      -@media (max-width: 719px) {
      -  .dac-modal-window {
      -    margin: 10px;
      -  }
      -
      -  .dac-modal-header {
      -    padding: 35px 10px 10px;
      -  }
      -
      -  .dac-modal-header-title {
      -    font-size: 16px;
      -    line-height: 24px;
      -    padding: 0;
      -  }
      -
      -  .dac-modal-header-subtitle {
      -    display: block;
      -    margin: 0;
      -    position: static;
      -    text-align: right;
      -  }
      -
      -  .dac-modal-content {
      -    padding: 10px;
      -  }
      +.dac-search-results-resources .resource-card-develop .section {
      +  color: #ff7043;
      +}
       
      -  .dac-modal-footer {
      -    border-top: 1px solid #e3e3e3;
      -    padding: 35px 10px;
      -  }
      +.dac-search-results-resources .resource-card-design {
      +  border-right: 2px solid #00bcd4;
       }
       
      -.newsletter .dac-modal-footer {
      -  padding-top: 0;
      -  text-align: right;
      +.dac-search-results-resources .resource-card-design .section {
      +  color: #00bcd4;
       }
       
      -.newsletter-checkboxes {
      -  padding-top: 20px;
      +.dac-search-results-resources .resource-card-distribute {
      +  border-right: 2px solid #afb42b;
       }
       
      -.newsletter-success-message {
      -  font-size: 32px;
      -  line-height: 1.4;
      -  padding: 40px 30px;
      -  text-align: center;
      +.dac-search-results-resources .resource-card-distribute .section {
      +  color: #afb42b;
       }
       
       @media (max-width: 719px) {
      -  .newsletter-success-message {
      -    font-size: 16px;
      -    padding: 12px 0 0;
      +  .dac-search-results-reference.no-results {
      +    display: none;
         }
       }
       
      -@media (min-width: 720px) {
      -  .newsletter-checkboxes {
      -    padding-top: 46px;
      +@media (min-width: 980px) {
      +  .dac-nav-open.dac-search-open .dac-search-results {
      +    padding-left: 260px;
         }
       
      -  .newsletter-leftCol {
      -    padding-right: 40px;
      +  .dac-search-mode.dac-search-open .dac-search-results {
      +    padding-left: 10px;
         }
      +}
       
      -  .newsletter-rightCol {
      -    padding-left: 40px;
      -  }
      +.dac-selected {
      +  color: #039bef !important;
       }
       
      -@media (max-width: 719px) {
      -  .newsletter .dac-modal-footer {
      -    margin-top: 30px;
      -    padding: 30px 10px;
      -    text-align: center;
      -  }
      +.dac-selected em {
      +  color: #039bef;
      +}
      +
      +.resource-card.dac-selected {
      +  box-shadow: 0px 1px 10px 0px rgba(3, 155, 239, 0.7);
      +}
      +
      +.resource-card.dac-selected em {
      +  color: #333;
       }
       
       .dac-expand, .dac-section {
      @@ -8405,7 +9372,7 @@ section#features {
       }
       
       .dac-invert {
      -  color: #b2b2b2;
      +  color: #b3b3b3;
         color: rgba(255, 255, 255, 0.7);
       }
       
      @@ -8418,7 +9385,11 @@ section#features {
       }
       
       .dac-gray.dac-hero, .dac-gray.dac-section {
      -  background-color: #b0bec5;
      +  background-color: #d8dfe2;
      +}
      +
      +.dac-gray-dark.dac-hero, .dac-gray-dark.dac-section {
      +   background-color: #b0bec5;
       }
       
       .dac-dark.dac-hero, .dac-dark.dac-section {
      @@ -8429,6 +9400,33 @@ section#features {
         background-color: #dc4d38;
       }
       
      +.dac-blue.dac-hero,
      +.dac-blue.dac-section {
      +  background-color: #0277bd;
      +}
      +
      +.dac-blue.dac-invert .dac-hero-description,
      +.dac-blue.dac-invert .dac-section-subtitle {
      +  color: #fff;
      +}
      +
      +.dac-dark-gray.dac-hero,
      +.dac-dark-gray.dac-section {
      +  background-color: #455a64;
      +}
      +
      +.dac-bg-opacity::after {
      +  background-color: rgba(0, 0, 0, .3);
      +  content : "";
      +  display: block;
      +  position: absolute;
      +  top: 0;
      +  left: 0;
      +  width: 100%;
      +  height: 100%;
      +  z-index: 1;
      +}
      +
       .dac-hero-cta, .dac-section-title, .dac-section-links {
         color: #212121;
         color: rgba(0, 0, 0, 0.87);
      @@ -8438,11 +9436,11 @@ section#features {
         color: white;
       }
       
      -.dac-hero-cta .dac-sprite, .dac-section-title .dac-sprite, .dac-section-links .dac-sprite {
      +.dac-hero-cta .dac-sprite, .dac-section-title .dac-sprite, .dac-section-links .dac-sprite, .dac-hero-cta .dac-modal-header-close:before, .dac-section-title .dac-modal-header-close:before, .dac-section-links .dac-modal-header-close:before, .dac-hero-cta .paging-links .prev-page-link:before, .paging-links .dac-hero-cta .prev-page-link:before, .dac-section-title .paging-links .prev-page-link:before, .paging-links .dac-section-title .prev-page-link:before, .dac-section-links .paging-links .prev-page-link:before, .paging-links .dac-section-links .prev-page-link:before, .dac-hero-cta .paging-links .next-page-link:before, .paging-links .dac-hero-cta .next-page-link:before, .dac-section-title .paging-links .next-page-link:before, .paging-links .dac-section-title .next-page-link:before, .dac-section-links .paging-links .next-page-link:before, .paging-links .dac-section-links .next-page-link:before, .dac-hero-cta .paging-links .next-class-link:before, .paging-links .dac-hero-cta .next-class-link:before, .dac-section-title .paging-links .next-class-link:before, .paging-links .dac-section-title .next-class-link:before, .dac-section-links .paging-links .next-class-link:before, .paging-links .dac-section-links .next-class-link:before, .dac-hero-cta .paging-links .start-class-link:after, .paging-links .dac-hero-cta .start-class-link:after, .dac-section-title .paging-links .start-class-link:after, .paging-links .dac-section-title .start-class-link:after, .dac-section-links .paging-links .start-class-link:after, .paging-links .dac-section-links .start-class-link:after {
         opacity: .87;
       }
       
      -.dac-invert .dac-hero-cta .dac-sprite, .dac-invert .dac-section-title .dac-sprite, .dac-invert .dac-section-links .dac-sprite {
      +.dac-invert .dac-hero-cta .dac-sprite, .dac-invert .dac-section-title .dac-sprite, .dac-invert .dac-section-links .dac-sprite, .dac-invert .dac-hero-cta .dac-modal-header-close:before, .dac-invert .dac-section-title .dac-modal-header-close:before, .dac-invert .dac-section-links .dac-modal-header-close:before, .dac-invert .dac-hero-cta .paging-links .prev-page-link:before, .paging-links .dac-invert .dac-hero-cta .prev-page-link:before, .dac-invert .dac-section-title .paging-links .prev-page-link:before, .paging-links .dac-invert .dac-section-title .prev-page-link:before, .dac-invert .dac-section-links .paging-links .prev-page-link:before, .paging-links .dac-invert .dac-section-links .prev-page-link:before, .dac-invert .dac-hero-cta .paging-links .next-page-link:before, .paging-links .dac-invert .dac-hero-cta .next-page-link:before, .dac-invert .dac-section-title .paging-links .next-page-link:before, .paging-links .dac-invert .dac-section-title .next-page-link:before, .dac-invert .dac-section-links .paging-links .next-page-link:before, .paging-links .dac-invert .dac-section-links .next-page-link:before, .dac-invert .dac-hero-cta .paging-links .next-class-link:before, .paging-links .dac-invert .dac-hero-cta .next-class-link:before, .dac-invert .dac-section-title .paging-links .next-class-link:before, .paging-links .dac-invert .dac-section-title .next-class-link:before, .dac-invert .dac-section-links .paging-links .next-class-link:before, .paging-links .dac-invert .dac-section-links .next-class-link:before, .dac-invert .dac-hero-cta .paging-links .start-class-link:after, .paging-links .dac-invert .dac-hero-cta .start-class-link:after, .dac-invert .dac-section-title .paging-links .start-class-link:after, .paging-links .dac-invert .dac-section-title .start-class-link:after, .dac-invert .dac-section-links .paging-links .start-class-link:after, .paging-links .dac-invert .dac-section-links .start-class-link:after {
         opacity: 1;
       }
       
      @@ -8452,10 +9450,51 @@ section#features {
       }
       
       .dac-invert .dac-hero-tag, .dac-invert .dac-hero-description, .dac-invert .dac-section-subtitle {
      -  color: #b2b2b2;
      +  color: #b3b3b3;
         color: rgba(255, 255, 255, 0.7);
       }
       
      +.dac-hero.dac-no-min-height {
      +  min-height: 0;
      +}
      +
      +.dac-hero-half-bg {
      +  background-size: cover;
      +  background-repeat: no-repeat;
      +  float: right;
      +  height: 440px;
      +}
      +
      +.dac-hero-half-bg-centered {
      +  background-position: center;
      +  background-repeat: no-repeat;
      +  background-size: cover;
      +  float: right;
      +  height: 440px;
      +}
      +
      +@media only screen and (-webkit-min-device-pixel-ratio: 2),
      +only screen and (-moz-min-device-pixel-ratio: 2),
      +only screen and (min-device-pixel-ratio: 2),
      +only screen and (min-resolution: 192dpi),
      +only screen and (min-resolution: 2dppx) {
      +  .dac-hero-half-bg,
      +  .dac-hero-half-bg-centered {
      +    background-size: "" "";
      +  }
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-hero-half-bg,
      +  .dac-hero-half-bg-centered {
      +    background-position: center;
      +    background-size: auto 100%;
      +    float: none;
      +    height: 200px;
      +    margin-top: 32px;
      +  }
      +}
      +
       .dac-section {
         background-position: 50% 50%;
         background-size: cover;
      @@ -8471,20 +9510,26 @@ section#features {
         }
       }
       
      -.dac-section.dac-small {
      +.dac-section.dac-small,
      +.dac-hero.dac-small {
         padding-bottom: 32px;
         padding-top: 32px;
       }
       
      +.dac-section.dac-slim {
      +  padding-bottom: 0;
      +  padding-top: 0;
      +}
      +
       .dac-section-title {
         text-align: center;
      -  margin-bottom: 40px;
      -  margin-top: 0;
      +  padding-bottom: 40px;
      +  padding-top: 0;
       }
       
       .dac-section-subtitle {
         font-size: 16px;
      -  margin-bottom: 40px;
      +  padding-bottom: 40px;
         margin-top: -24px;
         text-align: center;
       }
      @@ -8505,6 +9550,7 @@ section#features {
       }
       
       .dac-section-link {
      +  cursor: pointer;
         display: inline-block;
         margin: 0 32px;
         -webkit-transition: opacity .3s;
      @@ -8539,184 +9585,475 @@ $icon-home: x y offset_x offset_y width height total_width total_height image_pa
       At the bottom of this section, we provide information about the spritesheet itself
       $spritesheet: width height image $spritesheet-sprites;
       */
      -.dac-sprite, #tb li:before, #qv li:before {
      -  background-image: url(../../assets/images/sprite.png);
      +.dac-sprite, .dac-modal-header-close:before, .paging-links .prev-page-link:before, .paging-links .next-page-link:before, .paging-links .next-class-link:before, .paging-links .start-class-link:after, .Video-button--picture-in-picture, .Video-button--close, a.video-shadowbox-button.white::after, #tb li:before,
      +#qv li:before {
      +  background-image: url(../images/sprite.png);
         display: inline-block;
      -  vertical-align: middle; }
      -  @media screen and (min-device-pixel-ratio: 1.5) {
      -    .dac-sprite, #tb li:before, #qv li:before {
      -      background-image: url(../../assets/images/sprite-2x.png);
      -      background-size: 50% 50%; } }
      +  vertical-align: middle;
      +}
       
      -.dac-sprite.dac-auto-chevron {
      -  background-position: 0px -196px;
      +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx), (min-resolution: 144px) {
      +
      +  .dac-sprite,
      +  .dac-modal-header-close:before,
      +  .paging-links .prev-page-link:before,
      +  .paging-links .next-page-link:before,
      +  .paging-links .next-class-link:before,
      +  .paging-links .start-class-link:after,
      +  .Video-button--picture-in-picture,
      +  .Video-button--close,
      +  a.video-shadowbox-button.white::after,
      +  #tb li:before,
      +  #qv li:before {
      +    background-image: url(../images/sprite_2x.png);
      +    background-size: 36px 900px;
      +  }
      +}
      +
      +.dac-chevron {
      +  background-size: 9px 39px;
      +  display: inline-block;
      +  height: 13px;
      +  text-indent: -9999px;
      +  width: 9px;
      +}
      +
      +.dac-sprite.dac-auto-chevron,
      +.dac-auto-chevron.dac-modal-header-close:before,
      +.paging-links .dac-auto-chevron.prev-page-link:before,
      +.paging-links .dac-auto-chevron.next-page-link:before,
      +.paging-links .dac-auto-chevron.next-class-link:before,
      +.paging-links .dac-auto-chevron.start-class-link:after {
      +  background-position: 0px -669px;
         height: 24px;
         width: 24px;
      -  vertical-align: -6px; }
      -  .dac-invert .dac-sprite.dac-auto-chevron {
      -    background-position: 0px -222px;
      -    height: 24px;
      -    width: 24px; }
      -.dac-sprite.dac-auto-chevron-large {
      -  background-position: 0px -404px;
      +  vertical-align: -6px;
      +}
      +
      +.dac-invert .dac-sprite.dac-auto-chevron, .dac-invert .dac-auto-chevron.dac-modal-header-close:before, .dac-invert .paging-links .dac-auto-chevron.prev-page-link:before, .paging-links .dac-invert .dac-auto-chevron.prev-page-link:before, .dac-invert .paging-links .dac-auto-chevron.next-page-link:before, .paging-links .dac-invert .dac-auto-chevron.next-page-link:before, .dac-invert .paging-links .dac-auto-chevron.next-class-link:before, .paging-links .dac-invert .dac-auto-chevron.next-class-link:before, .dac-invert .paging-links .dac-auto-chevron.start-class-link:after, .paging-links .dac-invert .dac-auto-chevron.start-class-link:after {
      +  background-position: 0px -513px;
      +  height: 24px;
      +  width: 24px;
      +}
      +
      +.dac-sprite.dac-auto-chevron-large, .dac-auto-chevron-large.dac-modal-header-close:before, .paging-links .dac-auto-chevron-large.prev-page-link:before, .paging-links .dac-auto-chevron-large.next-page-link:before, .paging-links .dac-auto-chevron-large.next-class-link:before, .paging-links .dac-auto-chevron-large.start-class-link:after {
      +  background-position: 0px -695px;
      +  height: 36px;
      +  width: 36px;
      +  vertical-align: -10px;
      +}
      +
      +.dac-invert .dac-sprite.dac-auto-chevron-large,
      +.dac-invert .dac-auto-chevron-large.dac-modal-header-close:before,
      +.dac-invert .paging-links .dac-auto-chevron-large.prev-page-link:before,
      +.paging-links .dac-invert .dac-auto-chevron-large.prev-page-link:before,
      +.dac-invert .paging-links .dac-auto-chevron-large.next-page-link:before,
      +.paging-links .dac-invert .dac-auto-chevron-large.next-page-link:before,
      +.dac-invert .paging-links .dac-auto-chevron-large.next-class-link:before,
      +.paging-links .dac-invert .dac-auto-chevron-large.next-class-link:before,
      +.dac-invert .paging-links .dac-auto-chevron-large.start-class-link:after,
      +.paging-links .dac-invert .dac-auto-chevron-large.start-class-link:after {
      +  background-position: 0px -771px;
         height: 36px;
         width: 36px;
      -  vertical-align: -10px; }
      -  .dac-invert .dac-sprite.dac-auto-chevron-large {
      -    background-position: 0px -442px;
      -    height: 36px;
      -    width: 36px; }
      -.dac-sprite.dac-auto-unfold-less {
      -  background-position: 0px -352px;
      +}
      +
      +.dac-sprite.dac-auto-unfold-less, .dac-auto-unfold-less.dac-modal-header-close:before, .paging-links .dac-auto-unfold-less.prev-page-link:before, .paging-links .dac-auto-unfold-less.next-page-link:before, .paging-links .dac-auto-unfold-less.next-class-link:before, .paging-links .dac-auto-unfold-less.start-class-link:after {
      +  background-position: 0px -487px;
         height: 24px;
         width: 24px;
         vertical-align: -6px; }
      -  .dac-invert .dac-sprite.dac-auto-unfold-less {
      -    background-position: 0px -326px;
      +  .dac-invert .dac-sprite.dac-auto-unfold-less, .dac-invert .dac-auto-unfold-less.dac-modal-header-close:before, .dac-invert .paging-links .dac-auto-unfold-less.prev-page-link:before, .paging-links .dac-invert .dac-auto-unfold-less.prev-page-link:before, .dac-invert .paging-links .dac-auto-unfold-less.next-page-link:before, .paging-links .dac-invert .dac-auto-unfold-less.next-page-link:before, .dac-invert .paging-links .dac-auto-unfold-less.next-class-link:before, .paging-links .dac-invert .dac-auto-unfold-less.next-class-link:before, .dac-invert .paging-links .dac-auto-unfold-less.start-class-link:after, .paging-links .dac-invert .dac-auto-unfold-less.start-class-link:after {
      +    background-position: 0px -565px;
           height: 24px;
           width: 24px; }
      -.dac-sprite.dac-auto-unfold-more {
      -  background-position: 0px -300px;
      +
      +.dac-sprite.dac-auto-unfold-more, .dac-auto-unfold-more.dac-modal-header-close:before, .paging-links .dac-auto-unfold-more.prev-page-link:before, .paging-links .dac-auto-unfold-more.next-page-link:before, .paging-links .dac-auto-unfold-more.next-class-link:before, .paging-links .dac-auto-unfold-more.start-class-link:after {
      +  background-position: 0px -539px;
         height: 24px;
         width: 24px;
         vertical-align: -6px; }
      -  .dac-invert .dac-sprite.dac-auto-unfold-more {
      -    background-position: 0px -378px;
      +  .dac-invert .dac-sprite.dac-auto-unfold-more, .dac-invert .dac-auto-unfold-more.dac-modal-header-close:before, .dac-invert .paging-links .dac-auto-unfold-more.prev-page-link:before, .paging-links .dac-invert .dac-auto-unfold-more.prev-page-link:before, .dac-invert .paging-links .dac-auto-unfold-more.next-page-link:before, .paging-links .dac-invert .dac-auto-unfold-more.next-page-link:before, .dac-invert .paging-links .dac-auto-unfold-more.next-class-link:before, .paging-links .dac-invert .dac-auto-unfold-more.next-class-link:before, .dac-invert .paging-links .dac-auto-unfold-more.start-class-link:after, .paging-links .dac-invert .dac-auto-unfold-more.start-class-link:after {
      +    background-position: 0px -305px;
           height: 24px;
           width: 24px; }
       
      -.dac-sprite.dac-arrow-down-gray {
      +.dac-sprite.dac-arrow-down-gray, .dac-arrow-down-gray.dac-modal-header-close:before, .paging-links .dac-arrow-down-gray.prev-page-link:before, .paging-links .dac-arrow-down-gray.next-page-link:before, .paging-links .dac-arrow-down-gray.next-class-link:before, .paging-links .dac-arrow-down-gray.start-class-link:after {
         background-position: 0px 0px;
         height: 11px;
         width: 19px; }
       
      -.dac-sprite.dac-arrow-right {
      -  background-position: 0px -128px;
      +.dac-sprite.dac-arrow-right, .dac-arrow-right.dac-modal-header-close:before, .paging-links .dac-arrow-right.prev-page-link:before, .paging-links .dac-arrow-right.next-page-link:before, .paging-links .dac-arrow-right.next-class-link:before, .paging-links .dac-arrow-right.start-class-link:after {
      +  background-position: 0px -215px;
         height: 18px;
         width: 11px; }
       
      -.dac-sprite.dac-chevron-large-right-black {
      -  background-position: 0px -404px;
      +.dac-sprite.dac-back-arrow, .dac-back-arrow.dac-modal-header-close:before, .paging-links .dac-back-arrow.prev-page-link:before, .paging-links .dac-back-arrow.next-page-link:before, .paging-links .dac-back-arrow.next-class-link:before, .paging-links .dac-back-arrow.start-class-link:after {
      +  background-position: 0px -123px;
      +  height: 16px;
      +  width: 16px; }
      +
      +.dac-sprite.dac-chevron-large-right-black, .dac-chevron-large-right-black.dac-modal-header-close:before, .paging-links .dac-chevron-large-right-black.prev-page-link:before, .paging-links .dac-chevron-large-right-black.next-page-link:before, .paging-links .dac-chevron-large-right-black.next-class-link:before, .paging-links .dac-chevron-large-right-black.start-class-link:after {
      +  background-position: 0px -695px;
         height: 36px;
         width: 36px; }
       
      -.dac-sprite.dac-chevron-large-right-white {
      -  background-position: 0px -442px;
      +.dac-sprite.dac-chevron-large-right-white, .dac-chevron-large-right-white.dac-modal-header-close:before, .paging-links .dac-chevron-large-right-white.prev-page-link:before, .paging-links .dac-chevron-large-right-white.next-page-link:before, .paging-links .dac-chevron-large-right-white.next-class-link:before, .paging-links .dac-chevron-large-right-white.start-class-link:after {
      +  background-position: 0px -771px;
         height: 36px;
         width: 36px; }
       
      -.dac-sprite.dac-chevron-right-black {
      -  background-position: 0px -196px;
      +.dac-sprite.dac-chevron-right-black, .dac-chevron-right-black.dac-modal-header-close:before, .paging-links .dac-chevron-right-black.prev-page-link:before, .paging-links .dac-chevron-right-black.next-page-link:before, .paging-links .dac-chevron-right-black.next-class-link:before, .paging-links .dac-chevron-right-black.start-class-link:after {
      +  background-position: 0px -669px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-chevron-right-white, .dac-chevron-right-white.dac-modal-header-close:before, .paging-links .dac-chevron-right-white.prev-page-link:before, .paging-links .dac-chevron-right-white.next-page-link:before, .paging-links .dac-chevron-right-white.next-class-link:before, .paging-links .dac-chevron-right-white.start-class-link:after {
      +  background-position: 0px -513px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-chevron-right-white {
      -  background-position: 0px -222px;
      +.dac-sprite.dac-close-black, .dac-close-black.dac-modal-header-close:before, .paging-links .dac-close-black.prev-page-link:before, .paging-links .dac-close-black.next-page-link:before, .paging-links .dac-close-black.next-class-link:before, .paging-links .dac-close-black.start-class-link:after {
      +  background-position: 0px -89px;
      +  height: 14px;
      +  width: 14px; }
      +
      +.dac-sprite.dac-close-video-white, .dac-modal-header-close:before, .paging-links .dac-close-video-white.prev-page-link:before, .paging-links .prev-page-link.dac-modal-header-close:before, .paging-links .dac-close-video-white.next-page-link:before, .paging-links .next-page-link.dac-modal-header-close:before, .paging-links .dac-close-video-white.next-class-link:before, .paging-links .next-class-link.dac-modal-header-close:before, .paging-links .dac-close-video-white.start-class-link:after {
      +  background-position: 0px -435px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-close {
      +.dac-sprite.dac-close, .dac-close.dac-modal-header-close:before, .paging-links .dac-close.prev-page-link:before, .paging-links .dac-close.next-page-link:before, .paging-links .dac-close.next-class-link:before, .paging-links .dac-close.start-class-link:after {
         background-position: 0px -27px;
         height: 12px;
         width: 12px; }
       
      -.dac-sprite.dac-expand-less-black {
      -  background-position: 0px -248px;
      +.dac-sprite.dac-enlarge-video-white, .dac-enlarge-video-white.dac-modal-header-close:before, .paging-links .dac-enlarge-video-white.prev-page-link:before, .paging-links .dac-enlarge-video-white.next-page-link:before, .paging-links .dac-enlarge-video-white.next-class-link:before, .paging-links .dac-enlarge-video-white.start-class-link:after {
      +  background-position: 0px -409px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-expand-more-black {
      -  background-position: 0px -170px;
      +.dac-sprite.dac-expand-less-black, .dac-expand-less-black.dac-modal-header-close:before, .paging-links .dac-expand-less-black.prev-page-link:before, .paging-links .dac-expand-less-black.next-page-link:before, .paging-links .dac-expand-less-black.next-class-link:before, .paging-links .dac-expand-less-black.start-class-link:after {
      +  background-position: 0px -383px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-google-play {
      -  background-position: 0px -108px;
      -  height: 18px;
      -  width: 16px; }
      +.dac-sprite.dac-expand-more-black, .dac-expand-more-black.dac-modal-header-close:before, .paging-links .dac-expand-more-black.prev-page-link:before, .paging-links .dac-expand-more-black.next-page-link:before, .paging-links .dac-expand-more-black.next-class-link:before, .paging-links .dac-expand-more-black.start-class-link:after {
      +  background-position: 0px -357px;
      +  height: 24px;
      +  width: 24px; }
       
      -.dac-sprite.dac-gplus {
      -  background-position: 0px -89px;
      -  height: 17px;
      -  width: 16px; }
      +.dac-sprite.dac-fullscreen-exit, .dac-fullscreen-exit.dac-modal-header-close:before, .paging-links .dac-fullscreen-exit.prev-page-link:before, .paging-links .dac-fullscreen-exit.next-page-link:before, .paging-links .dac-fullscreen-exit.next-class-link:before, .paging-links .dac-fullscreen-exit.start-class-link:after {
      +  background-position: 0px -331px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-fullscreen, .dac-fullscreen.dac-modal-header-close:before, .paging-links .dac-fullscreen.prev-page-link:before, .paging-links .dac-fullscreen.next-page-link:before, .paging-links .dac-fullscreen.next-class-link:before, .paging-links .dac-fullscreen.start-class-link:after {
      +  background-position: 0px -279px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-google-play, .dac-google-play.dac-modal-header-close:before, .paging-links .dac-google-play.prev-page-link:before, .paging-links .dac-google-play.next-page-link:before, .paging-links .dac-google-play.next-class-link:before, .paging-links .dac-google-play.start-class-link:after {
      +  background-position: 0px -235px;
      +  height: 20px;
      +  width: 17px; }
      +
      +.dac-sprite.dac-gplus, .dac-gplus.dac-modal-header-close:before, .paging-links .dac-gplus.prev-page-link:before, .paging-links .dac-gplus.next-page-link:before, .paging-links .dac-gplus.next-class-link:before, .paging-links .dac-gplus.start-class-link:after {
      +  background-position: 0px -809px;
      +  height: 36px;
      +  width: 36px; }
       
      -.dac-sprite.dac-mail {
      +.dac-sprite.dac-mail, .dac-mail.dac-modal-header-close:before, .paging-links .dac-mail.prev-page-link:before, .paging-links .dac-mail.next-page-link:before, .paging-links .dac-mail.next-class-link:before, .paging-links .dac-mail.start-class-link:after {
         background-position: 0px -13px;
         height: 12px;
         width: 16px; }
       
      -.dac-sprite.dac-play-white {
      -  background-position: 0px -148px;
      +.dac-sprite.dac-nav-back-blue, .dac-nav-back-blue.dac-modal-header-close:before, .paging-links .prev-page-link:before, .paging-links .dac-nav-back-blue.next-page-link:before, .paging-links .dac-nav-back-blue.next-class-link:before, .paging-links .dac-nav-back-blue.start-class-link:after {
      +  background-position: 0px -105px;
      +  height: 16px;
      +  width: 16px; }
      +
      +.dac-sprite.dac-nav-back, .dac-nav-back.dac-modal-header-close:before, .paging-links .dac-nav-back.prev-page-link:before, .paging-links .dac-nav-back.next-page-link:before, .paging-links .dac-nav-back.next-class-link:before, .paging-links .dac-nav-back.start-class-link:after {
      +  background-position: 0px -177px;
      +  height: 16px;
      +  width: 16px; }
      +
      +/* The back button in Studio and NDK left nav */
      +.dac-nav-back-button.back-to-dev .dac-sprite.dac-nav-back {
      +  background-position: 0px -884px;
      +  height: 16px;
      +  width: 16px;
      +}
      +
      +.dac-sprite.dac-nav-forward-blue, .dac-nav-forward-blue.dac-modal-header-close:before, .paging-links .dac-nav-forward-blue.prev-page-link:before, .paging-links .next-page-link:before, .paging-links .next-class-link:before, .paging-links .start-class-link:after {
      +  background-position: 0px -159px;
      +  height: 16px;
      +  width: 16px; }
      +
      +.dac-sprite.dac-nav-forward, .dac-nav-forward.dac-modal-header-close:before, .paging-links .dac-nav-forward.prev-page-link:before, .paging-links .dac-nav-forward.next-page-link:before, .paging-links .dac-nav-forward.next-class-link:before, .paging-links .dac-nav-forward.start-class-link:after {
      +  background-position: 0px -141px;
      +  height: 16px;
      +  width: 16px; }
      +
      +.dac-sprite.dac-open-in-new, .dac-open-in-new.dac-modal-header-close:before, .paging-links .dac-open-in-new.prev-page-link:before, .paging-links .dac-open-in-new.next-page-link:before, .paging-links .dac-open-in-new.next-class-link:before, .paging-links .dac-open-in-new.start-class-link:after {
      +  background-position: 0px -195px;
      +  height: 18px;
      +  width: 18px; }
      +
      +.dac-sprite.dac-picture-in-picture-white, .dac-picture-in-picture-white.dac-modal-header-close:before, .paging-links .dac-picture-in-picture-white.prev-page-link:before, .paging-links .dac-picture-in-picture-white.next-page-link:before, .paging-links .dac-picture-in-picture-white.next-class-link:before, .paging-links .dac-picture-in-picture-white.start-class-link:after {
      +  background-position: 0px -461px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-play-circle-grey, .dac-play-circle-grey.dac-modal-header-close:before, .paging-links .dac-play-circle-grey.prev-page-link:before, .paging-links .dac-play-circle-grey.next-page-link:before, .paging-links .dac-play-circle-grey.next-class-link:before, .paging-links .dac-play-circle-grey.start-class-link:after {
      +  background-position: 0px -733px;
      +  height: 36px;
      +  width: 36px; }
      +
      +.dac-sprite.dac-play-circle-white, .dac-play-circle-white.dac-modal-header-close:before, .paging-links .dac-play-circle-white.prev-page-link:before, .paging-links .dac-play-circle-white.next-page-link:before, .paging-links .dac-play-circle-white.next-class-link:before, .paging-links .dac-play-circle-white.start-class-link:after {
      +  background-position: 0px -847px;
      +  height: 36px;
      +  width: 36px; }
      +
      +.dac-sprite.dac-play-white, .dac-play-white.dac-modal-header-close:before, .paging-links .dac-play-white.prev-page-link:before, .paging-links .dac-play-white.next-page-link:before, .paging-links .dac-play-white.next-class-link:before, .paging-links .dac-play-white.start-class-link:after {
      +  background-position: 0px -257px;
         height: 20px;
         width: 16px; }
       
      -.dac-sprite.dac-rss {
      +.dac-sprite.dac-rss, .dac-rss.dac-modal-header-close:before, .paging-links .dac-rss.prev-page-link:before, .paging-links .dac-rss.next-page-link:before, .paging-links .dac-rss.next-class-link:before, .paging-links .dac-rss.start-class-link:after {
         background-position: 0px -41px;
         height: 14px;
         width: 14px; }
       
      -.dac-sprite.dac-search {
      -  background-position: 0px -274px;
      +.dac-sprite.dac-search-white, .dac-search-white.dac-modal-header-close:before, .paging-links .dac-search-white.prev-page-link:before, .paging-links .dac-search-white.next-page-link:before, .paging-links .dac-search-white.next-class-link:before, .paging-links .dac-search-white.start-class-link:after {
      +  background-position: 0px -591px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-search, .dac-search.dac-modal-header-close:before, .paging-links .dac-search.prev-page-link:before, .paging-links .dac-search.next-page-link:before, .paging-links .dac-search.next-class-link:before, .paging-links .dac-search.start-class-link:after {
      +  background-position: 0px -617px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-star-outline, .dac-star-outline.dac-modal-header-close:before, .paging-links .dac-star-outline.prev-page-link:before, .paging-links .dac-star-outline.next-page-link:before, .paging-links .dac-star-outline.next-class-link:before, .paging-links .dac-star-outline.start-class-link:after {
      +  background-position: 0px -643px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-twitter {
      +.dac-sprite.dac-twitter, .dac-twitter.dac-modal-header-close:before, .paging-links .dac-twitter.prev-page-link:before, .paging-links .dac-twitter.next-page-link:before, .paging-links .dac-twitter.next-class-link:before, .paging-links .dac-twitter.start-class-link:after {
         background-position: 0px -73px;
         height: 14px;
         width: 16px; }
       
      -.dac-sprite.dac-unfold-less-white {
      -  background-position: 0px -326px;
      +.dac-sprite.dac-unfold-less-white, .dac-unfold-less-white.dac-modal-header-close:before, .paging-links .dac-unfold-less-white.prev-page-link:before, .paging-links .dac-unfold-less-white.next-page-link:before, .paging-links .dac-unfold-less-white.next-class-link:before, .paging-links .dac-unfold-less-white.start-class-link:after {
      +  background-position: 0px -565px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-unfold-less {
      -  background-position: 0px -352px;
      +.dac-sprite.dac-unfold-less, .dac-unfold-less.dac-modal-header-close:before, .paging-links .dac-unfold-less.prev-page-link:before, .paging-links .dac-unfold-less.next-page-link:before, .paging-links .dac-unfold-less.next-class-link:before, .paging-links .dac-unfold-less.start-class-link:after {
      +  background-position: 0px -487px;
         height: 24px;
         width: 24px; }
       
      -.dac-sprite.dac-unfold-more-white {
      -  background-position: 0px -378px;
      -  height: 24px;
      -  width: 24px; }
      +.dac-sprite.dac-unfold-more-white, .dac-unfold-more-white.dac-modal-header-close:before, .paging-links .dac-unfold-more-white.prev-page-link:before, .paging-links .dac-unfold-more-white.next-page-link:before, .paging-links .dac-unfold-more-white.next-class-link:before, .paging-links .dac-unfold-more-white.start-class-link:after {
      +  background-position: 0px -305px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-unfold-more, .dac-unfold-more.dac-modal-header-close:before, .paging-links .dac-unfold-more.prev-page-link:before, .paging-links .dac-unfold-more.next-page-link:before, .paging-links .dac-unfold-more.next-class-link:before, .paging-links .dac-unfold-more.start-class-link:after {
      +  background-position: 0px -539px;
      +  height: 24px;
      +  width: 24px; }
      +
      +.dac-sprite.dac-youtube, .dac-youtube.dac-modal-header-close:before, .paging-links .dac-youtube.prev-page-link:before, .paging-links .dac-youtube.next-page-link:before, .paging-links .dac-youtube.next-class-link:before, .paging-links .dac-youtube.start-class-link:after {
      +  background-position: 0px -57px;
      +  height: 14px;
      +  width: 18px; }
      +
      +/* Toast Component */
      +.dac-toast {
      +  background: #ffebc3;
      +  border-top: 1px solid #e5d4a1;
      +  display: none;
      +  color: rgba(0, 0, 0, .87);
      +  line-height: 1.4;
      +  padding: 10px;
      +}
      +
      +.dac-toast.dac-visible {
      +  display: block;
      +}
      +
      +.dac-toast-wrap {
      +  box-sizing: border-box;
      +  margin: 0 auto;
      +  max-width: 940px;
      +  padding-right: 20px;
      +  position: relative;
      +}
      +
      +.dac-toast-close-btn {
      +  background-color: transparent;
      +  border: none;
      +  border-radius: 0;
      +  cursor: pointer;
      +  opacity: .4;
      +  padding: 0;
      +  position: absolute;
      +  right: 0;
      +  top: -2px;
      +}
      +
      +.dac-toast-close-btn:hover,
      +.dac-toast-close-btn:focus,
      +.dac-toast-close-btn:active {
      +  opacity: 1;
      +  outline: none;
      +}
      +
      +.dac-toast-close-btn .dac-button.dac-raised.dac-primary{
      +  margin: 0;
      +  padding: 0;
      +}
      +
      +.dac-toast-group {
      +  bottom: 0;
      +  left: 0;
      +  position: fixed;
      +  right: 0;
      +  z-index: 60;
      +}
      +
      +.dac-toast.dac-danger {
      +  background-color: #ffccbc;
      +  border-top-color: #e5b7a9;
      +}
      +
      +.dac-toast.dac-success {
      +  background-color: #cdedc8;
      +  border-top-color: #c6d5b4;
      +}
      +
      +@media (max-width: 719px) {
      +  .dac-toast-close-btn {
      +    position: relative;
      +    top: 0;
      +    margin: 10px 0 0;
      +    display: block;
      +  }
      +}
      +
      +.dac-tab-item {
      +  box-sizing: border-box;
      +  cursor: pointer;
      +  display: table-cell;
      +  margin: 0;
      +  padding: 8px 12px;
      +  position: relative;
      +  text-align: left; }
      +  @media (max-width: 719px) {
      +    .dac-tab-item {
      +      padding-right: 12px;
      +      text-align: center;
      +      width: 33.33333333%; } }
      +
      +.dac-tab-title {
      +  color: #333;
      +  display: inline-block;
      +  font-size: 16px;
      +  font-weight: 500;
      +  margin: 0; }
      +
      +.dac-tab-arrow {
      +  margin-top: -2px; }
      +  @media (max-width: 719px) {
      +    .dac-tab-arrow {
      +      position: absolute;
      +      visibility: hidden; } }
      +
      +.dac-tab-bar {
      +  display: inline-block;
      +  list-style-type: none;
      +  margin: 0 0 0 12px;
      +  vertical-align: middle;
      +  overflow: hidden; }
      +  @media (max-width: 719px) {
      +    .dac-tab-bar {
      +      display: table;
      +      margin-left: 0;
      +      width: 100%; } }
      +
      +.dac-tab-views {
      +  list-style-type: none;
      +  margin: 0; }
      +
      +.dac-tab-view {
      +  background: #fff;
      +  display: none;
      +  overflow: hidden;
      +  margin: 0 0 10px;
      +  padding: 20px 10px 0;
      +  text-align: left; }
      +
      +.dac-tab-item.dac-active {
      +  background: #fff; }
       
      -.dac-sprite.dac-unfold-more {
      -  background-position: 0px -300px;
      -  height: 24px;
      -  width: 24px; }
      +.dac-tab-item.dac-active .dac-tab-arrow {
      +  -webkit-transform: scaleY(-1);
      +      -ms-transform: scaleY(-1);
      +          transform: scaleY(-1); }
       
      -.dac-sprite.dac-youtube {
      -  background-position: 0px -57px;
      -  height: 14px;
      -  width: 18px; }
      +.dac-tab-view.dac-active {
      +  display: block; }
       
       .dac-toggle-expand {
         cursor: pointer;
         display: inline-block; }
      +
       .dac-toggle-collapse {
         cursor: pointer;
         display: none; }
      +
       .dac-toggle.is-expanded .dac-toggle-expand {
         display: none; }
      +
       .dac-toggle.is-expanded .dac-toggle-collapse {
         display: inline-block; }
      +
       .dac-toggle-content {
         clear: left;
         overflow: hidden;
         max-height: 0;
         -webkit-transition: .3s max-height;
                 transition: .3s max-height; }
      +
       .dac-toggle.is-expanded .dac-toggle-content {
         max-height: none; }
      +
       .dac-toggle.dac-mobile .dac-toggle-content {
         max-height: none; }
      +
       @media (max-width: 719px) {
         .dac-toggle.dac-mobile .dac-toggle-content {
           max-height: 0; }
         .dac-toggle.is-expanded .dac-toggle-content {
           max-height: none; } }
       
      -.dac-visible-mobile-block, .dac-mobile-only, .dac-visible-mobile-inline, .dac-visible-mobile-inline-block, .dac-visible-tablet-block, .dac-visible-tablet-inline, .dac-visible-tablet-inline-block, .dac-visible-desktop-block, .dac-visible-desktop-inline, .dac-visible-desktop-inline-block {
      +/**
      + * Fades out an element.
      + * Applies visibility hidden when the transition is finished.
      + *
      + * Use opacity: 1; to show the element.
      + */
      +.dac-visible-mobile-block, .dac-mobile-only,
      +.dac-visible-mobile-inline,
      +.dac-visible-mobile-inline-block,
      +.dac-visible-tablet-block,
      +.dac-visible-tablet-inline,
      +.dac-visible-tablet-inline-block,
      +.dac-visible-desktop-block,
      +.dac-visible-desktop-inline,
      +.dac-visible-desktop-inline-block {
         display: none !important; }
       
       @media (max-width: 719px) {
      @@ -8752,6 +10089,12 @@ $spritesheet: width height image $spritesheet-sprites;
       .dac-offset-parent {
         position: relative !important; }
       
      +/**
      + * Hide from browsers/screenreaders on all sizes.
      + */
      +.dac-hidden {
      +  display: none !important; }
      +
       /**
        * Break strings when their length exceeds the width of their container.
        */
      @@ -8820,164 +10163,290 @@ $spritesheet: width height image $spritesheet-sprites;
         width: 10000px !important;
       }
       
      -#tb li:before, #qv li:before {
      -  background-position: 0px -196px;
      -  height: 24px;
      -  width: 24px;
      -  content: '';
      -  left: -8px;
      -  opacity: .7;
      -  position: absolute;
      -  top: -4px;
      +.Video {
      +  display: none;
       }
       
      -/* CHANGE EXISTING SELECTOR FOR ANDROID M HERO ONLY
      -   REMOVE THE BELOW STYLES WHEN THE ANDROID M CAROUSEL
      -   GRAPHIC ON THE MAIN LANDING IS TAKEN DOWN */
      -.dac-hero.mprev {
      -  background-color: #fff;
      -  background-position: 50% 53%;
      -  background-size: cover;
      -  background-image: url(../../assets/images/home/android_m_hero_1200.jpg);
      -  box-sizing: border-box;
      -  font-size: 16px;
      -  min-height: 550px;
      -  padding-top: 88px;
      +.Video-overlay {
      +  background-color: rgba(0, 0, 0, 0.8);
      +  width: 100%;
      +  height: 100%;
      +  position: fixed;
      +  top: 0;
      +  left: 0;
      +  z-index: 9999;
       }
      -.dac-hero.dac-darken.mprev::before {
      -  background: rgba(0, 0, 0, 0.3);
      +
      +.Video-container {
      +  width: 90vw;
      +  height: 50.625vw;
      +  max-height: calc(90vh - 29.25px);
      +  max-width: calc(160vh - 52px);
      +  margin: auto;
      +  position: fixed;
      +  top: -52px;
      +  right: 0;
         bottom: 0;
      -  content: '';
      -  display: block;
         left: 0;
      +  z-index: 9999;
      +}
      +
      +@media (min-width: 1422.22222222px) and (min-height: 800px) {
      +  .Video-container {
      +    width: 1280px;
      +    height: 720px;
      +  }
      +}
      +
      +.Video-controls {
      +  background: #28655F;
      +  height: 52px;
      +  margin: 0 auto;
      +  position: relative;
      +  box-shadow: 2px 3px 12px 0px rgba(0, 0, 0, 0.4);
      +}
      +
      +.Video-frame {
      +  position: relative;
      +  height: 100%;
      +  background: black;
      +  box-shadow: 2px 3px 12px 0px rgba(0, 0, 0, 0.4);
      +}
      +
      +.Video-loading {
      +  color: rgba(255, 255, 255, 0.35);
      +  font-size: 16px;
      +  position: absolute;
      +  top: 50%;
      +  left: 50%;
      +  -webkit-transform: translate(-50%, -50%);
      +  -ms-transform: translate(-50%, -50%);
      +  transform: translate(-50%, -50%);
      +}
      +
      +#youTubePlayer {
      +  max-height: 720px;
         position: absolute;
      -  right: 0;
         top: 0;
      +  right: 0;
      +  bottom: 0;
      +  left: 0;
      +  width: 100%;
      +  height: 100%;
       }
       
      -.dac-hero.dac-darken.mprev::before {
      -  background: -webkit-linear-gradient(top, rgba(0, 0, 0, .05), rgba(0, 0, 0, .05), #000 950px);
      -  background: linear-gradient(to bottom, rgba(0, 0, 0, .05), rgba(0, 0, 0, 0.05), #000 950px);
      +.Video-button {
      +  background-color: transparent;
      +  border: none;
      +  display: inline-block;
      +  height: 100%;
      +  width: 52px;
      +  outline: none;
      +  cursor: pointer;
      +  -webkit-transition: opacity 200ms;
      +  transition: opacity 200ms;
       }
       
      -@media (max-width: 719px) {
      +.Video-button:hover {
      +  opacity: 0.8;
      +}
       
      -  .dac-hero.dac-darken.mprev {
      -    background-size: auto 600px;
      -    background-position: 55% 0;
      -    background-repeat: no-repeat;
      +.Video-button--picture-in-picture {
      +  background-position: 0px -461px;
      +  height: 24px;
      +  width: 24px;
      +  display: none;
      +  position: absolute;
      +  right: 64px;
      +  top: 14px;
      +}
      +
      +.Video-button--close {
      +  background-position: 0px -435px;
      +  height: 24px;
      +  width: 24px;
      +  position: absolute;
      +  right: 14px;
      +  top: 14px;
      +}
      +
      +@media (min-width: 720px) {
      +  .Video--picture-in-picture .Video-overlay {
      +    display: none;
         }
       
      -  .dac-hero-figure.mprev {
      -    height: 10px;
      -    margin: 15px 0;
      +  .Video--picture-in-picture .Video-container {
      +    top: auto;
      +    left: auto;
      +    bottom: 20px;
      +    right: 20px;
      +    width: 40%;
      +    max-width: 420px;
      +    height: auto;
         }
      -}
       
      -@media (max-width: 719px) {
      +  .Video--picture-in-picture .Video-button--picture-in-picture {
      +    background-position: 0px -409px;
      +    height: 24px;
      +    width: 24px;
      +  }
       
      -  .dac-hero.dac-darken.mprev {
      -    background-size: auto 600px;
      -    background-position: 55% 0;
      -    background-repeat: no-repeat;
      +  .Video--picture-in-picture .Video-frame {
      +    padding-bottom: 56.25%;
         }
       
      -  .dac-hero-figure.mprev {
      -    height: 10px;
      -    margin: 15px 0;
      +  .Video-button--picture-in-picture {
      +    display: inline-block;
         }
       }
       
      -@media (max-width: 1200px) {
      +a.video-shadowbox-button.white {
      +  padding: 16px 42px 16px 8px;
      +  font-size: 18px;
      +  font-weight: 500;
      +  line-height: 24px;
      +  color: #fff;
      +  text-decoration: none;
      +}
       
      -  .dac-hero.dac-darken.mprev {
      -    background-size: auto 700px;
      -    background-position: 55% 0;
      -    background-repeat: no-repeat;
      +a.video-shadowbox-button.white::after {
      +  content: '';
      +  background-position: 0px -847px;
      +  height: 36px;
      +  width: 36px;
      +}
      +
      +a.video-shadowbox-button.white:hover {
      +  color: #bababa !important;
      +}
      +
      +a.video-shadowbox-button.white:hover::after {
      +  background-position: 0px -733px;
      +  height: 36px;
      +  width: 36px;
      +}
      +
      +#video-frame, #video-container {
      +  display: none;
      +}
      +
      +@media (max-width: 720px) {
      +  .wide-table {
      +    overflow-x: auto;
         }
       
      -  .dac-hero-cta.mprev {
      -  white-space:nowrap;
      +  .wide-table table {
      +    display: inline-table;
      +    margin-right: 0;
         }
       }
       
      -/** Custom search API styles */
      -.dac-custom-search {
      -  background: #fff;
      -  margin: 0 -10px;
      -  padding: 20px 10px;
      -  z-index: 1;
      +/* New CSS that isn't part of a component */
      +.paging-links {
      +  box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.2);
      +  margin: 30px 0;
      +  padding: 0 40px;
      +  /* Start class link doesn't have a caption */ }
      +
      +.paging-links .start-class-link, .paging-links .next-class-link, .paging-links .prev-page-link, .paging-links .next-page-link {
      +  font-size: 20px;
      +  font-weight: 500;
      +  display: inline-block;
      +  width: calc(50% - 2px);
      +  position: relative;
      +  padding: 46px 0 36px 0;
       }
       
      -.dac-custom-search-section-title {
      -  color: #505050;
      +@media (max-width: 719px) {
      +  .paging-links .start-class-link, .paging-links .next-class-link, .paging-links .prev-page-link, .paging-links .next-page-link {
      +    width: 100%;
      +  }
       }
       
      -.dac-custom-search-entry {
      -  margin-bottom: 36px;
      -  margin-top: 24px;
      +.paging-links .start-class-link {
      +  padding: 36px 0;
       }
       
      -.dac-custom-search-image {
      -  background-size: cover;
      -  height: 112px;
      +.paging-links .start-class-link, .paging-links .next-class-link {
      +  text-align: center;
      +  width: 100%;
      +}
      +
      +.paging-links .prev-page-link .page-link-caption {
      +  left: 0;
      +}
      +
      +.paging-links .prev-page-link:before {
      +  content: '';
      +  left: -24px;
      +  position: absolute;
      +  bottom: 41px;
       }
       
       @media (max-width: 719px) {
      -  .dac-custom-search-image {
      +  .paging-links .prev-page-link {
           display: none;
         }
       }
       
      -.dac-custom-search-title {
      -  color: #333;
      -  font-size: 14px;
      -  font-weight: 700;
      -  line-height: 24px;
      -  margin: 0;
      -  padding: 0;
      -}
      -
      -.dac-custom-search-title a {
      -  color: inherit;
      +.paging-links .next-page-link, .paging-links .next-class-link {
      +  text-align: right;
       }
       
      -.dac-custom-search-section {
      -  color: #999;
      -  font-size: 16px;
      -  font-variant: small-caps;
      -  font-weight: 700;
      -  margin: -5px 0 0 0;
      +.paging-links .next-page-link .page-link-caption, .paging-links .next-class-link .page-link-caption {
      +  right: 0;
       }
       
      -.dac-custom-search-snippet {
      -  color: #666;
      -  margin: 0;
      +.paging-links .next-page-link:before, .paging-links .next-class-link:before {
      +  content: '';
      +  right: -24px;
      +  position: absolute;
      +  bottom: 41px;
       }
       
      -.dac-custom-search-link {
      -  font-weight: 500;
      -  word-wrap: break-word;
      -  width: 100%;
      +.paging-links .start-class-link:after {
      +  content: '';
      +  right: -12px;
      +  position: relative;
      +  bottom: 3px;
       }
       
      -.dac-custom-search-load-more {
      -  background: none;
      -  border: none;
      -  color: #333;
      -  cursor: pointer;
      -  display: block;
      +.paging-links .page-link-caption {
      +  position: absolute;
      +  top: 26px;
         font-size: 14px;
         font-weight: 700;
      -  margin: 75px auto;
      -  outline: none;
      -  padding: 10px;
      +  opacity: 0.54;
       }
       
      -.dac-custom-search-load-more:hover {
      -  opacity: 0.7;
      +#tb li:before,
      +#qv li:before {
      +  background-position: 0px -669px;
      +  height: 24px;
      +  width: 24px;
      +  content: '';
      +  left: -8px;
      +  opacity: .7;
      +  position: absolute;
      +  top: -4px;
       }
       
      -.dac-custom-search-no-results {
      -  color: #999;
      +#skip-to-main {
      +  border: 0;
      +  clip: rect(0 0 0 0);
      +  height: 1px;
      +  margin: -1px;
      +  overflow: hidden;
      +  padding: 0;
      +  position: absolute;
      +  width: 1px;
      +}
      +
      +#skip-to-main:focus {
      +  background: #fff;
      +  clip: auto;
      +  height: auto;
      +  padding: 10px;
      +  width: auto;
      +  z-index: 10000;
       }
      diff --git a/tools/droiddoc/templates-sdk/assets/images/android_logo.png b/tools/droiddoc/templates-sdk/assets/images/android_logo.png
      index 5f19215cf2829c8c4142d4cdff20da186a00a4de..53f59c69ec8ee2bbce958bbf501e9ceba30f7fb5 100644
      GIT binary patch
      delta 3091
      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
      hK3PRc#v=a%0A4(=-*bfH{tN&B002ovPDHLkV1i1fy#@dP
      
      delta 488
      zcmV<E0T=$47=Z+kBYy$NNkl<ZScUDEKXQUl5XQg7%s@Jiz!5kB$_+@9&>3%FNve=4
      zl->Z-nN;2Y|6G70cmz915jF)+gADMVk<6GGzDnF>zu#l_Ef0c3{>lqL{0z`IwC6Kf
      zJ^=V@?-Ae#OfTVJ9yI0N$chnV34;J|<gY!1_I&oVzIT~5tACvLYJV(_=HfqTeOUrf
      zSP=jQb_DdR@=jxFPfSw*Fuu|SfUO{|G%v-r;vT7_072~b_nIC9FjWc)nR`u-gV?Qw
      zRR-Ai^oR(SEUzpgSo@wHT?F87ydeSZ;hGr<h@1vjhZ)DlBf#}H-tgA|U>=>;M;{sL
      z3uYJ+m3pL9<9{pwF05Y2%x6N4@|Y>9p$^d0@v4&5kPV{cr2tni0!ovPk=$mVPT(wd
      z{`!I2FbVB<I?R)wEuBwF(F1(kuSBp?&6u=dTvVzVlhb*Udsa6g@t|#hx|&Mwg1=M;
      z&;fJ+9l(_WFs)j5s;MaeXnf3LBu17_+x9oIbXq(w9$`EiKTO(u9oNMgPecU1%RnP>
      ztQr<$;wvZ-zpaX+*OGyq27YVyP*la!ScdkyBVutGuxZsrUFk090R9C)aj;x4xXu8m
      eA69ikMn&H~wyR^01!8Uh0000<MNUMnLSTaWy4{Na
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/android_logo@2x.png b/tools/droiddoc/templates-sdk/assets/images/android_logo@2x.png
      index 04132cc03ec60990b5fd11af09fe5a3caf96aea1..85b92110a974f03acd4c3d9c256bdc25181a9c65 100644
      GIT binary patch
      delta 3281
      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
      J8iaG?e*p1=4kG{n
      
      delta 838
      zcmV-M1G)Uv8QcbtBYy)UNkl<Zc%1E<Pf{8|6vn^TlPYn?5zGz7bt)<+$gohkg|Z5=
      znpHwpR&JrmLUMvZQm)|!@d)gc#qeBYz;SBE*wYUmDf_pg3f`OVeRMbd4}t)n$H!L$
      zM9i3OFXpYdHJnN0EfObD^UiD~L<kuee%rfjyXG_!!U%`}fPV<#o!Ls_Bx*|J&66)a
      z|4dgz3;-}%zF3C|#o~+4bm5&ul14gjKlyeZO;~k@v++^10PPbH0ywBhHDX|Dz}H{*
      zehh)~;<K*i-24H6B$5EtLJ9PXiBAZyY7q>~i0M0nKa~_OHqM9{08}<rG1f82iW&d_
      z{hPyZk(!BgUVi{E!D9Ezho4i?oRZ1<H-}-GnnW^Zo-{Q{|K?D%b&0irW%0Is-4+IB
      zL9l2^wFD6ZdP!%81D>qA_$3U?D5c#&>*Cfmmq-_2!&k3WJOB{TWW!eyxttB?U3cPj
      zjrz|)gs^wriJkMf1jk9#ybHGeRDJsdbeZUHUuCu%9Dj*g06@$k1LtKQVPLkM&fmNI
      zEIQ2u?@i;Bz?Ds(iKc^(7b5`ZjgPHzui}1p0Or!q5YW6gjZ*-zRq`B8U4V&CT;e5g
      z)lj<&oQ;nn28j$rt`NArTszoOy9F#j`*mZbanVxSfNWK_5x8h^83PU+Vx>8#8z{OK
      z_#b)m27h=wZ=5F+p=?=up5Jn2U`Q!-i%ZYm__%z2s>ERLvQ{mo5HKn3w-XR?z>{9m
      z*;$`_S!`-q8IZYEwW@1!z@;m)O~j@alY8UYlNPCynAgCjmN!2S@CIlL(8e2}EkGM@
      zfVKc_yaCz*wDAUL3(&?Jpe;ZfZ-BM{ZM*^60)Mpe251Y=#v7n5KpSs>wg7D&4@Q7z
      z@7Vn7{Y}EAmdAsUl)4O*-nYxHrgr5dt{0nHRt5}O7q^tsZqdE$KvCpg?rULFOYLiN
      zn|?a{Qd|bXkwdIBqq>2$4QQnEw#$PB8D&~(A^w+{mvoJ)=IRn#7e5cs7NCtcKwE$|
      z-ai0s0or&2v;}D64bT>#jW<9#q07#a#;%mO0WLdB8oN^B2Dt1jY3xcp0C;y^tg-Bb
      QdjJ3c07*qoM6N<$g7m(LLjV8(
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/play-circle-grey.png b/tools/droiddoc/templates-sdk/assets/images/play-circle-grey.png
      deleted file mode 100644
      index 5e7e7ba694be5c37d5a43d3d710e4fd70832995b..0000000000000000000000000000000000000000
      GIT binary patch
      literal 0
      HcmV?d00001
      
      literal 880
      zcmV-$1CRWPP)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD00009a7bBm000XU
      z000XU0RWnu7ytkO2XskIMF-vs6%idHv>26Y0009INkl<ZNXM;~%WD)t5XOJqyEDlm
      zM)2xgiKlq-q(WjU9?VJ<!RI{(A2%PD2r4L^3=xt)z=RwmNTTSLn+WPj5KoH!8&TNJ
      z%<Qy>nSIabBB@hT-F#hL{nb|myJRMBLjjP#dOFQ!LnuHIuWQ4j*s<GV#heR#3G@VI
      zon$oie5cB~Y^qN%U_^MpLv>V{<zUNuh*_%YxSyUF0H~~v>p%<?THZqHxv7rn0g|mN
      zTm&43ZI-CWR_dQXm}LZq0aoPlUxD;9V|avkh`dvar6CT~P#~6Ag$e;aAz$Ta?$dOI
      zF+AXn7(M|p5e@)HL=1csLj~|SqRV{|X_DeHF92AO8|^Qa9%=}n3tR)>EUyTYGaXM;
      z2ZX$lGc7(DTs8r9ol|%qrZ*y=2i#x?BVAe3JMuV*t`|@pjveNiBakFV3P`{$hB1hi
      zx_J9YSNmzJXo)Ed!`zl2K`@|D<OEe>e#^eTdqe6RU`P7+tlR9tGQkHTNq@~yCLm%-
      zt@iW0#5OZ&B<+|iOGE^e6ATN2giKPvr;^F^BCy)`L`wyq0+Z6r5dfnUK(=V)3eH*m
      z#ZX6;HDnVga5%I2#pMEdIDT`5<&<6S-$nah*88!!6eMJa{Y@=WFx}DHmTWaZCpu)K
      z*Vbf&9m2M(=t-c#w-%719#t9y2yq5P1YD2{>8fclLO_G6`nyBOaXz*Q8ObJK8PVPn
      zNuE^e)@emcI>lZr$onKto0OyaJfV)GBDJn$-|c%6AV`h3IO;rBKU+ouDpDRmMmCu0
      zmJ!>mA@w*1_)P0UOYB^B+tg>A#sg;5(=5%_WzORP8&cMi)Y`qZxzdu<bc54C#Hw7)
      zVYXc6D<N=79mfDmF}=!A!~)0FF$IKt>4eE@N6TDF+tDwUsK{pOKZ!8Q-n1P(?}o`7
      zB6Nl|>I@ST;dg8V6tUD9W=38P(rI6bVLsh!%St2lJQc(1!CH0*%!y%wMSixtKUid3
      z4ENF#|DKN&X^u6vvoO>rCd!+TG9r>@^ND%}m>?f!7wr$!_$sxQt%5iJ0000<MNUMn
      GLSTZPz<e73
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/play-circle-grey_2x.png b/tools/droiddoc/templates-sdk/assets/images/play-circle-grey_2x.png
      deleted file mode 100644
      index 3e01635e88eb5d0eb6f631035d4267428bf291d7..0000000000000000000000000000000000000000
      GIT binary patch
      literal 0
      HcmV?d00001
      
      literal 2280
      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
      CI~d3S
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/play-circle-white.png b/tools/droiddoc/templates-sdk/assets/images/play-circle-white.png
      deleted file mode 100644
      index 017d84644beab772b3e266d392ad64ad8c0fd777..0000000000000000000000000000000000000000
      GIT binary patch
      literal 0
      HcmV?d00001
      
      literal 670
      zcmV;P0%84$P)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD00009a7bBm000XU
      z000XU0RWnu7ytkO2XskIMF-vs6%iULf`z*Y0006#Nkl<ZNXM;~%}(1;5QWb*wxulE
      zMOS?r1Oc-{{74m#(l;O=7N~T=9#M5wiLm7XO4m)^BT=QuH+H@*e0{MKJF!G&<#^_v
      znem--CeoJ7v^iLDv-UvH41pwtifWEXVa2-{NRkvAX;(LlDQ%=1?HVcW+%1vBH2^7@
      z2g*nR7!(m*fX;y#kh`O$rR2_Y)&=GV01IHk75n~upDQNL1CN_v{$K$M97+U)7)inq
      z5=bOK3Rqs(S7QNqlITeYcSGe9J&7RzwxKG7h&XrO;@jI%8mEgp7kNsw8Y7qIsRD0k
      zt9@A1zFJYt6*CsgF20u4HKbiIV?a!`F;@>9(xV>!QzB$JagU@pP)UOb=>s{FhP;+3
      zA843orsTkWktT3VJeF0adxDiFBK0)YX}v{6pnGMqI<C=-G1(jX(ghS&YteU+F{;T(
      z@sW+eh?;b~;m(!nv#goBF))VmR0I1BtpXJ()<1nI^Dj?Euq}lQmu_OIwTjJ^>XWRW
      za8s|TtZ1xUqOYCSl)ubJrJDQSI~+*LHS$1+NH5A|m1xlbkx9BR7w)OFg%VlidhxUU
      z&Vk(XLs6qh(wQPhD-?MbX)i0Jtxa*tu#=2Dx5<czICJgYZ4|ceF7kw^F%^$aYKLp3
      z_8EXV59?I>)r)`9DE>#zYx%utk39NyH07GUe}BL=Q@@TLx@@-7jSKRm`^p})uI$V1
      zD_at=#6Gu-JkVcm*>fIs2P%kDBL*=ctsq<bqqQ~r59WQWh)$&|_y7O^07*qoM6N<$
      Ef~v<N(f|Me
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/play-circle-white_2x.png b/tools/droiddoc/templates-sdk/assets/images/play-circle-white_2x.png
      deleted file mode 100644
      index e48c1fd2419f0a72f728cb1adae5992dac50481d..0000000000000000000000000000000000000000
      GIT binary patch
      literal 0
      HcmV?d00001
      
      literal 1733
      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
      b(rx({hW|1b`cl_z00000NkvXXu0mjfhz2h@
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/sprite.png b/tools/droiddoc/templates-sdk/assets/images/sprite.png
      index 7fef43e754b72f333119a569369cbb3ca14883d0..562b23cd9a98f8c54181c8e45aa1760ef7596be5 100644
      GIT binary patch
      literal 4928
      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
      
      literal 3121
      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
      LNkvXXu0mjfIsVQ%
      
      diff --git a/tools/droiddoc/templates-sdk/assets/images/sprite@2x.png b/tools/droiddoc/templates-sdk/assets/images/sprite@2x.png
      new file mode 100644
      index 0000000000000000000000000000000000000000..2019e0282d0f5d83e70c5550b29f9eb4d122679d
      GIT binary patch
      literal 11545
      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
      IijPA7A5O>>DF6Tf
      
      literal 0
      HcmV?d00001
      
      diff --git a/tools/droiddoc/templates-sdk/assets/js/android_3p-bundle.js b/tools/droiddoc/templates-sdk/assets/js/android_3p-bundle.js
      index a67b5b0d8cf..70d6c2f0a13 100644
      --- a/tools/droiddoc/templates-sdk/assets/js/android_3p-bundle.js
      +++ b/tools/droiddoc/templates-sdk/assets/js/android_3p-bundle.js
      @@ -2763,4 +2763,10 @@ jQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array
       * https://github.com/jquery/jquery-ui
       * Includes: jquery.effects.transfer.js
       * Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */
      -(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;
      \ No newline at end of file
      +(function(a,b){a.effects.transfer=function(b){return this.queue(function(){var c=a(this),d=a(b.options.to),e=d.offset(),f={top:e.top,left:e.left,height:d.innerHeight(),width:d.innerWidth()},g=c.offset(),h=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;
      +/*! (c) 2012 Airbnb, Inc.
      +*
      +* polyglot.js 0.4.3 may be freely distributed under the terms of the BSD
      +* license. For all licensing information, details, and documention:
      +* http://airbnb.github.com/polyglot.js */
      +(function(e,t){typeof define=="function"&&define.amd?define([],function(){return t(e)}):typeof exports=="object"?module.exports=t(e):e.Polyglot=t(e)})(this,function(e){"use strict";function t(e){e=e||{},this.phrases={},this.extend(e.phrases||{}),this.currentLocale=e.locale||"en",this.allowMissing=!!e.allowMissing,this.warn=e.warn||c}function s(e){var t,n,r,i={};for(t in e)if(e.hasOwnProperty(t)){n=e[t];for(r in n)i[n[r]]=t}return i}function o(e){var t=/^\s+|\s+$/g;return e.replace(t,"")}function u(e,t,r){var i,s,u;return r!=null&&e?(s=e.split(n),u=s[f(t,r)]||s[0],i=o(u)):i=e,i}function a(e){var t=s(i);return t[e]||t.en}function f(e,t){return r[a(e)](t)}function l(e,t){for(var n in t)n!=="_"&&t.hasOwnProperty(n)&&(e=e.replace(new RegExp("%\\{"+n+"\\}","g"),t[n]));return e}function c(t){e.console&&e.console.warn&&e.console.warn("WARNING: "+t)}function h(e){var t={};for(var n in e)t[n]=e[n];return t}t.VERSION="0.4.3",t.prototype.locale=function(e){return e&&(this.currentLocale=e),this.currentLocale},t.prototype.extend=function(e,t){var n;for(var r in e)e.hasOwnProperty(r)&&(n=e[r],t&&(r=t+"."+r),typeof n=="object"?this.extend(n,r):this.phrases[r]=n)},t.prototype.clear=function(){this.phrases={}},t.prototype.replace=function(e){this.clear(),this.extend(e)},t.prototype.t=function(e,t){var n,r;return t=t==null?{}:t,typeof t=="number"&&(t={smart_count:t}),typeof this.phrases[e]=="string"?n=this.phrases[e]:typeof t._=="string"?n=t._:this.allowMissing?n=e:(this.warn('Missing translation for key: "'+e+'"'),r=e),typeof n=="string"&&(t=h(t),r=u(n,this.currentLocale,t.smart_count),r=l(r,t)),r},t.prototype.has=function(e){return e in this.phrases};var n="||||",r={chinese:function(e){return 0},german:function(e){return e!==1?1:0},french:function(e){return e>1?1:0},russian:function(e){return e%10===1&&e%100!==11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},czech:function(e){return e===1?0:e>=2&&e<=4?1:2},polish:function(e){return e===1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},icelandic:function(e){return e%10!==1||e%100===11?1:0}},i={chinese:["fa","id","ja","ko","lo","ms","th","tr","zh"],german:["da","de","en","es","fi","el","he","hu","it","nl","no","pt","sv"],french:["fr","tl","pt-br"],russian:["hr","ru"],czech:["cs"],polish:["pl"],icelandic:["is"]};return t});
      diff --git a/tools/droiddoc/templates-sdk/assets/js/docs.js b/tools/droiddoc/templates-sdk/assets/js/docs.js
      index ee3ebee21ef..5ed947c7cd8 100644
      --- a/tools/droiddoc/templates-sdk/assets/js/docs.js
      +++ b/tools/droiddoc/templates-sdk/assets/js/docs.js
      @@ -1,16 +1,17 @@
      -var classesNav;
      -var devdocNav;
      -var sidenav;
       var cookie_namespace = 'android_developer';
      -var NAV_PREF_TREE = "tree";
      -var NAV_PREF_PANELS = "panels";
      -var nav_pref;
       var isMobile = false; // true if mobile, so we can adjust some layout
       var mPagePath; // initialized in ready() function
       
       var basePath = getBaseUri(location.pathname);
      -var SITE_ROOT = toRoot + basePath.substring(1,basePath.indexOf("/",1));
      -var GOOGLE_DATA; // combined data for google service apis, used for search suggest
      +var SITE_ROOT = toRoot + basePath.substring(1, basePath.indexOf("/", 1));
      +
      +// TODO(akassay) generate this var in the reference doc build.
      +var API_LEVELS = ['1', '2', '3', '4', '5', '6', '7', '8', '9',
      +      '10', '11', '12', '13', '14', '15', '16',
      +      '17', '18', '19', '20', '21', '22', '23', '24'];
      +var METADATA = METADATA || {};
      +var RESERVED_METADATA_CATEGORY_NAMES = ['extras', 'carousel', 'collections',
      +                                        'searchHeroCollections'];
       
       // Ensure that all ajax getScript() requests allow caching
       $.ajaxSetup({
      @@ -21,102 +22,11 @@ $.ajaxSetup({
       
       $(document).ready(function() {
       
      -  // show lang dialog if the URL includes /intl/
      -  //if (location.pathname.substring(0,6) == "/intl/") {
      -  //  var lang = location.pathname.split('/')[2];
      -   // if (lang != getLangPref()) {
      -   //   $("#langMessage a.yes").attr("onclick","changeLangPref('" + lang
      -   //       + "', true); $('#langMessage').hide(); return false;");
      -  //    $("#langMessage .lang." + lang).show();
      -   //   $("#langMessage").show();
      -   // }
      -  //}
      -
      -  // load json file for JD doc search suggestions
      -  $.getScript(toRoot + 'jd_lists_unified.js');
      -  // load json file for Android API search suggestions
      -  $.getScript(toRoot + 'reference/lists.js');
      -  // load json files for Google services API suggestions
      -  $.getScript(toRoot + 'reference/gcm_lists.js', function(data, textStatus, jqxhr) {
      -      // once the GCM json (GCM_DATA) is loaded, load the GMS json (GMS_DATA) and merge the data
      -      if(jqxhr.status === 200) {
      -          $.getScript(toRoot + 'reference/gms_lists.js', function(data, textStatus, jqxhr) {
      -              if(jqxhr.status === 200) {
      -                  // combine GCM and GMS data
      -                  GOOGLE_DATA = GMS_DATA;
      -                  var start = GOOGLE_DATA.length;
      -                  for (var i=0; i<GCM_DATA.length; i++) {
      -                      GOOGLE_DATA.push({id:start+i, label:GCM_DATA[i].label,
      -                              link:GCM_DATA[i].link, type:GCM_DATA[i].type});
      -                  }
      -              }
      -          });
      -      }
      -  });
      -
      -  // setup keyboard listener for search shortcut
      -  $('body').keyup(function(event) {
      -    if (event.which == 191 && $(event.target).is(':not(:input)')) {
      -      $('#search_autocomplete').focus();
      -    }
      -  });
      -
      -  // init the fullscreen toggle click event
      -  $('#nav-swap .fullscreen').click(function(){
      -    if ($(this).hasClass('disabled')) {
      -      toggleFullscreen(true);
      -    } else {
      -      toggleFullscreen(false);
      -    }
      -  });
      -
      -  // initialize the divs with custom scrollbars
      -  if (window.innerWidth >= 720) {
      -    $('.scroll-pane').jScrollPane({verticalGutter: 0});
      -  }
      -
      -  // set up the search close button
      -  $('#search-close').on('click touchend', function() {
      -    $searchInput = $('#search_autocomplete');
      -    $searchInput.attr('value', '');
      -    $(this).addClass("hide");
      -    $("#search-container").removeClass('active');
      -    $("#search_autocomplete").blur();
      -    search_focus_changed($searchInput.get(), false);
      -    hideResults();
      -  });
      -
      -
      -  //Set up search
      -  $("#search_autocomplete").focus(function() {
      -    $("#search-container").addClass('active');
      -  })
      -  $("#search-container").on('mouseover touchend', function(e) {
      -    if ($(e.target).is('#search-close')) { return; }
      -    $("#search-container").addClass('active');
      -    $("#search_autocomplete").focus();
      -  })
      -  $("#search-container").mouseout(function() {
      -    if ($("#search_autocomplete").is(":focus")) return;
      -    if ($("#search_autocomplete").val() == '') {
      -      setTimeout(function(){
      -        $("#search-container").removeClass('active');
      -        $("#search_autocomplete").blur();
      -      },250);
      -    }
      -  })
      -  $("#search_autocomplete").blur(function() {
      -    if ($("#search_autocomplete").val() == '') {
      -      $("#search-container").removeClass('active');
      -    }
      -  })
      -
      -
         // prep nav expandos
      -  var pagePath = document.location.pathname;
      +  var pagePath = location.href.replace(location.hash, '');
         // account for intl docs by removing the intl/*/ path
         if (pagePath.indexOf("/intl/") == 0) {
      -    pagePath = pagePath.substr(pagePath.indexOf("/",6)); // start after intl/ to get last /
      +    pagePath = pagePath.substr(pagePath.indexOf("/", 6)); // start after intl/ to get last /
         }
       
         if (pagePath.indexOf(SITE_ROOT) == 0) {
      @@ -147,97 +57,13 @@ $(document).ready(function() {
           // Otherwise the page path is already an absolute URL
         }
       
      -  // Highlight the header tabs...
      -  // highlight Design tab
      -  var urlSegments = pagePathOriginal.split('/');
      -  var navEl = $(".dac-nav-list");
      -  var subNavEl = navEl.find(".dac-nav-secondary");
      -  var parentNavEl;
      -
      -  if ($("body").hasClass("design")) {
      -    navEl.find("> li.design > a").addClass("selected");
      -  // highlight About tabs
      -  } else if ($("body").hasClass("about")) {
      -    if (urlSegments[1] == "about" || urlSegments[1] == "wear" || urlSegments[1] == "tv" || urlSegments[1] == "auto") {
      -      navEl.find("> li.home > a").addClass('has-subnav');
      -      subNavEl.find("li." + urlSegments[1] + " > a").addClass("selected");
      -    } else {
      -      navEl.find("> li.home > a").addClass('selected');
      -    }
      -
      -// highlight NDK tabs
      -  } else if ($("body").hasClass("ndk")) {
      -    parentNavEl = navEl.find("> li.ndk > a");
      -    parentNavEl.addClass('has-subnav');
      -    if ($("body").hasClass("guide")) {
      -      navEl.find("> li.guides > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("reference")) {
      -      navEl.find("> li.reference > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("samples")) {
      -      navEl.find("> li.samples > a").addClass("selected ndk");
      -    } else if ($("body").hasClass("downloads")) {
      -      navEl.find("> li.downloads > a").addClass("selected ndk");
      -    }
      -
      -  // highlight Develop tab
      -  } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
      -    parentNavEl = navEl.find("> li.develop > a");
      -    parentNavEl.addClass('has-subnav');
      -
      -    // In Develop docs, also highlight appropriate sub-tab
      -    if (urlSegments[1] == "training") {
      -      subNavEl.find("li.training > a").addClass("selected");
      -    } else if (urlSegments[1] == "guide") {
      -      subNavEl.find("li.guide > a").addClass("selected");
      -    } else if (urlSegments[1] == "reference") {
      -      // If the root is reference, but page is also part of Google Services, select Google
      -      if ($("body").hasClass("google")) {
      -        subNavEl.find("li.google > a").addClass("selected");
      -      } else {
      -        subNavEl.find("li.reference > a").addClass("selected");
      -      }
      -    } else if ((urlSegments[1] == "tools") || (urlSegments[1] == "sdk")) {
      -      subNavEl.find("li.tools > a").addClass("selected");
      -    } else if ($("body").hasClass("google")) {
      -      subNavEl.find("li.google > a").addClass("selected");
      -    } else if ($("body").hasClass("samples")) {
      -      subNavEl.find("li.samples > a").addClass("selected");
      -    } else if ($("body").hasClass("preview")) {
      -      subNavEl.find("li.preview > a").addClass("selected");
      -    } else {
      -      parentNavEl.removeClass('has-subnav').addClass("selected");
      -    }
      -  // highlight Distribute tab
      -  } else if ($("body").hasClass("distribute")) {
      -    parentNavEl = navEl.find("> li.distribute > a");
      -    parentNavEl.addClass('has-subnav');
      -
      -    if (urlSegments[2] == "users") {
      -      subNavEl.find("li.users > a").addClass("selected");
      -    } else if (urlSegments[2] == "engage") {
      -      subNavEl.find("li.engage > a").addClass("selected");
      -    } else if (urlSegments[2] == "monetize") {
      -      subNavEl.find("li.monetize > a").addClass("selected");
      -    } else if (urlSegments[2] == "analyze") {
      -      subNavEl.find("li.analyze > a").addClass("selected");
      -    } else if (urlSegments[2] == "tools") {
      -      subNavEl.find("li.essentials > a").addClass("selected");
      -    } else if (urlSegments[2] == "stories") {
      -      subNavEl.find("li.stories > a").addClass("selected");
      -    } else if (urlSegments[2] == "essentials") {
      -      subNavEl.find("li.essentials > a").addClass("selected");
      -    } else if (urlSegments[2] == "googleplay") {
      -      subNavEl.find("li.googleplay > a").addClass("selected");
      -    } else {
      -      parentNavEl.removeClass('has-subnav').addClass("selected");
      -    }
      -  }
      -
         // set global variable so we can highlight the sidenav a bit later (such as for google reference)
         // and highlight the sidenav
         mPagePath = pagePath;
      +
      +  // Check for params and remove them.
      +  mPagePath = mPagePath.split('?')[0];
         highlightSidenav();
      -  buildBreadcrumbs();
       
         // set up prev/next links if they exist
         var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]');
      @@ -266,8 +92,8 @@ false; // navigate across topic boundaries only in design docs
       
             // except if cross boundaries aren't allowed, and we're at the top of a section already
             // (and there's another parent)
      -      if (!crossBoundaries && $parentListItem.hasClass('nav-section')
      -                           && $selListItem.hasClass('nav-section')) {
      +      if (!crossBoundaries && $parentListItem.hasClass('nav-section') &&
      +                           $selListItem.hasClass('nav-section')) {
               $prevLink = [];
             }
           }
      @@ -282,7 +108,7 @@ false; // navigate across topic boundaries only in design docs
             $nextLink = $selListItem.find('ul:eq(0)').find('a:eq(0)');
       
             // if there aren't any children, go to the next section (required for About pages)
      -      if($nextLink.length == 0) {
      +      if ($nextLink.length == 0) {
               $nextLink = $selListItem.next('li').find('a');
             } else if ($('.topic-start-link').length) {
               // as long as there's a child link and there is a "topic start link" (we're on a landing)
      @@ -306,7 +132,7 @@ false; // navigate across topic boundaries only in design docs
                 $nextLink = $selListItem.parents('li:eq(1)').next('li.nav-section').find('a:eq(0)');
                 if ($nextLink.length == 0) {
                   // if that doesn't work, we're at the end of the list, so disable NEXT link
      -            $('.next-page-link').attr('href','').addClass("disabled")
      +            $('.next-page-link').attr('href', '').addClass("disabled")
                                       .click(function() { return false; });
                   // and completely hide the one in the footer
                   $('.content-footer .next-page-link').hide();
      @@ -325,22 +151,31 @@ false; // navigate across topic boundaries only in design docs
             }
           } else if (isCrossingBoundary && !$('body.design').length) {  // Design always crosses boundaries
             $('.content-footer.next-class').show();
      -      $('.next-page-link').attr('href','')
      +      $('.next-page-link').attr('href', '')
                                 .removeClass("hide").addClass("disabled")
                                 .click(function() { return false; });
             // and completely hide the one in the footer
             $('.content-footer .next-page-link').hide();
      +      $('.content-footer .prev-page-link').hide();
      +
             if ($nextLink.length) {
      -        $('.next-class-link').attr('href',$nextLink.attr('href'))
      -                             .removeClass("hide")
      -                             .append(": " + $nextLink.html());
      +        $('.next-class-link').attr('href', $nextLink.attr('href'))
      +                             .removeClass("hide");
      +
      +        $('.content-footer .next-class-link').append($nextLink.html());
      +
               $('.next-class-link').find('.new').empty();
             }
           } else {
             $('.next-page-link').attr('href', $nextLink.attr('href'))
                                 .removeClass("hide");
      -      // for the footer link, also add the next page title
      -      $('.content-footer .next-page-link').append(": " + $nextLink.html());
      +      // for the footer link, also add the previous and next page titles
      +      if ($prevLink.length) {
      +        $('.content-footer .prev-page-link').append($prevLink.html());
      +      }
      +      if ($nextLink.length) {
      +        $('.content-footer .next-page-link').append($nextLink.html());
      +      }
           }
       
           if (!startClass && $prevLink.length) {
      @@ -351,11 +186,8 @@ false; // navigate across topic boundaries only in design docs
               $('.prev-page-link').attr('href', $prevLink.attr('href')).removeClass("hide");
             }
           }
      -
         }
       
      -
      -
         // Set up the course landing pages for Training with class names and descriptions
         if ($('body.trainingcourse').length) {
           var $classLinks = $selListItem.find('ul li a').not('#nav .nav-section .nav-section ul a');
      @@ -382,7 +214,7 @@ false; // navigate across topic boundaries only in design docs
           var $liLesson;
           $classLinks.each(function(index) {
             $liClass  = $('<li class="clearfix"></li>');
      -      $h2Title  = $('<a class="title" href="'+$(this).attr('href')+'"><h2 class="norule">' + $(this).html()+'</h2><span></span></a>');
      +      $h2Title  = $('<a class="title" href="' + $(this).attr('href') + '"><h2 class="norule">' + $(this).html() + '</h2><span></span></a>');
             $pSummary = $('<p class="description">' + $classDescriptions[index] + '</p>');
       
             $olLessons  = $('<ol class="lesson-list"></ol>');
      @@ -391,7 +223,7 @@ false; // navigate across topic boundaries only in design docs
       
             if ($lessons.length) {
               $lessons.each(function(index) {
      -          $olLessons.append('<li><a href="'+$(this).attr('href')+'">' + $(this).html()+'</a></li>');
      +          $olLessons.append('<li><a href="' + $(this).attr('href') + '">' + $(this).html() + '</a></li>');
               });
             } else {
               $pSummary.addClass('article');
      @@ -400,39 +232,24 @@ false; // navigate across topic boundaries only in design docs
             $liClass.append($h2Title).append($pSummary).append($olLessons);
             $olClasses.append($liClass);
           });
      -    $('.jd-descr').append($olClasses);
      +    $('#classes').append($olClasses);
         }
       
         // Set up expand/collapse behavior
         initExpandableNavItems("#nav");
       
      -
      -  $(".scroll-pane").scroll(function(event) {
      -      event.preventDefault();
      -      return false;
      -  });
      -
      -  /* Resize nav height when window height changes */
      -  $(window).resize(function() {
      -    if ($('#side-nav').length == 0) return;
      -    setNavBarDimensions(); // do this even if sidenav isn't fixed because it could become fixed
      -    // make sidenav behave when resizing the window and side-scolling is a concern
      -    updateSideNavDimensions();
      -    checkSticky();
      -    resizeNav(250);
      -  });
      -
      -  if ($('#devdoc-nav').length) {
      -    setNavBarDimensions();
      -  }
      -
      -
         // Set up play-on-hover <video> tags.
      -  $('video.play-on-hover').bind('click', function(){
      +  $('video.play-on-hover').bind('click', function() {
           $(this).get(0).load(); // in case the video isn't seekable
           $(this).get(0).play();
         });
       
      +  // Set up play-on-click for <video> tags with a "video-wrapper".
      +  $('.video-wrapper > video').bind('click', function() {
      +    this.play();
      +    $(this.parentElement).addClass('playing');
      +  });
      +
         // Set up tooltips
         var TOOLTIP_MARGIN = 10;
         $('acronym,.tooltip-link').each(function() {
      @@ -476,220 +293,20 @@ false; // navigate across topic boundaries only in design docs
         });
       
         //Loads the +1 button
      -  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
      -  po.src = 'https://apis.google.com/js/plusone.js';
      -  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      -
      -  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
      -
      -  if ($(".scroll-pane").length > 1) {
      -    // Check if there's a user preference for the panel heights
      -    var cookieHeight = readCookie("reference_height");
      -    if (cookieHeight) {
      -      restoreHeight(cookieHeight);
      -    }
      -  }
      -
      -  // Resize once loading is finished
      -  resizeNav();
      -  // Check if there's an anchor that we need to scroll into view.
      -  // A delay is needed, because some browsers do not immediately scroll down to the anchor
      -  window.setTimeout(offsetScrollForSticky, 100);
      -
      -  /* init the language selector based on user cookie for lang */
      -  loadLangPref();
      -  changeNavLang(getLangPref());
      -
      -  /* setup event handlers to ensure the overflow menu is visible while picking lang */
      -  $("#language select")
      -      .mousedown(function() {
      -        $("div.morehover").addClass("hover"); })
      -      .blur(function() {
      -        $("div.morehover").removeClass("hover"); });
      -
      -  /* some global variable setup */
      -  resizePackagesNav = $("#resize-packages-nav");
      -  classesNav = $("#classes-nav");
      -  devdocNav = $("#devdoc-nav");
      -
      -  var cookiePath = "";
      -  if (location.href.indexOf("/reference/") != -1) {
      -    cookiePath = "reference_";
      -  } else if (location.href.indexOf("/guide/") != -1) {
      -    cookiePath = "guide_";
      -  } else if (location.href.indexOf("/tools/") != -1) {
      -    cookiePath = "tools_";
      -  } else if (location.href.indexOf("/training/") != -1) {
      -    cookiePath = "training_";
      -  } else if (location.href.indexOf("/design/") != -1) {
      -    cookiePath = "design_";
      -  } else if (location.href.indexOf("/distribute/") != -1) {
      -    cookiePath = "distribute_";
      -  }
      -
      -
      -  /* setup shadowbox for any videos that want it */
      -  var $videoLinks = $("a.video-shadowbox-button, a.notice-developers-video");
      -  if ($videoLinks.length) {
      -    // if there's at least one, add the shadowbox HTML to the body
      -    $('body').prepend(
      -'<div id="video-container">'+
      -  '<div id="video-frame">'+
      -    '<div class="video-close">'+
      -      '<span id="icon-video-close" onclick="closeVideo()">&nbsp;</span>'+
      -    '</div>'+
      -    '<div id="youTubePlayer"></div>'+
      -  '</div>'+
      -'</div>');
      -
      -    // loads the IFrame Player API code asynchronously.
      -    $.getScript("https://www.youtube.com/iframe_api");
      -
      -    $videoLinks.each(function() {
      -      var videoId = $(this).attr('href').split('?v=')[1];
      -      $(this).click(function(event) {
      -        event.preventDefault();
      -        startYouTubePlayer(videoId);
      -      });
      -    });
      -  }
      +  //var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
      +  //po.src = 'https://apis.google.com/js/plusone.js';
      +  //var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
       });
       // END of the onload event
       
      -
      -var youTubePlayer;
      -function onYouTubeIframeAPIReady() {
      -}
      -
      -/* Returns the height the shadowbox video should be. It's based on the current
      -   height of the "video-frame" element, which is 100% height for the window.
      -   Then minus the margin so the video isn't actually the full window height. */
      -function getVideoHeight() {
      -  var frameHeight = $("#video-frame").height();
      -  var marginTop = $("#video-frame").css('margin-top').split('px')[0];
      -  return frameHeight - (marginTop * 2);
      -}
      -
      -var mPlayerPaused = false;
      -
      -function startYouTubePlayer(videoId) {
      -  $("#video-container").show();
      -  $("#video-frame").show();
      -  mPlayerPaused = false;
      -
      -  // compute the size of the player so it's centered in window
      -  var maxWidth = 940;  // the width of the web site content
      -  var videoAspect = .5625; // based on 1280x720 resolution
      -  var maxHeight = maxWidth * videoAspect;
      -  var videoHeight = getVideoHeight();
      -  var videoWidth = videoHeight / videoAspect;
      -  if (videoWidth > maxWidth) {
      -    videoWidth = maxWidth;
      -    videoHeight = maxHeight;
      -  }
      -  $("#video-frame").css('width', videoWidth);
      -
      -  // check if we've already created this player
      -  if (youTubePlayer == null) {
      -    // check if there's a start time specified
      -    var idAndHash = videoId.split("#");
      -    var startTime = 0;
      -    if (idAndHash.length > 1) {
      -      startTime = idAndHash[1].split("t=")[1] != undefined ? idAndHash[1].split("t=")[1] : 0;
      -    }
      -    // enable localized player
      -    var lang = getLangPref();
      -    var captionsOn = lang == 'en' ? 0 : 1;
      -
      -    youTubePlayer = new YT.Player('youTubePlayer', {
      -      height: videoHeight,
      -      width: videoWidth,
      -      videoId: idAndHash[0],
      -      playerVars: {start: startTime, hl: lang, cc_load_policy: captionsOn},
      -      events: {
      -        'onReady': onPlayerReady,
      -        'onStateChange': onPlayerStateChange
      -      }
      -    });
      -  } else {
      -    // reset the size in case the user adjusted the window since last play
      -    youTubePlayer.setSize(videoWidth, videoHeight);
      -    // if a video different from the one already playing was requested, cue it up
      -    if (videoId != youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]) {
      -      youTubePlayer.cueVideoById(videoId);
      -    }
      -    youTubePlayer.playVideo();
      -  }
      -}
      -
      -function onPlayerReady(event) {
      -  event.target.playVideo();
      -  mPlayerPaused = false;
      -}
      -
      -function closeVideo() {
      -  try {
      -    youTubePlayer.pauseVideo();
      -  } catch(e) {
      -  }
      -  $("#video-container").fadeOut(200);
      -}
      -
      -/* Track youtube playback for analytics */
      -function onPlayerStateChange(event) {
      -    // Video starts, send the video ID
      -    if (event.data == YT.PlayerState.PLAYING) {
      -      if (mPlayerPaused) {
      -        ga('send', 'event', 'Videos', 'Resume',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0]);
      -      } else {
      -        // track the start playing event so we know from which page the video was selected
      -        ga('send', 'event', 'Videos', 'Start: ' +
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            'on: ' + document.location.href);
      -      }
      -      mPlayerPaused = false;
      -    }
      -    // Video paused, send video ID and video elapsed time
      -    if (event.data == YT.PlayerState.PAUSED) {
      -      ga('send', 'event', 'Videos', 'Paused',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            youTubePlayer.getCurrentTime());
      -      mPlayerPaused = true;
      -    }
      -    // Video finished, send video ID and video elapsed time
      -    if (event.data == YT.PlayerState.ENDED) {
      -      ga('send', 'event', 'Videos', 'Finished',
      -            youTubePlayer.getVideoUrl().split('?v=')[1].split('&')[0].split('%')[0],
      -            youTubePlayer.getCurrentTime());
      -      mPlayerPaused = true;
      -    }
      -}
      -
      -
      -
       function initExpandableNavItems(rootTag) {
      -  $(rootTag + ' li.nav-section .nav-section-header').click(function() {
      -    var section = $(this).closest('li.nav-section');
      -    if (section.hasClass('expanded')) {
      -    /* hide me and descendants */
      -      section.find('ul').slideUp(250, function() {
      -        // remove 'expanded' class from my section and any children
      -        section.closest('li').removeClass('expanded');
      -        $('li.nav-section', section).removeClass('expanded');
      -        resizeNav();
      -      });
      -    } else {
      -    /* show me */
      -      // first hide all other siblings
      -      var $others = $('li.nav-section.expanded', $(this).closest('ul')).not('.sticky');
      -      $others.removeClass('expanded').children('ul').slideUp(250);
      -
      -      // now expand me
      -      section.closest('li').addClass('expanded');
      -      section.children('ul').slideDown(250, function() {
      -        resizeNav();
      -      });
      +  var toggleIcon = $(
      +      rootTag + ' li.nav-section .nav-section-header .toggle-icon, ' +
      +      rootTag + ' li.nav-section .nav-section-header a[href="#"]');
      +
      +  toggleIcon.on('click keypress', function(e) {
      +    if (e.type == 'keypress' && e.which == 13 || e.type == 'click') {
      +      doNavToggle(this);
           }
         });
       
      @@ -702,35 +319,27 @@ function initExpandableNavItems(rootTag) {
         });
       }
       
      +function doNavToggle(el) {
      +  var section = $(el).closest('li.nav-section');
      +  if (section.hasClass('expanded')) {
      +    /* hide me and descendants */
      +    section.find('ul').slideUp(250, function() {
      +      // remove 'expanded' class from my section and any children
      +      section.closest('li').removeClass('expanded');
      +      $('li.nav-section', section).removeClass('expanded');
      +    });
      +  } else {
      +    /* show me */
      +    // first hide all other siblings
      +    var $others = $('li.nav-section.expanded', $(el).closest('ul')).not('.sticky');
      +    $others.removeClass('expanded').children('ul').slideUp(250);
       
      -/** Create the list of breadcrumb links in the sticky header */
      -function buildBreadcrumbs() {
      -  var $breadcrumbUl =  $(".dac-header-crumbs");
      -  var primaryNavLink = ".dac-nav-list > .dac-nav-item > .dac-nav-link";
      -
      -  // Add the secondary horizontal nav item, if provided
      -  var $selectedSecondNav = $(".dac-nav-secondary .dac-nav-link.selected").clone()
      -    .attr('class', 'dac-header-crumbs-link');
      -
      -  if ($selectedSecondNav.length) {
      -    $breadcrumbUl.prepend($('<li class="dac-header-crumbs-item">').append($selectedSecondNav));
      -  }
      -
      -  // Add the primary horizontal nav
      -  var $selectedFirstNav = $(primaryNavLink + ".selected, " + primaryNavLink + ".has-subnav").clone()
      -    .attr('class', 'dac-header-crumbs-link');
      -
      -  // If there's no header nav item, use the logo link and title from alt text
      -  if ($selectedFirstNav.length < 1) {
      -    $selectedFirstNav = $('<a class="dac-header-crumbs-link">')
      -        .attr('href', $("div#header .logo a").attr('href'))
      -        .text($("div#header .logo img").attr('alt'));
      +    // now expand me
      +    section.closest('li').addClass('expanded');
      +    section.children('ul').slideDown(250);
         }
      -  $breadcrumbUl.prepend($('<li class="dac-header-crumbs-item">').append($selectedFirstNav));
       }
       
      -
      -
       /** Highlight the current page in sidenav, expanding children as appropriate */
       function highlightSidenav() {
         // if something is already highlighted, undo it. This is for dynamic navigation (Samples index)
      @@ -746,6 +355,8 @@ function highlightSidenav() {
         }
       
         var $selListItem;
      +  var breadcrumb = [];
      +
         if ($selNavLink.length) {
           // Find this page's <li> in sidenav and set selected
           $selListItem = $selNavLink.closest('li');
      @@ -755,8 +366,20 @@ function highlightSidenav() {
           $selNavLink.parents('li.nav-section').each(function() {
             $(this).addClass('expanded');
             $(this).children('ul').show();
      +
      +      var link = $(this).find('a').first();
      +
      +      if (!$(this).is($selListItem)) {
      +        breadcrumb.unshift(link)
      +      }
           });
      +
      +    $('#nav').scrollIntoView($selNavLink);
         }
      +
      +  breadcrumb.forEach(function(link) {
      +    link.dacCrumbs();
      +  });
       }
       
       function unHighlightSidenav() {
      @@ -764,59 +387,6 @@ function unHighlightSidenav() {
         $('ul#nav li.nav-section.expanded').removeClass('expanded').children('ul').hide();
       }
       
      -function toggleFullscreen(enable) {
      -  var delay = 20;
      -  var enabled = true;
      -  var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]');
      -  if (enable) {
      -    // Currently NOT USING fullscreen; enable fullscreen
      -    stylesheet.removeAttr('disabled');
      -    $('#nav-swap .fullscreen').removeClass('disabled');
      -    $('#devdoc-nav').css({left:''});
      -    setTimeout(updateSidenavFullscreenWidth,delay); // need to wait a moment for css to switch
      -    enabled = true;
      -  } else {
      -    // Currently USING fullscreen; disable fullscreen
      -    stylesheet.attr('disabled', 'disabled');
      -    $('#nav-swap .fullscreen').addClass('disabled');
      -    setTimeout(updateSidenavFixedWidth,delay); // need to wait a moment for css to switch
      -    enabled = false;
      -  }
      -  writeCookie("fullscreen", enabled, null);
      -  setNavBarDimensions();
      -  resizeNav(delay);
      -  updateSideNavDimensions();
      -  setTimeout(initSidenavHeightResize,delay);
      -}
      -
      -// TODO: Refactor into a closure.
      -var navBarLeftPos;
      -var navBarWidth;
      -function setNavBarDimensions() {
      -  navBarLeftPos = $('#body-content').offset().left;
      -  navBarWidth = $('#side-nav').width();
      -}
      -
      -
      -function updateSideNavDimensions() {
      -  var newLeft = $(window).scrollLeft() - navBarLeftPos;
      -  $('#devdoc-nav').css({left: -newLeft, width: navBarWidth});
      -  $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('padding-left')))});
      -}
      -
      -// TODO: use $(document).ready instead
      -function addLoadEvent(newfun) {
      -  var current = window.onload;
      -  if (typeof window.onload != 'function') {
      -    window.onload = newfun;
      -  } else {
      -    window.onload = function() {
      -      current();
      -      newfun();
      -    }
      -  }
      -}
      -
       var agent = navigator['userAgent'].toLowerCase();
       // If a mobile phone, set flag and do mobile setup
       if ((agent.indexOf("mobile") != -1) ||      // android, iphone, ipod
      @@ -826,195 +396,23 @@ if ((agent.indexOf("mobile") != -1) ||      // android, iphone, ipod
         isMobile = true;
       }
       
      -
       $(document).ready(function() {
         $("pre:not(.no-pretty-print)").addClass("prettyprint");
         prettyPrint();
       });
       
      -
      -
      -
      -/* ######### RESIZE THE SIDENAV ########## */
      -
      -function resizeNav(delay) {
      -  var $nav = $("#devdoc-nav");
      -  var $window = $(window);
      -  var navHeight;
      -
      -  // Get the height of entire window and the total header height.
      -  // Then figure out based on scroll position whether the header is visible
      -  var windowHeight = $window.height();
      -  var scrollTop = $window.scrollTop();
      -  var headerHeight = $('#header-wrapper').outerHeight();
      -  var headerVisible = scrollTop < stickyTop;
      -
      -  // get the height of space between nav and top of window.
      -  // Could be either margin or top position, depending on whether the nav is fixed.
      -  var topMargin = (parseInt($nav.css('top')) || 20) + 1;
      -  // add 1 for the #side-nav bottom margin
      -
      -  // Depending on whether the header is visible, set the side nav's height.
      -  if (headerVisible) {
      -    // The sidenav height grows as the header goes off screen
      -    navHeight = windowHeight - (headerHeight - scrollTop) - topMargin;
      -  } else {
      -    // Once header is off screen, the nav height is almost full window height
      -    navHeight = windowHeight - topMargin;
      -  }
      -
      -
      -
      -  $scrollPanes = $(".scroll-pane");
      -  if ($window.width() < 720) {
      -    $nav.css('height', '');
      -  } else if ($scrollPanes.length > 1) {
      -    // subtract the height of the api level widget and nav swapper from the available nav height
      -    navHeight -= ($('#api-nav-header').outerHeight(true) + $('#nav-swap').outerHeight(true));
      -
      -    $("#swapper").css({height:navHeight + "px"});
      -    if ($("#nav-tree").is(":visible")) {
      -      $("#nav-tree").css({height:navHeight});
      -    }
      -
      -    var classesHeight = navHeight - parseInt($("#resize-packages-nav").css("height")) - 10 + "px";
      -    //subtract 10px to account for drag bar
      -
      -    // if the window becomes small enough to make the class panel height 0,
      -    // then the package panel should begin to shrink
      -    if (parseInt(classesHeight) <= 0) {
      -      $("#resize-packages-nav").css({height:navHeight - 10}); //subtract 10px for drag bar
      -      $("#packages-nav").css({height:navHeight - 10});
      -    }
      -
      -    $("#classes-nav").css({'height':classesHeight, 'margin-top':'10px'});
      -    $("#classes-nav .jspContainer").css({height:classesHeight});
      -
      -
      -  } else {
      -    $nav.height(navHeight);
      -  }
      -
      -  if (delay) {
      -    updateFromResize = true;
      -    delayedReInitScrollbars(delay);
      -  } else {
      -    reInitScrollbars();
      -  }
      -
      -}
      -
      -var updateScrollbars = false;
      -var updateFromResize = false;
      -
      -/* Re-initialize the scrollbars to account for changed nav size.
      - * This method postpones the actual update by a 1/4 second in order to optimize the
      - * scroll performance while the header is still visible, because re-initializing the
      - * scroll panes is an intensive process.
      - */
      -function delayedReInitScrollbars(delay) {
      -  // If we're scheduled for an update, but have received another resize request
      -  // before the scheduled resize has occured, just ignore the new request
      -  // (and wait for the scheduled one).
      -  if (updateScrollbars && updateFromResize) {
      -    updateFromResize = false;
      -    return;
      -  }
      -
      -  // We're scheduled for an update and the update request came from this method's setTimeout
      -  if (updateScrollbars && !updateFromResize) {
      -    reInitScrollbars();
      -    updateScrollbars = false;
      -  } else {
      -    updateScrollbars = true;
      -    updateFromResize = false;
      -    setTimeout('delayedReInitScrollbars()',delay);
      -  }
      -}
      -
      -/* Re-initialize the scrollbars to account for changed nav size. */
      -function reInitScrollbars() {
      -  var pane = $(".scroll-pane").each(function(){
      -    var api = $(this).data('jsp');
      -    if (!api) {return;}
      -    api.reinitialise( {verticalGutter:0} );
      -  });
      -  $(".scroll-pane").removeAttr("tabindex"); // get rid of tabindex added by jscroller
      -}
      -
      -
      -/* Resize the height of the nav panels in the reference,
      - * and save the new size to a cookie */
      -function saveNavPanels() {
      -  var basePath = getBaseUri(location.pathname);
      -  var section = basePath.substring(1,basePath.indexOf("/",1));
      -  writeCookie("height", resizePackagesNav.css("height"), section);
      -}
      -
      -
      -
      -function restoreHeight(packageHeight) {
      -    $("#resize-packages-nav").height(packageHeight);
      -    $("#packages-nav").height(packageHeight);
      -  //  var classesHeight = navHeight - packageHeight;
      - //   $("#classes-nav").css({height:classesHeight});
      -  //  $("#classes-nav .jspContainer").css({height:classesHeight});
      -}
      -
      -
      -
      -/* ######### END RESIZE THE SIDENAV HEIGHT ########## */
      -
      -
      -
      -
      -
      -/** Scroll the jScrollPane to make the currently selected item visible
      -    This is called when the page finished loading. */
      -function scrollIntoView(nav) {
      -  return;
      -  var $nav = $("#"+nav);
      -  var element = $nav.jScrollPane({/* ...settings... */});
      -  var api = element.data('jsp');
      -
      -  if ($nav.is(':visible')) {
      -    var $selected = $(".selected", $nav);
      -    if ($selected.length == 0) {
      -      // If no selected item found, exit
      -      return;
      -    }
      -    // get the selected item's offset from its container nav by measuring the item's offset
      -    // relative to the document then subtract the container nav's offset relative to the document
      -    var selectedOffset = $selected.offset().top - $nav.offset().top + 60;
      -    if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up the item
      -                                               // if it's more than 80% down the nav
      -      // scroll the item up by an amount equal to 80% the container nav's height
      -      api.scrollTo(0, selectedOffset - ($nav.height() * .8), false);
      -    }
      -  }
      -}
      -
      -
      -
      -
      -
      -
       /* Show popup dialogs */
       function showDialog(id) {
      -  $dialog = $("#"+id);
      +  $dialog = $("#" + id);
         $dialog.prepend('<div class="box-border"><div class="top"> <div class="left"></div> <div class="right"></div></div><div class="bottom"> <div class="left"></div> <div class="right"></div> </div> </div>');
         $dialog.wrapInner('<div/>');
         $dialog.removeClass("hide");
       }
       
      -
      -
      -
      -
       /* #########    COOKIES!     ########## */
       
       function readCookie(cookie) {
      -  var myCookie = cookie_namespace+"_"+cookie+"=";
      +  var myCookie = cookie_namespace + "_" + cookie + "=";
         if (document.cookie) {
           var index = document.cookie.indexOf(myCookie);
           if (index != -1) {
      @@ -1031,98 +429,16 @@ function readCookie(cookie) {
       }
       
       function writeCookie(cookie, val, section) {
      -  if (val==undefined) return;
      -  section = section == null ? "_" : "_"+section+"_";
      -  var age = 2*365*24*60*60; // set max-age to 2 years
      -  var cookieValue = cookie_namespace + section + cookie + "=" + val
      -                    + "; max-age=" + age +"; path=/";
      +  if (val == undefined) return;
      +  section = section == null ? "_" : "_" + section + "_";
      +  var age = 2 * 365 * 24 * 60 * 60; // set max-age to 2 years
      +  var cookieValue = cookie_namespace + section + cookie + "=" + val +
      +                    "; max-age=" + age + "; path=/";
         document.cookie = cookieValue;
       }
       
       /* #########     END COOKIES!     ########## */
       
      -
      -var sticky = false;
      -var stickyTop;
      -var prevScrollLeft = 0; // used to compare current position to previous position of horiz scroll
      -/* Sets the vertical scoll position at which the sticky bar should appear.
      -   This method is called to reset the position when search results appear or hide */
      -function setStickyTop() {
      -  stickyTop = $('#header-wrapper').outerHeight() - $('#header > .dac-header-inner').outerHeight();
      -}
      -
      -/*
      - * Displays sticky nav bar on pages when dac header scrolls out of view
      - */
      -$(window).scroll(function(event) {
      -  // Exit if the mouse target is a DIV, because that means the event is coming
      -  // from a scrollable div and so there's no need to make adjustments to our layout
      -  if ($(event.target).nodeName == "DIV") {
      -    return;
      -  }
      -
      -  checkSticky();
      -});
      -
      -function checkSticky() {
      -  setStickyTop();
      -  var $headerEl = $('#header');
      -  // Exit if there's no sidenav
      -  if ($('#side-nav').length == 0) return;
      -
      -  var top = $(window).scrollTop();
      -  // we set the navbar fixed when the scroll position is beyond the height of the site header...
      -  var shouldBeSticky = top > stickyTop;
      -  // ... except if the document content is shorter than the sidenav height.
      -  // (this is necessary to avoid crazy behavior on OSX Lion due to overscroll bouncing)
      -  if ($("#doc-col").height() < $("#side-nav").height()) {
      -    shouldBeSticky = false;
      -  }
      -  // Nor on mobile
      -  if (window.innerWidth < 720) {
      -    shouldBeSticky = false;
      -  }
      -  // Account for horizontal scroll
      -  var scrollLeft = $(window).scrollLeft();
      -  // When the sidenav is fixed and user scrolls horizontally, reposition the sidenav to match
      -  if (sticky && (scrollLeft != prevScrollLeft)) {
      -    updateSideNavDimensions();
      -    prevScrollLeft = scrollLeft;
      -  }
      -
      -  // Don't continue if the header is sufficently far away
      -  // (to avoid intensive resizing that slows scrolling)
      -  if (sticky == shouldBeSticky) {
      -    return;
      -  }
      -
      -  // If sticky header visible and position is now near top, hide sticky
      -  if (sticky && !shouldBeSticky) {
      -    sticky = false;
      -    // make the sidenav static again
      -    $('#devdoc-nav')
      -      .removeClass('fixed')
      -      .css({'width':'auto','margin':''});
      -    // delay hide the sticky
      -    $headerEl.removeClass('is-sticky');
      -
      -    // update the sidenaav position for side scrolling
      -    updateSideNavDimensions();
      -  } else if (!sticky && shouldBeSticky) {
      -    sticky = true;
      -    $headerEl.addClass('is-sticky');
      -
      -    // make the sidenav fixed
      -    $('#devdoc-nav')
      -      .addClass('fixed');
      -
      -    // update the sidenaav position for side scrolling
      -    updateSideNavDimensions();
      -
      -  }
      -  resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance
      -}
      -
       /*
        * Manages secion card states and nav resize to conclude loading
        */
      @@ -1132,7 +448,7 @@ function checkSticky() {
           // Stack hover states
           $('.section-card-menu').each(function(index, el) {
             var height = $(el).height();
      -      $(el).css({height:height+'px', position:'relative'});
      +      $(el).css({height:height + 'px', position:'relative'});
             var $cardInfo = $(el).find('.card-info');
       
             $cardInfo.css({position: 'absolute', bottom:'0px', left:'0px', right:'0px', overflow:'visible'});
      @@ -1142,25 +458,8 @@ function checkSticky() {
       
       })();
       
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
       /*      MISC LIBRARY FUNCTIONS     */
       
      -
      -
      -
      -
       function toggle(obj, slide) {
         var ul = $("ul:first", obj);
         var li = ul.parent();
      @@ -1181,7 +480,6 @@ function toggle(obj, slide) {
         }
       }
       
      -
       function buildToggleLists() {
         $(".toggle-list").each(
           function(i) {
      @@ -1190,12 +488,10 @@ function buildToggleLists() {
           });
       }
       
      -
      -
       function hideNestedItems(list, toggle) {
         $list = $(list);
         // hide nested lists
      -  if($list.hasClass('showing')) {
      +  if ($list.hasClass('showing')) {
           $("li ol", $list).hide('fast');
           $list.removeClass('showing');
         // show nested lists
      @@ -1203,207 +499,47 @@ function hideNestedItems(list, toggle) {
           $("li ol", $list).show('fast');
           $list.addClass('showing');
         }
      -  $(".more,.less",$(toggle)).toggle();
      +  $(".more,.less", $(toggle)).toggle();
       }
       
      -
       /* Call this to add listeners to a <select> element for Studio/Eclipse/Other docs */
       function setupIdeDocToggle() {
      -  $( "select.ide" ).change(function() {
      +  $("select.ide").change(function() {
           var selected = $(this).find("option:selected").attr("value");
           $(".select-ide").hide();
      -    $(".select-ide."+selected).show();
      +    $(".select-ide." + selected).show();
       
           $("select.ide").val(selected);
         });
       }
       
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -/*      REFERENCE NAV SWAP     */
      -
      -
      -function getNavPref() {
      -  var v = readCookie('reference_nav');
      -  if (v != NAV_PREF_TREE) {
      -    v = NAV_PREF_PANELS;
      -  }
      -  return v;
      -}
      -
      -function chooseDefaultNav() {
      -  nav_pref = getNavPref();
      -  if (nav_pref == NAV_PREF_TREE) {
      -    $("#nav-panels").toggle();
      -    $("#panel-link").toggle();
      -    $("#nav-tree").toggle();
      -    $("#tree-link").toggle();
      -  }
      -}
      -
      -function swapNav() {
      -  if (nav_pref == NAV_PREF_TREE) {
      -    nav_pref = NAV_PREF_PANELS;
      -  } else {
      -    nav_pref = NAV_PREF_TREE;
      -    init_default_navtree(toRoot);
      -  }
      -  writeCookie("nav", nav_pref, "reference");
      -
      -  $("#nav-panels").toggle();
      -  $("#panel-link").toggle();
      -  $("#nav-tree").toggle();
      -  $("#tree-link").toggle();
      -
      -  resizeNav();
      -
      -  // Gross nasty hack to make tree view show up upon first swap by setting height manually
      -  $("#nav-tree .jspContainer:visible")
      -      .css({'height':$("#nav-tree .jspContainer .jspPane").height() +'px'});
      -  // Another nasty hack to make the scrollbar appear now that we have height
      -  resizeNav();
      -
      -  if ($("#nav-tree").is(':visible')) {
      -    scrollIntoView("nav-tree");
      -  } else {
      -    scrollIntoView("packages-nav");
      -    scrollIntoView("classes-nav");
      -  }
      -}
      -
      -
      -
      -/* ############################################ */
      -/* ##########     LOCALIZATION     ############ */
      -/* ############################################ */
      -
      -function getBaseUri(uri) {
      -  var intlUrl = (uri.substring(0,6) == "/intl/");
      -  if (intlUrl) {
      -    base = uri.substring(uri.indexOf('intl/')+5,uri.length);
      -    base = base.substring(base.indexOf('/')+1, base.length);
      -      //alert("intl, returning base url: /" + base);
      -    return ("/" + base);
      -  } else {
      -      //alert("not intl, returning uri as found.");
      -    return uri;
      -  }
      -}
      -
      -function requestAppendHL(uri) {
      -//append "?hl=<lang> to an outgoing request (such as to blog)
      -  var lang = getLangPref();
      -  if (lang) {
      -    var q = 'hl=' + lang;
      -    uri += '?' + q;
      -    window.location = uri;
      -    return false;
      -  } else {
      -    return true;
      -  }
      -}
      -
      -
      -function changeNavLang(lang) {
      -  if (lang === 'en') { return; }
      -
      -  var $links = $("a[" + lang + "-lang],p[" + lang + "-lang]");
      -  $links.each(function(){ // for each link with a translation
      -    var $link = $(this);
      -    // put the desired language from the attribute as the text
      -    $link.text($link.attr(lang + '-lang'))
      -  });
      -}
      -
      -function changeLangPref(lang, submit) {
      -  writeCookie("pref_lang", lang, null);
      -
      -  //  #######  TODO:  Remove this condition once we're stable on devsite #######
      -  //  This condition is only needed if we still need to support legacy GAE server
      -  if (devsite) {
      -    // Switch language when on Devsite server
      -    if (submit) {
      -      $("#setlang").submit();
      -    }
      -  } else {
      -    // Switch language when on legacy GAE server
      -    if (submit) {
      -      window.location = getBaseUri(location.pathname);
      -    }
      -  }
      -}
      -
      -function loadLangPref() {
      -  var lang = readCookie("pref_lang");
      -  if (lang != 0) {
      -    $("#language").find("option[value='"+lang+"']").attr("selected",true);
      -  }
      -}
      -
      -function getLangPref() {
      -  var lang = $("#language").find(":selected").attr("value");
      -  if (!lang) {
      -    lang = readCookie("pref_lang");
      -  }
      -  return (lang != 0) ? lang : 'en';
      -}
      -
      -/* ##########     END LOCALIZATION     ############ */
      -
      -
      -
      -
      -
      -
      -/* Used to hide and reveal supplemental content, such as long code samples.
      -   See the companion CSS in android-developer-docs.css */
      -function toggleContent(obj) {
      -  var div = $(obj).closest(".toggle-content");
      -  var toggleMe = $(".toggle-content-toggleme:eq(0)",div);
      -  if (div.hasClass("closed")) { // if it's closed, open it
      -    toggleMe.slideDown();
      -    $(".toggle-content-text:eq(0)", obj).toggle();
      -    div.removeClass("closed").addClass("open");
      -    $(".toggle-content-img:eq(0)", div).attr("title", "hide").attr("src", toRoot
      -                  + "assets/images/styles/disclosure_up.png");
      -  } else { // if it's open, close it
      -    toggleMe.slideUp('fast', function() {  // Wait until the animation is done before closing arrow
      -      $(".toggle-content-text:eq(0)", obj).toggle();
      -      div.removeClass("open").addClass("closed");
      -      div.find(".toggle-content").removeClass("open").addClass("closed")
      -              .find(".toggle-content-toggleme").hide();
      -      $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot
      -                  + "assets/images/styles/disclosure_down.png");
      -    });
      -  }
      -  return false;
      -}
      -
      +/* Used to hide and reveal supplemental content, such as long code samples.
      +   See the companion CSS in android-developer-docs.css */
      +function toggleContent(obj) {
      +  var div = $(obj).closest(".toggle-content");
      +  var toggleMe = $(".toggle-content-toggleme:eq(0)", div);
      +  if (div.hasClass("closed")) { // if it's closed, open it
      +    toggleMe.slideDown();
      +    $(".toggle-content-text:eq(0)", obj).toggle();
      +    div.removeClass("closed").addClass("open");
      +    $(".toggle-content-img:eq(0)", div).attr("title", "hide").attr("src", toRoot +
      +                  "assets/images/styles/disclosure_up.png");
      +  } else { // if it's open, close it
      +    toggleMe.slideUp('fast', function() {  // Wait until the animation is done before closing arrow
      +      $(".toggle-content-text:eq(0)", obj).toggle();
      +      div.removeClass("open").addClass("closed");
      +      div.find(".toggle-content").removeClass("open").addClass("closed")
      +              .find(".toggle-content-toggleme").hide();
      +      $(".toggle-content-img", div).attr("title", "show").attr("src", toRoot +
      +                  "assets/images/styles/disclosure_down.png");
      +    });
      +  }
      +  return false;
      +}
       
       /* New version of expandable content */
      -function toggleExpandable(link,id) {
      -  if($(id).is(':visible')) {
      +function toggleExpandable(link, id) {
      +  if ($(id).is(':visible')) {
           $(id).slideUp();
           $(link).removeClass('expanded');
         } else {
      @@ -1417,10 +553,6 @@ function hideExpandable(ids) {
         $(ids).prev('h4').find('a.expandable').removeClass('expanded');
       }
       
      -
      -
      -
      -
       /*
        *  Slideshow 1.0
        *  Used on /index.html and /develop/index.html for carousel
      @@ -1460,169 +592,164 @@ function hideExpandable(ids) {
        *
        */
       
      - (function($) {
      - $.fn.dacSlideshow = function(o) {
      -
      -     //Options - see above
      -     o = $.extend({
      -         btnPrev:   null,
      -         btnNext:   null,
      -         btnPause:  null,
      -         auto:      true,
      -         speed:     500,
      -         autoTime:  12000,
      -         easing:    null,
      -         start:     0,
      -         scroll:    1,
      -         pagination: true
      -
      -     }, o || {});
      -
      -     //Set up a carousel for each
      -     return this.each(function() {
      -
      -         var running = false;
      -         var animCss = o.vertical ? "top" : "left";
      -         var sizeCss = o.vertical ? "height" : "width";
      -         var div = $(this);
      -         var ul = $("ul", div);
      -         var tLi = $("li", ul);
      -         var tl = tLi.size();
      -         var timer = null;
      -
      -         var li = $("li", ul);
      -         var itemLength = li.size();
      -         var curr = o.start;
      -
      -         li.css({float: o.vertical ? "none" : "left"});
      -         ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"});
      -         div.css({position: "relative", "z-index": "2", left: "0px"});
      -
      -         var liSize = o.vertical ? height(li) : width(li);
      -         var ulSize = liSize * itemLength;
      -         var divSize = liSize;
      -
      -         li.css({width: li.width(), height: li.height()});
      -         ul.css(sizeCss, ulSize+"px").css(animCss, -(curr*liSize));
      -
      -         div.css(sizeCss, divSize+"px");
      -
      -         //Pagination
      -         if (o.pagination) {
      -             var pagination = $("<div class='pagination'></div>");
      -             var pag_ul = $("<ul></ul>");
      -             if (tl > 1) {
      -               for (var i=0;i<tl;i++) {
      -                    var li = $("<li>"+i+"</li>");
      -                    pag_ul.append(li);
      -                    if (i==o.start) li.addClass('active');
      -                        li.click(function() {
      -                        go(parseInt($(this).text()));
      -                    })
      -                }
      -                pagination.append(pag_ul);
      -                div.append(pagination);
      -             }
      -         }
      -
      -         //Previous button
      -         if(o.btnPrev)
      +(function($) {
      +  $.fn.dacSlideshow = function(o) {
      +
      +    //Options - see above
      +    o = $.extend({
      +      btnPrev:   null,
      +      btnNext:   null,
      +      btnPause:  null,
      +      auto:      true,
      +      speed:     500,
      +      autoTime:  12000,
      +      easing:    null,
      +      start:     0,
      +      scroll:    1,
      +      pagination: true
      +
      +    }, o || {});
      +
      +    //Set up a carousel for each
      +    return this.each(function() {
      +
      +      var running = false;
      +      var animCss = o.vertical ? "top" : "left";
      +      var sizeCss = o.vertical ? "height" : "width";
      +      var div = $(this);
      +      var ul = $("ul", div);
      +      var tLi = $("li", ul);
      +      var tl = tLi.size();
      +      var timer = null;
      +
      +      var li = $("li", ul);
      +      var itemLength = li.size();
      +      var curr = o.start;
      +
      +      li.css({float: o.vertical ? "none" : "left"});
      +      ul.css({margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1"});
      +      div.css({position: "relative", "z-index": "2", left: "0px"});
      +
      +      var liSize = o.vertical ? height(li) : width(li);
      +      var ulSize = liSize * itemLength;
      +      var divSize = liSize;
      +
      +      li.css({width: li.width(), height: li.height()});
      +      ul.css(sizeCss, ulSize + "px").css(animCss, -(curr * liSize));
      +
      +      div.css(sizeCss, divSize + "px");
      +
      +      //Pagination
      +      if (o.pagination) {
      +        var pagination = $("<div class='pagination'></div>");
      +        var pag_ul = $("<ul></ul>");
      +        if (tl > 1) {
      +          for (var i = 0; i < tl; i++) {
      +            var li = $("<li>" + i + "</li>");
      +            pag_ul.append(li);
      +            if (i == o.start) li.addClass('active');
      +            li.click(function() {
      +              go(parseInt($(this).text()));
      +            })
      +          }
      +          pagination.append(pag_ul);
      +          div.append(pagination);
      +        }
      +      }
      +
      +      //Previous button
      +      if (o.btnPrev)
                    $(o.btnPrev).click(function(e) {
      -                 e.preventDefault();
      -                 return go(curr-o.scroll);
      +               e.preventDefault();
      +               return go(curr - o.scroll);
                    });
       
      -         //Next button
      -         if(o.btnNext)
      +      //Next button
      +      if (o.btnNext)
                    $(o.btnNext).click(function(e) {
      -                 e.preventDefault();
      -                 return go(curr+o.scroll);
      +               e.preventDefault();
      +               return go(curr + o.scroll);
                    });
       
      -         //Pause button
      -         if(o.btnPause)
      +      //Pause button
      +      if (o.btnPause)
                    $(o.btnPause).click(function(e) {
      -                 e.preventDefault();
      -                 if ($(this).hasClass('paused')) {
      -                     startRotateTimer();
      -                 } else {
      -                     pauseRotateTimer();
      -                 }
      +               e.preventDefault();
      +               if ($(this).hasClass('paused')) {
      +                 startRotateTimer();
      +               } else {
      +                 pauseRotateTimer();
      +               }
                    });
       
      -         //Auto rotation
      -         if(o.auto) startRotateTimer();
      -
      -         function startRotateTimer() {
      -             clearInterval(timer);
      -             timer = setInterval(function() {
      -                  if (curr == tl-1) {
      -                    go(0);
      -                  } else {
      -                    go(curr+o.scroll);
      -                  }
      -              }, o.autoTime);
      -             $(o.btnPause).removeClass('paused');
      -         }
      -
      -         function pauseRotateTimer() {
      -             clearInterval(timer);
      -             $(o.btnPause).addClass('paused');
      -         }
      -
      -         //Go to an item
      -         function go(to) {
      -             if(!running) {
      -
      -                 if(to<0) {
      -                    to = itemLength-1;
      -                 } else if (to>itemLength-1) {
      -                    to = 0;
      -                 }
      -                 curr = to;
      -
      -                 running = true;
      -
      -                 ul.animate(
      -                     animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing,
      -                     function() {
      -                         running = false;
      -                     }
      -                 );
      +      //Auto rotation
      +      if (o.auto) startRotateTimer();
       
      -                 $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
      -                 $( (curr-o.scroll<0 && o.btnPrev)
      -                     ||
      -                    (curr+o.scroll > itemLength && o.btnNext)
      -                     ||
      -                    []
      -                  ).addClass("disabled");
      +      function startRotateTimer() {
      +        clearInterval(timer);
      +        timer = setInterval(function() {
      +          if (curr == tl - 1) {
      +            go(0);
      +          } else {
      +            go(curr + o.scroll);
      +          }
      +        }, o.autoTime);
      +        $(o.btnPause).removeClass('paused');
      +      }
      +
      +      function pauseRotateTimer() {
      +        clearInterval(timer);
      +        $(o.btnPause).addClass('paused');
      +      }
      +
      +      //Go to an item
      +      function go(to) {
      +        if (!running) {
      +
      +          if (to < 0) {
      +            to = itemLength - 1;
      +          } else if (to > itemLength - 1) {
      +            to = 0;
      +          }
      +          curr = to;
       
      +          running = true;
       
      -                 var nav_items = $('li', pagination);
      -                 nav_items.removeClass('active');
      -                 nav_items.eq(to).addClass('active');
      +          ul.animate(
      +              animCss == "left" ? {left: -(curr * liSize)} : {top: -(curr * liSize)} , o.speed, o.easing,
      +                     function() {
      +                       running = false;
      +                     }
      +                 );
       
      +          $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
      +          $((curr - o.scroll < 0 && o.btnPrev)              ||
      +             (curr + o.scroll > itemLength && o.btnNext)              ||
      +             []
      +           ).addClass("disabled");
       
      -             }
      -             if(o.auto) startRotateTimer();
      -             return false;
      -         };
      -     });
      - };
      +          var nav_items = $('li', pagination);
      +          nav_items.removeClass('active');
      +          nav_items.eq(to).addClass('active');
       
      - function css(el, prop) {
      -     return parseInt($.css(el[0], prop)) || 0;
      - };
      - function width(el) {
      -     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      - };
      - function height(el) {
      -     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      - };
      +        }
      +        if (o.auto) startRotateTimer();
      +        return false;
      +      };
      +    });
      +  };
       
      - })(jQuery);
      +  function css(el, prop) {
      +    return parseInt($.css(el[0], prop)) || 0;
      +  };
      +  function width(el) {
      +    return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      +  };
      +  function height(el) {
      +    return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      +  };
       
      +})(jQuery);
       
       /*
        *  dacSlideshow 1.0
      @@ -1661,2378 +788,4250 @@ function hideExpandable(ids) {
        *  pagination: whether or not to include dotted pagination
        *
        */
      - (function($) {
      - $.fn.dacTabbedList = function(o) {
      -
      -     //Options - see above
      -     o = $.extend({
      -         speed : 250,
      -         easing: null,
      -         nav_id: null,
      -         frame_id: null
      -     }, o || {});
      -
      -     //Set up a carousel for each
      -     return this.each(function() {
      -
      -         var curr = 0;
      -         var running = false;
      -         var animCss = "margin-left";
      -         var sizeCss = "width";
      -         var div = $(this);
      -
      -         var nav = $(o.nav_id, div);
      -         var nav_li = $("li", nav);
      -         var nav_size = nav_li.size();
      -         var frame = div.find(o.frame_id);
      -         var content_width = $(frame).find('ul').width();
      -         //Buttons
      -         $(nav_li).click(function(e) {
      +(function($) {
      +  $.fn.dacTabbedList = function(o) {
      +
      +    //Options - see above
      +    o = $.extend({
      +      speed : 250,
      +      easing: null,
      +      nav_id: null,
      +      frame_id: null
      +    }, o || {});
      +
      +    //Set up a carousel for each
      +    return this.each(function() {
      +
      +      var curr = 0;
      +      var running = false;
      +      var animCss = "margin-left";
      +      var sizeCss = "width";
      +      var div = $(this);
      +
      +      var nav = $(o.nav_id, div);
      +      var nav_li = $("li", nav);
      +      var nav_size = nav_li.size();
      +      var frame = div.find(o.frame_id);
      +      var content_width = $(frame).find('ul').width();
      +      //Buttons
      +      $(nav_li).click(function(e) {
                  go($(nav_li).index($(this)));
                })
       
      -         //Go to an item
      -         function go(to) {
      -             if(!running) {
      -                 curr = to;
      -                 running = true;
      +      //Go to an item
      +      function go(to) {
      +        if (!running) {
      +          curr = to;
      +          running = true;
       
      -                 frame.animate({ 'margin-left' : -(curr*content_width) }, o.speed, o.easing,
      +          frame.animate({'margin-left' : -(curr * content_width)}, o.speed, o.easing,
                            function() {
      -                         running = false;
      +                       running = false;
                            }
                        );
       
      +          nav_li.removeClass('active');
      +          nav_li.eq(to).addClass('active');
       
      -                 nav_li.removeClass('active');
      -                 nav_li.eq(to).addClass('active');
      -
      -
      -             }
      -             return false;
      -         };
      -     });
      - };
      -
      - function css(el, prop) {
      -     return parseInt($.css(el[0], prop)) || 0;
      - };
      - function width(el) {
      -     return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      - };
      - function height(el) {
      -     return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      - };
      -
      - })(jQuery);
      -
      -
      +        }
      +        return false;
      +      };
      +    });
      +  };
       
      +  function css(el, prop) {
      +    return parseInt($.css(el[0], prop)) || 0;
      +  };
      +  function width(el) {
      +    return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight');
      +  };
      +  function height(el) {
      +    return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
      +  };
       
      +})(jQuery);
       
       /* ######################################################## */
      -/* ################  SEARCH SUGGESTIONS  ################## */
      +/* #################  JAVADOC REFERENCE ################### */
       /* ######################################################## */
       
       
       
      -var gSelectedIndex = -1;  // the index position of currently highlighted suggestion
      -var gSelectedColumn = -1;  // which column of suggestion lists is currently focused
      +var API_LEVEL_COOKIE = "api_level";
      +var minLevel = 1;
      +var maxLevel = 1;
       
      -var gMatches = new Array();
      -var gLastText = "";
      -var gInitialized = false;
      -var ROW_COUNT_FRAMEWORK = 20;       // max number of results in list
      -var gListLength = 0;
      +function buildApiLevelSelector() {
      +  maxLevel = API_LEVELS.length;
      +  var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE));
      +  userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
       
      +  minLevel = parseInt($("#doc-api-level").attr("class"));
      +  // Handle provisional api levels; the provisional level will always be the highest possible level
      +  // Provisional api levels will also have a length; other stuff that's just missing a level won't,
      +  // so leave those kinds of entities at the default level of 1 (for example, the R.styleable class)
      +  if (isNaN(minLevel) && minLevel.length) {
      +    minLevel = maxLevel;
      +  }
      +  var select = $("#apiLevelSelector").html("").change(changeApiLevel);
      +  for (var i = maxLevel - 1; i >= 0; i--) {
      +    var option = $("<option />").attr("value", "" + API_LEVELS[i]).append("" + API_LEVELS[i]);
      +    //  if (API_LEVELS[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
      +    select.append(option);
      +  }
       
      -var gGoogleMatches = new Array();
      -var ROW_COUNT_GOOGLE = 15;          // max number of results in list
      -var gGoogleListLength = 0;
      +  // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
      +  var selectedLevelItem = $("#apiLevelSelector option[value='" + userApiLevel + "']").get(0);
      +  selectedLevelItem.setAttribute('selected', true);
      +}
       
      -var gDocsMatches = new Array();
      -var ROW_COUNT_DOCS = 100;          // max number of results in list
      -var gDocsListLength = 0;
      +function changeApiLevel() {
      +  maxLevel = API_LEVELS.length;
      +  minLevel = parseInt($('#doc-api-level').attr('class'));
      +  var selectedLevel = maxLevel;
       
      -function onSuggestionClick(link) {
      -  // When user clicks a suggested document, track it
      -  ga('send', 'event', 'Suggestion Click', 'clicked: ' + $(link).attr('href'),
      -                'query: ' + $("#search_autocomplete").val().toLowerCase());
      -}
      +  selectedLevel = parseInt($("#apiLevelSelector option:selected").val());
      +  toggleVisisbleApis(selectedLevel, "body");
       
      -function set_item_selected($li, selected)
      -{
      -    if (selected) {
      -        $li.attr('class','jd-autocomplete jd-selected');
      -    } else {
      -        $li.attr('class','jd-autocomplete');
      -    }
      -}
      +  writeCookie(API_LEVEL_COOKIE, selectedLevel, null);
       
      -function set_item_values(toroot, $li, match)
      -{
      -    var $link = $('a',$li);
      -    $link.html(match.__hilabel || match.label);
      -    $link.attr('href',toroot + match.link);
      +  if (selectedLevel < minLevel) {
      +      // Show the API notice dialog, set number values and button event
      +      $('#api-unavailable').trigger('modal-open');
      +      $('#api-unavailable .selected-level').text(selectedLevel);
      +      $('#api-unavailable .api-level').text(minLevel);
      +      $('#api-unavailable button.ok').attr('onclick','$("#apiLevelSelector").val("' + minLevel + '");changeApiLevel();');
      +  }
       }
       
      -function set_item_values_jd(toroot, $li, match)
      -{
      -    var $link = $('a',$li);
      -    $link.html(match.title);
      -    $link.attr('href',toroot + match.url);
      -}
      +function toggleVisisbleApis(selectedLevel, context) {
      +  var apis = $(".api", context);
      +  apis.each(function(i) {
      +    var obj = $(this);
      +    var className = obj.attr("class");
      +    var apiLevelIndex = className.lastIndexOf("-") + 1;
      +    var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
      +    apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
      +    var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
      +    if (apiLevel.length == 0) { // for odd cases when the since data is actually missing, just bail
      +      return;
      +    }
      +    apiLevel = parseInt(apiLevel);
       
      -function new_suggestion($list) {
      -    var $li = $("<li class='jd-autocomplete'></li>");
      -    $list.append($li);
      +    // Handle provisional api levels; if this item's level is the provisional one, set it to the max
      +    var selectedLevelNum = parseInt(selectedLevel)
      +    var apiLevelNum = parseInt(apiLevel);
      +    if (isNaN(apiLevelNum)) {
      +      apiLevelNum = maxLevel;
      +    }
       
      -    $li.mousedown(function() {
      -        window.location = this.firstChild.getAttribute("href");
      -    });
      -    $li.mouseover(function() {
      -        $('.search_filtered_wrapper li').removeClass('jd-selected');
      -        $(this).addClass('jd-selected');
      -        gSelectedColumn = $(".search_filtered:visible").index($(this).closest('.search_filtered'));
      -        gSelectedIndex = $("li", $(".search_filtered:visible")[gSelectedColumn]).index(this);
      -    });
      -    $li.append("<a onclick='onSuggestionClick(this)'></a>");
      -    $li.attr('class','show-item');
      -    return $li;
      +    // Grey things out that aren't available and give a tooltip title
      +    if (apiLevelNum > selectedLevelNum) {
      +      obj.addClass("absent").attr("title", "Requires API Level \"" +
      +            apiLevel + "\" or higher. To reveal, change the target API level " +
      +              "above the left navigation.");
      +    } else obj.removeClass("absent").removeAttr("title");
      +  });
       }
       
      -function sync_selection_table(toroot)
      -{
      -    var $li; //list item jquery object
      -    var i; //list item iterator
      -
      -    // if there are NO results at all, hide all columns
      -    if (!(gMatches.length > 0) && !(gGoogleMatches.length > 0) && !(gDocsMatches.length > 0)) {
      -        $('.suggest-card').hide(300);
      -        return;
      -    }
      +/* #################  SIDENAV TREE VIEW ################### */
      +/* TODO: eliminate redundancy with non-google functions */
      +function init_google_navtree(navtree_id, toroot, root_nodes) {
      +  var me = new Object();
      +  me.toroot = toroot;
      +  me.node = new Object();
       
      -    // if there are api results
      -    if ((gMatches.length > 0) || (gGoogleMatches.length > 0)) {
      -      // reveal suggestion list
      -      $('.suggest-card.reference').show();
      -      var listIndex = 0; // list index position
      +  me.node.li = document.getElementById(navtree_id);
      +  if (!me.node.li) {
      +    return;
      +  }
       
      -      // reset the lists
      -      $(".suggest-card.reference li").remove();
      +  me.node.children_data = root_nodes;
      +  me.node.children = new Array();
      +  me.node.children_ul = document.createElement("ul");
      +  me.node.get_children_ul = function() { return me.node.children_ul; };
      +  //me.node.children_ul.className = "children_ul";
      +  me.node.li.appendChild(me.node.children_ul);
      +  me.node.depth = 0;
       
      -      // ########### ANDROID RESULTS #############
      -      if (gMatches.length > 0) {
      +  get_google_node(me, me.node);
      +}
       
      -          // determine android results to show
      -          gListLength = gMatches.length < ROW_COUNT_FRAMEWORK ?
      -                        gMatches.length : ROW_COUNT_FRAMEWORK;
      -          for (i=0; i<gListLength; i++) {
      -              var $li = new_suggestion($(".suggest-card.reference ul"));
      -              set_item_values(toroot, $li, gMatches[i]);
      -              set_item_selected($li, i == gSelectedIndex);
      -          }
      +function new_google_node(me, mom, text, link, children_data, api_level) {
      +  var node = new Object();
      +  var child;
      +  node.children = Array();
      +  node.children_data = children_data;
      +  node.depth = mom.depth + 1;
      +  node.get_children_ul = function() {
      +      if (!node.children_ul) {
      +        node.children_ul = document.createElement("ul");
      +        node.children_ul.className = "tree-list-children";
      +        node.li.appendChild(node.children_ul);
             }
      +      return node.children_ul;
      +    };
      +  node.li = document.createElement("li");
       
      -      // ########### GOOGLE RESULTS #############
      -      if (gGoogleMatches.length > 0) {
      -          // show header for list
      -          $(".suggest-card.reference ul").append("<li class='header'>in Google Services:</li>");
      -
      -          // determine google results to show
      -          gGoogleListLength = gGoogleMatches.length < ROW_COUNT_GOOGLE ? gGoogleMatches.length : ROW_COUNT_GOOGLE;
      -          for (i=0; i<gGoogleListLength; i++) {
      -              var $li = new_suggestion($(".suggest-card.reference ul"));
      -              set_item_values(toroot, $li, gGoogleMatches[i]);
      -              set_item_selected($li, i == gSelectedIndex);
      -          }
      -      }
      -    } else {
      -      $('.suggest-card.reference').hide();
      -    }
      -
      -    // ########### JD DOC RESULTS #############
      -    if (gDocsMatches.length > 0) {
      -        // reset the lists
      -        $(".suggest-card:not(.reference) li").remove();
      -
      -        // determine google results to show
      -        // NOTE: The order of the conditions below for the sugg.type MUST BE SPECIFIC:
      -        // The order must match the reverse order that each section appears as a card in
      -        // the suggestion UI... this may be only for the "develop" grouped items though.
      -        gDocsListLength = gDocsMatches.length < ROW_COUNT_DOCS ? gDocsMatches.length : ROW_COUNT_DOCS;
      -        for (i=0; i<gDocsListLength; i++) {
      -            var sugg = gDocsMatches[i];
      -            var $li;
      -            if (sugg.type == "design") {
      -                $li = new_suggestion($(".suggest-card.design ul"));
      -            } else
      -            if (sugg.type == "distribute") {
      -                $li = new_suggestion($(".suggest-card.distribute ul"));
      -            } else
      -            if (sugg.type == "samples") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.samples"));
      -            } else
      -            if (sugg.type == "training") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.training"));
      -            } else
      -            if (sugg.type == "about"||"guide"||"tools"||"google") {
      -                $li = new_suggestion($(".suggest-card.develop .child-card.guides"));
      -            } else {
      -              continue;
      -            }
      +  mom.get_children_ul().appendChild(node.li);
       
      -            set_item_values_jd(toroot, $li, sugg);
      -            set_item_selected($li, i == gSelectedIndex);
      -        }
      +  if (link) {
      +    child = document.createElement("a");
       
      -        // add heading and show or hide card
      -        if ($(".suggest-card.design li").length > 0) {
      -          $(".suggest-card.design ul").prepend("<li class='header'>Design:</li>");
      -          $(".suggest-card.design").show(300);
      -        } else {
      -          $('.suggest-card.design').hide(300);
      -        }
      -        if ($(".suggest-card.distribute li").length > 0) {
      -          $(".suggest-card.distribute ul").prepend("<li class='header'>Distribute:</li>");
      -          $(".suggest-card.distribute").show(300);
      -        } else {
      -          $('.suggest-card.distribute').hide(300);
      -        }
      -        if ($(".child-card.guides li").length > 0) {
      -          $(".child-card.guides").prepend("<li class='header'>Guides:</li>");
      -          $(".child-card.guides li").appendTo(".suggest-card.develop ul");
      -        }
      -        if ($(".child-card.training li").length > 0) {
      -          $(".child-card.training").prepend("<li class='header'>Training:</li>");
      -          $(".child-card.training li").appendTo(".suggest-card.develop ul");
      -        }
      -        if ($(".child-card.samples li").length > 0) {
      -          $(".child-card.samples").prepend("<li class='header'>Samples:</li>");
      -          $(".child-card.samples li").appendTo(".suggest-card.develop ul");
      -        }
      +  } else {
      +    child = document.createElement("span");
      +    child.className = "tree-list-subtitle";
       
      -        if ($(".suggest-card.develop li").length > 0) {
      -          $(".suggest-card.develop").show(300);
      -        } else {
      -          $('.suggest-card.develop').hide(300);
      +  }
      +  if (children_data != null) {
      +    node.li.className = "nav-section";
      +    node.label_div = document.createElement("div");
      +    node.label_div.className = "nav-section-header-ref";
      +    node.li.appendChild(node.label_div);
      +    get_google_node(me, node);
      +    node.label_div.appendChild(child);
      +  } else {
      +    node.li.appendChild(child);
      +  }
      +  if (link) {
      +    child.href = me.toroot + link;
      +  }
      +  node.label = document.createTextNode(text);
      +  child.appendChild(node.label);
      +
      +  node.children_ul = null;
      +
      +  return node;
      +}
      +
      +function get_google_node(me, mom) {
      +  mom.children_visited = true;
      +  var linkText;
      +  for (var i in mom.children_data) {
      +    var node_data = mom.children_data[i];
      +    linkText = node_data[0];
      +
      +    if (linkText.match("^" + "com.google.android") == "com.google.android") {
      +      linkText = linkText.substr(19, linkText.length);
      +    }
      +    mom.children[i] = new_google_node(me, mom, linkText, node_data[1],
      +        node_data[2], node_data[3]);
      +  }
      +}
      +
      +/****** NEW version of script to build google and sample navs dynamically ******/
      +// TODO: update Google reference docs to tolerate this new implementation
      +
      +var NODE_NAME = 0;
      +var NODE_HREF = 1;
      +var NODE_GROUP = 2;
      +var NODE_TAGS = 3;
      +var NODE_CHILDREN = 4;
      +
      +function init_google_navtree2(navtree_id, data) {
      +  var $containerUl = $("#" + navtree_id);
      +  for (var i in data) {
      +    var node_data = data[i];
      +    $containerUl.append(new_google_node2(node_data));
      +  }
      +
      +  // Make all third-generation list items 'sticky' to prevent them from collapsing
      +  $containerUl.find('li li li.nav-section').addClass('sticky');
      +
      +  initExpandableNavItems("#" + navtree_id);
      +}
      +
      +function new_google_node2(node_data) {
      +  var linkText = node_data[NODE_NAME];
      +  if (linkText.match("^" + "com.google.android") == "com.google.android") {
      +    linkText = linkText.substr(19, linkText.length);
      +  }
      +  var $li = $('<li>');
      +  var $a;
      +  if (node_data[NODE_HREF] != null) {
      +    $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >' +
      +        linkText + '</a>');
      +  } else {
      +    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >' +
      +        linkText + '/</a>');
      +  }
      +  var $childUl = $('<ul>');
      +  if (node_data[NODE_CHILDREN] != null) {
      +    $li.addClass("nav-section");
      +    $a = $('<div class="nav-section-header">').append($a);
      +    if (node_data[NODE_HREF] == null) $a.addClass('empty');
      +
      +    for (var i in node_data[NODE_CHILDREN]) {
      +      var child_node_data = node_data[NODE_CHILDREN][i];
      +      $childUl.append(new_google_node2(child_node_data));
      +    }
      +    $li.append($childUl);
      +  }
      +  $li.prepend($a);
      +
      +  return $li;
      +}
      +
      +function showGoogleRefTree() {
      +  init_default_google_navtree(toRoot);
      +  init_default_gcm_navtree(toRoot);
      +}
      +
      +function init_default_google_navtree(toroot) {
      +  // load json file for navtree data
      +  $.getScript(toRoot + 'gms_navtree_data.js', function(data, textStatus, jqxhr) {
      +    // when the file is loaded, initialize the tree
      +    if (jqxhr.status === 200) {
      +      init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA);
      +      highlightSidenav();
      +    }
      +  });
      +}
      +
      +function init_default_gcm_navtree(toroot) {
      +  // load json file for navtree data
      +  $.getScript(toRoot + 'gcm_navtree_data.js', function(data, textStatus, jqxhr) {
      +    // when the file is loaded, initialize the tree
      +    if (jqxhr.status === 200) {
      +      init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
      +      highlightSidenav();
      +    }
      +  });
      +}
      +
      +/* TOGGLE INHERITED MEMBERS */
      +
      +/* Toggle an inherited class (arrow toggle)
      + * @param linkObj  The link that was clicked.
      + * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      + *                'null' to simply toggle.
      + */
      +function toggleInherited(linkObj, expand) {
      +  var base = linkObj.getAttribute("id");
      +  var list = document.getElementById(base + "-list");
      +  var summary = document.getElementById(base + "-summary");
      +  var trigger = document.getElementById(base + "-trigger");
      +  var a = $(linkObj);
      +  if ((expand == null && a.hasClass("closed")) || expand) {
      +    list.style.display = "none";
      +    summary.style.display = "block";
      +    trigger.src = toRoot + "assets/images/styles/disclosure_up.png";
      +    a.removeClass("closed");
      +    a.addClass("opened");
      +  } else if ((expand == null && a.hasClass("opened")) || (expand == false)) {
      +    list.style.display = "block";
      +    summary.style.display = "none";
      +    trigger.src = toRoot + "assets/images/styles/disclosure_down.png";
      +    a.removeClass("opened");
      +    a.addClass("closed");
      +  }
      +  return false;
      +}
      +
      +/* Toggle all inherited classes in a single table (e.g. all inherited methods)
      + * @param linkObj  The link that was clicked.
      + * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      + *                'null' to simply toggle.
      + */
      +function toggleAllInherited(linkObj, expand) {
      +  var a = $(linkObj);
      +  var table = $(a.parent().parent().parent()); // ugly way to get table/tbody
      +  var expandos = $(".jd-expando-trigger", table);
      +  if ((expand == null && a.text() == "[Expand]") || expand) {
      +    expandos.each(function(i) {
      +      toggleInherited(this, true);
      +    });
      +    a.text("[Collapse]");
      +  } else if ((expand == null && a.text() == "[Collapse]") || (expand == false)) {
      +    expandos.each(function(i) {
      +      toggleInherited(this, false);
      +    });
      +    a.text("[Expand]");
      +  }
      +  return false;
      +}
      +
      +/* Toggle all inherited members in the class (link in the class title)
      + */
      +function toggleAllClassInherited() {
      +  var a = $("#toggleAllClassInherited"); // get toggle link from class title
      +  var toggles = $(".toggle-all", $("#body-content"));
      +  if (a.text() == "[Expand All]") {
      +    toggles.each(function(i) {
      +      toggleAllInherited(this, true);
      +    });
      +    a.text("[Collapse All]");
      +  } else {
      +    toggles.each(function(i) {
      +      toggleAllInherited(this, false);
      +    });
      +    a.text("[Expand All]");
      +  }
      +  return false;
      +}
      +
      +/* Expand all inherited members in the class. Used when initiating page search */
      +function ensureAllInheritedExpanded() {
      +  var toggles = $(".toggle-all", $("#body-content"));
      +  toggles.each(function(i) {
      +    toggleAllInherited(this, true);
      +  });
      +  $("#toggleAllClassInherited").text("[Collapse All]");
      +}
      +
      +/* HANDLE KEY EVENTS
      + * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search)
      + */
      +var agent = navigator['userAgent'].toLowerCase();
      +var mac = agent.indexOf("macintosh") != -1;
      +
      +$(document).keydown(function(e) {
      +  var control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key
      +  if (control && e.which == 70) {  // 70 is "F"
      +    ensureAllInheritedExpanded();
      +  }
      +});
      +
      +/* On-demand functions */
      +
      +/** Move sample code line numbers out of PRE block and into non-copyable column */
      +function initCodeLineNumbers() {
      +  var numbers = $("#codesample-block a.number");
      +  if (numbers.length) {
      +    $("#codesample-line-numbers").removeClass("hidden").append(numbers);
      +  }
      +
      +  $(document).ready(function() {
      +    // select entire line when clicked
      +    $("span.code-line").click(function() {
      +      if (!shifted) {
      +        selectText(this);
      +      }
      +    });
      +    // invoke line link on double click
      +    $(".code-line").dblclick(function() {
      +      document.location.hash = $(this).attr('id');
      +    });
      +    // highlight the line when hovering on the number
      +    $("#codesample-line-numbers a.number").mouseover(function() {
      +      var id = $(this).attr('href');
      +      $(id).css('background', '#e7e7e7');
      +    });
      +    $("#codesample-line-numbers a.number").mouseout(function() {
      +      var id = $(this).attr('href');
      +      $(id).css('background', 'none');
      +    });
      +  });
      +}
      +
      +// create SHIFT key binder to avoid the selectText method when selecting multiple lines
      +var shifted = false;
      +$(document).bind('keyup keydown', function(e) {
      +  shifted = e.shiftKey; return true;
      +});
      +
      +// courtesy of jasonedelman.com
      +function selectText(element) {
      +  var doc = document      ,
      +        range, selection
      +  ;
      +  if (doc.body.createTextRange) { //ms
      +    range = doc.body.createTextRange();
      +    range.moveToElementText(element);
      +    range.select();
      +  } else if (window.getSelection) { //all others
      +    selection = window.getSelection();
      +    range = doc.createRange();
      +    range.selectNodeContents(element);
      +    selection.removeAllRanges();
      +    selection.addRange(range);
      +  }
      +}
      +
      +/** Display links and other information about samples that match the
      +    group specified by the URL */
      +function showSamples() {
      +  var group = $("#samples").attr('class');
      +  $("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>");
      +
      +  var $ul = $("<ul>");
      +  $selectedLi = $("#nav li.selected");
      +
      +  $selectedLi.children("ul").children("li").each(function() {
      +    var $li = $("<li>").append($(this).find("a").first().clone());
      +    var $samplesLink = $li.find("a");
      +    if ($samplesLink.text().endsWith('/')) {
      +      $samplesLink.text($samplesLink.text().slice(0,-1));
      +    }
      +    $ul.append($li);
      +  });
      +
      +  $("#samples").append($ul);
      +
      +}
      +
      +/* ########################################################## */
      +/* ###################  RESOURCE CARDS  ##################### */
      +/* ########################################################## */
      +
      +/** Handle resource queries, collections, and grids (sections). Requires
      +    jd_tag_helpers.js and the *_unified_data.js to be loaded. */
      +
      +(function() {
      +  $(document).ready(function() {
      +    // Need to initialize hero carousel before other sections for dedupe
      +    // to work correctly.
      +    $('[data-carousel-query]').dacCarouselQuery();
      +
      +    // Iterate over all instances and initialize a resource widget.
      +    $('.resource-widget').resourceWidget();
      +  });
      +
      +  $.fn.widgetOptions = function() {
      +    return {
      +      cardSizes: (this.data('cardsizes') || '').split(','),
      +      maxResults: parseInt(this.data('maxresults'), 10) || Infinity,
      +      initialResults: this.data('initialResults'),
      +      itemsPerPage: this.data('itemsPerPage'),
      +      sortOrder: this.data('sortorder'),
      +      query: this.data('query'),
      +      section: this.data('section'),
      +      /* Added by LFL 6/6/14 */
      +      resourceStyle: this.data('resourcestyle') || 'card',
      +      stackSort: this.data('stacksort') || 'true',
      +      // For filter based resources
      +      allowDuplicates: this.data('allow-duplicates') || 'false'
      +    };
      +  };
      +
      +  $.fn.deprecateOldGridStyles = function() {
      +    var m = this.get(0).className.match(/\bcol-(\d+)\b/);
      +    if (m && !this.is('.cols > *')) {
      +      this.removeClass('col-' + m[1]);
      +    }
      +    return this;
      +  }
      +
      +  /*
      +   * Three types of resource layouts:
      +   * Flow - Uses a fixed row-height flow using float left style.
      +   * Carousel - Single card slideshow all same dimension absolute.
      +   * Stack - Uses fixed columns and flexible element height.
      +   */
      +  function initResourceWidget(widget, resources, opts) {
      +    var $widget = $(widget).deprecateOldGridStyles();
      +    var isFlow = $widget.hasClass('resource-flow-layout');
      +    var isCarousel = $widget.hasClass('resource-carousel-layout');
      +    var isStack = $widget.hasClass('resource-stack-layout');
      +
      +    opts = opts || $widget.widgetOptions();
      +    resources = resources || metadata.query(opts);
      +
      +    if (opts.maxResults !== undefined) {
      +      resources = resources.slice(0, opts.maxResults);
      +    }
      +
      +    if (isFlow) {
      +      drawResourcesFlowWidget($widget, opts, resources);
      +    } else if (isCarousel) {
      +      drawResourcesCarouselWidget($widget, opts, resources);
      +    } else if (isStack) {
      +      opts.numStacks = $widget.data('numstacks');
      +      drawResourcesStackWidget($widget, opts, resources);
      +    }
      +  }
      +
      +  $.fn.resourceWidget = function(resources, options) {
      +    return this.each(function() {
      +      initResourceWidget(this, resources, options);
      +    });
      +  };
      +
      +  /* Initializes a Resource Carousel Widget */
      +  function drawResourcesCarouselWidget($widget, opts, resources) {
      +    $widget.empty();
      +    var plusone = false; // stop showing plusone buttons on cards
      +
      +    $widget.addClass('resource-card slideshow-container')
      +      .append($('<a>').addClass('slideshow-prev').text('Prev'))
      +      .append($('<a>').addClass('slideshow-next').text('Next'));
      +
      +    var css = {'width': $widget.width() + 'px',
      +                'height': $widget.height() + 'px'};
      +
      +    var $ul = $('<ul>');
      +
      +    for (var i = 0; i < resources.length; ++i) {
      +      var $card = $('<a>')
      +        .attr('href', cleanUrl(resources[i].url))
      +        .decorateResourceCard(resources[i], plusone);
      +
      +      $('<li>').css(css)
      +          .append($card)
      +          .appendTo($ul);
      +    }
      +
      +    $('<div>').addClass('frame')
      +      .append($ul)
      +      .appendTo($widget);
      +
      +    $widget.dacSlideshow({
      +      auto: true,
      +      btnPrev: '.slideshow-prev',
      +      btnNext: '.slideshow-next'
      +    });
      +  }
      +
      +  /* Initializes a Resource Card Stack Widget (column-based layout)
      +     Modified by LFL 6/6/14
      +   */
      +  function drawResourcesStackWidget($widget, opts, resources, sections) {
      +    // Don't empty widget, grab all items inside since they will be the first
      +    // items stacked, followed by the resource query
      +    var plusone = false; // stop showing plusone buttons on cards
      +    var cards = $widget.find('.resource-card').detach().toArray();
      +    var numStacks = opts.numStacks || 1;
      +    var $stacks = [];
      +
      +    for (var i = 0; i < numStacks; ++i) {
      +      $stacks[i] = $('<div>').addClass('resource-card-stack')
      +          .appendTo($widget);
      +    }
      +
      +    var sectionResources = [];
      +
      +    // Extract any subsections that are actually resource cards
      +    if (sections) {
      +      for (i = 0; i < sections.length; ++i) {
      +        if (!sections[i].sections || !sections[i].sections.length) {
      +          // Render it as a resource card
      +          sectionResources.push(
      +            $('<a>')
      +              .addClass('resource-card section-card')
      +              .attr('href', cleanUrl(sections[i].resource.url))
      +              .decorateResourceCard(sections[i].resource, plusone)[0]
      +          );
      +
      +        } else {
      +          cards.push(
      +            $('<div>')
      +              .addClass('resource-card section-card-menu')
      +              .decorateResourceSection(sections[i], plusone)[0]
      +          );
      +        }
      +      }
      +    }
      +
      +    cards = cards.concat(sectionResources);
      +
      +    for (i = 0; i < resources.length; ++i) {
      +      var $card = createResourceElement(resources[i], opts);
      +
      +      if (opts.resourceStyle.indexOf('related') > -1) {
      +        $card.addClass('related-card');
      +      }
      +
      +      cards.push($card[0]);
      +    }
      +
      +    if (opts.stackSort !== 'false') {
      +      for (i = 0; i < cards.length; ++i) {
      +        // Find the stack with the shortest height, but give preference to
      +        // left to right order.
      +        var minHeight = $stacks[0].height();
      +        var minIndex = 0;
      +
      +        for (var j = 1; j < numStacks; ++j) {
      +          var height = $stacks[j].height();
      +          if (height < minHeight - 45) {
      +            minHeight = height;
      +            minIndex = j;
      +          }
      +        }
      +
      +        $stacks[minIndex].append($(cards[i]));
      +      }
      +    }
      +  }
      +
      +  /*
      +    Create a resource card using the given resource object and a list of html
      +     configured options. Returns a jquery object containing the element.
      +  */
      +  function createResourceElement(resource, opts, plusone) {
      +    var $el;
      +
      +    // The difference here is that generic cards are not entirely clickable
      +    // so its a div instead of an a tag, also the generic one is not given
      +    // the resource-card class so it appears with a transparent background
      +    // and can be styled in whatever way the css setup.
      +    if (opts.resourceStyle === 'generic') {
      +      $el = $('<div>')
      +        .addClass('resource')
      +        .attr('href', cleanUrl(resource.url))
      +        .decorateResource(resource, opts);
      +    } else {
      +      var cls = 'resource resource-card';
      +
      +      $el = $('<a>')
      +        .addClass(cls)
      +        .attr('href', cleanUrl(resource.url))
      +        .decorateResourceCard(resource, plusone);
      +    }
      +
      +    return $el;
      +  }
      +
      +  function createResponsiveFlowColumn(cardSize) {
      +    var cardWidth = parseInt(cardSize.match(/(\d+)/)[1], 10);
      +    var column = $('<div>').addClass('col-' + (cardWidth / 3) + 'of6');
      +    if (cardWidth < 9) {
      +      column.addClass('col-tablet-1of2');
      +    } else if (cardWidth > 9 && cardWidth < 18) {
      +      column.addClass('col-tablet-1of1');
      +    }
      +    if (cardWidth < 18) {
      +      column.addClass('col-mobile-1of1');
      +    }
      +    return column;
      +  }
      +
      +  /* Initializes a flow widget, see distribute.scss for generating accompanying css */
      +  function drawResourcesFlowWidget($widget, opts, resources) {
      +    // We'll be doing our own modifications to opts.
      +    opts = $.extend({}, opts);
      +
      +    $widget.empty().addClass('cols');
      +    if (opts.itemsPerPage) {
      +      $('<div class="col-1of1 dac-section-links dac-text-center">')
      +        .append(
      +          $('<div class="dac-section-link dac-show-less" data-toggle="show-less">Less<i class="dac-sprite dac-auto-unfold-less"></i></div>'),
      +          $('<div class="dac-section-link dac-show-more" data-toggle="show-more">More<i class="dac-sprite dac-auto-unfold-more"></i></div>')
      +        )
      +        .appendTo($widget);
      +    }
      +
      +    $widget.data('options.resourceflow', opts);
      +    $widget.data('resources.resourceflow', resources);
      +
      +    drawResourceFlowPage($widget, opts, resources);
      +  }
      +
      +  function drawResourceFlowPage($widget, opts, resources) {
      +    var cardSizes = opts.cardSizes || ['6x6']; // 2015-08-09: dynamic card sizes are deprecated
      +    var i = opts.currentIndex || 0;
      +    var j = 0;
      +    var plusone = false; // stop showing plusone buttons on cards
      +    var firstPage = i === 0;
      +    var initialResults = opts.initialResults || opts.itemsPerPage || resources.length;
      +    var max = firstPage ? initialResults : i + opts.itemsPerPage;
      +    max = Math.min(resources.length, max);
      +
      +    var page = $('<div class="resource-flow-page">');
      +    if (opts.itemsPerPage) {
      +      $widget.find('.dac-section-links').before(page);
      +    } else {
      +      $widget.append(page);
      +    }
      +
      +    while (i < max) {
      +      var cardSize = cardSizes[j++ % cardSizes.length];
      +      cardSize = cardSize.replace(/^\s+|\s+$/, '');
      +
      +      var column = createResponsiveFlowColumn(cardSize).appendTo(page);
      +
      +      // A stack has a third dimension which is the number of stacked items
      +      var isStack = cardSize.match(/(\d+)x(\d+)x(\d+)/);
      +      var stackCount = 0;
      +      var $stackDiv = null;
      +
      +      if (isStack) {
      +        // Create a stack container which should have the dimensions defined
      +        // by the product of the items inside.
      +        $stackDiv = $('<div>').addClass('resource-card-stack resource-card-' + isStack[1] +
      +          'x' + isStack[2] * isStack[3]) .appendTo(column);
      +      }
      +
      +      // Build each stack item or just a single item
      +      do {
      +        var resource = resources[i];
      +
      +        var $card = createResourceElement(resources[i], opts, plusone);
      +
      +        $card.addClass('resource-card-' + cardSize +
      +          ' resource-card-' + resource.type.toLowerCase());
      +
      +        if (isStack) {
      +          $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]);
      +          if (++stackCount === parseInt(isStack[3])) {
      +            $card.addClass('resource-card-row-stack-last');
      +            stackCount = 0;
      +          }
      +        } else {
      +          stackCount = 0;
      +        }
      +
      +        $card.appendTo($stackDiv || column);
      +
      +      } while (++i < max && stackCount > 0);
      +
      +      // Record number of pages viewed in analytics.
      +      if (!firstPage) {
      +        var clicks = Math.ceil((i - initialResults) / opts.itemsPerPage);
      +        devsite.analytics.trackAnalyticsEvent('event',
      +            'Cards', 'Click More', clicks);
      +      }
      +    }
      +
      +    opts.currentIndex = i;
      +    $widget.toggleClass('dac-has-more', i < resources.length);
      +    $widget.toggleClass('dac-has-less', !firstPage);
      +
      +    $widget.trigger('dac:domchange');
      +    if (opts.onRenderPage) {
      +      opts.onRenderPage(page);
      +    }
      +  }
      +
      +  function drawResourceFlowReset($widget, opts, resources) {
      +    $widget.find('.resource-flow-page')
      +        .slice(1)
      +        .remove();
      +    $widget.toggleClass('dac-has-more', true);
      +    $widget.toggleClass('dac-has-less', false);
      +
      +    opts.currentIndex = Math.min(opts.initialResults, resources.length);
      +    devsite.analytics.trackAnalyticsEvent('event', 'Cards', 'Click Less');
      +  }
      +
      +  /* A decorator for event functions which finds the surrounding widget and it's options */
      +  function wrapWithWidget(func) {
      +    return function(e) {
      +      if (e) e.preventDefault();
      +
      +      var $widget = $(this).closest('.resource-flow-layout');
      +      var opts = $widget.data('options.resourceflow');
      +      var resources = $widget.data('resources.resourceflow');
      +      func($widget, opts, resources);
      +    };
      +  }
      +
      +  /* Build a site map of resources using a section as a root. */
      +  function buildSectionList(opts) {
      +    if (opts.section && SECTION_BY_ID[opts.section]) {
      +      return SECTION_BY_ID[opts.section].sections || [];
      +    }
      +    return [];
      +  }
      +
      +  function cleanUrl(url) {
      +    if (url && url.indexOf('//') === -1) {
      +      url = toRoot + url;
      +    }
      +
      +    return url;
      +  }
      +
      +  // Delegated events for resources.
      +  $(document).on('click', '.resource-flow-layout [data-toggle="show-more"]', wrapWithWidget(drawResourceFlowPage));
      +  $(document).on('click', '.resource-flow-layout [data-toggle="show-less"]', wrapWithWidget(drawResourceFlowReset));
      +})();
      +
      +(function($) {
      +  // A mapping from category and type values to new values or human presentable strings.
      +  var SECTION_MAP = {
      +    googleplay: 'google play'
      +  };
      +
      +  /*
      +    Utility method for creating dom for the description area of a card.
      +    Used in decorateResourceCard and decorateResource.
      +  */
      +  function buildResourceCardDescription(resource, plusone) {
      +    var $description = $('<div>').addClass('description ellipsis');
      +
      +    $description.append($('<div>').addClass('text').html(resource.summary));
      +
      +    if (resource.cta) {
      +      $description.append($('<a>').addClass('cta').html(resource.cta));
      +    }
      +
      +    if (plusone) {
      +      var plusurl = resource.url.indexOf("//") > -1 ? resource.url :
      +        "//developer.android.com/" + resource.url;
      +
      +      $description.append($('<div>').addClass('util')
      +        .append($('<div>').addClass('g-plusone')
      +          .attr('data-size', 'small')
      +          .attr('data-align', 'right')
      +          .attr('data-href', plusurl)));
      +    }
      +
      +    return $description;
      +  }
      +
      +  /* Simple jquery function to create dom for a standard resource card */
      +  $.fn.decorateResourceCard = function(resource, plusone) {
      +    var section = resource.category || resource.type;
      +    section = (SECTION_MAP[section] || section).toLowerCase();
      +    var imgUrl = resource.image ||
      +      'assets/images/resource-card-default-android.jpg';
      +
      +    if (imgUrl.indexOf('//') === -1) {
      +      imgUrl = toRoot + imgUrl;
      +    }
      +
      +    if (resource.type === 'youtube' || resource.type === 'video') {
      +      $('<div>').addClass('play-button')
      +        .append($('<i class="dac-sprite dac-play-white">'))
      +        .appendTo(this);
      +    }
      +
      +    $('<div>').addClass('card-bg')
      +      .css('background-image', 'url(' + (imgUrl || toRoot +
      +        'assets/images/resource-card-default-android.jpg') + ')')
      +      .appendTo(this);
      +
      +    $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
      +      .append($('<div>').addClass('section').text(section))
      +      .append($('<div>').addClass('title' + (resource.title_highlighted ? ' highlighted' : ''))
      +        .html(resource.title_highlighted || resource.title))
      +      .append(buildResourceCardDescription(resource, plusone))
      +      .appendTo(this);
      +
      +    return this;
      +  };
      +
      +  /* Simple jquery function to create dom for a resource section card (menu) */
      +  $.fn.decorateResourceSection = function(section, plusone) {
      +    var resource = section.resource;
      +    //keep url clean for matching and offline mode handling
      +    var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot;
      +    var $base = $('<a>')
      +        .addClass('card-bg')
      +        .attr('href', resource.url)
      +        .append($('<div>').addClass('card-section-icon')
      +          .append($('<div>').addClass('icon'))
      +          .append($('<div>').addClass('section').html(resource.title)))
      +      .appendTo(this);
      +
      +    var $cardInfo = $('<div>').addClass('card-info').appendTo(this);
      +
      +    if (section.sections && section.sections.length) {
      +      // Recurse the section sub-tree to find a resource image.
      +      var stack = [section];
      +
      +      while (stack.length) {
      +        if (stack[0].resource.image) {
      +          $base.css('background-image', 'url(' + urlPrefix + stack[0].resource.image + ')');
      +          break;
      +        }
      +
      +        if (stack[0].sections) {
      +          stack = stack.concat(stack[0].sections);
      +        }
      +
      +        stack.shift();
      +      }
      +
      +      var $ul = $('<ul>')
      +        .appendTo($cardInfo);
      +
      +      var max = section.sections.length > 3 ? 3 : section.sections.length;
      +
      +      for (var i = 0; i < max; ++i) {
      +
      +        var subResource = section.sections[i];
      +        if (!plusone) {
      +          $('<li>')
      +            .append($('<a>').attr('href', subResource.url)
      +              .append($('<div>').addClass('title').html(subResource.title))
      +              .append($('<div>').addClass('description ellipsis')
      +                .append($('<div>').addClass('text').html(subResource.summary))
      +                .append($('<div>').addClass('util'))))
      +          .appendTo($ul);
      +        } else {
      +          $('<li>')
      +            .append($('<a>').attr('href', subResource.url)
      +              .append($('<div>').addClass('title').html(subResource.title))
      +              .append($('<div>').addClass('description ellipsis')
      +                .append($('<div>').addClass('text').html(subResource.summary))
      +                .append($('<div>').addClass('util')
      +                  .append($('<div>').addClass('g-plusone')
      +                    .attr('data-size', 'small')
      +                    .attr('data-align', 'right')
      +                    .attr('data-href', resource.url)))))
      +          .appendTo($ul);
               }
      +      }
      +
      +      // Add a more row
      +      if (max < section.sections.length) {
      +        $('<li>')
      +          .append($('<a>').attr('href', resource.url)
      +            .append($('<div>')
      +              .addClass('title')
      +              .text('More')))
      +        .appendTo($ul);
      +      }
      +    } else {
      +      // No sub-resources, just render description?
      +    }
      +
      +    return this;
      +  };
      +
      +  /* Render other types of resource styles that are not cards. */
      +  $.fn.decorateResource = function(resource, opts) {
      +    var imgUrl = resource.image ||
      +      'assets/images/resource-card-default-android.jpg';
      +    var linkUrl = resource.url;
      +
      +    if (imgUrl.indexOf('//') === -1) {
      +      imgUrl = toRoot + imgUrl;
      +    }
      +
      +    if (linkUrl && linkUrl.indexOf('//') === -1) {
      +      linkUrl = toRoot + linkUrl;
      +    }
      +
      +    $(this).append(
      +      $('<div>').addClass('image')
      +        .css('background-image', 'url(' + imgUrl + ')'),
      +      $('<div>').addClass('info').append(
      +        $('<h4>').addClass('title').html(resource.title_highlighted || resource.title),
      +        $('<p>').addClass('summary').html(resource.summary),
      +        $('<a>').attr('href', linkUrl).addClass('cta').html('Learn More')
      +      )
      +    );
      +
      +    return this;
      +  };
      +})(jQuery);
      +
      +/*
      +  Fullscreen Carousel
      +
      +  The following allows for an area at the top of the page that takes over the
      +  entire browser height except for its top offset and an optional bottom
      +  padding specified as a data attribute.
      +
      +  HTML:
      +
      +  <div class="fullscreen-carousel">
      +    <div class="fullscreen-carousel-content">
      +      <!-- content here -->
      +    </div>
      +    <div class="fullscreen-carousel-content">
      +      <!-- content here -->
      +    </div>
      +
      +    etc ...
      +
      +  </div>
      +
      +  Control over how the carousel takes over the screen can mostly be defined in
      +  a css file. Setting min-height on the .fullscreen-carousel-content elements
      +  will prevent them from shrinking to far vertically when the browser is very
      +  short, and setting max-height on the .fullscreen-carousel itself will prevent
      +  the area from becoming to long in the case that the browser is stretched very
      +  tall.
      +
      +  There is limited functionality for having multiple sections since that request
      +  was removed, but it is possible to add .next-arrow and .prev-arrow elements to
      +  scroll between multiple content areas.
      +*/
      +
      +(function() {
      +  $(document).ready(function() {
      +    $('.fullscreen-carousel').each(function() {
      +      initWidget(this);
      +    });
      +  });
      +
      +  function initWidget(widget) {
      +    var $widget = $(widget);
      +
      +    var topOffset = $widget.offset().top;
      +    var padBottom = parseInt($widget.data('paddingbottom')) || 0;
      +    var maxHeight = 0;
      +    var minHeight = 0;
      +    var $content = $widget.find('.fullscreen-carousel-content');
      +    var $nextArrow = $widget.find('.next-arrow');
      +    var $prevArrow = $widget.find('.prev-arrow');
      +    var $curSection = $($content[0]);
      +
      +    if ($content.length <= 1) {
      +      $nextArrow.hide();
      +      $prevArrow.hide();
      +    } else {
      +      $nextArrow.click(function() {
      +        var index = ($content.index($curSection) + 1);
      +        $curSection.hide();
      +        $curSection = $($content[index >= $content.length ? 0 : index]);
      +        $curSection.show();
      +      });
      +
      +      $prevArrow.click(function() {
      +        var index = ($content.index($curSection) - 1);
      +        $curSection.hide();
      +        $curSection = $($content[index < 0 ? $content.length - 1 : 0]);
      +        $curSection.show();
      +      });
      +    }
      +
      +    // Just hide all content sections except first.
      +    $content.each(function(index) {
      +      if ($(this).height() > minHeight) minHeight = $(this).height();
      +      $(this).css({position: 'absolute',  display: index > 0 ? 'none' : ''});
      +    });
      +
      +    // Register for changes to window size, and trigger.
      +    $(window).resize(resizeWidget);
      +    resizeWidget();
      +
      +    function resizeWidget() {
      +      var height = $(window).height() - topOffset - padBottom;
      +      $widget.width($(window).width());
      +      $widget.height(height < minHeight ? minHeight :
      +        (maxHeight && height > maxHeight ? maxHeight : height));
      +    }
      +  }
      +})();
      +
      +/*
      +  Tab Carousel
      +
      +  The following allows tab widgets to be installed via the html below. Each
      +  tab content section should have a data-tab attribute matching one of the
      +  nav items'. Also each tab content section should have a width matching the
      +  tab carousel.
      +
      +  HTML:
      +
      +  <div class="tab-carousel">
      +    <ul class="tab-nav">
      +      <li><a href="#" data-tab="handsets">Handsets</a>
      +      <li><a href="#" data-tab="wearable">Wearable</a>
      +      <li><a href="#" data-tab="tv">TV</a>
      +    </ul>
      +
      +    <div class="tab-carousel-content">
      +      <div data-tab="handsets">
      +        <!--Full width content here-->
      +      </div>
      +
      +      <div data-tab="wearable">
      +        <!--Full width content here-->
      +      </div>
      +
      +      <div data-tab="tv">
      +        <!--Full width content here-->
      +      </div>
      +    </div>
      +  </div>
       
      -    } else {
      -      $('.suggest-card:not(.reference)').hide(300);
      +*/
      +(function() {
      +  $(document).ready(function() {
      +    $('.tab-carousel').each(function() {
      +      initWidget(this);
      +    });
      +  });
      +
      +  function initWidget(widget) {
      +    var $widget = $(widget);
      +    var $nav = $widget.find('.tab-nav');
      +    var $anchors = $nav.find('[data-tab]');
      +    var $li = $nav.find('li');
      +    var $contentContainer = $widget.find('.tab-carousel-content');
      +    var $tabs = $contentContainer.find('[data-tab]');
      +    var $curTab = $($tabs[0]); // Current tab is first tab.
      +    var width = $widget.width();
      +
      +    // Setup nav interactivity.
      +    $anchors.click(function(evt) {
      +      evt.preventDefault();
      +      var query = '[data-tab=' + $(this).data('tab') + ']';
      +      transitionWidget($tabs.filter(query));
      +    });
      +
      +    // Add highlight for navigation on first item.
      +    var $highlight = $('<div>').addClass('highlight')
      +      .css({left:$li.position().left + 'px', width:$li.outerWidth() + 'px'})
      +      .appendTo($nav);
      +
      +    // Store height since we will change contents to absolute.
      +    $contentContainer.height($contentContainer.height());
      +
      +    // Absolutely position tabs so they're ready for transition.
      +    $tabs.each(function(index) {
      +      $(this).css({position: 'absolute', left: index > 0 ? width + 'px' : '0'});
      +    });
      +
      +    function transitionWidget($toTab) {
      +      if (!$curTab.is($toTab)) {
      +        var curIndex = $tabs.index($curTab[0]);
      +        var toIndex = $tabs.index($toTab[0]);
      +        var dir = toIndex > curIndex ? 1 : -1;
      +
      +        // Animate content sections.
      +        $toTab.css({left:(width * dir) + 'px'});
      +        $curTab.animate({left:(width * -dir) + 'px'});
      +        $toTab.animate({left:'0'});
      +
      +        // Animate navigation highlight.
      +        $highlight.animate({left:$($li[toIndex]).position().left + 'px',
      +          width:$($li[toIndex]).outerWidth() + 'px'})
      +
      +        // Store new current section.
      +        $curTab = $toTab;
      +      }
           }
      -}
      +  }
      +})();
       
      -/** Called by the search input's onkeydown and onkeyup events.
      -  * Handles navigation with keyboard arrows, Enter key to invoke search,
      -  * otherwise invokes search suggestions on key-up event.
      -  * @param e       The JS event
      -  * @param kd      True if the event is key-down
      -  * @param toroot  A string for the site's root path
      -  * @returns       True if the event should bubble up
      -  */
      -function search_changed(e, kd, toroot)
      -{
      -    var currentLang = getLangPref();
      -    var search = document.getElementById("search_autocomplete");
      -    var text = search.value.replace(/(^ +)|( +$)/g, '');
      -    // get the ul hosting the currently selected item
      -    gSelectedColumn = gSelectedColumn >= 0 ? gSelectedColumn :  0;
      -    var $columns = $(".search_filtered_wrapper").find(".search_filtered:visible");
      -    var $selectedUl = $columns[gSelectedColumn];
      -
      -    // show/hide the close button
      -    if (text != '') {
      -        $("#search-close").removeClass("hide");
      +/**
      + * Auto TOC
      + *
      + * Upgrades h2s on the page to have a rule and be toggle-able on mobile.
      + */
      +(function($) {
      +  var upgraded = false;
      +  var h2Titles;
      +
      +  function initWidget() {
      +    // add HRs below all H2s (except for a few other h2 variants)
      +    // Consider doing this with css instead.
      +    h2Titles = $('h2').not('#qv h2, #tb h2, .sidebox h2, #devdoc-nav h2, h2.norule');
      +    h2Titles.css({paddingBottom:0}).after('<hr/>');
      +
      +    // Exit early if on older browser.
      +    if (!window.matchMedia) {
      +      return;
      +    }
      +
      +    // Only run logic in mobile layout.
      +    var query = window.matchMedia('(max-width: 719px)');
      +    if (query.matches) {
      +      makeTogglable();
           } else {
      -        $("#search-close").addClass("hide");
      -    }
      -    // 27 = esc
      -    if (e.keyCode == 27) {
      -        // close all search results
      -        if (kd) $('#search-close').trigger('click');
      -        return true;
      -    }
      -    // 13 = enter
      -    else if (e.keyCode == 13) {
      -        if (gSelectedIndex < 0) {
      -            $('.suggest-card').hide();
      -            if ($("#searchResults").is(":hidden") && (search.value != "")) {
      -              // if results aren't showing (and text not empty), return true to allow search to execute
      -              $('body,html').animate({scrollTop:0}, '500', 'swing');
      -              return true;
      -            } else {
      -              // otherwise, results are already showing, so allow ajax to auto refresh the results
      -              // and ignore this Enter press to avoid the reload.
      -              return false;
      -            }
      -        } else if (kd && gSelectedIndex >= 0) {
      -            // click the link corresponding to selected item
      -            $("a",$("li",$selectedUl)[gSelectedIndex]).get()[0].click();
      -            return false;
      -        }
      +      query.addListener(makeTogglable);
           }
      -    // If Google results are showing, return true to allow ajax search to execute
      -    else if ($("#searchResults").is(":visible")) {
      -        // Also, if search_results is scrolled out of view, scroll to top to make results visible
      -        if ((sticky ) && (search.value != "")) {
      -          $('body,html').animate({scrollTop:0}, '500', 'swing');
      -        }
      -        return true;
      +  }
      +
      +  function makeTogglable() {
      +    // Only run this logic once.
      +    if (upgraded) { return; }
      +    upgraded = true;
      +
      +    // Only make content h2s togglable.
      +    var contentTitles = h2Titles.filter('#jd-content *');
      +
      +    // If there are more than 1
      +    if (contentTitles.size() < 2) {
      +      return;
           }
      -    // 38 UP ARROW
      -    else if (kd && (e.keyCode == 38)) {
      -        // if the next item is a header, skip it
      -        if ($($("li", $selectedUl)[gSelectedIndex-1]).hasClass("header")) {
      -            gSelectedIndex--;
      -        }
      -        if (gSelectedIndex >= 0) {
      -            $('li', $selectedUl).removeClass('jd-selected');
      -            gSelectedIndex--;
      -            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -            // If user reaches top, reset selected column
      -            if (gSelectedIndex < 0) {
      -              gSelectedColumn = -1;
      -            }
      -        }
      -        return false;
      +
      +    contentTitles.each(function() {
      +      // Find all the relevant nodes.
      +      var $title = $(this);
      +      var $hr = $title.next();
      +      var $contents = allNextUntil($hr[0], 'h2, .next-docs');
      +      var $section = $($title)
      +        .add($hr)
      +        .add($title.prev('a[name]'))
      +        .add($contents);
      +      var $anchor = $section.first().prev();
      +      var anchorMethod = 'after';
      +      if ($anchor.length === 0) {
      +        $anchor = $title.parent();
      +        anchorMethod = 'prepend';
      +      }
      +
      +      // Some h2s are in their own container making it pretty hard to find the end, so skip.
      +      if ($contents.length === 0) {
      +        return;
      +      }
      +
      +      // Remove from DOM before messing with it. DOM is slow!
      +      $section.detach();
      +
      +      // Add mobile-only expand arrows.
      +      $title.prepend('<span class="dac-visible-mobile-inline-block">' +
      +          '<i class="dac-toggle-expand dac-sprite dac-expand-more-black"></i>' +
      +          '<i class="dac-toggle-collapse dac-sprite dac-expand-less-black"></i>' +
      +          '</span>')
      +        .attr('data-toggle', 'section');
      +
      +      // Wrap in magic markup.
      +      $section = $section.wrapAll('<div class="dac-toggle dac-mobile">').parent();
      +
      +      // extra div used for max-height calculation.
      +      $contents.wrapAll('<div class="dac-toggle-content dac-expand"><div>');
      +
      +      // Pre-expand section if requested.
      +      if ($title.hasClass('is-expanded')) {
      +        $section.addClass('is-expanded');
      +      }
      +
      +      // Pre-expand section if targetted by hash.
      +      if (location.hash && $section.find(location.hash).length) {
      +        $section.addClass('is-expanded');
      +      }
      +
      +      // Add it back to the dom.
      +      $anchor[anchorMethod].call($anchor, $section);
      +    });
      +  }
      +
      +  // Similar to $.fn.nextUntil() except we need all nodes, jQuery skips text nodes.
      +  function allNextUntil(elem, until) {
      +    var matched = [];
      +
      +    while ((elem = elem.nextSibling) && elem.nodeType !== 9) {
      +      if (elem.nodeType === 1 && jQuery(elem).is(until)) {
      +        break;
      +      }
      +      matched.push(elem);
           }
      -    // 40 DOWN ARROW
      -    else if (kd && (e.keyCode == 40)) {
      -        // if the next item is a header, skip it
      -        if ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header")) {
      -            gSelectedIndex++;
      +    return $(matched);
      +  }
      +
      +  $(function() {
      +    initWidget();
      +  });
      +})(jQuery);
      +
      +(function($, window) {
      +  'use strict';
      +
      +  // Blogger API info
      +  var apiUrl = 'https://www.googleapis.com/blogger/v3';
      +  var apiKey = 'AIzaSyCFhbGnjW06dYwvRCU8h_zjdpS4PYYbEe8';
      +
      +  // Blog IDs can be found in the markup of the blog posts
      +  var blogs = {
      +    'android-developers': {
      +      id: '6755709643044947179',
      +      title: 'Android Developers Blog'
      +    }
      +  };
      +  var monthNames = ['January', 'February', 'March', 'April', 'May', 'June',
      +      'July', 'August', 'September', 'October', 'November', 'December'];
      +
      +  var BlogReader = (function() {
      +    var reader;
      +
      +    function BlogReader() {
      +      this.doneSetup = false;
      +    }
      +
      +    /**
      +     * Initialize the blog reader and modal.
      +     */
      +    BlogReader.prototype.setup = function() {
      +      $('#jd-content').append(
      +          '<div id="blog-reader" data-modal="blog-reader" class="dac-modal dac-has-small-header">' +
      +            '<div class="dac-modal-container">' +
      +              '<div class="dac-modal-window">' +
      +                '<header class="dac-modal-header">' +
      +                  '<div class="dac-modal-header-actions">' +
      +                    '<a href="" class="dac-modal-header-open" target="_blank">' +
      +                      '<i class="dac-sprite dac-open-in-new"></i>' +
      +                    '</a>' +
      +                    '<button class="dac-modal-header-close" data-modal-toggle>' +
      +                    '</button>' +
      +                  '</div>' +
      +                  '<h2 class="norule dac-modal-header-title"></h2>' +
      +                '</header>' +
      +                '<div class="dac-modal-content dac-blog-reader">' +
      +                  '<time class="dac-blog-reader-date" pubDate></time>' +
      +                  '<h3 class="dac-blog-reader-title"></h3>' +
      +                  '<div class="dac-blog-reader-text clearfix"></div>' +
      +                '</div>' +
      +              '</div>' +
      +            '</div>' +
      +          '</div>');
      +
      +      this.blogReader = $('#blog-reader').dacModal();
      +
      +      this.doneSetup = true;
      +    };
      +
      +    BlogReader.prototype.openModal_ = function(blog, post) {
      +      var published = new Date(post.published);
      +      var formattedDate = monthNames[published.getMonth()] + ' ' + published.getDate() + ' ' + published.getFullYear();
      +      this.blogReader.find('.dac-modal-header-open').attr('href', post.url);
      +      this.blogReader.find('.dac-modal-header-title').text(blog.title);
      +      this.blogReader.find('.dac-blog-reader-title').html(post.title);
      +      this.blogReader.find('.dac-blog-reader-date').html(formattedDate);
      +      this.blogReader.find('.dac-blog-reader-text').html(post.content);
      +      this.blogReader.trigger('modal-open');
      +    };
      +
      +    /**
      +     * Show a blog post in a modal
      +     * @param  {string} blogName - The name of the Blogspot blog.
      +     * @param  {string} postPath - The path to the blog post.
      +     * @param  {bool} secondTry - Has it failed once?
      +     */
      +    BlogReader.prototype.showPost = function(blogName, postPath, secondTry) {
      +      var blog = blogs[blogName];
      +      var postUrl = 'https://' + blogName + '.blogspot.com' + postPath;
      +
      +      var url = apiUrl + '/blogs/' + blog.id + '/posts/bypath?path=' + encodeURIComponent(postPath) + '&key=' + apiKey;
      +      $.ajax(url, {timeout: 650}).done(this.openModal_.bind(this, blog)).fail(function(error) {
      +        // Retry once if we get an error
      +        if (error.status === 500 && !secondTry) {
      +          this.showPost(blogName, postPath, true);
      +        } else {
      +          window.location.href = postUrl;
               }
      -        if ((gSelectedIndex < $("li", $selectedUl).length-1) ||
      -                        ($($("li", $selectedUl)[gSelectedIndex+1]).hasClass("header"))) {
      -            $('li', $selectedUl).removeClass('jd-selected');
      -            gSelectedIndex++;
      -            $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      +      }.bind(this));
      +    };
      +
      +    return {
      +      getReader: function() {
      +        if (!reader) {
      +          reader = new BlogReader();
               }
      -        return false;
      +        return reader;
      +      }
      +    };
      +  })();
      +
      +  var blogReader = BlogReader.getReader();
      +
      +  function wrapLinkWithReader(e) {
      +    var el = $(e.currentTarget);
      +    if (el.hasClass('dac-modal-header-open')) {
      +      return;
           }
      -    // Consider left/right arrow navigation
      -    // NOTE: Order of suggest columns are reverse order (index position 0 is on right)
      -    else if (kd && $columns.length > 1 && gSelectedColumn >= 0) {
      -      // 37 LEFT ARROW
      -      // go left only if current column is not left-most column (last column)
      -      if (e.keyCode == 37 && gSelectedColumn < $columns.length - 1) {
      -        $('li', $selectedUl).removeClass('jd-selected');
      -        gSelectedColumn++;
      -        $selectedUl = $columns[gSelectedColumn];
      -        // keep or reset the selected item to last item as appropriate
      -        gSelectedIndex = gSelectedIndex >
      -                $("li", $selectedUl).length-1 ?
      -                $("li", $selectedUl).length-1 : gSelectedIndex;
      -        // if the corresponding item is a header, move down
      -        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
      -          gSelectedIndex++;
      -        }
      -        // set item selected
      -        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -        return false;
      +
      +    // Only catch links on blogspot.com
      +    var matches = el.attr('href').match(/https?:\/\/([^\.]*).blogspot.com([^$]*)/);
      +    if (matches && matches.length === 3) {
      +      var blogName = matches[1];
      +      var postPath = matches[2];
      +
      +      // Check if we have information about the blog
      +      if (!blogs[blogName]) {
      +        return;
             }
      -      // 39 RIGHT ARROW
      -      // go right only if current column is not the right-most column (first column)
      -      else if (e.keyCode == 39 && gSelectedColumn > 0) {
      -        $('li', $selectedUl).removeClass('jd-selected');
      -        gSelectedColumn--;
      -        $selectedUl = $columns[gSelectedColumn];
      -        // keep or reset the selected item to last item as appropriate
      -        gSelectedIndex = gSelectedIndex >
      -                $("li", $selectedUl).length-1 ?
      -                $("li", $selectedUl).length-1 : gSelectedIndex;
      -        // if the corresponding item is a header, move down
      -        if ($($("li", $selectedUl)[gSelectedIndex]).hasClass("header")) {
      -          gSelectedIndex++;
      -        }
      -        // set item selected
      -        $('li:nth-child('+(gSelectedIndex+1)+')', $selectedUl).addClass('jd-selected');
      -        return false;
      +
      +      // Setup the first time it's used
      +      if (!blogReader.doneSetup) {
      +        blogReader.setup();
             }
      +
      +      e.preventDefault();
      +      blogReader.showPost(blogName, postPath);
           }
      +  }
       
      -    // if key-up event and not arrow down/up/left/right,
      -    // read the search query and add suggestions to gMatches
      -    else if (!kd && (e.keyCode != 40)
      -                 && (e.keyCode != 38)
      -                 && (e.keyCode != 37)
      -                 && (e.keyCode != 39)) {
      -        gSelectedIndex = -1;
      -        gMatches = new Array();
      -        matchedCount = 0;
      -        gGoogleMatches = new Array();
      -        matchedCountGoogle = 0;
      -        gDocsMatches = new Array();
      -        matchedCountDocs = 0;
      -
      -        // Search for Android matches
      -        for (var i=0; i<DATA.length; i++) {
      -            var s = DATA[i];
      -            if (text.length != 0 &&
      -                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
      -                gMatches[matchedCount] = s;
      -                matchedCount++;
      -            }
      -        }
      -        rank_autocomplete_api_results(text, gMatches);
      -        for (var i=0; i<gMatches.length; i++) {
      -            var s = gMatches[i];
      -        }
      +  $(document).on('click.blog-reader', 'a.resource-card[href*="blogspot.com/"]',
      +      wrapLinkWithReader);
      +})(jQuery, window);
       
      +(function($) {
      +  $.fn.debounce = function(func, wait, immediate) {
      +    var timeout;
       
      -        // Search for Google matches
      -        for (var i=0; i<GOOGLE_DATA.length; i++) {
      -            var s = GOOGLE_DATA[i];
      -            if (text.length != 0 &&
      -                  s.label.toLowerCase().indexOf(text.toLowerCase()) != -1) {
      -                gGoogleMatches[matchedCountGoogle] = s;
      -                matchedCountGoogle++;
      -            }
      +    return function() {
      +      var context = this;
      +      var args = arguments;
      +
      +      var later = function() {
      +        timeout = null;
      +        if (!immediate) {
      +          func.apply(context, args);
               }
      -        rank_autocomplete_api_results(text, gGoogleMatches);
      -        for (var i=0; i<gGoogleMatches.length; i++) {
      -            var s = gGoogleMatches[i];
      +      };
      +
      +      var callNow = immediate && !timeout;
      +      clearTimeout(timeout);
      +      timeout = setTimeout(later, wait);
      +
      +      if (callNow) {
      +        func.apply(context, args);
      +      }
      +    };
      +  };
      +})(jQuery);
      +
      +/* Calculate the vertical area remaining */
      +(function($) {
      +  $.fn.ellipsisfade = function() {
      +    // Only fetch line-height of first element to avoid recalculate style.
      +    // Will be NaN if no elements match, which is ok.
      +    var lineHeight = parseInt(this.css('line-height'), 10);
      +
      +    this.each(function() {
      +      // get element text
      +      var $this = $(this);
      +      var remainingHeight = $this.parent().parent().height();
      +      $this.parent().siblings().each(function() {
      +        var elHeight;
      +        if ($(this).is(':visible')) {
      +          elHeight = $(this).outerHeight(true);
      +          remainingHeight = remainingHeight - elHeight;
               }
      +      });
      +
      +      var adjustedRemainingHeight = ((remainingHeight) / lineHeight >> 0) * lineHeight;
      +      $this.parent().css({height: adjustedRemainingHeight});
      +      $this.css({height: 'auto'});
      +    });
      +
      +    return this;
      +  };
       
      -        highlight_autocomplete_result_labels(text);
      +  /* Pass the line height to ellipsisfade() to adjust the height of the
      +   text container to show the max number of lines possible, without
      +   showing lines that are cut off. This works with the css ellipsis
      +   classes to fade last text line and apply an ellipsis char. */
      +  function updateEllipsis(context) {
      +    if (!(context instanceof jQuery)) {
      +      context = $('html');
      +    }
       
      +    context.find('.card-info .text').ellipsisfade();
      +  }
       
      +  $(window).on('resize', $.fn.debounce(updateEllipsis, 500));
      +  $(updateEllipsis);
      +  $('html').on('dac:domchange', function(e) { updateEllipsis($(e.target)); });
      +})(jQuery);
       
      -        // Search for matching JD docs
      -        if (text.length >= 2) {
      -          // match only the beginning of a word
      -          var queryStr = text.toLowerCase();
      +/* Filter */
      +(function($) {
      +  'use strict';
       
      -          // Search for Training classes
      -          for (var i=0; i<TRAINING_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = TRAINING_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      +  /**
      +   * A single filter item content.
      +   * @type {string} - Element template.
      +   * @private
      +   */
      +  var ITEM_STR_ = '<input type="checkbox" value="{{value}}" class="dac-form-checkbox" id="{{id}}">' +
      +      '<label for="{{id}}" class="dac-form-checkbox-button"></label>' +
      +      '<label for="{{id}}" class="dac-form-label">{{name}}</label>';
       
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Don't consider doc title for lessons (only for class landing pages),
      -            // unless the lesson has a tag that already matches
      -            if ((s.lang == currentLang) &&
      -                  (!(s.type == "training" && s.url.indexOf("index.html") == -1) || matched)) {
      -              // it matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +  /**
      +   * Template for a chip element.
      +   * @type {*|HTMLElement}
      +   * @private
      +   */
      +  var CHIP_BASE_ = $('<li class="dac-filter-chip">' +
      +    '<button class="dac-filter-chip-close">' +
      +      '<i class="dac-sprite dac-close-black dac-filter-chip-close-icon"></i>' +
      +    '</button>' +
      +  '</li>');
      +
      +  /**
      +   * Component to handle narrowing down resources.
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function Filter(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, Filter.DEFAULTS_, options);
      +    this.init();
      +  }
      +
      +  Filter.DEFAULTS_ = {
      +    activeClass: 'dac-active',
      +    chipsDataAttr: 'filter-chips',
      +    nameDataAttr: 'filter-name',
      +    countDataAttr: 'filter-count',
      +    tabViewDataAttr: 'tab-view',
      +    valueDataAttr: 'filter-value'
      +  };
      +
      +  /**
      +   * Draw resource cards.
      +   * @param {Array} resources
      +   * @private
      +   */
      +  Filter.prototype.draw_ = function(resources) {
      +    var that = this;
      +
      +    if (resources.length === 0) {
      +      this.containerEl_.html('<p class="dac-filter-message">Nothing matches selected filters.</p>');
      +      return;
      +    }
       
      +    // Draw resources.
      +    that.containerEl_.resourceWidget(resources, that.data_.options);
      +  };
       
      -          // Search for API Guides
      -          for (var i=0; i<GUIDE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = GUIDE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      +  /**
      +   * Initialize a Filter component.
      +   */
      +  Filter.prototype.init = function() {
      +    this.containerEl_ = $(this.options.filter);
       
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      +    // Setup data settings
      +    this.data_ = {};
      +    this.data_.chips = {};
      +    this.data_.options = this.containerEl_.widgetOptions();
      +    this.data_.all = window.metadata.query(this.data_.options);
       
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +    // Initialize filter UI
      +    this.initUi();
      +  };
       
      +  /**
      +   * Generate a chip for a given filter item.
      +   * @param {Object} item - A single filter option (checkbox container).
      +   * @returns {HTMLElement} A new Chip element.
      +   */
      +  Filter.prototype.chipForItem = function(item) {
      +    var chip = CHIP_BASE_.clone();
      +    chip.prepend(this.data_.chips[item.data('filter-value')]);
      +    chip.data('item.dac-filter', item);
      +    item.data('chip.dac-filter', chip);
      +    this.addToItemValue(item, 1);
      +    return chip[0];
      +  };
       
      -          // Search for Tools Guides
      -          for (var i=0; i<TOOLS_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = TOOLS_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -                if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -                if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +  /**
      +   * Update count of checked filter items.
      +   * @param {Object} item - A single filter option (checkbox container).
      +   * @param {Number} value - Either -1 or 1.
      +   */
      +  Filter.prototype.addToItemValue = function(item, value) {
      +    var tab = item.parent().data(this.options.tabViewDataAttr);
      +    var countEl = this.countEl_.filter('[data-' + this.options.countDataAttr + '="' + tab + '"]');
      +    var count = value + parseInt(countEl.text(), 10);
      +    countEl.text(count);
      +    countEl.toggleClass('dac-disabled', count === 0);
      +  };
       
      +  /**
      +   * Set event listeners.
      +   * @private
      +   */
      +  Filter.prototype.setEventListeners_ = function() {
      +    this.chipsEl_.on('click.dac-filter', '.dac-filter-chip-close', this.closeChipHandler_.bind(this));
      +    this.tabViewEl_.on('change.dac-filter', ':checkbox', this.toggleCheckboxHandler_.bind(this));
      +  };
       
      -          // Search for About docs
      -          for (var i=0; i<ABOUT_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = ABOUT_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +  /**
      +   * Check filter items that are active by default.
      +   */
      +  Filter.prototype.activateInitialFilters_ = function() {
      +    var id = (new Date()).getTime();
      +    var initiallyCheckedValues = this.data_.options.query.replace(/,\s*/g, '+').split('+');
      +    var chips = document.createDocumentFragment();
      +    var that = this;
       
      +    this.items_.each(function(i) {
      +      var item = $(this);
      +      var opts = item.data();
      +      that.data_.chips[opts.filterValue] = opts.filterName;
       
      -          // Search for Design guides
      -          for (var i=0; i<DESIGN_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = DESIGN_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +      var checkbox = $(ITEM_STR_.replace(/\{\{name\}\}/g, opts.filterName)
      +        .replace(/\{\{value\}\}/g, opts.filterValue)
      +        .replace(/\{\{id\}\}/g, 'filter-' + id + '-' + (i + 1)));
       
      +      if (initiallyCheckedValues.indexOf(opts.filterValue) > -1) {
      +        checkbox[0].checked = true;
      +        chips.appendChild(that.chipForItem(item));
      +      }
       
      -          // Search for Distribute guides
      -          for (var i=0; i<DISTRIBUTE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = DISTRIBUTE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +      item.append(checkbox);
      +    });
       
      +    this.chipsEl_.append(chips);
      +  };
       
      -          // Search for Google guides
      -          for (var i=0; i<GOOGLE_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = GOOGLE_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +  /**
      +   * Initialize the Filter view
      +   */
      +  Filter.prototype.initUi = function() {
      +    // Cache DOM elements
      +    this.chipsEl_ = this.el.find('[data-' + this.options.chipsDataAttr + ']');
      +    this.countEl_ = this.el.find('[data-' + this.options.countDataAttr + ']');
      +    this.tabViewEl_ = this.el.find('[data-' + this.options.tabViewDataAttr + ']');
      +    this.items_ = this.el.find('[data-' + this.options.nameDataAttr + ']');
      +
      +    // Setup UI
      +    this.draw_(this.data_.all);
      +    this.activateInitialFilters_();
      +    this.setEventListeners_();
      +  };
       
      +  /**
      +   * @returns {[types|Array, tags|Array, category|Array]}
      +   */
      +  Filter.prototype.getActiveClauses = function() {
      +    var tags = [];
      +    var types = [];
      +    var categories = [];
      +
      +    this.items_.find(':checked').each(function(i, checkbox) {
      +      // Currently, there is implicit business logic here that `tag` is AND'ed together
      +      // while `type` is OR'ed. So , and + do the same thing here. It would be great to
      +      // reuse the same query engine for filters, but it would need more powerful syntax.
      +      // Probably parenthesis, to support "tag:dog + tag:cat + (type:video, type:blog)"
      +      var expression = $(checkbox).val();
      +      var regex = /(\w+):(\w+)/g;
      +      var match;
      +
      +      while (match = regex.exec(expression)) {
      +        switch (match[1]) {
      +          case 'category':
      +            categories.push(match[2]);
      +            break;
      +          case 'tag':
      +            tags.push(match[2]);
      +            break;
      +          case 'type':
      +            types.push(match[2]);
      +            break;
      +        }
      +      }
      +    });
       
      -          // Search for Samples
      -          for (var i=0; i<SAMPLES_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = SAMPLES_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title.t
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +    return [types, tags, categories];
      +  };
       
      -          // Search for Preview Guides
      -          for (var i=0; i<PREVIEW_RESOURCES.length; i++) {
      -            // current search comparison, with counters for tag and title,
      -            // used later to improve ranking
      -            var s = PREVIEW_RESOURCES[i];
      -            s.matched_tag = 0;
      -            s.matched_title = 0;
      -            var matched = false;
      -
      -            // Check if query matches any tags; work backwards toward 1 to assist ranking
      -            for (var j = s.keywords.length - 1; j >= 0; j--) {
      -              // it matches a tag
      -              if (s.keywords[j].toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_tag = j + 1; // add 1 to index position
      -              }
      -            }
      -            // Check if query matches the doc title, but only for current language
      -            if (s.lang == currentLang) {
      -              // if query matches the doc title
      -              if (s.title.toLowerCase().indexOf(queryStr) == 0) {
      -                matched = true;
      -                s.matched_title = 1;
      -              }
      -            }
      -            if (matched) {
      -              gDocsMatches[matchedCountDocs] = s;
      -              matchedCountDocs++;
      -            }
      -          }
      +  /**
      +   * Actual filtering logic.
      +   * @returns {Array}
      +   */
      +  Filter.prototype.filteredResources = function() {
      +    var data = this.getActiveClauses();
      +    var types = data[0];
      +    var tags = data[1];
      +    var categories = data[2];
      +    var resources = [];
      +    var resource = {};
      +    var tag = '';
      +    var shouldAddResource = true;
      +
      +    for (var resourceIndex = 0; resourceIndex < this.data_.all.length; resourceIndex++) {
      +      resource = this.data_.all[resourceIndex];
      +      shouldAddResource = types.indexOf(resource.type) > -1;
      +
      +      if (categories && categories.length > 0) {
      +        shouldAddResource = shouldAddResource && categories.indexOf(resource.category) > -1;
      +      }
       
      -          // Rank/sort all the matched pages
      -          rank_autocomplete_doc_results(text, gDocsMatches);
      -        }
      +      for (var tagIndex = 0; shouldAddResource && tagIndex < tags.length; tagIndex++) {
      +        tag = tags[tagIndex];
      +        shouldAddResource = resource.tags.indexOf(tag) > -1;
      +      }
       
      -        // draw the suggestions
      -        sync_selection_table(toroot);
      -        return true; // allow the event to bubble up to the search api
      +      if (shouldAddResource) {
      +        resources.push(resource);
      +      }
           }
      -}
      -
      -/* Order the jd doc result list based on match quality */
      -function rank_autocomplete_doc_results(query, matches) {
      -    query = query || '';
      -    if (!matches || !matches.length)
      -      return;
       
      -    var _resultScoreFn = function(match) {
      -        var score = 1.0;
      +    return resources;
      +  };
       
      -        // if the query matched a tag
      -        if (match.matched_tag > 0) {
      -          // multiply score by factor relative to position in tags list (max of 3)
      -          score *= 3 / match.matched_tag;
      +  /**
      +   * Close Chip Handler
      +   * @param {Event} event - Click event
      +   * @private
      +   */
      +  Filter.prototype.closeChipHandler_ = function(event) {
      +    var chip = $(event.currentTarget).parent();
      +    var checkbox = chip.data('item.dac-filter').find(':first-child')[0];
      +    checkbox.checked = false;
      +    this.changeStateForCheckbox(checkbox);
      +  };
       
      -          // if it also matched the title
      -          if (match.matched_title > 0) {
      -            score *= 2;
      -          }
      -        } else if (match.matched_title > 0) {
      -          score *= 3;
      -        }
      +  /**
      +   * Handle filter item state change.
      +   * @param {Event} event - Change event
      +   * @private
      +   */
      +  Filter.prototype.toggleCheckboxHandler_ = function(event) {
      +    this.changeStateForCheckbox(event.currentTarget);
      +  };
       
      -        return score;
      -    };
      +  /**
      +   * Redraw resource view based on new state.
      +   * @param checkbox
      +   */
      +  Filter.prototype.changeStateForCheckbox = function(checkbox) {
      +    var item = $(checkbox).parent();
       
      -    for (var i=0; i<matches.length; i++) {
      -        matches[i].__resultScore = _resultScoreFn(matches[i]);
      +    if (checkbox.checked) {
      +      this.chipsEl_.append(this.chipForItem(item));
      +      devsite.analytics.trackAnalyticsEvent('event',
      +          'Filters', 'Check', $(checkbox).val());
      +    } else {
      +      item.data('chip.dac-filter').remove();
      +      this.addToItemValue(item, -1);
      +      devsite.analytics.trackAnalyticsEvent('event',
      +          'Filters', 'Uncheck', $(checkbox).val());
           }
       
      -    matches.sort(function(a,b){
      -        var n = b.__resultScore - a.__resultScore;
      -        if (n == 0) // lexicographical sort if scores are the same
      -            n = (a.label < b.label) ? -1 : 1;
      -        return n;
      -    });
      -}
      +    this.draw_(this.filteredResources());
      +  };
       
      -/* Order the result list based on match quality */
      -function rank_autocomplete_api_results(query, matches) {
      -    query = query || '';
      -    if (!matches || !matches.length)
      -      return;
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacFilter = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      new Filter(el, el.data());
      +    });
      +  };
       
      -    // helper function that gets the last occurence index of the given regex
      -    // in the given string, or -1 if not found
      -    var _lastSearch = function(s, re) {
      -      if (s == '')
      -        return -1;
      -      var l = -1;
      -      var tmp;
      -      while ((tmp = s.search(re)) >= 0) {
      -        if (l < 0) l = 0;
      -        l += tmp;
      -        s = s.substr(tmp + 1);
      -      }
      -      return l;
      -    };
      +  /**
      +   * Data Attribute API
      +   */
      +  $(function() {
      +    $('[data-filter]').dacFilter();
      +  });
      +})(jQuery);
       
      -    // helper function that counts the occurrences of a given character in
      -    // a given string
      -    var _countChar = function(s, c) {
      -      var n = 0;
      -      for (var i=0; i<s.length; i++)
      -        if (s.charAt(i) == c) ++n;
      -      return n;
      -    };
      +(function($) {
      +  'use strict';
       
      -    var queryLower = query.toLowerCase();
      -    var queryAlnum = (queryLower.match(/\w+/) || [''])[0];
      -    var partPrefixAlnumRE = new RegExp('\\b' + queryAlnum);
      -    var partExactAlnumRE = new RegExp('\\b' + queryAlnum + '\\b');
      +  /**
      +   * Toggle Floating Label state.
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param options
      +   * @constructor
      +   */
      +  function FloatingLabel(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, FloatingLabel.DEFAULTS_, options);
      +    this.group = this.el.closest('.dac-form-input-group');
      +    this.input = this.group.find('.dac-form-input');
       
      -    var _resultScoreFn = function(result) {
      -        // scores are calculated based on exact and prefix matches,
      -        // and then number of path separators (dots) from the last
      -        // match (i.e. favoring classes and deep package names)
      -        var score = 1.0;
      -        var labelLower = result.label.toLowerCase();
      -        var t;
      -        t = _lastSearch(labelLower, partExactAlnumRE);
      -        if (t >= 0) {
      -            // exact part match
      -            var partsAfter = _countChar(labelLower.substr(t + 1), '.');
      -            score *= 200 / (partsAfter + 1);
      -        } else {
      -            t = _lastSearch(labelLower, partPrefixAlnumRE);
      -            if (t >= 0) {
      -                // part prefix match
      -                var partsAfter = _countChar(labelLower.substr(t + 1), '.');
      -                score *= 20 / (partsAfter + 1);
      -            }
      -        }
      +    this.checkValue_ = this.checkValue_.bind(this);
      +    this.checkValue_();
       
      -        return score;
      -    };
      +    this.input.on('focus', function() {
      +      this.group.addClass('dac-focused');
      +    }.bind(this));
      +    this.input.on('blur', function() {
      +      this.group.removeClass('dac-focused');
      +      this.checkValue_();
      +    }.bind(this));
      +    this.input.on('keyup', this.checkValue_);
      +  }
       
      -    for (var i=0; i<matches.length; i++) {
      -        // if the API is deprecated, default score is 0; otherwise, perform scoring
      -        if (matches[i].deprecated == "true") {
      -          matches[i].__resultScore = 0;
      -        } else {
      -          matches[i].__resultScore = _resultScoreFn(matches[i]);
      -        }
      +  /**
      +   * The label is moved out of the textbox when it has a value.
      +   */
      +  FloatingLabel.prototype.checkValue_ = function() {
      +    if (this.input.val().length) {
      +      this.group.addClass('dac-has-value');
      +    } else {
      +      this.group.removeClass('dac-has-value');
           }
      +  };
       
      -    matches.sort(function(a,b){
      -        var n = b.__resultScore - a.__resultScore;
      -        if (n == 0) // lexicographical sort if scores are the same
      -            n = (a.label < b.label) ? -1 : 1;
      -        return n;
      +  /**
      +   * jQuery plugin
      +   * @param  {object} options - Override default options.
      +   */
      +  $.fn.dacFloatingLabel = function(options) {
      +    return this.each(function() {
      +      new FloatingLabel(this, options);
           });
      -}
      +  };
       
      -/* Add emphasis to part of string that matches query */
      -function highlight_autocomplete_result_labels(query) {
      -    query = query || '';
      -    if ((!gMatches || !gMatches.length) && (!gGoogleMatches || !gGoogleMatches.length))
      -      return;
      +  $(document).on('ready.aranja', function() {
      +    $('.dac-form-floatlabel').each(function() {
      +      $(this).dacFloatingLabel($(this).data());
      +    });
      +  });
      +})(jQuery);
       
      -    var queryLower = query.toLowerCase();
      -    var queryAlnumDot = (queryLower.match(/[\w\.]+/) || [''])[0];
      -    var queryRE = new RegExp(
      -        '(' + queryAlnumDot.replace(/\./g, '\\.') + ')', 'ig');
      -    for (var i=0; i<gMatches.length; i++) {
      -        gMatches[i].__hilabel = gMatches[i].label.replace(
      -            queryRE, '<b>$1</b>');
      -    }
      -    for (var i=0; i<gGoogleMatches.length; i++) {
      -        gGoogleMatches[i].__hilabel = gGoogleMatches[i].label.replace(
      -            queryRE, '<b>$1</b>');
      -    }
      -}
      +(function($) {
      +  'use strict';
       
      -function search_focus_changed(obj, focused)
      -{
      -    if (!focused) {
      -        if(obj.value == ""){
      -          $("#search-close").addClass("hide");
      -        }
      -        $(".suggest-card").hide();
      +  /**
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function Crumbs(selected, options) {
      +    this.options = $.extend({}, Crumbs.DEFAULTS_, options);
      +    this.el = $(this.options.container);
      +
      +    // Do not build breadcrumbs for landing site.
      +    if (!selected || location.pathname === '/index.html' || location.pathname === '/') {
      +      return;
           }
      -}
       
      -function submit_search() {
      -  var query = escapeHTML(document.getElementById('search_autocomplete').value);
      -  location.hash = 'q=' + query;
      -  searchControl.query = query;
      -  searchControl.init();
      -  searchControl.trackSearchRequest(query);
      -  $("#searchResults").slideDown('slow', setStickyTop);
      -  return false;
      -}
      +    // Cache navigation resources
      +    this.selected = $(selected);
      +    this.selectedParent = this.selected.closest('.dac-nav-secondary').siblings('a');
       
      -function hideResults() {
      -  $("#searchResults").slideUp('fast', setStickyTop);
      -  $("#search-close").addClass("hide");
      -  location.hash = '';
      +    // Build the breadcrumb list.
      +    this.init();
      +  }
       
      -  $("#search_autocomplete").val("").blur();
      +  Crumbs.DEFAULTS_ = {
      +    container: '.dac-header-crumbs',
      +    crumbItem: $('<li class="dac-header-crumbs-item">'),
      +    linkClass: 'dac-header-crumbs-link'
      +  };
       
      -  // reset the ajax search callback to nothing, so results don't appear unless ENTER
      -  searchControl.reset();
      +  Crumbs.prototype.init = function() {
      +    Crumbs.buildCrumbForLink(this.selected.clone()).appendTo(this.el);
       
      -  return false;
      -}
      +    if (this.selectedParent.length) {
      +      Crumbs.buildCrumbForLink(this.selectedParent.clone()).prependTo(this.el);
      +    }
       
      -/* ########################################################## */
      -/* ################  CUSTOM SEARCH ENGINE  ################## */
      -/* ########################################################## */
      -var searchControl = null;
      -var dacsearch = dacsearch || {};
      +    // Reveal the breadcrumbs
      +    this.el.addClass('dac-has-content');
      +  };
       
      -/**
      - * The custom search engine API.
      - * @constructor
      - */
      -dacsearch.CustomSearchEngine = function() {
         /**
      -   * The last response from Google CSE.
      -   * @private {Object}
      +   * Build a HTML structure for a breadcrumb.
      +   * @param {string} link
      +   * @return {jQuery}
          */
      -  this.resultQuery_ = {};
      -
      -  /** @private {?Element} */
      -  this.searchResultEl_ = null;
      -
      -  /** @private {?Element} */
      -  this.searchInputEl_ = null;
      -
      -  /** @private {string} */
      -  this.query = '';
      -};
      -
      -/**
      - * Initializes DAC's Google custom search engine.
      - * @export
      - */
      -dacsearch.CustomSearchEngine.prototype.init = function() {
      -  this.searchResultEl_ = $('#leftSearchControl');
      -  this.searchResultEl_.empty();
      -  this.searchInputEl_ = $('#search_autocomplete');
      -  this.searchInputEl_.focus().val(this.query);
      -  this.getResults_();
      -  this.bindEvents_();
      -};
      +  Crumbs.buildCrumbForLink = function(link) {
      +    link.find('br').replaceWith(' ');
       
      +    var crumbLink = $('<a>')
      +      .attr('class', Crumbs.DEFAULTS_.linkClass)
      +      .attr('href', link.attr('href'))
      +      .text(link.text());
       
      -/**
      - * Binds the keyup event to the search input.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.bindEvents_ = function() {
      -  this.searchInputEl_.keyup(this.debounce_(function(e) {
      -    var code = e.which;
      -    if (code != 13) {
      -      this.query = escapeHTML(this.searchInputEl_.val());
      -      location.hash = 'q=' + encodeURI(this.query);
      -      this.searchResultEl_.empty();
      -      this.getResults_();
      -    }
      -  }.bind(this), 250));
      -};
      +    return Crumbs.DEFAULTS_.crumbItem.clone().append(crumbLink);
      +  };
       
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacCrumbs = function(options) {
      +    return this.each(function() {
      +      new Crumbs(this, options);
      +    });
      +  };
      +})(jQuery);
       
      -/**
      - * Resets the search control.
      - */
      -dacsearch.CustomSearchEngine.prototype.reset = function() {
      -  this.query = '';
      -  this.searchInputEl_.off('keyup');
      -  this.searchResultEl_.empty();
      -  this.updateResultTitle_();
      -};
      +(function($) {
      +  'use strict';
       
      +  /**
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function SearchInput(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, SearchInput.DEFAULTS_, options);
      +    this.body = $('body');
      +    this.input = this.el.find('input');
      +    this.close = this.el.find(this.options.closeButton);
      +    this.clear = this.el.find(this.options.clearButton);
      +    this.icon = this.el.find('.' + this.options.iconClass);
      +    this.init();
      +  }
       
      -/**
      - * Updates the search query text at the top of the results.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.updateResultTitle_ = function() {
      -  $("#searchTitle").html("Results for <em>" + this.query + "</em>");
      -};
      +  SearchInput.DEFAULTS_ = {
      +    activeClass: 'dac-active',
      +    activeIconClass: 'dac-search',
      +    closeButton: '[data-search-close]',
      +    clearButton: '[data-search-clear]',
      +    hiddenClass: 'dac-hidden',
      +    iconClass: 'dac-header-search-icon',
      +    searchModeClass: 'dac-search-mode',
      +    transitionDuration: 250
      +  };
       
      +  SearchInput.prototype.init = function() {
      +    this.input.on('focus.dac-search', this.setActiveState.bind(this))
      +              .on('input.dac-search', this.checkInputValue.bind(this));
      +    this.close.on('click.dac-search', this.unsetActiveStateHandler_.bind(this));
      +    this.clear.on('click.dac-search', this.clearInput.bind(this));
      +  };
       
      -/**
      - * Makes the CSE api call and gets the results.
      - * @param {number=} opt_start The optional start index.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.getResults_ = function(opt_start) {
      -  var lang = getLangPref();
      -  // Fix zh-cn to be zh-CN.
      -  lang = lang.replace(/-\w+/, function(m) { return m.toUpperCase(); });
      -  var cseUrl = 'https://content.googleapis.com/customsearch/v1?';
      -  var searchParams = {
      -    cx: '000521750095050289010:zpcpi1ea4s8',
      -    key: 'AIzaSyCFhbGnjW06dYwvRCU8h_zjdpS4PYYbEe8',
      -    q: this.query,
      -    start: opt_start || 1,
      -    num: 6,
      -    hl: lang,
      -    fields: 'queries,items(pagemap,link,title,htmlSnippet,formattedUrl)'
      -  };
      -
      -  $.get(cseUrl + $.param(searchParams), function(data) {
      -    this.resultQuery_ = data;
      -    this.renderResults_(data);
      -    this.updateResultTitle_(this.query);
      -  }.bind(this));
      -};
      +  SearchInput.prototype.setActiveState = function() {
      +    var that = this;
       
      +    this.clear.addClass(this.options.hiddenClass);
      +    this.body.addClass(this.options.searchModeClass);
      +    this.checkInputValue();
       
      -/**
      - * Renders the results.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.renderResults_ = function(results) {
      -  var el = this.searchResultEl_;
      +    // Set icon to black after background has faded to white.
      +    setTimeout(function() {
      +      that.icon.addClass(that.options.activeIconClass);
      +    }, this.options.transitionDuration);
      +  };
       
      -  if (!results.items) {
      -    el.append($('<div>').text('No results'));
      -    return;
      -  }
      +  SearchInput.prototype.unsetActiveStateHandler_ = function(event) {
      +    event.preventDefault();
      +    this.unsetActiveState();
      +  };
       
      -  for (var i = 0; i < results.items.length; i++) {
      -    var item = results.items[i];
      -    var hasImage = item.pagemap && item.pagemap.cse_thumbnail;
      -    var sectionMatch = item.link.match(/developer\.android\.com\/(\w*)/);
      -    var section = (sectionMatch && sectionMatch[1]) || 'blog';
      +  SearchInput.prototype.unsetActiveState = function() {
      +    this.icon.removeClass(this.options.activeIconClass);
      +    this.clear.addClass(this.options.hiddenClass);
      +    this.body.removeClass(this.options.searchModeClass);
      +  };
       
      -    var entry = $('<div>').addClass('dac-custom-search-entry cols');
      +  SearchInput.prototype.clearInput = function(event) {
      +    event.preventDefault();
      +    this.input.val('');
      +    this.clear.addClass(this.options.hiddenClass);
      +  };
       
      -    if (hasImage) {
      -      var image = item.pagemap.cse_thumbnail[0];
      -      entry.append($('<div>').addClass('col-1of6')
      -        .append($('<div>').addClass('dac-custom-search-image').css(
      -        'background-image', 'url(' + image.src + ')')));
      +  SearchInput.prototype.checkInputValue = function() {
      +    if (this.input.val().length) {
      +      this.clear.removeClass(this.options.hiddenClass);
      +    } else {
      +      this.clear.addClass(this.options.hiddenClass);
           }
      +  };
       
      -    var linkTitleEl = $('<a>').text(item.title).attr('href', item.link);
      -    linkTitleEl.click(function(e) {
      -      ga('send', 'event', 'Google Custom Search',
      -          'clicked: ' + linkTitleEl.attr('href'),
      -          'query: ' + $("#search_autocomplete").val().toLowerCase());
      -    });
      -
      -    var linkUrlEl = $('<a>').addClass('dac-custom-search-link').text(
      -        item.formattedUrl).attr('href', item.link);
      -    linkUrlEl.click(function(e) {
      -      ga('send', 'event', 'Google Custom Search',
      -          'clicked: ' + linkUrlEl.attr('href'),
      -          'query: ' + $("#search_autocomplete").val().toLowerCase());
      +  /**
      +   * jQuery plugin
      +   * @param {object} options - Override default options.
      +   */
      +  $.fn.dacSearchInput = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      el.data('search-input.dac', new SearchInput(el, el.data()));
           });
      +  };
       
      +  /**
      +   * Data Attribute API
      +   */
      +  $(function() {
      +    $('[data-search]').dacSearchInput();
      +  });
      +})(jQuery);
       
      -    entry.append($('<div>').addClass(hasImage ? 'col-5of6' : 'col-6of6')
      -      .append($('<p>').addClass('dac-custom-search-section').text(section))
      -      .append(
      -        linkTitleEl.wrap('<h2>').parent().addClass('dac-custom-search-title'))
      -      .append($('<p>').addClass('dac-custom-search-snippet')
      -      .html(item.htmlSnippet.replace(/<br>/g, ''))).append(linkUrlEl));
      +/* global METADATA */
      +(function($) {
      +  function DacCarouselQuery(el) {
      +    el = $(el);
       
      -    el.append(entry);
      -  }
      +    var opts = el.data();
      +    opts.maxResults = parseInt(opts.maxResults || '100', 10);
      +    opts.query = opts.carouselQuery;
      +    var resources = window.metadata.query(opts);
       
      -  if ($('#dac-custom-search-load-more')) {
      -    $('#dac-custom-search-load-more').remove();
      -  }
      +    el.empty();
      +    $(resources).each(function() {
      +      var resource = $.extend({}, this, METADATA.carousel[this.url]);
      +      el.dacHero(resource);
      +    });
       
      -  if (results.queries.nextPage) {
      -    var loadMoreButton = $('<button id="dac-custom-search-load-more">')
      -      .addClass('dac-custom-search-load-more')
      -      .text('Load more')
      -      .click(function() {
      -        this.loadMoreResults_();
      -      }.bind(this));
      +    // Pagination element.
      +    el.append('<div class="dac-hero-carousel-pagination"><div class="wrap" data-carousel-pagination>');
       
      -    el.append(loadMoreButton);
      +    el.dacCarousel();
         }
      -};
       
      +  // jQuery plugin
      +  $.fn.dacCarouselQuery = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      var data = el.data('dac.carouselQuery');
       
      -/**
      - * Loads more results.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.loadMoreResults_ = function() {
      -  this.query = this.resultQuery_.queries.request[0].searchTerms;
      -  var start = this.resultQuery_.queries.nextPage[0].startIndex;
      -  var loadMoreButton = this.searchResultEl_.find(
      -      '#dac-custom-search-load-more');
      -  loadMoreButton.text('Loading more...');
      -  this.getResults_(start);
      -  this.trackSearchRequest(this.query + ' startIndex = ' + start);
      -};
      +      if (!data) { el.data('dac.carouselQuery', (data = new DacCarouselQuery(el))); }
      +    });
      +  };
       
      +  // Data API
      +  $(function() {
      +    $('[data-carousel-query]').dacCarouselQuery();
      +  });
      +})(jQuery);
       
      -/**
      - * Tracks a search request.
      - * @param {string} query The query for the request,
      - *                       includes start index if loading more results.
      - */
      -dacsearch.CustomSearchEngine.prototype.trackSearchRequest = function(query) {
      -  ga('send', 'event', 'Google Custom Search Submit', 'submit search query',
      -      'query: ' + query);
      -};
      +(function($) {
      +  /**
      +   * A CSS based carousel, inspired by SequenceJS.
      +   * @param {jQuery} el
      +   * @param {object} options
      +   * @constructor
      +   */
      +  function DacCarousel(el, options) {
      +    this.el = $(el);
      +    this.options = options = $.extend({}, DacCarousel.OPTIONS, this.el.data(), options || {});
      +    this.frames = this.el.find(options.frameSelector);
      +    this.count = this.frames.size();
      +    this.current = options.start;
       
      +    this.initPagination();
      +    this.initEvents();
      +    this.initFrame();
      +  }
       
      -/**
      - * Returns a function, that, as long as it continues to be invoked, will not
      - * be triggered. The function will be called after it stops being called for
      - * N milliseconds.
      - * @param {Function} func The function to debounce.
      - * @param {number} wait The number of milliseconds to wait before calling the function.
      - * @private
      - */
      -dacsearch.CustomSearchEngine.prototype.debounce_ = function(func, wait) {
      -  var timeout;
      -  return function() {
      -    var context = this, args = arguments;
      -    var later = function() {
      -      timeout = null;
      -      func.apply(context, args);
      -    };
      -   clearTimeout(timeout);
      -   timeout = setTimeout(later, wait);
      +  DacCarousel.OPTIONS = {
      +    auto:      true,
      +    autoTime:  10000,
      +    autoMinTime: 5000,
      +    btnPrev:   '[data-carousel-prev]',
      +    btnNext:   '[data-carousel-next]',
      +    frameSelector: 'article',
      +    loop:      true,
      +    start:     0,
      +    swipeThreshold: 160,
      +    pagination: '[data-carousel-pagination]'
         };
      -};
       
      +  DacCarousel.prototype.initPagination = function() {
      +    this.pagination = $([]);
      +    if (!this.options.pagination) { return; }
       
      -google.setOnLoadCallback(function(){
      -  searchControl = new dacsearch.CustomSearchEngine();
      -  if (location.hash.indexOf("q=") == -1) {
      -    // if there's no query in the url, don't search and make sure results are hidden
      -    $('#searchResults').hide();
      -    return;
      -  } else {
      -    // first time loading search results for this page
      -    searchControl.query = escapeHTML(decodeURI(location.hash.split('q=')[1]));
      -    searchControl.init();
      -    searchControl.trackSearchRequest(searchControl.query);
      -    $('#searchResults').slideDown('slow', setStickyTop);
      -    $("#search-close").removeClass("hide");
      -  }
      -}, true);
      -
      -/* Adjust the scroll position to account for sticky header, only if the hash matches an id.
      -   This does not handle <a name=""> tags. Some CSS fixes those, but only for reference docs. */
      -function offsetScrollForSticky() {
      -  // Ignore if there's no search bar (some special pages have no header)
      -  if ($("#search-container").length < 1) return;
      -
      -  var hash = escape(location.hash.substr(1));
      -  var $matchingElement = $("#"+hash);
      -  // Sanity check that there's an element with that ID on the page
      -  if ($matchingElement.length) {
      -    // If the position of the target element is near the top of the page (<20px, where we expect it
      -    // to be because we need to move it down 60px to become in view), then move it down 60px
      -    if (Math.abs($matchingElement.offset().top - $(window).scrollTop()) < 20) {
      -      $(window).scrollTop($(window).scrollTop() - 60);
      -    }
      -  }
      -}
      +    var pagination = $('<ul class="dac-pagination">');
      +    var parent = this.el;
      +    if (typeof this.options.pagination === 'string') { parent = this.el.find(this.options.pagination); }
       
      -// when an event on the browser history occurs (back, forward, load) requery hash and do search
      -$(window).hashchange( function(){
      -  // Ignore if there's no search bar (some special pages have no header)
      -  if ($("#search-container").length < 1) return;
      +    if (this.count > 1) {
      +      for (var i = 0; i < this.count; i++) {
      +        var li = $('<li class="dac-pagination-item">').text(i);
      +        if (i === this.options.start) { li.addClass('active'); }
      +        li.click(this.go.bind(this, i));
       
      -  // If the hash isn't a search query or there's an error in the query,
      -  // then adjust the scroll position to account for sticky header, then exit.
      -  if ((location.hash.indexOf("q=") == -1) || (searchControl.query == "undefined")) {
      -    // If the results pane is open, close it.
      -    if (!$("#searchResults").is(":hidden")) {
      -      hideResults();
      +        pagination.append(li);
      +      }
      +      this.pagination = pagination.children();
      +      parent.append(pagination);
           }
      -    offsetScrollForSticky();
      -    return;
      -  }
      -
      -  $('#searchResults').slideDown('slow', setStickyTop);
      -  $("#search_autocomplete").focus();
      -  $("#search-close").removeClass("hide");
      -});
      +  };
       
      -/* returns the given string with all HTML brackets converted to entities
      -    TODO: move this to the site's JS library */
      -function escapeHTML(string) {
      -  return string.replace(/</g,"&lt;")
      -                .replace(/>/g,"&gt;");
      -}
      +  DacCarousel.prototype.initEvents = function() {
      +    var that = this;
       
      +    this.touch = {
      +      start: {x: 0, y: 0},
      +      end:   {x: 0, y: 0}
      +    };
       
      +    this.el.on('touchstart', this.touchstart_.bind(this));
      +    this.el.on('touchend', this.touchend_.bind(this));
      +    this.el.on('touchmove', this.touchmove_.bind(this));
       
      +    this.el.hover(function() {
      +      that.pauseRotateTimer();
      +    }, function() {
      +      that.startRotateTimer();
      +    });
       
      +    $(this.options.btnPrev).click(function(e) {
      +      e.preventDefault();
      +      that.prev();
      +    });
       
      +    $(this.options.btnNext).click(function(e) {
      +      e.preventDefault();
      +      that.next();
      +    });
      +  };
       
      +  DacCarousel.prototype.touchstart_ = function(event) {
      +    var t = event.originalEvent.touches[0];
      +    this.touch.start = {x: t.screenX, y: t.screenY};
      +  };
       
      -/* ######################################################## */
      -/* #################  JAVADOC REFERENCE ################### */
      -/* ######################################################## */
      +  DacCarousel.prototype.touchend_ = function() {
      +    var deltaX = this.touch.end.x - this.touch.start.x;
      +    var deltaY = Math.abs(this.touch.end.y - this.touch.start.y);
      +    var shouldSwipe = (deltaY < Math.abs(deltaX)) && (Math.abs(deltaX) >= this.options.swipeThreshold);
       
      -/* Initialize some droiddoc stuff, but only if we're in the reference */
      -if (location.pathname.indexOf("/reference") == 0) {
      -  if(!(location.pathname.indexOf("/reference-gms/packages.html") == 0)
      -    && !(location.pathname.indexOf("/reference-gcm/packages.html") == 0)
      -    && !(location.pathname.indexOf("/reference/com/google") == 0)) {
      -    $(document).ready(function() {
      -      // init available apis based on user pref
      -      changeApiLevel();
      -      initSidenavHeightResize()
      -      });
      -  }
      -}
      +    if (shouldSwipe) {
      +      if (deltaX > 0) {
      +        this.prev();
      +      } else {
      +        this.next();
      +      }
      +    }
      +  };
       
      -var API_LEVEL_COOKIE = "api_level";
      -var minLevel = 1;
      -var maxLevel = 1;
      +  DacCarousel.prototype.touchmove_ = function(event) {
      +    var t = event.originalEvent.touches[0];
      +    this.touch.end = {x: t.screenX, y: t.screenY};
      +  };
       
      -/******* SIDENAV DIMENSIONS ************/
      +  DacCarousel.prototype.initFrame = function() {
      +    this.frames.removeClass('active').eq(this.options.start).addClass('active');
      +  };
       
      -  function initSidenavHeightResize() {
      -    // Change the drag bar size to nicely fit the scrollbar positions
      -    var $dragBar = $(".ui-resizable-s");
      -    $dragBar.css({'width': $dragBar.parent().width() - 5 + "px"});
      +  DacCarousel.prototype.startRotateTimer = function() {
      +    if (!this.options.auto || this.rotateTimer) { return; }
      +    this.rotateTimer = setTimeout(this.next.bind(this), this.options.autoTime);
      +  };
       
      -    $( "#resize-packages-nav" ).resizable({
      -      containment: "#nav-panels",
      -      handles: "s",
      -      alsoResize: "#packages-nav",
      -      resize: function(event, ui) { resizeNav(); }, /* resize the nav while dragging */
      -      stop: function(event, ui) { saveNavPanels(); } /* once stopped, save the sizes to cookie  */
      -      });
      +  DacCarousel.prototype.pauseRotateTimer = function() {
      +    clearTimeout(this.rotateTimer);
      +    this.rotateTimer = null;
      +  };
       
      -  }
      +  DacCarousel.prototype.prev = function() {
      +    this.go(this.current - 1);
      +  };
       
      -function updateSidenavFixedWidth() {
      -  if (!sticky) return;
      -  $('#devdoc-nav').css({
      -    'width' : $('#side-nav').css('width'),
      -    'margin' : $('#side-nav').css('margin')
      -  });
      -  $('#devdoc-nav a.totop').css({'display':'block','width':$("#nav").innerWidth()+'px'});
      +  DacCarousel.prototype.next = function() {
      +    this.go(this.current + 1);
      +  };
       
      -  initSidenavHeightResize();
      -}
      +  DacCarousel.prototype.go = function(next) {
      +    // Figure out what the next slide is.
      +    while (this.count > 0 && next >= this.count) { next -= this.count; }
      +    while (next < 0) { next += this.count; }
       
      -function updateSidenavFullscreenWidth() {
      -  if (!sticky) return;
      -  $('#devdoc-nav').css({
      -    'width' : $('#side-nav').css('width'),
      -    'margin' : $('#side-nav').css('margin')
      -  });
      -  $('#devdoc-nav .totop').css({'left': 'inherit'});
      +    // Cancel if we're already on that slide.
      +    if (next === this.current) { return; }
       
      -  initSidenavHeightResize();
      -}
      +    // Prepare next slide.
      +    this.frames.eq(next).removeClass('out');
       
      -function buildApiLevelSelector() {
      -  maxLevel = SINCE_DATA.length;
      -  var userApiLevel = parseInt(readCookie(API_LEVEL_COOKIE));
      -  userApiLevel = userApiLevel == 0 ? maxLevel : userApiLevel; // If there's no cookie (zero), use the max by default
      +    // Recalculate styles before starting slide transition.
      +    this.el.resolveStyles();
      +    // Update pagination
      +    this.pagination.removeClass('active').eq(next).addClass('active');
       
      -  minLevel = parseInt($("#doc-api-level").attr("class"));
      -  // Handle provisional api levels; the provisional level will always be the highest possible level
      -  // Provisional api levels will also have a length; other stuff that's just missing a level won't,
      -  // so leave those kinds of entities at the default level of 1 (for example, the R.styleable class)
      -  if (isNaN(minLevel) && minLevel.length) {
      -    minLevel = maxLevel;
      -  }
      -  var select = $("#apiLevelSelector").html("").change(changeApiLevel);
      -  for (var i = maxLevel-1; i >= 0; i--) {
      -    var option = $("<option />").attr("value",""+SINCE_DATA[i]).append(""+SINCE_DATA[i]);
      -  //  if (SINCE_DATA[i] < minLevel) option.addClass("absent"); // always false for strings (codenames)
      -    select.append(option);
      -  }
      +    // Transition out current frame
      +    this.frames.eq(this.current).toggleClass('active out');
       
      -  // get the DOM element and use setAttribute cuz IE6 fails when using jquery .attr('selected',true)
      -  var selectedLevelItem = $("#apiLevelSelector option[value='"+userApiLevel+"']").get(0);
      -  selectedLevelItem.setAttribute('selected',true);
      -}
      +    // Transition in a new frame
      +    this.frames.eq(next).toggleClass('active');
       
      -function changeApiLevel() {
      -  maxLevel = SINCE_DATA.length;
      -  var selectedLevel = maxLevel;
      +    this.current = next;
      +  };
       
      -  selectedLevel = parseInt($("#apiLevelSelector option:selected").val());
      -  toggleVisisbleApis(selectedLevel, "body");
      +  // Helper which resolves new styles for an element, so it can start transitioning
      +  // from the new values.
      +  $.fn.resolveStyles = function() {
      +    /*jshint expr:true*/
      +    this[0] && this[0].offsetTop;
      +    return this;
      +  };
       
      -  writeCookie(API_LEVEL_COOKIE, selectedLevel, null);
      +  // jQuery plugin
      +  $.fn.dacCarousel = function() {
      +    this.each(function() {
      +      var $el = $(this);
      +      $el.data('dac-carousel', new DacCarousel(this));
      +    });
      +    return this;
      +  };
       
      -  if (selectedLevel < minLevel) {
      -    var thing = ($("#jd-header").html().indexOf("package") != -1) ? "package" : "class";
      -    $("#naMessage").show().html("<div><p><strong>This " + thing
      -              + " requires API level " + minLevel + " or higher.</strong></p>"
      -              + "<p>This document is hidden because your selected API level for the documentation is "
      -              + selectedLevel + ". You can change the documentation API level with the selector "
      -              + "above the left navigation.</p>"
      -              + "<p>For more information about specifying the API level your app requires, "
      -              + "read <a href='" + toRoot + "training/basics/supporting-devices/platforms.html'"
      -              + ">Supporting Different Platform Versions</a>.</p>"
      -              + "<input type='button' value='OK, make this page visible' "
      -              + "title='Change the API level to " + minLevel + "' "
      -              + "onclick='$(\"#apiLevelSelector\").val(\"" + minLevel + "\");changeApiLevel();' />"
      -              + "</div>");
      -  } else {
      -    $("#naMessage").hide();
      -  }
      -}
      +  // Data API
      +  $(function() {
      +    $('[data-carousel]').dacCarousel();
      +  });
      +})(jQuery);
       
      -function toggleVisisbleApis(selectedLevel, context) {
      -  var apis = $(".api",context);
      -  apis.each(function(i) {
      -    var obj = $(this);
      -    var className = obj.attr("class");
      -    var apiLevelIndex = className.lastIndexOf("-")+1;
      -    var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
      -    apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
      -    var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
      -    if (apiLevel.length == 0) { // for odd cases when the since data is actually missing, just bail
      -      return;
      -    }
      -    apiLevel = parseInt(apiLevel);
      +/* global toRoot */
       
      -    // Handle provisional api levels; if this item's level is the provisional one, set it to the max
      -    var selectedLevelNum = parseInt(selectedLevel)
      -    var apiLevelNum = parseInt(apiLevel);
      -    if (isNaN(apiLevelNum)) {
      -        apiLevelNum = maxLevel;
      -    }
      +(function($) {
      +  // Ordering matters
      +  var TAG_MAP = [
      +    {from: 'developerstory', to: 'Android Developer Story'},
      +    {from: 'googleplay', to: 'Google Play'}
      +  ];
       
      -    // Grey things out that aren't available and give a tooltip title
      -    if (apiLevelNum > selectedLevelNum) {
      -      obj.addClass("absent").attr("title","Requires API Level \""
      -            + apiLevel + "\" or higher. To reveal, change the target API level "
      -              + "above the left navigation.");
      -    }
      -    else obj.removeClass("absent").removeAttr("title");
      -  });
      -}
      +  function DacHero(el, resource, isSearch) {
      +    var slide = $('<article>');
      +    slide.addClass(isSearch ? 'dac-search-hero' : 'dac-expand dac-hero');
      +    var image = cleanUrl(resource.heroImage || resource.image);
      +    var fullBleed = image && !resource.heroColor;
      +
      +    if (!isSearch) {
      +      // Configure background
      +      slide.css({
      +        backgroundImage: fullBleed ? 'url(' + image + ')' : '',
      +        backgroundColor: resource.heroColor || ''
      +      });
       
      +      // Should copy be inverted
      +      slide.toggleClass('dac-invert', resource.heroInvert || fullBleed);
      +      slide.toggleClass('dac-darken', fullBleed);
       
      +      // Should be clickable
      +      slide.append($('<a class="dac-hero-carousel-action">').attr('href', cleanUrl(resource.url)));
      +    }
       
      +    var cols = $('<div class="cols dac-hero-content">');
       
      -/* #################  SIDENAV TREE VIEW ################### */
      +    // inline image column
      +    var rightCol = $('<div class="col-1of2 col-push-1of2 dac-hero-figure">')
      +      .appendTo(cols);
       
      -function new_node(me, mom, text, link, children_data, api_level)
      -{
      -  var node = new Object();
      -  node.children = Array();
      -  node.children_data = children_data;
      -  node.depth = mom.depth + 1;
      +    if ((!fullBleed || isSearch) && image) {
      +      rightCol.append($('<img>').attr('src', image));
      +    }
       
      -  node.li = document.createElement("li");
      -  mom.get_children_ul().appendChild(node.li);
      +    // info column
      +    $('<div class="col-1of2 col-pull-1of2">')
      +      .append($('<div class="dac-hero-tag">').text(formatTag(resource)))
      +      .append($('<h1 class="dac-hero-title">').text(formatTitle(resource)))
      +      .append($('<p class="dac-hero-description">').text(resource.summary))
      +      .append($('<a class="dac-hero-cta">')
      +        .text(formatCTA(resource))
      +        .attr('href', cleanUrl(resource.url))
      +        .prepend($('<span class="dac-sprite dac-auto-chevron">'))
      +      )
      +      .appendTo(cols);
       
      -  node.label_div = document.createElement("div");
      -  node.label_div.className = "label";
      -  if (api_level != null) {
      -    $(node.label_div).addClass("api");
      -    $(node.label_div).addClass("api-level-"+api_level);
      +    slide.append(cols.wrap('<div class="wrap">').parent());
      +    el.append(slide);
         }
      -  node.li.appendChild(node.label_div);
       
      -  if (children_data != null) {
      -    node.expand_toggle = document.createElement("a");
      -    node.expand_toggle.href = "javascript:void(0)";
      -    node.expand_toggle.onclick = function() {
      -          if (node.expanded) {
      -            $(node.get_children_ul()).slideUp("fast");
      -            node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
      -            node.expanded = false;
      -          } else {
      -            expand_node(me, node);
      -          }
      -       };
      -    node.label_div.appendChild(node.expand_toggle);
      +  function cleanUrl(url) {
      +    if (url && url.indexOf('//') === -1) {
      +      url = toRoot + url;
      +    }
      +    return url;
      +  }
       
      -    node.plus_img = document.createElement("img");
      -    node.plus_img.src = me.toroot + "assets/images/triangle-closed-small.png";
      -    node.plus_img.className = "plus";
      -    node.plus_img.width = "8";
      -    node.plus_img.border = "0";
      -    node.expand_toggle.appendChild(node.plus_img);
      +  function formatTag(resource) {
      +    // Hmm, need a better more scalable solution for this.
      +    for (var i = 0, mapping; mapping = TAG_MAP[i]; i++) {
      +      if (resource.tags.indexOf(mapping.from) > -1) {
      +        return mapping.to;
      +      }
      +    }
      +    return resource.type;
      +  }
       
      -    node.expanded = false;
      +  function formatTitle(resource) {
      +    return resource.title.replace(/android developer story: /i, '');
         }
       
      -  var a = document.createElement("a");
      -  node.label_div.appendChild(a);
      -  node.label = document.createTextNode(text);
      -  a.appendChild(node.label);
      -  if (link) {
      -    a.href = me.toroot + link;
      -  } else {
      -    if (children_data != null) {
      -      a.className = "nolink";
      -      a.href = "javascript:void(0)";
      -      a.onclick = node.expand_toggle.onclick;
      -      // This next line shouldn't be necessary.  I'll buy a beer for the first
      -      // person who figures out how to remove this line and have the link
      -      // toggle shut on the first try. --joeo@android.com
      -      node.expanded = false;
      -    }
      +  function formatCTA(resource) {
      +    return resource.type === 'youtube' ? 'Watch the video' : 'Learn more';
         }
       
      +  // jQuery plugin
      +  $.fn.dacHero = function(resource, isSearch) {
      +    return this.each(function() {
      +      var el = $(this);
      +      return new DacHero(el, resource, isSearch);
      +    });
      +  };
      +})(jQuery);
       
      -  node.children_ul = null;
      -  node.get_children_ul = function() {
      -      if (!node.children_ul) {
      -        node.children_ul = document.createElement("ul");
      -        node.children_ul.className = "children_ul";
      -        node.children_ul.style.display = "none";
      -        node.li.appendChild(node.children_ul);
      -      }
      -      return node.children_ul;
      -    };
      +(function($) {
      +  'use strict';
       
      -  return node;
      -}
      +  function highlightString(label, query) {
      +    query = query || '';
      +    //query = query.replace('<wbr>', '').replace('.', '\\.');
      +    var queryRE = new RegExp('(' + query + ')', 'ig');
      +    return label.replace(queryRE, '<em>$1</em>');
      +  }
       
      +  $.fn.highlightMatches = function(query) {
      +    return this.each(function() {
      +      var el = $(this);
      +      var label = el.html();
      +      var highlighted = highlightString(label, query);
      +      el.html(highlighted);
      +      el.addClass('highlighted');
      +    });
      +  };
      +})(jQuery);
       
      +/**
      + * History tracking.
      + * Track visited urls in localStorage.
      + */
      +(function($) {
      +  var PAGES_TO_STORE_ = 100;
      +  var MIN_NUMBER_OF_PAGES_TO_DISPLAY_ = 6;
      +  var CONTAINER_SELECTOR_ = '.dac-search-results-history-wrap';
       
      +  /**
      +   * Generate resource cards for visited pages.
      +   * @param {HTMLElement} el
      +   * @constructor
      +   */
      +  function HistoryQuery(el) {
      +    this.el = $(el);
       
      -function expand_node(me, node)
      -{
      -  if (node.children_data && !node.expanded) {
      -    if (node.children_visited) {
      -      $(node.get_children_ul()).slideDown("fast");
      -    } else {
      -      get_node(me, node);
      -      if ($(node.label_div).hasClass("absent")) {
      -        $(node.get_children_ul()).addClass("absent");
      -      }
      -      $(node.get_children_ul()).slideDown("fast");
      +    // Only show history component if enough pages have been visited.
      +    if (getVisitedPages().length < MIN_NUMBER_OF_PAGES_TO_DISPLAY_) {
      +      this.el.closest(CONTAINER_SELECTOR_).addClass('dac-hidden');
      +      return;
           }
      -    node.plus_img.src = me.toroot + "assets/images/triangle-opened-small.png";
      -    node.expanded = true;
       
      -    // perform api level toggling because new nodes are new to the DOM
      -    var selectedLevel = $("#apiLevelSelector option:selected").val();
      -    toggleVisisbleApis(selectedLevel, "#side-nav");
      -  }
      -}
      +    // Rename query
      +    this.el.data('query', this.el.data('history-query'));
       
      -function get_node(me, mom)
      -{
      -  mom.children_visited = true;
      -  for (var i in mom.children_data) {
      -    var node_data = mom.children_data[i];
      -    mom.children[i] = new_node(me, mom, node_data[0], node_data[1],
      -        node_data[2], node_data[3]);
      +    // jQuery method to populate cards.
      +    this.el.resourceWidget();
         }
      -}
       
      -function this_page_relative(toroot)
      -{
      -  var full = document.location.pathname;
      -  var file = "";
      -  if (toroot.substr(0, 1) == "/") {
      -    if (full.substr(0, toroot.length) == toroot) {
      -      return full.substr(toroot.length);
      -    } else {
      -      // the file isn't under toroot.  Fail.
      -      return null;
      -    }
      -  } else {
      -    if (toroot != "./") {
      -      toroot = "./" + toroot;
      -    }
      -    do {
      -      if (toroot.substr(toroot.length-3, 3) == "../" || toroot == "./") {
      -        var pos = full.lastIndexOf("/");
      -        file = full.substr(pos) + file;
      -        full = full.substr(0, pos);
      -        toroot = toroot.substr(0, toroot.length-3);
      -      }
      -    } while (toroot != "" && toroot != "/");
      -    return file.substr(1);
      +  /**
      +   * Fetch from localStorage an array of visted pages
      +   * @returns {Array}
      +   */
      +  function getVisitedPages() {
      +    var visited = localStorage.getItem('visited-pages');
      +    return visited ? JSON.parse(visited) : [];
         }
      -}
       
      -function find_page(url, data)
      -{
      -  var nodes = data;
      -  var result = null;
      -  for (var i in nodes) {
      -    var d = nodes[i];
      -    if (d[1] == url) {
      -      return new Array(i);
      -    }
      -    else if (d[2] != null) {
      -      result = find_page(url, d[2]);
      -      if (result != null) {
      -        return (new Array(i).concat(result));
      +  /**
      +   * Return a page corresponding to cuurent pathname. If none exists, create one.
      +   * @param {Array} pages
      +   * @param {String} path
      +   * @returns {Object} Page
      +   */
      +  function getPageForPath(pages, path) {
      +    var page;
      +
      +    // Backwards lookup for current page, last pages most likely to be visited again.
      +    for (var i = pages.length - 1; i >= 0; i--) {
      +      if (pages[i].path === path) {
      +        page = pages[i];
      +
      +        // Remove page object from pages list to ensure correct ordering.
      +        pages.splice(i, 1);
      +
      +        return page;
             }
           }
      +
      +    // If storage limit is exceeded, remove last visited path.
      +    if (pages.length >= PAGES_TO_STORE_) {
      +      pages.shift();
      +    }
      +
      +    return {path: path};
         }
      -  return null;
      -}
       
      -function init_default_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_navtree("tree-list", toroot, NAVTREE_DATA);
      -      }
      -  });
      +  /**
      +   * Add current page to back of visited array, increase hit count by 1.
      +   */
      +  function addCurrectPage() {
      +    var path = location.pathname;
       
      -  // perform api level toggling because because the whole tree is new to the DOM
      -  var selectedLevel = $("#apiLevelSelector option:selected").val();
      -  toggleVisisbleApis(selectedLevel, "#side-nav");
      -}
      +    // Do not track frontpage visits.
      +    if (path === '/' || path === '/index.html') {return;}
       
      -function init_navtree(navtree_id, toroot, root_nodes)
      -{
      -  var me = new Object();
      -  me.toroot = toroot;
      -  me.node = new Object();
      +    var pages = getVisitedPages();
      +    var page = getPageForPath(pages, path);
       
      -  me.node.li = document.getElementById(navtree_id);
      -  me.node.children_data = root_nodes;
      -  me.node.children = new Array();
      -  me.node.children_ul = document.createElement("ul");
      -  me.node.get_children_ul = function() { return me.node.children_ul; };
      -  //me.node.children_ul.className = "children_ul";
      -  me.node.li.appendChild(me.node.children_ul);
      -  me.node.depth = 0;
      +    // New page visits have no hit count.
      +    page.hit = ~~page.hit + 1;
       
      -  get_node(me, me.node);
      +    // Most recently visted pages are located at the end of the visited array.
      +    pages.push(page);
       
      -  me.this_page = this_page_relative(toroot);
      -  me.breadcrumbs = find_page(me.this_page, root_nodes);
      -  if (me.breadcrumbs != null && me.breadcrumbs.length != 0) {
      -    var mom = me.node;
      -    for (var i in me.breadcrumbs) {
      -      var j = me.breadcrumbs[i];
      -      mom = mom.children[j];
      -      expand_node(me, mom);
      -    }
      -    mom.label_div.className = mom.label_div.className + " selected";
      -    addLoadEvent(function() {
      -      scrollIntoView("nav-tree");
      -      });
      +    localStorage.setItem('visited-pages', JSON.stringify(pages));
         }
      -}
       
      +  /**
      +   * Hit count compare function.
      +   * @param {Object} a - page
      +   * @param {Object} b - page
      +   * @returns {number}
      +   */
      +  function byHit(a, b) {
      +    if (a.hit > b.hit) {
      +      return -1;
      +    } else if (a.hit < b.hit) {
      +      return 1;
      +    }
       
      +    return 0;
      +  }
       
      +  /**
      +   * Return a list of visited urls in a given order.
      +   * @param {String} order - (recent|most-visited)
      +   * @returns {Array}
      +   */
      +  $.dacGetVisitedUrls = function(order) {
      +    var pages = getVisitedPages();
       
      +    if (order === 'recent') {
      +      pages.reverse();
      +    } else {
      +      pages.sort(byHit);
      +    }
       
      +    return pages.map(function(page) {
      +      return page.path.replace(/^\//, '');
      +    });
      +  };
       
      +  // jQuery plugin
      +  $.fn.dacHistoryQuery = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      var data = el.data('dac.recentlyVisited');
       
      +      if (!data) {
      +        el.data('dac.recentlyVisited', (data = new HistoryQuery(el)));
      +      }
      +    });
      +  };
       
      -/* TODO: eliminate redundancy with non-google functions */
      -function init_google_navtree(navtree_id, toroot, root_nodes)
      -{
      -  var me = new Object();
      -  me.toroot = toroot;
      -  me.node = new Object();
      +  $(function() {
      +    $('[data-history-query]').dacHistoryQuery();
      +    // Do not block page rendering.
      +    setTimeout(addCurrectPage, 0);
      +  });
      +})(jQuery);
       
      -  me.node.li = document.getElementById(navtree_id);
      -  if (!me.node.li) {
      -    return;
      +/* ############################################ */
      +/* ##########     LOCALIZATION     ############ */
      +/* ############################################ */
      +/**
      + * Global helpers.
      + */
      +function getBaseUri(uri) {
      +  var intlUrl = (uri.substring(0, 6) === '/intl/');
      +  if (intlUrl) {
      +    var base = uri.substring(uri.indexOf('intl/') + 5, uri.length);
      +    base = base.substring(base.indexOf('/') + 1, base.length);
      +    return '/' + base;
      +  } else {
      +    return uri;
         }
      +}
       
      -  me.node.children_data = root_nodes;
      -  me.node.children = new Array();
      -  me.node.children_ul = document.createElement("ul");
      -  me.node.get_children_ul = function() { return me.node.children_ul; };
      -  //me.node.children_ul.className = "children_ul";
      -  me.node.li.appendChild(me.node.children_ul);
      -  me.node.depth = 0;
      -
      -  get_google_node(me, me.node);
      +function changeLangPref(targetLang, submit) {
      +  window.writeCookie('pref_lang', targetLang, null);
      +  $('#language').find('option[value="' + targetLang + '"]').attr('selected', true);
      +  if (submit) {
      +    $('#setlang').submit();
      +  }
       }
      +// Redundant usage to appease jshint.
      +window.changeLangPref = changeLangPref;
       
      -function new_google_node(me, mom, text, link, children_data, api_level)
      -{
      -  var node = new Object();
      -  var child;
      -  node.children = Array();
      -  node.children_data = children_data;
      -  node.depth = mom.depth + 1;
      -  node.get_children_ul = function() {
      -      if (!node.children_ul) {
      -        node.children_ul = document.createElement("ul");
      -        node.children_ul.className = "tree-list-children";
      -        node.li.appendChild(node.children_ul);
      -      }
      -      return node.children_ul;
      -    };
      -  node.li = document.createElement("li");
      +(function() {
      +  /**
      +   * Whitelisted locales. Should match choices in language dropdown. Repeated here
      +   * as a lot of i18n logic happens before page load and dropdown is ready.
      +   */
      +  var LANGUAGES = [
      +    'en',
      +    'es',
      +    'in',
      +    'ja',
      +    'ko',
      +    'pt-br',
      +    'ru',
      +    'vi',
      +    'zh-cn',
      +    'zh-tw'
      +  ];
       
      -  mom.get_children_ul().appendChild(node.li);
      +  /**
      +   * Master list of translated strings for template files.
      +   */
      +  var PHRASES = {
      +    'newsletter': {
      +      'title': 'Get the latest Android developer news and tips that will help you find success on Google Play.',
      +      'requiredHint': '* Required Fields',
      +      'name': 'Full name',
      +      'email': 'Email address',
      +      'company': 'Company / developer name',
      +      'appUrl': 'One of your Play Store app URLs',
      +      'business': {
      +        'label': 'Which best describes your business:',
      +        'apps': 'Apps',
      +        'games': 'Games',
      +        'both': 'Apps & Games'
      +      },
      +      'confirmMailingList': 'Add me to the mailing list for the monthly newsletter and occasional emails about ' +
      +                            'development and Google Play opportunities.',
      +      'privacyPolicy': 'I acknowledge that the information provided in this form will be subject to Google\'s ' +
      +                       '<a href="https://www.google.com/policies/privacy/" target="_blank">privacy policy</a>.',
      +      'languageVal': 'English',
      +      'successTitle': 'Hooray!',
      +      'successDetails': 'You have successfully signed up for the latest Android developer news and tips.',
      +      'languageValTarget': {
      +        'en': 'English',
      +        'ar': 'Arabic (العربيّة)',
      +        'in': 'Indonesian (Bahasa)',
      +        'fr': 'French (français)',
      +        'de': 'German (Deutsch)',
      +        'ja': 'Japanese (日本語)',
      +        'ko': 'Korean (한국어)',
      +        'ru': 'Russian (Русский)',
      +        'es': 'Spanish (español)',
      +        'th': 'Thai (ภาษาไทย)',
      +        'tr': 'Turkish (Türkçe)',
      +        'vi': 'Vietnamese (tiếng Việt)',
      +        'pt-br': 'Brazilian Portuguese (Português Brasileiro)',
      +        'zh-cn': 'Simplified Chinese (简体中文)',
      +        'zh-tw': 'Traditional Chinese (繁體中文)',
      +      },
      +      'resetLangTitle': "Browse this site in %{targetLang}?",
      +      'resetLangTextIntro': 'You requested a page in %{targetLang}, but your language preference for this site is %{lang}.',
      +      'resetLangTextCta': 'Would you like to change your language preference and browse this site in %{targetLang}? ' +
      +                          'If you want to change your language preference later, use the language menu at the bottom of each page.',
      +      'resetLangButtonYes': 'Change Language',
      +      'resetLangButtonNo': 'Not Now'
      +    }
      +  };
       
      +  /**
      +   * Current locale.
      +   */
      +  var locale = (function() {
      +    var lang = window.readCookie('pref_lang');
      +    if (lang === 0 || LANGUAGES.indexOf(lang) === -1) {
      +      lang = 'en';
      +    }
      +    return lang;
      +  })();
      +  var localeTarget = (function() {
      +    var lang = getQueryVariable('hl');
      +    if (lang === false || LANGUAGES.indexOf(lang) === -1) {
      +      lang = locale;
      +    }
      +    return lang;
      +  })();
       
      -  if(link) {
      -    child = document.createElement("a");
      +  /**
      +   * Global function shims for backwards compatibility
      +   */
      +  window.changeNavLang = function() {
      +    // Already done.
      +  };
       
      -  }
      -  else {
      -    child = document.createElement("span");
      -    child.className = "tree-list-subtitle";
      +  window.loadLangPref = function() {
      +    // Languages pref already loaded.
      +  };
       
      -  }
      -  if (children_data != null) {
      -    node.li.className="nav-section";
      -    node.label_div = document.createElement("div");
      -    node.label_div.className = "nav-section-header-ref";
      -    node.li.appendChild(node.label_div);
      -    get_google_node(me, node);
      -    node.label_div.appendChild(child);
      -  }
      -  else {
      -    node.li.appendChild(child);
      -  }
      -  if(link) {
      -    child.href = me.toroot + link;
      -  }
      -  node.label = document.createTextNode(text);
      -  child.appendChild(node.label);
      +  window.getLangPref = function() {
      +    return locale;
      +  };
       
      -  node.children_ul = null;
      +  window.getLangTarget = function() {
      +    return localeTarget;
      +  };
      +
      +  // Expose polyglot instance for advanced localization.
      +  var polyglot = window.polyglot = new window.Polyglot({
      +    locale: locale,
      +    phrases: PHRASES
      +  });
       
      -  return node;
      -}
      +  // When DOM is ready.
      +  $(function() {
      +    // Mark current locale in language picker.
      +    $('#language').find('option[value="' + locale + '"]').attr('selected', true);
       
      -function get_google_node(me, mom)
      -{
      -  mom.children_visited = true;
      -  var linkText;
      -  for (var i in mom.children_data) {
      -    var node_data = mom.children_data[i];
      -    linkText = node_data[0];
      +    $('html').dacTranslate().on('dac:domchange', function(e) {
      +      $(e.target).dacTranslate();
      +    });
      +  });
       
      -    if(linkText.match("^"+"com.google.android")=="com.google.android"){
      -      linkText = linkText.substr(19, linkText.length);
      +  $.fn.dacTranslate = function() {
      +    // Translate strings in template markup:
      +
      +    // OLD
      +    // Having all translations in HTML does not scale well and bloats every page.
      +    // Need to migrate this to data-l JS translations below.
      +    if (locale !== 'en') {
      +      var $links = this.find('a[' + locale + '-lang]');
      +      $links.each(function() { // for each link with a translation
      +        var $link = $(this);
      +        // put the desired language from the attribute as the text
      +        $link.text($link.attr(locale + '-lang'));
      +      });
           }
      -      mom.children[i] = new_google_node(me, mom, linkText, node_data[1],
      -          node_data[2], node_data[3]);
      -  }
      -}
      -
       
      +    // NEW
      +    // A simple declarative api for JS translations. Feel free to extend as appropriate.
      +
      +    // Miscellaneous string compilations
      +    // Build full strings from localized substrings:
      +    var myLocaleTarget = window.getLangTarget();
      +    var myTargetLang = window.polyglot.t("newsletter.languageValTarget." + myLocaleTarget);
      +    var myLang = window.polyglot.t("newsletter.languageVal");
      +    var myTargetLangTitleString = window.polyglot.t("newsletter.resetLangTitle", {targetLang: myTargetLang});
      +    var myResetLangTextIntro = window.polyglot.t("newsletter.resetLangTextIntro", {targetLang: myTargetLang, lang: myLang});
      +    var myResetLangTextCta = window.polyglot.t("newsletter.resetLangTextCta", {targetLang: myTargetLang});
      +    //var myResetLangButtonYes = window.polyglot.t("newsletter.resetLangButtonYes", {targetLang: myTargetLang});
      +
      +    // Inject strings as text values in dialog components:
      +    $("#langform .dac-modal-header-title").text(myTargetLangTitleString);
      +    $("#langform #resetLangText").text(myResetLangTextIntro);
      +    $("#langform #resetLangCta").text(myResetLangTextCta);
      +    //$("#resetLangButtonYes").attr("data-t", window.polyglot.t(myResetLangButtonYes));
      +
      +    // Text: <div data-t="nav.home"></div>
      +    // HTML: <div data-t="privacy" data-t-html></html>
      +    this.find('[data-t]').each(function() {
      +      var el = $(this);
      +      var data = el.data();
      +      if (data.t) {
      +        el[data.tHtml === '' ? 'html' : 'text'](polyglot.t(data.t));
      +      }
      +    });
       
      +    return this;
      +  };
      +})();
      +/* ##########     END LOCALIZATION     ############ */
       
      +// Translations. These should eventually be moved into language-specific files and loaded on demand.
      +// jshint nonbsp:false
      +switch (window.getLangPref()) {
      +  case 'ar':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Google Play. يمكنك الحصول على آخر الأخبار والنصائح من مطوّري تطبيقات Android، مما يساعدك ' +
      +          'على تحقيق النجاح على',
      +        'requiredHint': '* حقول مطلوبة',
      +        'name': '. الاسم بالكامل ',
      +        'email': '. عنوان البريد الإلكتروني ',
      +        'company': '. اسم الشركة / اسم مطوّر البرامج',
      +        'appUrl': '. أحد عناوين URL لتطبيقاتك في متجر Play',
      +        'business': {
      +          'label': '. ما العنصر الذي يوضح طبيعة نشاطك التجاري بدقة؟ ',
      +          'apps': 'التطبيقات',
      +          'games': 'الألعاب',
      +          'both': 'التطبيقات والألعاب'
      +        },
      +        'confirmMailingList': 'إضافتي إلى القائمة البريدية للنشرة الإخبارية الشهرية والرسائل الإلكترونية التي يتم' +
      +          ' إرسالها من حين لآخر بشأن التطوير وفرص Google Play.',
      +        'privacyPolicy': 'أقر بأن المعلومات المقدَّمة في هذا النموذج تخضع لسياسة خصوصية ' +
      +          '<a href="https://www.google.com/intl/ar/policies/privacy/" target="_blank">Google</a>.',
      +        'languageVal': 'Arabic (العربيّة)',
      +        'successTitle': 'رائع!',
      +        'successDetails': 'لقد اشتركت بنجاح للحصول على آخر الأخبار والنصائح من مطوّري برامج Android.'
      +      }
      +    });
      +    break;
      +  case 'zh-cn':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': '获取最新的 Android 开发者资讯和提示,助您在 Google Play 上取得成功。',
      +        'requiredHint': '* 必填字段',
      +        'name': '全名',
      +        'email': '电子邮件地址',
      +        'company': '公司/开发者名称',
      +        'appUrl': '您的某个 Play 商店应用网址',
      +        'business': {
      +          'label': '哪一项能够最准确地描述您的业务?',
      +          'apps': '应用',
      +          'games': '游戏',
      +          'both': '应用和游戏'
      +        },
      +        'confirmMailingList': '将我添加到邮寄名单,以便接收每月简报以及不定期发送的关于开发和 Google Play 商机的电子邮件。',
      +        'privacyPolicy': '我确认自己了解在此表单中提供的信息受 <a href="https://www.google.com/intl/zh-CN/' +
      +        'policies/privacy/" target="_blank">Google</a> 隐私权政策的约束。',
      +        'languageVal': 'Simplified Chinese (简体中文)',
      +        'successTitle': '太棒了!',
      +        'successDetails': '您已成功订阅最新的 Android 开发者资讯和提示。'
      +      }
      +    });
      +    break;
      +  case 'zh-tw':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': '獲得 Android 開發人員的最新消息和各項秘訣,讓您在 Google Play 上輕鬆邁向成功之路。',
      +        'requiredHint': '* 必要欄位',
      +        'name': '全名',
      +        'email': '電子郵件地址',
      +        'company': '公司/開發人員名稱',
      +        'appUrl': '您其中一個 Play 商店應用程式的網址',
      +        'business': {
      +          'label': '為您的商家選取最合適的產品類別。',
      +          'apps': '應用程式',
      +          'games': '遊戲',
      +          'both': '應用程式和遊戲'
      +        },
      +        'confirmMailingList': '我想加入 Google Play 的郵寄清單,以便接收每月電子報和 Google Play 不定期寄送的電子郵件,' +
      +          '瞭解關於開發和 Google Play 商機的資訊。',
      +        'privacyPolicy': '我瞭解,我在這張表單中提供的資訊將受到 <a href="' +
      +        'https://www.google.com/intl/zh-TW/policies/privacy/" target="_blank">Google</a> 隱私權政策.',
      +        'languageVal': 'Traditional Chinese (繁體中文)',
      +        'successTitle': '太棒了!',
      +        'successDetails': '您已經成功訂閱 Android 開發人員的最新消息和各項秘訣。'
      +      }
      +    });
      +    break;
      +  case 'fr':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Recevez les dernières actualités destinées aux développeurs Android, ainsi que des conseils qui ' +
      +          'vous mèneront vers le succès sur Google Play.',
      +        'requiredHint': '* Champs obligatoires',
      +        'name': 'Nom complet',
      +        'email': 'Adresse e-mail',
      +        'company': 'Nom de la société ou du développeur',
      +        'appUrl': 'Une de vos URL Play Store',
      +        'business': {
      +          'label': 'Quelle option décrit le mieux votre activité ?',
      +          'apps': 'Applications',
      +          'games': 'Jeux',
      +          'both': 'Applications et jeux'
      +        },
      +        'confirmMailingList': 'Ajoutez-moi à la liste de diffusion de la newsletter mensuelle et tenez-moi informé ' +
      +          'par des e-mails occasionnels de l\'évolution et des opportunités de Google Play.',
      +        'privacyPolicy': 'Je comprends que les renseignements fournis dans ce formulaire seront soumis aux <a href="' +
      +        'https://www.google.com/intl/fr/policies/privacy/" target="_blank">règles de confidentialité</a> de Google.',
      +        'languageVal': 'French (français)',
      +        'successTitle': 'Super !',
      +        'successDetails': 'Vous êtes bien inscrit pour recevoir les actualités et les conseils destinés aux ' +
      +          'développeurs Android.'
      +      }
      +    });
      +    break;
      +  case 'de':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Abonniere aktuelle Informationen und Tipps für Android-Entwickler und werde noch erfolgreicher ' +
      +          'bei Google Play.',
      +        'requiredHint': '* Pflichtfelder',
      +        'name': 'Vollständiger Name',
      +        'email': 'E-Mail-Adresse',
      +        'company': 'Unternehmens-/Entwicklername',
      +        'appUrl': 'Eine der URLs deiner Play Store App',
      +        'business': {
      +          'label': 'Welche der folgenden Kategorien beschreibt dein Unternehmen am besten?',
      +          'apps': 'Apps',
      +          'games': 'Spiele',
      +          'both': 'Apps und Spiele'
      +        },
      +        'confirmMailingList': 'Meine E-Mail-Adresse soll zur Mailingliste hinzugefügt werden, damit ich den ' +
      +          'monatlichen Newsletter sowie gelegentlich E-Mails zu Entwicklungen und Optionen bei Google Play erhalte.',
      +        'privacyPolicy': 'Ich bestätige, dass die in diesem Formular bereitgestellten Informationen gemäß der ' +
      +          '<a href="https://www.google.com/intl/de/policies/privacy/" target="_blank">Datenschutzerklärung</a> von ' +
      +          'Google verwendet werden dürfen.',
      +        'languageVal': 'German (Deutsch)',
      +        'successTitle': 'Super!',
      +        'successDetails': 'Du hast dich erfolgreich angemeldet und erhältst jetzt aktuelle Informationen und Tipps ' +
      +          'für Android-Entwickler.'
      +      }
      +    });
      +    break;
      +  case 'in':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Receba as dicas e as notícias mais recentes para os desenvolvedores Android e seja bem-sucedido ' +
      +        'no Google Play.',
      +        'requiredHint': '* Bidang Wajib Diisi',
      +        'name': 'Nama lengkap',
      +        'email': 'Alamat email',
      +        'company': 'Nama pengembang / perusahaan',
      +        'appUrl': 'Salah satu URL aplikasi Play Store Anda',
      +        'business': {
      +          'label': 'Dari berikut ini, mana yang paling cocok dengan bisnis Anda?',
      +          'apps': 'Aplikasi',
      +          'games': 'Game',
      +          'both': 'Aplikasi dan Game'
      +        },
      +        'confirmMailingList': 'Tambahkan saya ke milis untuk mendapatkan buletin bulanan dan email sesekali mengenai ' +
      +          'perkembangan dan kesempatan yang ada di Google Play.',
      +        'privacyPolicy': 'Saya memahami bahwa informasi yang diberikan dalam formulir ini tunduk pada <a href="' +
      +        'https://www.google.com/intl/in/policies/privacy/" target="_blank">kebijakan privasi</a> Google.',
      +        'languageVal': 'Indonesian (Bahasa)',
      +        'successTitle': 'Hore!',
      +        'successDetails': 'Anda berhasil mendaftar untuk kiat dan berita pengembang Android terbaru.'
      +      }
      +    });
      +    break;
      +  case 'it':
      +    //window.polyglot.extend({
      +    //  'newsletter': {
      +    //    'title': 'Receba as dicas e as notícias mais recentes para os desenvolvedores Android e seja bem-sucedido ' +
      +    //    'no Google Play.',
      +    //    'requiredHint': '* Campos obrigatórios',
      +    //    'name': 'Nome completo',
      +    //    'email': 'Endereço de Email',
      +    //    'company': 'Nome da empresa / do desenvolvedor',
      +    //    'appUrl': 'URL de um dos seus apps da Play Store',
      +    //    'business': {
      +    //      'label': 'Qual das seguintes opções melhor descreve sua empresa?',
      +    //      'apps': 'Apps',
      +    //      'games': 'Jogos',
      +    //      'both': 'Apps e Jogos'
      +    //    },
      +    //    'confirmMailingList': 'Inscreva-me na lista de e-mails para que eu receba o boletim informativo mensal, ' +
      +    //    'bem como e-mails ocasionais sobre o desenvolvimento e as oportunidades do Google Play.',
      +    //    'privacyPolicy': 'Reconheço que as informações fornecidas neste formulário estão sujeitas à <a href="' +
      +    //    'https://www.google.com.br/policies/privacy/" target="_blank">Política de Privacidade</a> do Google.',
      +    //    'languageVal': 'Italian (italiano)',
      +    //    'successTitle': 'Uhu!',
      +    //    'successDetails': 'Você se inscreveu para receber as notícias e as dicas mais recentes para os ' +
      +    //    'desenvolvedores Android.',
      +    //  }
      +    //});
      +    break;
      +  case 'ja':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Google Play での成功に役立つ Android デベロッパー向けの最新ニュースやおすすめの情報をお届けします。',
      +        'requiredHint': '* 必須',
      +        'name': '氏名',
      +        'email': 'メールアドレス',
      +        'company': '会社名 / デベロッパー名',
      +        'appUrl': 'Play ストア アプリの URL(いずれか 1 つ)',
      +        'business': {
      +          'label': 'お客様のビジネスに最もよく当てはまるものをお選びください。',
      +          'apps': 'アプリ',
      +          'games': 'ゲーム',
      +          'both': 'アプリとゲーム'
      +        },
      +        'confirmMailingList': '開発や Google Play の最新情報に関する毎月発行のニュースレターや不定期発行のメールを受け取る',
      +        'privacyPolicy': 'このフォームに入力した情報に <a href="https://www.google.com/intl/ja/policies/privacy/" ' +
      +          'target="_blank">Google</a> のプライバシー ポリシーが適用',
      +        'languageVal': 'Japanese (日本語)',
      +        'successTitle': '完了です!',
      +        'successDetails': 'Android デベロッパー向けの最新ニュースやおすすめの情報の配信登録が完了しました。'
      +      }
      +    });
      +    break;
      +  case 'ko':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Google Play에서 성공을 거두는 데 도움이 되는 최신 Android 개발자 소식 및 도움말을 받아 보세요.',
      +        'requiredHint': '* 필수 입력란',
      +        'name': '이름',
      +        'email': '이메일 주소',
      +        'company': '회사/개발자 이름',
      +        'appUrl': 'Play 스토어 앱 URL 중 1개',
      +        'business': {
      +          'label': '다음 중 내 비즈니스를 가장 잘 설명하는 단어는 무엇인가요?',
      +          'apps': '앱',
      +          'games': '게임',
      +          'both': '앱 및 게임'
      +        },
      +        'confirmMailingList': '개발 및 Google Play 관련 소식에 관한 월별 뉴스레터 및 비정기 이메일을 받아보겠습니다.',
      +        'privacyPolicy': '이 양식에 제공한 정보는 <a href="https://www.google.com/intl/ko/policies/privacy/" ' +
      +          'target="_blank">Google의</a> 개인정보취급방침에 따라 사용됨을',
      +        'languageVal':'Korean (한국어)',
      +        'successTitle': '축하합니다!',
      +        'successDetails': '최신 Android 개발자 뉴스 및 도움말을 받아볼 수 있도록 가입을 완료했습니다.'
      +      }
      +    });
      +    break;
      +  case 'pt-br':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Receba as dicas e as notícias mais recentes para os desenvolvedores Android e seja bem-sucedido ' +
      +        'no Google Play.',
      +        'requiredHint': '* Campos obrigatórios',
      +        'name': 'Nome completo',
      +        'email': 'Endereço de Email',
      +        'company': 'Nome da empresa / do desenvolvedor',
      +        'appUrl': 'URL de um dos seus apps da Play Store',
      +        'business': {
      +          'label': 'Qual das seguintes opções melhor descreve sua empresa?',
      +          'apps': 'Apps',
      +          'games': 'Jogos',
      +          'both': 'Apps e Jogos'
      +        },
      +        'confirmMailingList': 'Inscreva-me na lista de e-mails para que eu receba o boletim informativo mensal, ' +
      +        'bem como e-mails ocasionais sobre o desenvolvimento e as oportunidades do Google Play.',
      +        'privacyPolicy': 'Reconheço que as informações fornecidas neste formulário estão sujeitas à <a href="' +
      +        'https://www.google.com.br/policies/privacy/" target="_blank">Política de Privacidade</a> do Google.',
      +        'languageVal': 'Brazilian Portuguese (Português Brasileiro)',
      +        'successTitle': 'Uhu!',
      +        'successDetails': 'Você se inscreveu para receber as notícias e as dicas mais recentes para os ' +
      +        'desenvolvedores Android.'
      +      }
      +    });
      +    break;
      +  case 'ru':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Хотите получать последние новости и советы для разработчиков Google Play? Заполните эту форму.',
      +        'requiredHint': '* Обязательные поля',
      +        'name': 'Полное имя',
      +        'email': 'Адрес электронной почты',
      +        'company': 'Название компании или имя разработчика',
      +        'appUrl': 'Ссылка на любое ваше приложение в Google Play',
      +        'business': {
      +          'label': 'Что вы создаете?',
      +          'apps': 'Приложения',
      +          'games': 'Игры',
      +          'both': 'Игры и приложения'
      +        },
      +        'confirmMailingList': 'Я хочу получать ежемесячную рассылку для разработчиков и другие полезные новости ' +
      +          'Google Play.',
      +        'privacyPolicy': 'Я предоставляю эти данные в соответствии с <a href="' +
      +          'https://www.google.com/intl/ru/policies/privacy/" target="_blank">Политикой конфиденциальности</a> Google.',
      +        'languageVal': 'Russian (Русский)',
      +        'successTitle': 'Поздравляем!',
      +        'successDetails': 'Теперь вы подписаны на последние новости и советы для разработчиков Android.'
      +      }
      +    });
      +    break;
      +  case 'es':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Recibe las últimas noticias y sugerencias para programadores de Android y logra tener éxito en ' +
      +          'Google Play.',
      +        'requiredHint': '* Campos obligatorios',
      +        'name': 'Dirección de correo electrónico',
      +        'email': 'Endereço de Email',
      +        'company': 'Nombre de la empresa o del programador',
      +        'appUrl': 'URL de una de tus aplicaciones de Play Store',
      +        'business': {
      +          'label': '¿Qué describe mejor a tu empresa?',
      +          'apps': 'Aplicaciones',
      +          'games': 'Juegos',
      +          'both': 'Juegos y aplicaciones'
      +        },
      +        'confirmMailingList': 'Deseo unirme a la lista de distribución para recibir el boletín informativo mensual ' +
      +          'y correos electrónicos ocasionales sobre desarrollo y oportunidades de Google Play.',
      +        'privacyPolicy': 'Acepto que la información que proporcioné en este formulario cumple con la <a href="' +
      +        'https://www.google.com/intl/es/policies/privacy/" target="_blank">política de privacidad</a> de Google.',
      +        'languageVal': 'Spanish (español)',
      +        'successTitle': '¡Felicitaciones!',
      +        'successDetails': 'El registro para recibir las últimas noticias y sugerencias para programadores de Android ' +
      +          'se realizó correctamente.'
      +      }
      +    });
      +    break;
      +  case 'th':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'รับข่าวสารล่าสุดสำหรับนักพัฒนาซอฟต์แวร์ Android ตลอดจนเคล็ดลับที่จะช่วยให้คุณประสบความสำเร็จบน ' +
      +          'Google Play',
      +        'requiredHint': '* ช่องที่ต้องกรอก',
      +        'name': 'ชื่อและนามสกุล',
      +        'email': 'ที่อยู่อีเมล',
      +        'company': 'ชื่อบริษัท/นักพัฒนาซอฟต์แวร์',
      +        'appUrl': 'URL แอปใดแอปหนึ่งของคุณใน Play สโตร์',
      +        'business': {
      +          'label': 'ข้อใดตรงกับธุรกิจของคุณมากที่สุด',
      +          'apps': 'แอป',
      +          'games': 'เกม',
      +          'both': 'แอปและเกม'
      +        },
      +        'confirmMailingList': 'เพิ่มฉันลงในรายชื่ออีเมลเพื่อรับจดหมายข่าวรายเดือนและอีเมลเป็นครั้งคราวเกี่ยวกับก' +
      +          'ารพัฒนาซอฟต์แวร์และโอกาสใน Google Play',
      +        'privacyPolicy': 'ฉันรับทราบว่าข้อมูลที่ให้ไว้ในแบบฟอร์มนี้จะเป็นไปตามนโยบายส่วนบุคคลของ ' +
      +          '<a href="https://www.google.com/intl/th/policies/privacy/" target="_blank">Google</a>',
      +        'languageVal': 'Thai (ภาษาไทย)',
      +        'successTitle': 'ไชโย!',
      +        'successDetails': 'คุณลงชื่อสมัครรับข่าวสารและเคล็ดลับล่าสุดสำหรับนักพัฒนาซอฟต์แวร์ Android เสร็จเรียบร้อยแล้ว'
      +      }
      +    });
      +    break;
      +  case 'tr':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Google Play\'de başarılı olmanıza yardımcı olacak en son Android geliştirici haberleri ve ipuçları.',
      +        'requiredHint': '* Zorunlu Alanlar',
      +        'name': 'Tam ad',
      +        'email': 'E-posta adresi',
      +        'company': 'Şirket / geliştirici adı',
      +        'appUrl': 'Play Store uygulama URL\'lerinizden biri',
      +        'business': {
      +          'label': 'İşletmenizi en iyi hangisi tanımlar?',
      +          'apps': 'Uygulamalar',
      +          'games': 'Oyunlar',
      +          'both': 'Uygulamalar ve Oyunlar'
      +        },
      +        'confirmMailingList': 'Beni, geliştirme ve Google Play fırsatlarıyla ilgili ara sıra gönderilen e-posta ' +
      +          'iletilerine ilişkin posta listesine ve aylık haber bültenine ekle.',
      +        'privacyPolicy': 'Bu formda sağlanan bilgilerin Google\'ın ' +
      +          '<a href="https://www.google.com/intl/tr/policies/privacy/" target="_blank">Gizlilik Politikası\'na</a> ' +
      +          'tabi olacağını kabul ediyorum.',
      +        'languageVal': 'Turkish (Türkçe)',
      +        'successTitle': 'Yaşasın!',
      +        'successDetails': 'En son Android geliştirici haberleri ve ipuçlarına başarıyla kaydoldunuz.'
      +      }
      +    });
      +    break;
      +  case 'vi':
      +    window.polyglot.extend({
      +      'newsletter': {
      +        'title': 'Nhận tin tức và mẹo mới nhất dành cho nhà phát triển Android sẽ giúp bạn tìm thấy thành công trên ' +
      +          'Google Play.',
      +        'requiredHint': '* Các trường bắt buộc',
      +        'name': 'Tên đầy đủ',
      +        'email': 'Địa chỉ email',
      +        'company': 'Tên công ty/nhà phát triển',
      +        'appUrl': 'Một trong số các URL ứng dụng trên cửa hàng Play của bạn',
      +        'business': {
      +          'label': 'Lựa chọn nào sau đây mô tả chính xác nhất doanh nghiệp của bạn?',
      +          'apps': 'Ứng dụng',
      +          'games': 'Trò chơi',
      +          'both': 'Ứng dụng và trò chơi'
      +        },
      +        'confirmMailingList': 'Thêm tôi vào danh sách gửi thư cho bản tin hàng tháng và email định kỳ về việc phát ' +
      +          'triển và cơ hội của Google Play.',
      +        'privacyPolicy': 'Tôi xác nhận rằng thông tin được cung cấp trong biểu mẫu này tuân thủ chính sách bảo mật ' +
      +          'của <a href="https://www.google.com/intl/vi/policies/privacy/" target="_blank">Google</a>.',
      +        'languageVal': 'Vietnamese (tiếng Việt)',
      +        'successTitle': 'Thật tuyệt!',
      +        'successDetails': 'Bạn đã đăng ký thành công nhận tin tức và mẹo mới nhất dành cho nhà phát triển của Android.'
      +      }
      +    });
      +    break;
      +}
       
      +(function($) {
      +  'use strict';
       
      -/****** NEW version of script to build google and sample navs dynamically ******/
      -// TODO: update Google reference docs to tolerate this new implementation
      +  function Modal(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, options);
      +    this.isOpen = false;
       
      -var NODE_NAME = 0;
      -var NODE_HREF = 1;
      -var NODE_GROUP = 2;
      -var NODE_TAGS = 3;
      -var NODE_CHILDREN = 4;
      +    this.el.on('click', function(event) {
      +      if (!$.contains(this.el.find('.dac-modal-window')[0], event.target)) {
      +        return this.el.trigger('modal-close');
      +      }
      +    }.bind(this));
       
      -function init_google_navtree2(navtree_id, data)
      -{
      -  var $containerUl = $("#"+navtree_id);
      -  for (var i in data) {
      -    var node_data = data[i];
      -    $containerUl.append(new_google_node2(node_data));
      +    this.el.on('modal-open', this.open_.bind(this));
      +    this.el.on('modal-close', this.close_.bind(this));
      +    this.el.on('modal-toggle', this.toggle_.bind(this));
         }
       
      -  // Make all third-generation list items 'sticky' to prevent them from collapsing
      -  $containerUl.find('li li li.nav-section').addClass('sticky');
      +  Modal.prototype.toggle_ = function() {
      +    this.el.trigger('modal-' + (this.isOpen ? 'close' : 'open'));
      +  };
       
      -  initExpandableNavItems("#"+navtree_id);
      -}
      +  Modal.prototype.close_ = function() {
      +    // When closing the modal for Android Studio downloads, reload the page
      +    // because otherwise we might get stuck with post-download dialog state
      +    if ($("[data-modal='studio_tos'].dac-active").length) {
      +      location.reload();
      +    }
      +    this.el.removeClass('dac-active');
      +    $('body').removeClass('dac-modal-open');
      +    this.isOpen = false;
      +  };
       
      -function new_google_node2(node_data)
      -{
      -  var linkText = node_data[NODE_NAME];
      -  if(linkText.match("^"+"com.google.android")=="com.google.android"){
      -    linkText = linkText.substr(19, linkText.length);
      -  }
      -  var $li = $('<li>');
      -  var $a;
      -  if (node_data[NODE_HREF] != null) {
      -    $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >'
      -        + linkText + '</a>');
      -  } else {
      -    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
      -        + linkText + '/</a>');
      -  }
      -  var $childUl = $('<ul>');
      -  if (node_data[NODE_CHILDREN] != null) {
      -    $li.addClass("nav-section");
      -    $a = $('<div class="nav-section-header">').append($a);
      -    if (node_data[NODE_HREF] == null) $a.addClass('empty');
      +  Modal.prototype.open_ = function() {
      +    this.el.addClass('dac-active');
      +    $('body').addClass('dac-modal-open');
      +    this.isOpen = true;
      +  };
       
      -    for (var i in node_data[NODE_CHILDREN]) {
      -      var child_node_data = node_data[NODE_CHILDREN][i];
      -      $childUl.append(new_google_node2(child_node_data));
      -    }
      -    $li.append($childUl);
      +  function onClickToggleModal(event) {
      +    event.preventDefault();
      +    var toggle = $(event.currentTarget);
      +    var options = toggle.data();
      +    var modal = options.modalToggle ? $('[data-modal="' + options.modalToggle + '"]') :
      +      toggle.closest('[data-modal]');
      +    modal.trigger('modal-toggle');
         }
      -  $li.prepend($a);
       
      -  return $li;
      -}
      +  /**
      +   * jQuery plugin
      +   * @param  {object} options - Override default options.
      +   */
      +  $.fn.dacModal = function(options) {
      +    return this.each(function() {
      +      new Modal(this, options);
      +    });
      +  };
       
      +  $.fn.dacToggleModal = function(options) {
      +    return this.each(function() {
      +      new ToggleModal(this, options);
      +    });
      +  };
       
      +  /**
      +   * Data Attribute API
      +   */
      +  $(document).on('ready.aranja', function() {
      +    $('[data-modal]').each(function() {
      +      $(this).dacModal($(this).data());
      +    });
       
      +    $('html').on('click.modal', '[data-modal-toggle]', onClickToggleModal);
       
      +    // Check if url anchor is targetting a toggle to open the modal.
      +    if (location.hash) {
      +      var $elem = $(document.getElementById(location.hash.substr(1)));
      +      if ($elem.attr('data-modal-toggle')) {
      +        $elem.trigger('click');
      +      }
      +    }
       
      +    var isTargetLangValid = false;
      +    $(ANDROID_LANGUAGES).each(function(index, langCode) {
      +      if (langCode == window.getLangTarget()) {
      +        isTargetLangValid = true;
      +        return;
      +      }
      +    });
      +    if (window.getLangTarget() !== window.getLangPref() && isTargetLangValid) {
      +        $('#langform').trigger('modal-open');
      +        $("#langform button.yes").attr("onclick","window.changeLangPref('" + window.getLangTarget() + "', true);  return false;");
      +        $("#langform button.no").attr("onclick","window.changeLangPref('" + window.getLangPref() + "', true); return false;");
      +    }
       
      +    /* Check the current API level, but only if we're in the reference */
      +    if (location.pathname.indexOf('/reference') == 0) {
      +      // init available apis based on user pref
      +      changeApiLevel();
      +    }
      +  });
      +})(jQuery);
       
      +/* Fullscreen - Toggle fullscreen mode for reference pages */
      +(function($) {
      +  'use strict';
       
      +  /**
      +   * @param {HTMLElement} el - The DOM element.
      +   * @constructor
      +   */
      +  function Fullscreen(el) {
      +    this.el = $(el);
      +    this.html = $('html');
      +    this.icon = this.el.find('.dac-sprite');
      +    this.isFullscreen = window.readCookie(Fullscreen.COOKIE_) === 'true';
      +    this.activate_();
      +    this.el.on('click.dac-fullscreen', this.toggleHandler_.bind(this));
      +  }
       
      +  /**
      +   * Cookie name for storing the state
      +   * @type {string}
      +   * @private
      +   */
      +  Fullscreen.COOKIE_ = 'fullscreen';
       
      +  /**
      +   * Classes to modify the DOM
      +   * @type {{mode: string, fullscreen: string, fullscreenExit: string}}
      +   * @private
      +   */
      +  Fullscreen.CLASSES_ = {
      +    mode: 'dac-fullscreen-mode',
      +    fullscreen: 'dac-fullscreen',
      +    fullscreenExit: 'dac-fullscreen-exit'
      +  };
       
      -function showGoogleRefTree() {
      -  init_default_google_navtree(toRoot);
      -  init_default_gcm_navtree(toRoot);
      -}
      +  /**
      +   * Event listener for toggling fullscreen mode
      +   * @param {MouseEvent} event
      +   * @private
      +   */
      +  Fullscreen.prototype.toggleHandler_ = function(event) {
      +    event.stopPropagation();
      +    this.toggle(!this.isFullscreen, true);
      +  };
       
      -function init_default_google_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'gms_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_google_navtree("gms-tree-list", toroot, GMS_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -      }
      -  });
      -}
      +  /**
      +   * Change the DOM based on current state.
      +   * @private
      +   */
      +  Fullscreen.prototype.activate_ = function() {
      +    this.icon.toggleClass(Fullscreen.CLASSES_.fullscreen, !this.isFullscreen);
      +    this.icon.toggleClass(Fullscreen.CLASSES_.fullscreenExit, this.isFullscreen);
      +    this.html.toggleClass(Fullscreen.CLASSES_.mode, this.isFullscreen);
      +  };
       
      -function init_default_gcm_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'gcm_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -      }
      -  });
      -}
      +  /**
      +   * Toggle fullscreen mode and store the state in a cookie.
      +   */
      +  Fullscreen.prototype.toggle = function() {
      +    this.isFullscreen = !this.isFullscreen;
      +    window.writeCookie(Fullscreen.COOKIE_, this.isFullscreen, null);
      +    this.activate_();
      +  };
       
      -function showSamplesRefTree() {
      -  init_default_samples_navtree(toRoot);
      -}
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacFullscreen = function() {
      +    return this.each(function() {
      +      new Fullscreen($(this));
      +    });
      +  };
      +})(jQuery);
       
      -function init_default_samples_navtree(toroot) {
      -  // load json file for navtree data
      -  $.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) {
      -      // when the file is loaded, initialize the tree
      -      if(jqxhr.status === 200) {
      -          // hack to remove the "about the samples" link then put it back in
      -          // after we nuke the list to remove the dummy static list of samples
      -          var $firstLi = $("#nav.samples-nav > li:first-child").clone();
      -          $("#nav.samples-nav").empty();
      -          $("#nav.samples-nav").append($firstLi);
      -
      -          init_google_navtree2("nav.samples-nav", SAMPLES_NAVTREE_DATA);
      -          highlightSidenav();
      -          resizeNav();
      -          if ($("#jd-content #samples").length) {
      -            showSamples();
      -          }
      -      }
      -  });
      -}
      +(function($) {
      +  'use strict';
       
      -/* TOGGLE INHERITED MEMBERS */
      +  /**
      +   * @param {HTMLElement} selected - The link that is selected in the nav.
      +   * @constructor
      +   */
      +  function HeaderTabs(selected) {
       
      -/* Toggle an inherited class (arrow toggle)
      - * @param linkObj  The link that was clicked.
      - * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      - *                'null' to simply toggle.
      - */
      -function toggleInherited(linkObj, expand) {
      -    var base = linkObj.getAttribute("id");
      -    var list = document.getElementById(base + "-list");
      -    var summary = document.getElementById(base + "-summary");
      -    var trigger = document.getElementById(base + "-trigger");
      -    var a = $(linkObj);
      -    if ( (expand == null && a.hasClass("closed")) || expand ) {
      -        list.style.display = "none";
      -        summary.style.display = "block";
      -        trigger.src = toRoot + "assets/images/styles/disclosure_up.png";
      -        a.removeClass("closed");
      -        a.addClass("opened");
      -    } else if ( (expand == null && a.hasClass("opened")) || (expand == false) ) {
      -        list.style.display = "block";
      -        summary.style.display = "none";
      -        trigger.src = toRoot + "assets/images/styles/disclosure_down.png";
      -        a.removeClass("opened");
      -        a.addClass("closed");
      +    // Don't highlight any tabs on the index page
      +    if (location.pathname === '/index.html' || location.pathname === '/') {
      +      //return;
           }
      -    return false;
      -}
       
      -/* Toggle all inherited classes in a single table (e.g. all inherited methods)
      - * @param linkObj  The link that was clicked.
      - * @param expand  'true' to ensure it's expanded. 'false' to ensure it's closed.
      - *                'null' to simply toggle.
      - */
      -function toggleAllInherited(linkObj, expand) {
      -  var a = $(linkObj);
      -  var table = $(a.parent().parent().parent()); // ugly way to get table/tbody
      -  var expandos = $(".jd-expando-trigger", table);
      -  if ( (expand == null && a.text() == "[Expand]") || expand ) {
      -    expandos.each(function(i) {
      -      toggleInherited(this, true);
      -    });
      -    a.text("[Collapse]");
      -  } else if ( (expand == null && a.text() == "[Collapse]") || (expand == false) ) {
      -    expandos.each(function(i) {
      -      toggleInherited(this, false);
      -    });
      -    a.text("[Expand]");
      +    this.selected = $(selected);
      +    this.selectedParent = this.selected.closest('.dac-nav-secondary').siblings('a');
      +    this.links = $('.dac-header-tabs a');
      +
      +    this.selectActiveTab();
         }
      -  return false;
      -}
       
      -/* Toggle all inherited members in the class (link in the class title)
      - */
      -function toggleAllClassInherited() {
      -  var a = $("#toggleAllClassInherited"); // get toggle link from class title
      -  var toggles = $(".toggle-all", $("#body-content"));
      -  if (a.text() == "[Expand All]") {
      -    toggles.each(function(i) {
      -      toggleAllInherited(this, true);
      +  HeaderTabs.prototype.selectActiveTab = function() {
      +    var section = null;
      +
      +    if (this.selectedParent.length) {
      +      section = this.selectedParent.text();
      +    } else {
      +      section = this.selected.text();
      +    }
      +
      +    if (section) {
      +      this.links.removeClass('selected');
      +
      +      this.links.filter(function() {
      +        return $(this).text() === $.trim(section);
      +      }).addClass('selected');
      +    }
      +  };
      +
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacHeaderTabs = function() {
      +    return this.each(function() {
      +      new HeaderTabs(this);
           });
      -    a.text("[Collapse All]");
      -  } else {
      -    toggles.each(function(i) {
      -      toggleAllInherited(this, false);
      +  };
      +})(jQuery);
      +
      +(function($) {
      +  'use strict';
      +  var icon = $('<i/>').addClass('dac-sprite dac-nav-forward');
      +  var config = JSON.parse(window.localStorage.getItem('global-navigation') || '{}');
      +  var forwardLink = $('<span/>')
      +    .addClass('dac-nav-link-forward')
      +    .html(icon)
      +    .attr('tabindex', 0)
      +    .on('click keypress', function(e) {
      +      if (e.type == 'keypress' && e.which == 13 || e.type == 'click') {
      +        swap_(e);
      +      }
           });
      -    a.text("[Expand All]");
      +
      +  /**
      +   * @constructor
      +   */
      +  function Nav(navigation) {
      +    $('.dac-nav-list').dacCurrentPage().dacHeaderTabs().dacSidebarToggle($('body'));
      +
      +    navigation.find('[data-reference-tree]').dacReferenceNav();
      +
      +    setupViews_(navigation.children().eq(0).children());
      +
      +    initCollapsedNavs(navigation.find('.dac-nav-sub-slider'));
      +
      +    $('#dac-main-navigation').scrollIntoView('.selected')
         }
      -  return false;
      -}
       
      -/* Expand all inherited members in the class. Used when initiating page search */
      -function ensureAllInheritedExpanded() {
      -  var toggles = $(".toggle-all", $("#body-content"));
      -  toggles.each(function(i) {
      -    toggleAllInherited(this, true);
      -  });
      -  $("#toggleAllClassInherited").text("[Collapse All]");
      -}
      +  function updateStore(icon) {
      +    var navClass = getCurrentLandingPage_(icon);
      +    var isExpanded = icon.hasClass('dac-expand-less-black');
      +    var expandedNavs = config.expanded || [];
      +    if (isExpanded) {
      +      expandedNavs.push(navClass);
      +    } else {
      +      expandedNavs = expandedNavs.filter(function(item) {
      +        return item !== navClass;
      +      });
      +    }
      +    config.expanded = expandedNavs;
      +    window.localStorage.setItem('global-navigation', JSON.stringify(config));
      +  }
       
      +  function toggleSubNav_(icon) {
      +    var isExpanded = icon.hasClass('dac-expand-less-black');
      +    icon.toggleClass('dac-expand-less-black', !isExpanded);
      +    icon.toggleClass('dac-expand-more-black', isExpanded);
      +    icon.data('sub-navigation.dac').slideToggle(200);
       
      -/* HANDLE KEY EVENTS
      - * - Listen for Ctrl+F (Cmd on Mac) and expand all inherited members (to aid page search)
      - */
      -var agent = navigator['userAgent'].toLowerCase();
      -var mac = agent.indexOf("macintosh") != -1;
      +    updateStore(icon);
      +  }
       
      -$(document).keydown( function(e) {
      -var control = mac ? e.metaKey && !e.ctrlKey : e.ctrlKey; // get ctrl key
      -  if (control && e.which == 70) {  // 70 is "F"
      -    ensureAllInheritedExpanded();
      +  function handleSubNavToggle_(event) {
      +    event.preventDefault();
      +    var icon = $(event.target);
      +    toggleSubNav_(icon);
      +  }
      +
      +  function getCurrentLandingPage_(icon) {
      +    return icon.closest('li')[0].className.replace('dac-nav-item ', '');
         }
      -});
       
      +  // Setup sub navigation collapse/expand
      +  function initCollapsedNavs(toggleIcons) {
      +    toggleIcons.each(setInitiallyActive_($('body')));
      +    toggleIcons.on('click keypress', function(e) {
      +      if (e.type == 'keypress' && e.which == 13 || e.type == 'click') {
      +        handleSubNavToggle_(e);
      +      }
      +    });
      +  }
       
      +  function setInitiallyActive_(body) {
      +    var expandedNavs = config.expanded || [];
      +    return function(i, icon) {
      +      icon = $(icon);
      +      var subNav = icon.next();
       
      +      if (!subNav.length) {
      +        return;
      +      }
       
      +      var landingPageClass = getCurrentLandingPage_(icon);
      +      var expanded = expandedNavs.indexOf(landingPageClass) >= 0;
      +      landingPageClass = landingPageClass === 'home' ? 'about' : landingPageClass;
       
      +      if (landingPageClass == 'about' && location.pathname == '/index.html') {
      +        expanded = true;
      +      }
       
      -/* On-demand functions */
      +      // TODO: Should read from localStorage
      +      var visible = body.hasClass(landingPageClass) || expanded;
       
      -/** Move sample code line numbers out of PRE block and into non-copyable column */
      -function initCodeLineNumbers() {
      -  var numbers = $("#codesample-block a.number");
      -  if (numbers.length) {
      -    $("#codesample-line-numbers").removeClass("hidden").append(numbers);
      +      icon.data('sub-navigation.dac', subNav);
      +      icon.toggleClass('dac-expand-less-black', visible);
      +      icon.toggleClass('dac-expand-more-black', !visible);
      +      subNav.toggle(visible);
      +    };
         }
       
      -  $(document).ready(function() {
      -    // select entire line when clicked
      -    $("span.code-line").click(function() {
      -      if (!shifted) {
      -        selectText(this);
      +  function setupViews_(views) {
      +    if (views.length === 1) {
      +      // Active tier 1 nav.
      +      views.addClass('dac-active');
      +    } else {
      +      // Activate back button and tier 2 nav.
      +      views.slice(0, 2).addClass('dac-active');
      +      var selectedNav = views.eq(2).find('.selected').after(forwardLink);
      +      var langAttr = selectedNav.attr(window.getLangPref() + '-lang');
      +      //form the label from locale attr if possible, else set to selectedNav text value
      +      if ((typeof langAttr !== typeof undefined &&  langAttr !== false) && (langAttr !== '')) {
      +        $('.dac-nav-back-title').text(langAttr);
      +      } else {
      +        $('.dac-nav-back-title').text(selectedNav.text());
             }
      +    }
      +
      +    // Navigation should animate.
      +    setTimeout(function() {
      +      views.removeClass('dac-no-anim');
      +    }, 10);
      +  }
      +
      +  function swap_(event) {
      +    event.preventDefault();
      +    $(event.currentTarget).trigger('swap-content');
      +  }
      +
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacNav = function() {
      +    return this.each(function() {
      +      new Nav($(this));
           });
      -    // invoke line link on double click
      -    $(".code-line").dblclick(function() {
      -      document.location.hash = $(this).attr('id');
      -    });
      -    // highlight the line when hovering on the number
      -    $("#codesample-line-numbers a.number").mouseover(function() {
      -      var id = $(this).attr('href');
      -      $(id).css('background','#e7e7e7');
      -    });
      -    $("#codesample-line-numbers a.number").mouseout(function() {
      -      var id = $(this).attr('href');
      -      $(id).css('background','none');
      -    });
      -  });
      -}
      +  };
      +})(jQuery);
       
      -// create SHIFT key binder to avoid the selectText method when selecting multiple lines
      -var shifted = false;
      -$(document).bind('keyup keydown', function(e){shifted = e.shiftKey; return true;} );
      +/* global NAVTREE_DATA */
      +(function($) {
      +  /**
      +   * Build the reference navigation with namespace dropdowns.
      +   * @param {jQuery} el - The DOM element.
      +   */
      +  function buildReferenceNav(el) {
      +    var supportLibraryPath = '/reference/android/support/';
      +    var currPath = location.pathname;
       
      -// courtesy of jasonedelman.com
      -function selectText(element) {
      -    var doc = document
      -        , range, selection
      -    ;
      -    if (doc.body.createTextRange) { //ms
      -        range = doc.body.createTextRange();
      -        range.moveToElementText(element);
      -        range.select();
      -    } else if (window.getSelection) { //all others
      -        selection = window.getSelection();
      -        range = doc.createRange();
      -        range.selectNodeContents(element);
      -        selection.removeAllRanges();
      -        selection.addRange(range);
      +    if (currPath.indexOf(supportLibraryPath) > -1) {
      +      updateSupportLibrariesNav(supportLibraryPath, currPath);
           }
      -}
      -
      +    var namespaceList = el.find('[data-reference-namespaces]');
      +    var resources = $('[data-reference-resources]').detach();
      +    var selected = namespaceList.find('.selected');
      +    resources.appendTo(el);
      +
      +    // Links should be toggleable.
      +    namespaceList.find('a').addClass('dac-reference-nav-toggle dac-closed');
      +
      +    // Set the path for the navtree data to use.
      +    var navtree_filepath = getNavtreeFilePath(supportLibraryPath, currPath);
      +
      +    // Load in all resources
      +    $.getScript(navtree_filepath, function(data, textStatus, xhr) {
      +      if (xhr.status === 200) {
      +        namespaceList.on(
      +            'click', 'a.dac-reference-nav-toggle', toggleResourcesHandler);
      +      }
      +    });
       
      +    // No setup required if no resources are present
      +    if (!resources.length) {
      +      return;
      +    }
       
      +    // The resources should be a part of selected namespace.
      +    var overview = addResourcesToView(resources, selected);
       
      -/** Display links and other information about samples that match the
      -    group specified by the URL */
      -function showSamples() {
      -  var group = $("#samples").attr('class');
      -  $("#samples").html("<p>Here are some samples for <b>" + group + "</b> apps:</p>");
      +    // Currently viewing Overview
      +    if (location.href === overview.attr('href')) {
      +      overview.parent().addClass('selected');
      +    }
       
      -  var $ul = $("<ul>");
      -  $selectedLi = $("#nav li.selected");
      +    // Open currently selected resource
      +    var listsToOpen = selected.children().eq(1);
      +    listsToOpen = listsToOpen.add(
      +        listsToOpen.find('.selected').parent()).show();
       
      -  $selectedLi.children("ul").children("li").each(function() {
      -      var $li = $("<li>").append($(this).find("a").first().clone());
      -      $ul.append($li);
      -  });
      +    // Mark dropdowns as open
      +    listsToOpen.prev().removeClass('dac-closed');
       
      -  $("#samples").append($ul);
      +    // Scroll into view
      +    namespaceList.scrollIntoView(selected);
      +  }
       
      -}
      +  function getNavtreeFilePath(supportLibraryPath, currPath) {
      +    var navtree_filepath = '';
      +    var navtree_filename = 'navtree_data.js';
      +    if (currPath.indexOf(supportLibraryPath + 'test') > -1) {
      +      navtree_filepath = supportLibraryPath + 'test/' + navtree_filename;
      +    } else if (currPath.indexOf(supportLibraryPath + 'wearable') > -1) {
      +      navtree_filepath = supportLibraryPath + 'wearable/' + navtree_filename;
      +    } else {
      +      navtree_filepath = '/' + navtree_filename;
      +    }
      +    return navtree_filepath;
      +  }
       
      +  function updateSupportLibrariesNav(supportLibraryPath, currPath) {
      +    var navTitle = '';
      +    if (currPath.indexOf(supportLibraryPath + 'test') > -1) {
      +      navTitle = 'Test Support APIs';
      +    } else if (currPath.indexOf(supportLibraryPath + 'wearable') > -1) {
      +      navTitle = 'Wearable Support APIs';
      +    }
      +    $('#api-nav-title').text(navTitle);
      +    $('#api-level-toggle').hide();
      +  }
       
      +  /**
      +   * Handles the toggling of resources.
      +   * @param {Event} event
      +   */
      +  function toggleResourcesHandler(event) {
      +    event.preventDefault();
      +    if (event.type == 'click' || event.type == 'keypress' && event.which == 13) {
      +      var el = $(this);
      +      // If resources for given namespace is not present, fetch correct data.
      +      if (this.tagName === 'A' && !this.hasResources) {
      +        addResourcesToView(buildResourcesViewForData(getDataForNamespace(el.text())), el.parent());
      +      }
       
      -/* ########################################################## */
      -/* ###################  RESOURCE CARDS  ##################### */
      -/* ########################################################## */
      +      el.toggleClass('dac-closed').next().slideToggle(200);
      +    }
      +  }
       
      -/** Handle resource queries, collections, and grids (sections). Requires
      -    jd_tag_helpers.js and the *_unified_data.js to be loaded. */
      +  /**
      +   * @param {String} namespace
      +   * @returns {Array} namespace data
      +   */
      +  function getDataForNamespace(namespace) {
      +    var namespaceData = NAVTREE_DATA.filter(function(data) {
      +      return data[0] === namespace;
      +    });
       
      -(function() {
      -  // Prevent the same resource from being loaded more than once per page.
      -  var addedPageResources = {};
      +    return namespaceData.length ? namespaceData[0][2] : [];
      +  }
       
      -  $(document).ready(function() {
      -    // Need to initialize hero carousel before other sections for dedupe
      -    // to work correctly.
      -    $('[data-carousel-query]').dacCarouselQuery();
      +  /**
      +   * Build a list item for a resource
      +   * @param {Array} resource
      +   * @returns {String}
      +   */
      +  function buildResourceItem(resource) {
      +    return '<li class="api apilevel-' + resource[3] + '"><a href="/' + resource[1] + '">' + resource[0] + '</a></li>';
      +  }
       
      -    $('.resource-widget').each(function() {
      -      initResourceWidget(this);
      -    });
      +  /**
      +   * Build resources list items.
      +   * @param {Array} resources
      +   * @returns {String}
      +   */
      +  function buildResourceList(resources) {
      +    return '<li><h2>' + resources[0] + '</h2><ul>' + resources[2].map(buildResourceItem).join('') + '</ul>';
      +  }
       
      -    /* Pass the line height to ellipsisfade() to adjust the height of the
      -    text container to show the max number of lines possible, without
      -    showing lines that are cut off. This works with the css ellipsis
      -    classes to fade last text line and apply an ellipsis char. */
      +  /**
      +   * Build a resources view
      +   * @param {Array} data
      +   * @returns {jQuery} resources in an unordered list.
      +   */
      +  function buildResourcesViewForData(data) {
      +    return $('<ul>' + data.map(buildResourceList).join('') + '</ul>');
      +  }
       
      -    //card text currently uses 20px line height.
      -    var lineHeight = 20;
      -    $('.card-info .text').ellipsisfade(lineHeight);
      -  });
      +  /**
      +   * Add resources to a containing view.
      +   * @param {jQuery} resources
      +   * @param {jQuery} view
      +   * @returns {jQuery} the overview link.
      +   */
      +  function addResourcesToView(resources, view) {
      +    var namespace = view.children().eq(0);
      +    var overview = $('<a href="' + namespace.attr('href') + '">Overview</a>');
      +
      +    // Mark namespace with content;
      +    namespace[0].hasResources = true;
      +
      +    // Add correct classes / event listeners to resources.
      +    resources.prepend($('<li>').html(overview))
      +      .find('a')
      +        .addClass('dac-reference-nav-resource')
      +      .end()
      +        .find('h2').attr('tabindex', 0)
      +        .addClass('dac-reference-nav-toggle dac-closed')
      +        .on('click keypress', toggleResourcesHandler)
      +      .end()
      +        .add(resources.find('ul'))
      +        .addClass('dac-reference-nav-resources')
      +      .end()
      +        .appendTo(view);
      +
      +    return overview;
      +  }
       
      -  /*
      -    Three types of resource layouts:
      -    Flow - Uses a fixed row-height flow using float left style.
      -    Carousel - Single card slideshow all same dimension absolute.
      -    Stack - Uses fixed columns and flexible element height.
      -  */
      -  function initResourceWidget(widget) {
      -    var $widget = $(widget);
      -    var isFlow = $widget.hasClass('resource-flow-layout'),
      -        isCarousel = $widget.hasClass('resource-carousel-layout'),
      -        isStack = $widget.hasClass('resource-stack-layout');
      -
      -    // remove illegal col-x class which is not relevant anymore thanks to responsive styles.
      -    var m = $widget.get(0).className.match(/\bcol-(\d+)\b/);
      -    if (m && !$widget.is('.cols > *')) {
      -      $widget.removeClass('col-' + m[1]);
      -    }
      -
      -    var opts = {
      -      cardSizes: ($widget.data('cardsizes') || '').split(','),
      -      maxResults: parseInt($widget.data('maxresults') || '100', 10),
      -      initialResults: $widget.data('initialResults'),
      -      itemsPerPage: $widget.data('itemsperpage'),
      -      sortOrder: $widget.data('sortorder'),
      -      query: $widget.data('query'),
      -      section: $widget.data('section'),
      -      /* Added by LFL 6/6/14 */
      -      resourceStyle: $widget.data('resourcestyle') || 'card',
      -      stackSort: $widget.data('stacksort') || 'true'
      -    };
      +  function setActiveReferencePackage(el) {
      +    var packageLinkEls = el.find('[data-reference-namespaces] a');
      +    var selected = null;
      +    var highestMatchCount = 0;
      +    packageLinkEls.each(function(index, linkEl) {
      +      var matchCount = 0;
      +      $(location.pathname.split('/')).each(function(index, subpath) {
      +        if (linkEl.href.indexOf('/' + subpath + '/') > -1) {
      +          matchCount++;
      +        }
      +      });
      +      if (matchCount > highestMatchCount) {
      +        selected = linkEl;
      +        highestMatchCount = matchCount;
      +      }
      +    });
      +    $(selected).parent().addClass('selected');
      +  }
       
      -    // run the search for the set of resources to show
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacReferenceNav = function() {
      +    return this.each(function() {
      +      setActiveReferencePackage($(this));
      +      buildReferenceNav($(this));
      +    });
      +  };
      +})(jQuery);
       
      -    var resources = buildResourceList(opts);
      +/** Scroll a container to make a target element visible
      + This is called when the page finished loading. */
      +$.fn.scrollIntoView = function(target) {
      +  if ('string' === typeof target) {
      +    target = this.find(target);
      +  }
      +  if (this.is(':visible')) {
      +    if (target.length == 0) {
      +      // If no selected item found, exit
      +      return;
      +    }
       
      -    if (isFlow) {
      -      drawResourcesFlowWidget($widget, opts, resources);
      -    } else if (isCarousel) {
      -      drawResourcesCarouselWidget($widget, opts, resources);
      -    } else if (isStack) {
      -      /* Looks like this got removed and is not used, so repurposing for the
      -          homepage style layout.
      -          Modified by LFL 6/6/14
      -      */
      -      //var sections = buildSectionList(opts);
      -      opts['numStacks'] = $widget.data('numstacks');
      -      drawResourcesStackWidget($widget, opts, resources/*, sections*/);
      +    // get the target element's offset from its container nav by measuring the element's offset
      +    // relative to the document then subtract the container nav's offset relative to the document
      +    var targetOffset = target.offset().top - this.offset().top;
      +    var containerHeight = this.height();
      +    if (targetOffset > containerHeight * .8) { // multiply nav height by .8 so we move up the item
      +      // if it's more than 80% down the nav
      +      // scroll the item up by an amount equal to 80% the container height
      +      this.scrollTop(targetOffset - (containerHeight * .8));
           }
         }
      +};
       
      -  /* Initializes a Resource Carousel Widget */
      -  function drawResourcesCarouselWidget($widget, opts, resources) {
      -    $widget.empty();
      -    var plusone = false; // stop showing plusone buttons on cards
      -
      -    $widget.addClass('resource-card slideshow-container')
      -      .append($('<a>').addClass('slideshow-prev').text('Prev'))
      -      .append($('<a>').addClass('slideshow-next').text('Next'));
      +(function($) {
      +  $.fn.dacCurrentPage = function() {
      +    // Highlight the header tabs...
      +    // highlight Design tab
      +    var baseurl = getBaseUri(window.location.pathname);
      +    var urlSegments = baseurl.split('/');
      +    var navEl = this;
      +    var body = $('body');
      +    var subNavEl = navEl.find('.dac-nav-secondary');
      +    var parentNavEl;
      +    var selected;
      +    // In NDK docs, highlight appropriate sub-nav
      +    if (body.hasClass('dac-ndk')) {
      +      if (body.hasClass('guide')) {
      +        selected = navEl.find('> li.guides > a').addClass('selected');
      +      } else if (body.hasClass('reference')) {
      +        selected = navEl.find('> li.reference > a').addClass('selected');
      +      } else if (body.hasClass('samples')) {
      +        selected = navEl.find('> li.samples > a').addClass('selected');
      +      } else if (body.hasClass('downloads')) {
      +        selected = navEl.find('> li.downloads > a').addClass('selected');
      +      }
      +    } else if (body.hasClass('dac-studio')) {
      +      if (body.hasClass('download')) {
      +        selected = navEl.find('> li.download > a').addClass('selected');
      +      } else if (body.hasClass('features')) {
      +        selected = navEl.find('> li.features > a').addClass('selected');
      +      } else if (body.hasClass('guide')) {
      +        selected = navEl.find('> li.guide > a').addClass('selected');
      +      } else if (body.hasClass('preview')) {
      +        selected = navEl.find('> li.preview > a').addClass('selected');
      +      }
      +    } else if (body.hasClass('design')) {
      +      selected = navEl.find('> li.design > a').addClass('selected');
      +      // highlight Home nav
      +    } else if (body.hasClass('about') || location.pathname == '/index.html') {
      +      parentNavEl = navEl.find('> li.home > a');
      +      parentNavEl.addClass('has-subnav');
      +      // In Home docs, also highlight appropriate sub-nav
      +      if (urlSegments[1] === 'wear' || urlSegments[1] === 'tv' ||
      +        urlSegments[1] === 'auto') {
      +        selected = subNavEl.find('li.' + urlSegments[1] + ' > a').addClass('selected');
      +      } else if (urlSegments[1] === 'about') {
      +        selected = subNavEl.find('li.versions > a').addClass('selected');
      +      } else {
      +        selected = parentNavEl.removeClass('has-subnav').addClass('selected');
      +      }
      +      // highlight Develop nav
      +    } else if (body.hasClass('develop') || body.hasClass('google')) {
      +      parentNavEl = navEl.find('> li.develop > a');
      +      parentNavEl.addClass('has-subnav');
      +      // In Develop docs, also highlight appropriate sub-nav
      +      if (urlSegments[1] === 'training') {
      +        selected = subNavEl.find('li.training > a').addClass('selected');
      +      } else if (urlSegments[1] === 'guide') {
      +        selected = subNavEl.find('li.guide > a').addClass('selected');
      +      } else if (urlSegments[1] === 'reference') {
      +        // If the root is reference, but page is also part of Google Services, select Google
      +        if (body.hasClass('google')) {
      +          selected = subNavEl.find('li.google > a').addClass('selected');
      +        } else {
      +          selected = subNavEl.find('li.reference > a').addClass('selected');
      +        }
      +      } else if (body.hasClass('google')) {
      +        selected = subNavEl.find('li.google > a').addClass('selected');
      +      } else if (body.hasClass('samples')) {
      +        selected = subNavEl.find('li.samples > a').addClass('selected');
      +      } else {
      +        selected = parentNavEl.removeClass('has-subnav').addClass('selected');
      +      }
      +      // highlight Distribute nav
      +    } else if (body.hasClass('distribute')) {
      +      parentNavEl = navEl.find('> li.distribute > a');
      +      parentNavEl.addClass('has-subnav');
      +      // In Distribute docs, also highlight appropriate sub-nav
      +      if (urlSegments[2] === 'users') {
      +        selected = subNavEl.find('li.users > a').addClass('selected');
      +      } else if (urlSegments[2] === 'engage') {
      +        selected = subNavEl.find('li.engage > a').addClass('selected');
      +      } else if (urlSegments[2] === 'monetize') {
      +        selected = subNavEl.find('li.monetize > a').addClass('selected');
      +      } else if (urlSegments[2] === 'analyze') {
      +        selected = subNavEl.find('li.analyze > a').addClass('selected');
      +      } else if (urlSegments[2] === 'tools') {
      +        selected = subNavEl.find('li.disttools > a').addClass('selected');
      +      } else if (urlSegments[2] === 'stories') {
      +        selected = subNavEl.find('li.stories > a').addClass('selected');
      +      } else if (urlSegments[2] === 'essentials') {
      +        selected = subNavEl.find('li.essentials > a').addClass('selected');
      +      } else if (urlSegments[2] === 'googleplay') {
      +        selected = subNavEl.find('li.googleplay > a').addClass('selected');
      +      } else {
      +        selected = parentNavEl.removeClass('has-subnav').addClass('selected');
      +      }
      +    } else if (body.hasClass('preview')) {
      +      selected = navEl.find('> li.preview > a').addClass('selected');
      +    }
      +    return $(selected);
      +  };
      +})(jQuery);
       
      -    var css = { 'width': $widget.width() + 'px',
      -                'height': $widget.height() + 'px' };
      +(function($) {
      +  'use strict';
       
      -    var $ul = $('<ul>');
      +  /**
      +   * Toggle the visabilty of the mobile navigation.
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function ToggleNav(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, ToggleNav.DEFAULTS_, options);
      +    this.body = $(document.body);
      +    this.navigation_ = this.body.find(this.options.navigation);
      +    this.el.on('click', this.clickHandler_.bind(this));
      +  }
       
      -    for (var i = 0; i < resources.length; ++i) {
      -      var $card = $('<a>')
      -        .attr('href', cleanUrl(resources[i].url))
      -        .decorateResourceCard(resources[i],plusone);
      +  ToggleNav.BREAKPOINT_ = 980;
       
      -      $('<li>').css(css)
      -          .append($card)
      -          .appendTo($ul);
      +  /**
      +   * Open on correct sizes
      +   */
      +  function toggleSidebarVisibility(body) {
      +    var wasClosed = ('' + localStorage.getItem('navigation-open')) === 'false';
      +    // Override the local storage setting for navigation-open for child sites
      +    // with no-subnav class.
      +    if (document.body.classList.contains('no-subnav')) {
      +      wasClosed = false;
           }
       
      -    $('<div>').addClass('frame')
      -      .append($ul)
      -      .appendTo($widget);
      -
      -    $widget.dacSlideshow({
      -      auto: true,
      -      btnPrev: '.slideshow-prev',
      -      btnNext: '.slideshow-next'
      -    });
      -  };
      +    if (wasClosed) {
      +      body.removeClass(ToggleNav.DEFAULTS_.activeClass);
      +    } else if (window.innerWidth >= ToggleNav.BREAKPOINT_) {
      +      body.addClass(ToggleNav.DEFAULTS_.activeClass);
      +    } else {
      +      body.removeClass(ToggleNav.DEFAULTS_.activeClass);
      +    }
      +  }
       
      -  /* Initializes a Resource Card Stack Widget (column-based layout)
      -     Modified by LFL 6/6/14
      +  /**
      +   * ToggleNav Default Settings
      +   * @type {{body: boolean, dimmer: string, navigation: string, activeClass: string}}
      +   * @private
          */
      -  function drawResourcesStackWidget($widget, opts, resources, sections) {
      -    // Don't empty widget, grab all items inside since they will be the first
      -    // items stacked, followed by the resource query
      -    var plusone = false; // stop showing plusone buttons on cards
      -    var cards = $widget.find('.resource-card').detach().toArray();
      -    var numStacks = opts.numStacks || 1;
      -    var $stacks = [];
      -    var urlString;
      +  ToggleNav.DEFAULTS_ = {
      +    body: true,
      +    dimmer: '.dac-nav-dimmer',
      +    animatingClass: 'dac-nav-animating',
      +    navigation: '[data-dac-nav]',
      +    activeClass: 'dac-nav-open'
      +  };
       
      -    for (var i = 0; i < numStacks; ++i) {
      -      $stacks[i] = $('<div>').addClass('resource-card-stack')
      -          .appendTo($widget);
      -    }
      +  /**
      +   * The actual toggle logic.
      +   * @param {Event} event
      +   * @private
      +   */
      +  ToggleNav.prototype.clickHandler_ = function(event) {
      +    event.preventDefault();
      +    var animatingClass = this.options.animatingClass;
      +    var body = this.body;
       
      -    var sectionResources = [];
      +    body.addClass(animatingClass);
      +    body.toggleClass(this.options.activeClass);
       
      -    // Extract any subsections that are actually resource cards
      -    if (sections) {
      -      for (var i = 0; i < sections.length; ++i) {
      -        if (!sections[i].sections || !sections[i].sections.length) {
      -          // Render it as a resource card
      -          sectionResources.push(
      -            $('<a>')
      -              .addClass('resource-card section-card')
      -              .attr('href', cleanUrl(sections[i].resource.url))
      -              .decorateResourceCard(sections[i].resource,plusone)[0]
      -          );
      +    setTimeout(function() {
      +      body.removeClass(animatingClass);
      +    }, this.navigation_.transitionDuration());
       
      -        } else {
      -          cards.push(
      -            $('<div>')
      -              .addClass('resource-card section-card-menu')
      -              .decorateResourceSection(sections[i],plusone)[0]
      -          );
      -        }
      -      }
      +    if (window.innerWidth >= ToggleNav.BREAKPOINT_) {
      +      localStorage.setItem('navigation-open', body.hasClass(this.options.activeClass));
           }
      +  };
       
      -    cards = cards.concat(sectionResources);
      +  /**
      +   * jQuery plugin
      +   * @param  {object} options - Override default options.
      +   */
      +  $.fn.dacToggleMobileNav = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      new ToggleNav(el, el.data());
      +    });
      +  };
       
      -    for (var i = 0; i < resources.length; ++i) {
      -      var $card = createResourceElement(resources[i], opts);
      +  $.fn.dacSidebarToggle = function(body) {
      +    toggleSidebarVisibility(body);
      +    $(window).on('resize', toggleSidebarVisibility.bind(null, body));
      +  };
       
      -      if (opts.resourceStyle.indexOf('related') > -1) {
      -        $card.addClass('related-card');
      -      }
      +  /**
      +   * Data Attribute API
      +   */
      +  $(function() {
      +    $('[data-dac-toggle-nav]').dacToggleMobileNav();
      +  });
      +})(jQuery);
       
      -      cards.push($card[0]);
      -    }
      +(function($) {
      +  'use strict';
       
      -    if (opts.stackSort != 'false') {
      -      for (var i = 0; i < cards.length; ++i) {
      -        // Find the stack with the shortest height, but give preference to
      -        // left to right order.
      -        var minHeight = $stacks[0].height();
      -        var minIndex = 0;
      +  /**
      +   * Submit the newsletter form to a Google Form.
      +   * @param {HTMLElement} el - The Form DOM element.
      +   * @constructor
      +   */
      +  function NewsletterForm(el) {
      +    this.el = $(el);
      +    this.form = this.el.find('form');
      +    $('<iframe/>').hide()
      +      .attr('name', 'dac-newsletter-iframe')
      +      .attr('src', '')
      +      .insertBefore(this.form);
      +    this.el.find('[data-newsletter-language]').val(window.polyglot.t('newsletter.languageVal'));
      +    this.form.on('submit', this.submitHandler_.bind(this));
      +  }
       
      -        for (var j = 1; j < numStacks; ++j) {
      -          var height = $stacks[j].height();
      -          if (height < minHeight - 45) {
      -            minHeight = height;
      -            minIndex = j;
      -          }
      -        }
      +  /**
      +   * Milliseconds until modal has vanished after modal-close is triggered.
      +   * @type {number}
      +   * @private
      +   */
      +  NewsletterForm.CLOSE_DELAY_ = 300;
       
      -        $stacks[minIndex].append($(cards[i]));
      -      }
      -    }
      +  /**
      +   * Switch view to display form after close.
      +   * @private
      +   */
      +  NewsletterForm.prototype.closeHandler_ = function() {
      +    setTimeout(function() {
      +      this.el.trigger('swap-reset');
      +    }.bind(this), NewsletterForm.CLOSE_DELAY_);
      +  };
       
      +  /**
      +   * Reset the modal to initial state.
      +   * @private
      +   */
      +  NewsletterForm.prototype.reset_ = function() {
      +    this.form.trigger('reset');
      +    this.el.one('modal-close', this.closeHandler_.bind(this));
         };
       
      -  /*
      -    Create a resource card using the given resource object and a list of html
      -     configured options. Returns a jquery object containing the element.
      -  */
      -  function createResourceElement(resource, opts, plusone) {
      -    var $el;
      +  /**
      +   * Display a success view on submit.
      +   * @private
      +   */
      +  NewsletterForm.prototype.submitHandler_ = function() {
      +    this.el.one('swap-complete', this.reset_.bind(this));
      +    this.el.trigger('swap-content');
      +  };
       
      -    // The difference here is that generic cards are not entirely clickable
      -    // so its a div instead of an a tag, also the generic one is not given
      -    // the resource-card class so it appears with a transparent background
      -    // and can be styled in whatever way the css setup.
      -    if (opts.resourceStyle == 'generic') {
      -      $el = $('<div>')
      -        .addClass('resource')
      -        .attr('href', cleanUrl(resource.url))
      -        .decorateResource(resource, opts);
      -    } else {
      -      var cls = 'resource resource-card';
      +  /**
      +   * jQuery plugin
      +   * @param  {object} options - Override default options.
      +   */
      +  $.fn.dacNewsletterForm = function(options) {
      +    return this.each(function() {
      +      new NewsletterForm(this, options);
      +    });
      +  };
       
      -      $el = $('<a>')
      -        .addClass(cls)
      -        .attr('href', cleanUrl(resource.url))
      -        .decorateResourceCard(resource, plusone);
      -    }
      +  /**
      +   * Data Attribute API
      +   */
      +  $(document).on('ready.aranja', function() {
      +    $('[data-newsletter]').each(function() {
      +      $(this).dacNewsletterForm();
      +    });
      +  });
      +})(jQuery);
       
      -    return $el;
      +/* globals METADATA, YOUTUBE_RESOURCES, BLOGGER_RESOURCES */
      +window.metadata = {};
      +
      +/**
      + * Prepare metadata and indices for querying.
      + */
      +window.metadata.prepare = (function() {
      +  // Helper functions.
      +  function mergeArrays() {
      +    return Array.prototype.concat.apply([], arguments);
         }
       
      -  function createResponsiveFlowColumn(cardSize) {
      -    var cardWidth = parseInt(cardSize.match(/(\d+)/)[1], 10);
      -    var column = $('<div>').addClass('col-' + (cardWidth / 3) + 'of6');
      -    if (cardWidth < 9) {
      -      column.addClass('col-tablet-1of2');
      -    } else if (cardWidth > 9 && cardWidth < 18) {
      -      column.addClass('col-tablet-1of1');
      -    }
      -    if (cardWidth < 18) {
      -      column.addClass('col-mobile-1of1')
      +  /**
      +   * Creates lookup maps for a resource index.
      +   * I.e. where MAP['some tag'][resource.id] === true when that resource has 'some tag'.
      +   * @param resourceDict
      +   * @returns {{}}
      +   */
      +  function buildResourceLookupMap(resourceDict) {
      +    var map = {};
      +    for (var key in resourceDict) {
      +      var dictForKey = {};
      +      var srcArr = resourceDict[key];
      +      for (var i = 0; i < srcArr.length; i++) {
      +        dictForKey[srcArr[i].index] = true;
      +      }
      +      map[key] = dictForKey;
           }
      -    return column;
      +    return map;
         }
       
      -  /* Initializes a flow widget, see distribute.scss for generating accompanying css */
      -  function drawResourcesFlowWidget($widget, opts, resources) {
      -    $widget.empty().addClass('cols');
      -    var cardSizes = opts.cardSizes || ['6x6'];
      -    var initialResults = opts.initialResults || resources.length;
      -    var i = 0, j = 0;
      -    var plusone = false; // stop showing plusone buttons on cards
      -    var cardParent = $widget;
      -
      -    while (i < resources.length) {
      +  /**
      +   * Merges metadata maps for english and the current language into the global store.
      +   */
      +  function mergeMetadataMap(name, locale) {
      +    if (locale && locale !== 'en' && METADATA[locale]) {
      +      METADATA[name] = $.extend(METADATA.en[name], METADATA[locale][name]);
      +    } else {
      +      METADATA[name] = METADATA.en[name];
      +    }
      +  }
       
      -      if (i === initialResults && initialResults < resources.length) {
      -        // Toggle remaining cards
      -        cardParent = $('<div class="dac-toggle-content clearfix">').appendTo($widget);
      -        $widget.addClass('dac-toggle');
      -        $('<div class="col-1of1 dac-section-links dac-text-center">')
      -          .append(
      -            $('<div class="dac-section-link" data-toggle="section">')
      -              .append('<span class="dac-toggle-expand">More<i class="dac-sprite dac-auto-unfold-more"></i></span>')
      -              .append('<span class="dac-toggle-collapse">Less<i class="dac-sprite dac-auto-unfold-less"></i></span>')
      -          )
      -          .appendTo($widget)
      +  /**
      +   * Index all resources by type, url, tag and category.
      +   * @param resources
      +   */
      +  function createIndices(resources) {
      +    // URL, type, tag and category lookups
      +    var byType = METADATA.byType = {};
      +    var byUrl = METADATA.byUrl = {};
      +    var byTag = METADATA.byTag = {};
      +    var byCategory = METADATA.byCategory = {};
      +
      +    for (var i = 0; i < resources.length; i++) {
      +      var res = resources[i];
      +
      +      // Store index.
      +      res.index = i;
      +
      +      // Index by type.
      +      var type = res.type;
      +      if (type) {
      +        byType[type] = byType[type] || [];
      +        byType[type].push(res);
             }
       
      -      var cardSize = cardSizes[j++ % cardSizes.length];
      -      cardSize = cardSize.replace(/^\s+|\s+$/,'');
      -
      -      var column = createResponsiveFlowColumn(cardSize).appendTo(cardParent);
      -
      -      // A stack has a third dimension which is the number of stacked items
      -      var isStack = cardSize.match(/(\d+)x(\d+)x(\d+)/);
      -      var stackCount = 0;
      -      var $stackDiv = null;
      +      // Index by tag.
      +      var tags = res.tags || [];
      +      for (var j = 0; j < tags.length; j++) {
      +        var tag = tags[j];
      +        if (tag) {
      +          byTag[tag] = byTag[tag] || [];
      +          byTag[tag].push(res);
      +        }
      +      }
       
      -      if (isStack) {
      -        // Create a stack container which should have the dimensions defined
      -        // by the product of the items inside.
      -        $stackDiv = $('<div>').addClass('resource-card-stack resource-card-' + isStack[1]
      -            + 'x' + isStack[2] * isStack[3]) .appendTo(column);
      +      // Index by category.
      +      var category = res.category;
      +      if (category) {
      +        byCategory[category] = byCategory[category] || [];
      +        byCategory[category].push(res);
             }
       
      -      // Build each stack item or just a single item
      -      do {
      -        var resource = resources[i];
      +      // Index by url.
      +      var url = res.url;
      +      if (url) {
      +        res.baseUrl = url.replace(/^intl\/\w+[\/]/, '');
      +        byUrl[res.baseUrl] = res;
      +      }
      +    }
      +    METADATA.hasType = buildResourceLookupMap(byType);
      +    METADATA.hasTag = buildResourceLookupMap(byTag);
      +    METADATA.hasCategory = buildResourceLookupMap(byCategory);
      +  }
       
      -        var $card = createResourceElement(resources[i], opts, plusone);
      +  return function() {
      +    // Only once.
      +    if (METADATA.all) { return; }
      +
      +    // Get current language.
      +    var locale = getLangPref();
      +    // Merge english resources.
      +    if (useDevsiteMetadata) {
      +      var all_keys = Object.keys(METADATA['en']);
      +      METADATA.all = []
      +
      +      $(all_keys).each(function(index, category) {
      +        if (RESERVED_METADATA_CATEGORY_NAMES.indexOf(category) == -1) {
      +          METADATA.all = mergeArrays(
      +            METADATA.all,
      +            METADATA.en[category]
      +          );
      +        }
      +      });
       
      -        $card.addClass('resource-card-' + cardSize +
      -          ' resource-card-' + resource.type);
      +      METADATA.all = mergeArrays(
      +        METADATA.all,
      +        YOUTUBE_RESOURCES,
      +        BLOGGER_RESOURCES,
      +        METADATA.en.extras
      +      );
      +    } else {
      +      METADATA.all = mergeArrays(
      +        METADATA.en.about,
      +        METADATA.en.design,
      +        METADATA.en.distribute,
      +        METADATA.en.develop,
      +        YOUTUBE_RESOURCES,
      +        BLOGGER_RESOURCES,
      +        METADATA.en.extras
      +      );
      +    }
       
      -        if (isStack) {
      -          $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]);
      -          if (++stackCount == parseInt(isStack[3])) {
      -            $card.addClass('resource-card-row-stack-last');
      -            stackCount = 0;
      +    // Merge local language resources.
      +    if (locale !== 'en' && METADATA[locale]) {
      +      if (useDevsiteMetadata) {
      +        all_keys = Object.keys(METADATA[locale]);
      +        $(all_keys).each(function(index, category) {
      +          if (RESERVED_METADATA_CATEGORY_NAMES.indexOf(category) == -1) {
      +            METADATA.all = mergeArrays(
      +              METADATA.all,
      +              METADATA.en[category]
      +            );
                 }
      -        } else {
      -          stackCount = 0;
      -        }
      +        });
       
      -        $card.appendTo($stackDiv || column);
      +        METADATA.all = mergeArrays(
      +          METADATA.all,
      +          METADATA[locale].extras
      +        );
      +      } else {
      +        METADATA.all = mergeArrays(
      +          METADATA.all,
      +          METADATA[locale].about,
      +          METADATA[locale].design,
      +          METADATA[locale].distribute,
      +          METADATA[locale].develop,
      +          METADATA[locale].extras
      +        );
       
      -      } while (++i < resources.length && stackCount > 0);
      +      }
           }
      -  }
       
      -  /* Build a site map of resources using a section as a root. */
      -  function buildSectionList(opts) {
      -    if (opts.section && SECTION_BY_ID[opts.section]) {
      -      return SECTION_BY_ID[opts.section].sections || [];
      -    }
      -    return [];
      -  }
      +    mergeMetadataMap('collections', locale);
      +    mergeMetadataMap('searchHeroCollections', locale);
      +    mergeMetadataMap('carousel', locale);
       
      -  function buildResourceList(opts) {
      -    return $.queryResources(opts);
      -  }
      +    // Create query indicies for resources.
      +    createIndices(METADATA.all, locale);
       
      -  $.queryResources = function(opts) {
      -    var maxResults = opts.maxResults || 100;
      +    // Reference metadata.
      +    METADATA.androidReference = mergeArrays(
      +        window.DATA, window.SUPPORT_WEARABLE_DATA, window.SUPPORT_TEST_DATA);
      +    METADATA.googleReference = mergeArrays(window.GMS_DATA, window.GCM_DATA);
      +  };
      +})();
       
      -    var query = opts.query || '';
      -    var expressions = parseResourceQuery(query);
      -    var addedResourceIndices = {};
      +/* global METADATA, util */
      +window.metadata.query = (function($) {
      +  var pageMap = {};
      +
      +  function buildResourceList(opts) {
      +    window.metadata.prepare();
      +    var expressions = parseResourceQuery(opts.query || '');
      +    var instanceMap = {};
           var results = [];
       
           for (var i = 0; i < expressions.length; i++) {
             var clauses = expressions[i];
       
      -      // build initial set of resources from first clause
      -      var firstClause = clauses[0];
      -      var resources = [];
      -      switch (firstClause.attr) {
      -        case 'type':
      -          resources = ALL_RESOURCES_BY_TYPE[firstClause.value];
      -          break;
      -        case 'lang':
      -          resources = ALL_RESOURCES_BY_LANG[firstClause.value];
      -          break;
      -        case 'tag':
      -          resources = ALL_RESOURCES_BY_TAG[firstClause.value];
      -          break;
      -        case 'collection':
      -          var urls = RESOURCE_COLLECTIONS[firstClause.value].resources || [];
      -          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
      -          break;
      -        case 'section':
      -          var urls = SITE_MAP[firstClause.value].sections || [];
      -          resources = urls.map(function(url){ return ALL_RESOURCES_BY_URL[url]; });
      -          break;
      +      // Get all resources for first clause
      +      var resources = getResourcesForClause(clauses.shift());
      +
      +      // Concat to final results list
      +      results = results.concat(resources.map(filterResources(clauses, i > 0, instanceMap)).filter(filterEmpty));
      +    }
      +
      +    // Set correct order
      +    if (opts.sortOrder && results.length) {
      +      results = opts.sortOrder === 'random' ? util.shuffle(results) : results.sort(sortResultsByKey(opts.sortOrder));
      +    }
      +
      +    // Slice max results.
      +    if (opts.maxResults !== Infinity) {
      +      results = results.slice(0, opts.maxResults);
      +    }
      +
      +    // Remove page level duplicates
      +    if (opts.allowDuplicates === undefined || opts.allowDuplicates === 'false') {
      +      results = results.filter(removePageLevelDuplicates);
      +
      +      for (var index = 0; index < results.length; ++index) {
      +        pageMap[results[index].index] = 1;
             }
      -      // console.log(firstClause.attr + ':' + firstClause.value);
      -      resources = resources || [];
      +    }
      +
      +    return results;
      +  }
       
      -      // use additional clauses to filter corpus
      -      if (clauses.length > 1) {
      -        var otherClauses = clauses.slice(1);
      -        resources = resources.filter(getResourceMatchesClausesFilter(otherClauses));
      -      }
      +  function filterResources(clauses, removeDuplicates, map) {
      +    return function(resource) {
      +      var resourceIsAllowed = true;
       
      -      // filter out resources already added
      -      if (i > 1) {
      -        resources = resources.filter(getResourceNotAlreadyAddedFilter(addedResourceIndices));
      +      // References must be defined.
      +      if (resource === undefined) {
      +        return;
             }
       
      -      // add to list of already added indices
      -      for (var j = 0; j < resources.length; j++) {
      -        if (resources[j]) {
      -          addedResourceIndices[resources[j].index] = 1;
      -        }
      -      }
      +      // Get canonical (localized) version of resource if possible.
      +      resource = METADATA.byUrl[resource.baseUrl] || METADATA.byUrl[resource.url] || resource;
       
      -      // concat to final results list
      -      results = results.concat(resources);
      -    }
      +      // Filter out resources already used
      +      if (removeDuplicates) {
      +        resourceIsAllowed = !map[resource.index];
      +      }
       
      -    if (opts.sortOrder && results.length) {
      -      var attr = opts.sortOrder;
      -
      -      if (opts.sortOrder == 'random') {
      -        var i = results.length, j, temp;
      -        while (--i) {
      -          j = Math.floor(Math.random() * (i + 1));
      -          temp = results[i];
      -          results[i] = results[j];
      -          results[j] = temp;
      -        }
      -      } else {
      -        var desc = attr.charAt(0) == '-';
      -        if (desc) {
      -          attr = attr.substring(1);
      -        }
      -        results = results.sort(function(x,y) {
      -          return (desc ? -1 : 1) * (parseInt(x[attr], 10) - parseInt(y[attr], 10));
      -        });
      +      // Must fulfill all criteria
      +      if (clauses.length > 0) {
      +        resourceIsAllowed = resourceIsAllowed && doesResourceMatchClauses(resource, clauses);
             }
      -    }
       
      -    results = results.filter(getResourceNotAlreadyAddedFilter(addedPageResources));
      -    results = results.slice(0, maxResults);
      +      // Mark resource as used.
      +      if (resourceIsAllowed) {
      +        map[resource.index] = 1;
      +      }
       
      -    for (var j = 0; j < results.length; ++j) {
      -      addedPageResources[results[j].index] = 1;
      -    }
      +      return resourceIsAllowed && resource;
      +    };
      +  }
       
      -    return results;
      +  function filterEmpty(resource) {
      +    return resource;
         }
       
      +  function sortResultsByKey(key) {
      +    var desc = key.charAt(0) === '-';
       
      -  function getResourceNotAlreadyAddedFilter(addedResourceIndices) {
      -    return function(resource) {
      -      return resource && !addedResourceIndices[resource.index];
      +    if (desc) {
      +      key = key.substring(1);
      +    }
      +
      +    return function(x, y) {
      +      return (desc ? -1 : 1) * (parseInt(x[key], 10) - parseInt(y[key], 10));
           };
         }
       
      +  function getResourcesForClause(clause) {
      +    switch (clause.attr) {
      +      case 'type':
      +        return METADATA.byType[clause.value];
      +      case 'tag':
      +        return METADATA.byTag[clause.value];
      +      case 'collection':
      +        var resources = METADATA.collections[clause.value] || {};
      +        return getResourcesByUrlCollection(resources.resources);
      +      case 'history':
      +        return getResourcesByUrlCollection($.dacGetVisitedUrls(clause.value));
      +      case 'section':
      +        return getResourcesByUrlCollection([clause.value].sections);
      +      default:
      +        return [];
      +    }
      +  }
       
      -  function getResourceMatchesClausesFilter(clauses) {
      -    return function(resource) {
      -      return doesResourceMatchClauses(resource, clauses);
      -    };
      +  function getResourcesByUrlCollection(resources) {
      +    return (resources || []).map(function(url) {
      +      return METADATA.byUrl[url];
      +    });
         }
       
      +  function removePageLevelDuplicates(resource) {
      +    return resource && !pageMap[resource.index];
      +  }
       
         function doesResourceMatchClauses(resource, clauses) {
           for (var i = 0; i < clauses.length; i++) {
             var map;
             switch (clauses[i].attr) {
               case 'type':
      -          map = IS_RESOURCE_OF_TYPE[clauses[i].value];
      -          break;
      -        case 'lang':
      -          map = IS_RESOURCE_IN_LANG[clauses[i].value];
      +          map = METADATA.hasType[clauses[i].value];
                 break;
               case 'tag':
      -          map = IS_RESOURCE_TAGGED[clauses[i].value];
      +          map = METADATA.hasTag[clauses[i].value];
                 break;
             }
       
      @@ -4040,19 +5039,10 @@ function showSamples() {
               return clauses[i].negative;
             }
           }
      -    return true;
      -  }
      -
      -  function cleanUrl(url)
      -  {
      -    if (url && url.indexOf('//') === -1) {
      -      url = toRoot + url;
      -    }
       
      -    return url;
      +    return true;
         }
       
      -
         function parseResourceQuery(query) {
           // Parse query into array of expressions (expression e.g. 'tag:foo + type:video')
           var expressions = [];
      @@ -4070,18 +5060,18 @@ function showSamples() {
               var parts = clauseStr.split(':');
               var clause = {};
       
      -        clause.attr = parts[0].replace(/^\s+|\s+$/g,'');
      +        clause.attr = parts[0].replace(/^\s+|\s+$/g, '');
               if (clause.attr) {
      -          if (clause.attr.charAt(0) == '+') {
      +          if (clause.attr.charAt(0) === '+') {
                   clause.attr = clause.attr.substring(1);
      -          } else if (clause.attr.charAt(0) == '-') {
      +          } else if (clause.attr.charAt(0) === '-') {
                   clause.negative = true;
                   clause.attr = clause.attr.substring(1);
                 }
               }
       
               if (parts.length > 1) {
      -          clause.value = parts[1].replace(/^\s+|\s+$/g,'');
      +          clause.value = parts[1].replace(/^\s+|\s+$/g, '');
               }
       
               clauses.push(clause);
      @@ -4089,1122 +5079,985 @@ function showSamples() {
       
             if (!clauses.length) {
               continue;
      -      }
      -
      -      expressions.push(clauses);
      -    }
      -
      -    return expressions;
      -  }
      -})();
      -
      -(function($) {
      -
      -  /*
      -    Utility method for creating dom for the description area of a card.
      -    Used in decorateResourceCard and decorateResource.
      -  */
      -  function buildResourceCardDescription(resource, plusone) {
      -    var $description = $('<div>').addClass('description ellipsis');
      -
      -    $description.append($('<div>').addClass('text').html(resource.summary));
      -
      -    if (resource.cta) {
      -      $description.append($('<a>').addClass('cta').html(resource.cta));
      -    }
      -
      -    if (plusone) {
      -      var plusurl = resource.url.indexOf("//") > -1 ? resource.url :
      -        "//developer.android.com/" + resource.url;
      -
      -      $description.append($('<div>').addClass('util')
      -        .append($('<div>').addClass('g-plusone')
      -          .attr('data-size', 'small')
      -          .attr('data-align', 'right')
      -          .attr('data-href', plusurl)));
      -    }
      -
      -    return $description;
      -  }
      -
      -
      -  /* Simple jquery function to create dom for a standard resource card */
      -  $.fn.decorateResourceCard = function(resource,plusone) {
      -    var section = resource.group || resource.type;
      -    var imgUrl = resource.image ||
      -      'assets/images/resource-card-default-android.jpg';
      -
      -    if (imgUrl.indexOf('//') === -1) {
      -      imgUrl = toRoot + imgUrl;
      -    }
      -
      -    if (resource.type === 'youtube') {
      -      $('<div>').addClass('play-button')
      -        .append($('<i class="dac-sprite dac-play-white">'))
      -        .appendTo(this);
      -    }
      -
      -    $('<div>').addClass('card-bg')
      -      .css('background-image', 'url(' + (imgUrl || toRoot +
      -        'assets/images/resource-card-default-android.jpg') + ')')
      -      .appendTo(this);
      -
      -    $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
      -      .append($('<div>').addClass('section').text(section))
      -      .append($('<div>').addClass('title').html(resource.title))
      -      .append(buildResourceCardDescription(resource, plusone))
      -      .appendTo(this);
      -
      -    return this;
      -  };
      -
      -  /* Simple jquery function to create dom for a resource section card (menu) */
      -  $.fn.decorateResourceSection = function(section,plusone) {
      -    var resource = section.resource;
      -    //keep url clean for matching and offline mode handling
      -    var urlPrefix = resource.image.indexOf("//") > -1 ? "" : toRoot;
      -    var $base = $('<a>')
      -        .addClass('card-bg')
      -        .attr('href', resource.url)
      -        .append($('<div>').addClass('card-section-icon')
      -          .append($('<div>').addClass('icon'))
      -          .append($('<div>').addClass('section').html(resource.title)))
      -      .appendTo(this);
      -
      -    var $cardInfo = $('<div>').addClass('card-info').appendTo(this);
      -
      -    if (section.sections && section.sections.length) {
      -      // Recurse the section sub-tree to find a resource image.
      -      var stack = [section];
      -
      -      while (stack.length) {
      -        if (stack[0].resource.image) {
      -          $base.css('background-image', 'url(' + urlPrefix + stack[0].resource.image + ')');
      -          break;
      -        }
      -
      -        if (stack[0].sections) {
      -          stack = stack.concat(stack[0].sections);
      -        }
      -
      -        stack.shift();
      -      }
      -
      -      var $ul = $('<ul>')
      -        .appendTo($cardInfo);
      -
      -      var max = section.sections.length > 3 ? 3 : section.sections.length;
      -
      -      for (var i = 0; i < max; ++i) {
      -
      -        var subResource = section.sections[i];
      -        if (!plusone) {
      -          $('<li>')
      -            .append($('<a>').attr('href', subResource.url)
      -              .append($('<div>').addClass('title').html(subResource.title))
      -              .append($('<div>').addClass('description ellipsis')
      -                .append($('<div>').addClass('text').html(subResource.summary))
      -                .append($('<div>').addClass('util'))))
      -          .appendTo($ul);
      -        } else {
      -          $('<li>')
      -            .append($('<a>').attr('href', subResource.url)
      -              .append($('<div>').addClass('title').html(subResource.title))
      -              .append($('<div>').addClass('description ellipsis')
      -                .append($('<div>').addClass('text').html(subResource.summary))
      -                .append($('<div>').addClass('util')
      -                  .append($('<div>').addClass('g-plusone')
      -                    .attr('data-size', 'small')
      -                    .attr('data-align', 'right')
      -                    .attr('data-href', resource.url)))))
      -          .appendTo($ul);
      -        }
      -      }
      -
      -      // Add a more row
      -      if (max < section.sections.length) {
      -        $('<li>')
      -          .append($('<a>').attr('href', resource.url)
      -            .append($('<div>')
      -              .addClass('title')
      -              .text('More')))
      -        .appendTo($ul);
      -      }
      -    } else {
      -      // No sub-resources, just render description?
      -    }
      -
      -    return this;
      -  };
      -
      -
      -
      -
      -  /* Render other types of resource styles that are not cards. */
      -  $.fn.decorateResource = function(resource, opts) {
      -    var imgUrl = resource.image ||
      -      'assets/images/resource-card-default-android.jpg';
      -    var linkUrl = resource.url;
      -
      -    if (imgUrl.indexOf('//') === -1) {
      -      imgUrl = toRoot + imgUrl;
      -    }
      -
      -    if (linkUrl && linkUrl.indexOf('//') === -1) {
      -      linkUrl = toRoot + linkUrl;
      -    }
      -
      -    $(this).append(
      -      $('<div>').addClass('image')
      -        .css('background-image', 'url(' + imgUrl + ')'),
      -      $('<div>').addClass('info').append(
      -        $('<h4>').addClass('title').html(resource.title),
      -        $('<p>').addClass('summary').html(resource.summary),
      -        $('<a>').attr('href', linkUrl).addClass('cta').html('Learn More')
      -      )
      -    );
      -
      -    return this;
      -  };
      -})(jQuery);
      -
      -
      -/* Calculate the vertical area remaining */
      -(function($) {
      -    $.fn.ellipsisfade= function(lineHeight) {
      -        this.each(function() {
      -            // get element text
      -            var $this = $(this);
      -            var remainingHeight = $this.parent().parent().height();
      -            $this.parent().siblings().each(function ()
      -            {
      -              if ($(this).is(":visible")) {
      -                var h = $(this).outerHeight(true);
      -                remainingHeight = remainingHeight - h;
      -              }
      -            });
      -
      -            adjustedRemainingHeight = ((remainingHeight)/lineHeight>>0)*lineHeight
      -            $this.parent().css({'height': adjustedRemainingHeight});
      -            $this.css({'height': "auto"});
      -        });
      -
      -        return this;
      -    };
      -}) (jQuery);
      -
      -/*
      -  Fullscreen Carousel
      -
      -  The following allows for an area at the top of the page that takes over the
      -  entire browser height except for its top offset and an optional bottom
      -  padding specified as a data attribute.
      -
      -  HTML:
      -
      -  <div class="fullscreen-carousel">
      -    <div class="fullscreen-carousel-content">
      -      <!-- content here -->
      -    </div>
      -    <div class="fullscreen-carousel-content">
      -      <!-- content here -->
      -    </div>
      -
      -    etc ...
      -
      -  </div>
      -
      -  Control over how the carousel takes over the screen can mostly be defined in
      -  a css file. Setting min-height on the .fullscreen-carousel-content elements
      -  will prevent them from shrinking to far vertically when the browser is very
      -  short, and setting max-height on the .fullscreen-carousel itself will prevent
      -  the area from becoming to long in the case that the browser is stretched very
      -  tall.
      -
      -  There is limited functionality for having multiple sections since that request
      -  was removed, but it is possible to add .next-arrow and .prev-arrow elements to
      -  scroll between multiple content areas.
      -*/
      -
      -(function() {
      -  $(document).ready(function() {
      -    $('.fullscreen-carousel').each(function() {
      -      initWidget(this);
      -    });
      -  });
      +      }
       
      -  function initWidget(widget) {
      -    var $widget = $(widget);
      +      expressions.push(clauses);
      +    }
       
      -    var topOffset = $widget.offset().top;
      -    var padBottom = parseInt($widget.data('paddingbottom')) || 0;
      -    var maxHeight = 0;
      -    var minHeight = 0;
      -    var $content = $widget.find('.fullscreen-carousel-content');
      -    var $nextArrow = $widget.find('.next-arrow');
      -    var $prevArrow = $widget.find('.prev-arrow');
      -    var $curSection = $($content[0]);
      +    return expressions;
      +  }
       
      -    if ($content.length <= 1) {
      -      $nextArrow.hide();
      -      $prevArrow.hide();
      -    } else {
      -      $nextArrow.click(function() {
      -        var index = ($content.index($curSection) + 1);
      -        $curSection.hide();
      -        $curSection = $($content[index >= $content.length ? 0 : index]);
      -        $curSection.show();
      -      });
      +  return buildResourceList;
      +})(jQuery);
       
      -      $prevArrow.click(function() {
      -        var index = ($content.index($curSection) - 1);
      -        $curSection.hide();
      -        $curSection = $($content[index < 0 ? $content.length - 1 : 0]);
      -        $curSection.show();
      -      });
      -    }
      +/* global METADATA, getLangPref */
       
      -    // Just hide all content sections except first.
      -    $content.each(function(index) {
      -      if ($(this).height() > minHeight) minHeight = $(this).height();
      -      $(this).css({position: 'absolute',  display: index > 0 ? 'none' : ''});
      -    });
      +window.metadata.search = (function() {
      +  'use strict';
       
      -    // Register for changes to window size, and trigger.
      -    $(window).resize(resizeWidget);
      -    resizeWidget();
      +  var currentLang = getLangPref();
       
      -    function resizeWidget() {
      -      var height = $(window).height() - topOffset - padBottom;
      -      $widget.width($(window).width());
      -      $widget.height(height < minHeight ? minHeight :
      -        (maxHeight && height > maxHeight ? maxHeight : height));
      -    }
      +  function search(query) {
      +    window.metadata.prepare();
      +    return {
      +      android: findDocsMatches(query, METADATA.androidReference),
      +      docs: findDocsMatches(query, METADATA.googleReference),
      +      resources: findResourceMatches(query)
      +    };
         }
      -})();
       
      +  function findDocsMatches(query, data) {
      +    var results = [];
       
      +    for (var i = 0; i < data.length; i++) {
      +      var s = data[i];
      +      if (query.length !== 0 && s.label.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
      +        results.push(s);
      +      }
      +    }
       
      +    rankAutocompleteApiResults(query, results);
       
      +    return results;
      +  }
       
      -/*
      -  Tab Carousel
      +  function findResourceMatches(query) {
      +    var results = [];
       
      -  The following allows tab widgets to be installed via the html below. Each
      -  tab content section should have a data-tab attribute matching one of the
      -  nav items'. Also each tab content section should have a width matching the
      -  tab carousel.
      +    // Search for matching JD docs
      +    if (query.length >= 2) {
      +      /* In some langs, spaces may be optional between certain non-Ascii word-glyphs. For
      +       * those langs, only match query at word boundaries if query includes Ascii chars only.
      +       */
      +      var NO_BOUNDARY_LANGUAGES = ['ja','ko','vi','zh-cn','zh-tw'];
      +      var isAsciiOnly = /^[\u0000-\u007f]*$/.test(query);
      +      var noBoundaries = (NO_BOUNDARY_LANGUAGES.indexOf(window.getLangPref()) !== -1);
      +      var exprBoundary = (!isAsciiOnly && noBoundaries) ? '' : '(?:^|\\s)';
      +      var queryRegex = new RegExp(exprBoundary + query.toLowerCase(), 'g');
      +
      +      var all = METADATA.all;
      +      for (var i = 0; i < all.length; i++) {
      +        // current search comparison, with counters for tag and title,
      +        // used later to improve ranking
      +        var s = all[i];
      +        s.matched_tag = 0;
      +        s.matched_title = 0;
      +        var matched = false;
      +
      +        // Check if query matches any tags; work backwards toward 1 to assist ranking
      +        if (s.keywords) {
      +          for (var j = s.keywords.length - 1; j >= 0; j--) {
      +            // it matches a tag
      +            if (s.keywords[j].toLowerCase().match(queryRegex)) {
      +              matched = true;
      +              s.matched_tag = j + 1; // add 1 to index position
      +            }
      +          }
      +        }
       
      -  HTML:
      +        // Check if query matches doc title
      +        if (s.title.toLowerCase().match(queryRegex)) {
      +          matched = true;
      +          s.matched_title = 1;
      +        }
       
      -  <div class="tab-carousel">
      -    <ul class="tab-nav">
      -      <li><a href="#" data-tab="handsets">Handsets</a>
      -      <li><a href="#" data-tab="wearable">Wearable</a>
      -      <li><a href="#" data-tab="tv">TV</a>
      -    </ul>
      +        // Remember the doc if it matches either
      +        if (matched) {
      +          results.push(s);
      +        }
      +      }
       
      -    <div class="tab-carousel-content">
      -      <div data-tab="handsets">
      -        <!--Full width content here-->
      -      </div>
      +      // Improve the current results
      +      results = lookupBetterResult(results);
       
      -      <div data-tab="wearable">
      -        <!--Full width content here-->
      -      </div>
      +      // Rank/sort all the matched pages
      +      rankAutocompleteDocResults(results);
       
      -      <div data-tab="tv">
      -        <!--Full width content here-->
      -      </div>
      -    </div>
      -  </div>
      +      return results;
      +    }
      +  }
       
      -*/
      -(function() {
      -  $(document).ready(function() {
      -    $('.tab-carousel').each(function() {
      -      initWidget(this);
      -    });
      -  });
      +  // Replaces a match with another resource by url, if it exists.
      +  function lookupReplacementByUrl(match, url) {
      +    var replacement = METADATA.byUrl[url];
       
      -  function initWidget(widget) {
      -    var $widget = $(widget);
      -    var $nav = $widget.find('.tab-nav');
      -    var $anchors = $nav.find('[data-tab]');
      -    var $li = $nav.find('li');
      -    var $contentContainer = $widget.find('.tab-carousel-content');
      -    var $tabs = $contentContainer.find('[data-tab]');
      -    var $curTab = $($tabs[0]); // Current tab is first tab.
      -    var width = $widget.width();
      +    // Replacement resource does not exists.
      +    if (!replacement) { return; }
       
      -    // Setup nav interactivity.
      -    $anchors.click(function(evt) {
      -      evt.preventDefault();
      -      var query = '[data-tab=' + $(this).data('tab') + ']';
      -      transitionWidget($tabs.filter(query));
      -    });
      +    replacement.matched_title = Math.max(replacement.matched_title, match.matched_title);
      +    replacement.matched_tag = Math.max(replacement.matched_tag, match.matched_tag);
       
      -    // Add highlight for navigation on first item.
      -    var $highlight = $('<div>').addClass('highlight')
      -      .css({left:$li.position().left + 'px', width:$li.outerWidth() + 'px'})
      -      .appendTo($nav);
      +    return replacement;
      +  }
       
      -    // Store height since we will change contents to absolute.
      -    $contentContainer.height($contentContainer.height());
      +  // Find the localized version of a page if it exists.
      +  function lookupLocalizedVersion(match) {
      +    return METADATA.byUrl[match.baseUrl] || METADATA.byUrl[match.url];
      +  }
       
      -    // Absolutely position tabs so they're ready for transition.
      -    $tabs.each(function(index) {
      -      $(this).css({position: 'absolute', left: index > 0 ? width + 'px' : '0'});
      -    });
      +  // Find the main page for a tutorial when matching a subpage.
      +  function lookupTutorialIndex(match) {
      +    // Guard for non index tutorial pages.
      +    if (match.type !== 'training' || match.url.indexOf('index.html') >= 0) { return; }
       
      -    function transitionWidget($toTab) {
      -      if (!$curTab.is($toTab)) {
      -        var curIndex = $tabs.index($curTab[0]);
      -        var toIndex = $tabs.index($toTab[0]);
      -        var dir = toIndex > curIndex ? 1 : -1;
      +    var indexUrl = match.url.replace(/[^\/]+$/, 'index.html');
      +    return lookupReplacementByUrl(match, indexUrl);
      +  }
       
      -        // Animate content sections.
      -        $toTab.css({left:(width * dir) + 'px'});
      -        $curTab.animate({left:(width * -dir) + 'px'});
      -        $toTab.animate({left:'0'});
      +  // Find related results which are a better match for the user.
      +  function lookupBetterResult(matches) {
      +    var newMatches = [];
       
      -        // Animate navigation highlight.
      -        $highlight.animate({left:$($li[toIndex]).position().left + 'px',
      -          width:$($li[toIndex]).outerWidth() + 'px'})
      +    matches = matches.filter(function(match) {
      +      var newMatch = match;
      +      newMatch = lookupTutorialIndex(newMatch) || newMatch;
      +      newMatch = lookupLocalizedVersion(newMatch) || newMatch;
       
      -        // Store new current section.
      -        $curTab = $toTab;
      +      if (newMatch !== match) {
      +        newMatches.push(newMatch);
             }
      -    }
      -  }
      -})();
       
      -/**
      - * Auto TOC
      - *
      - * Upgrades h2s on the page to have a rule and be toggle-able on mobile.
      - */
      -(function($) {
      -  var upgraded = false;
      -  var h2Titles;
      +      return newMatch === match;
      +    });
       
      -  function initWidget() {
      -    // add HRs below all H2s (except for a few other h2 variants)
      -    // Consider doing this with css instead.
      -    h2Titles = $('h2').not('#qv h2, #tb h2, .sidebox h2, #devdoc-nav h2, h2.norule');
      -    h2Titles.css({marginBottom:0}).after('<hr/>');
      +    return toUnique(newMatches.concat(matches));
      +  }
       
      -    // Exit early if on older browser.
      -    if (!window.matchMedia) {
      +  /* Order the jd doc result list based on match quality */
      +  function rankAutocompleteDocResults(matches) {
      +    if (!matches || !matches.length) {
             return;
           }
       
      -    // Only run logic in mobile layout.
      -    var query = window.matchMedia('(max-width: 719px)');
      -    if (query.matches) {
      -      makeTogglable();
      -    } else {
      -      query.addListener(makeTogglable);
      +    var _resultScoreFn = function(match) {
      +      var score = 1.0;
      +
      +      // if the query matched a tag
      +      if (match.matched_tag > 0) {
      +        // multiply score by factor relative to position in tags list (max of 3)
      +        score *= 3 / match.matched_tag;
      +
      +        // if it also matched the title
      +        if (match.matched_title > 0) {
      +          score *= 2;
      +        }
      +      } else if (match.matched_title > 0) {
      +        score *= 3;
      +      }
      +
      +      if (match.lang === currentLang) {
      +        score *= 5;
      +      }
      +
      +      return score;
      +    };
      +
      +    for (var i = 0; i < matches.length; i++) {
      +      matches[i].__resultScore = _resultScoreFn(matches[i]);
           }
      -  }
       
      -  function makeTogglable() {
      -    // Only run this logic once.
      -    if (upgraded) { return; }
      -    upgraded = true;
      +    matches.sort(function(a, b) {
      +      var n = b.__resultScore - a.__resultScore;
       
      -    // Only make content h2s togglable.
      -    var contentTitles = h2Titles.filter('#jd-content *');
      +      if (n === 0) {
      +        // lexicographical sort if scores are the same
      +        n = (a.title < b.title) ? -1 : 1;
      +      }
       
      -    // If there are more than 1
      -    if (contentTitles.size() < 2) {
      +      return n;
      +    });
      +  }
      +
      +  /* Order the result list based on match quality */
      +  function rankAutocompleteApiResults(query, matches) {
      +    query = query || '';
      +    if (!matches || !matches.length) {
             return;
           }
       
      -    contentTitles.each(function() {
      -      // Find all the relevant nodes.
      -      var $title = $(this);
      -      var $hr = $title.next();
      -      var $contents = $hr.nextUntil('h2, .next-docs');
      -      var $section = $($title)
      -        .add($hr)
      -        .add($title.prev('a[name]'))
      -        .add($contents);
      -      var $anchor = $section.first().prev();
      -      var anchorMethod = 'after';
      -      if ($anchor.length === 0) {
      -        $anchor = $title.parent();
      -        anchorMethod = 'prepend';
      +    // helper function that gets the last occurence index of the given regex
      +    // in the given string, or -1 if not found
      +    var _lastSearch = function(s, re) {
      +      if (s === '') {
      +        return -1;
      +      }
      +      var l = -1;
      +      var tmp;
      +      while ((tmp = s.search(re)) >= 0) {
      +        if (l < 0) {
      +          l = 0;
      +        }
      +        l += tmp;
      +        s = s.substr(tmp + 1);
             }
      +      return l;
      +    };
       
      -      // Some h2s are in their own container making it pretty hard to find the end, so skip.
      -      if ($contents.length === 0) {
      -        return;
      +    // helper function that counts the occurrences of a given character in
      +    // a given string
      +    var _countChar = function(s, c) {
      +      var n = 0;
      +      for (var i = 0; i < s.length; i++) {
      +        if (s.charAt(i) === c) {
      +          ++n;
      +        }
             }
      +      return n;
      +    };
       
      -      // Remove from DOM before messing with it. DOM is slow!
      -      $section.detach();
      +    var queryLower = query.toLowerCase();
      +    var queryAlnum = (queryLower.match(/\w+/) || [''])[0];
      +    var partPrefixAlnumRE = new RegExp('\\b' + queryAlnum);
      +    var partExactAlnumRE = new RegExp('\\b' + queryAlnum + '\\b');
       
      -      // Add mobile-only expand arrows.
      -      $title.prepend('<span class="dac-visible-mobile-inline-block">' +
      -          '<i class="dac-toggle-expand dac-sprite dac-expand-more-black"></i>' +
      -          '<i class="dac-toggle-collapse dac-sprite dac-expand-less-black"></i>' +
      -          '</span>')
      -        .attr('data-toggle', 'section');
      +    var _resultScoreFn = function(result) {
      +      // scores are calculated based on exact and prefix matches,
      +      // and then number of path separators (dots) from the last
      +      // match (i.e. favoring classes and deep package names)
      +      var score = 1.0;
      +      var labelLower = result.label.toLowerCase();
      +      var t;
      +      var partsAfter;
      +      t = _lastSearch(labelLower, partExactAlnumRE);
      +      if (t >= 0) {
      +        // exact part match
      +        partsAfter = _countChar(labelLower.substr(t + 1), '.');
      +        score *= 200 / (partsAfter + 1);
      +      } else {
      +        t = _lastSearch(labelLower, partPrefixAlnumRE);
      +        if (t >= 0) {
      +          // part prefix match
      +          partsAfter = _countChar(labelLower.substr(t + 1), '.');
      +          score *= 20 / (partsAfter + 1);
      +        }
      +      }
       
      -      // Wrap in magic markup.
      -      $section = $section.wrapAll('<div class="dac-toggle dac-mobile">').parent();
      -      $contents.wrapAll('<div class="dac-toggle-content"><div>'); // extra div used for max-height calculation.
      +      return score;
      +    };
       
      -      // Pre-expand section if requested.
      -      if ($title.hasClass('is-expanded')) {
      -        $section.addClass('is-expanded');
      +    for (var i = 0; i < matches.length; i++) {
      +      // if the API is deprecated, default score is 0; otherwise, perform scoring
      +      if (matches[i].deprecated === 'true') {
      +        matches[i].__resultScore = 0;
      +      } else {
      +        matches[i].__resultScore = _resultScoreFn(matches[i]);
             }
      +    }
       
      -      // Pre-expand section if targetted by hash.
      -      if (location.hash && $section.find(location.hash).length) {
      -        $section.addClass('is-expanded');
      +    matches.sort(function(a, b) {
      +      var n = b.__resultScore - a.__resultScore;
      +
      +      if (n === 0) {
      +        // lexicographical sort if scores are the same
      +        n = (a.label < b.label) ? -1 : 1;
             }
       
      -      // Add it back to the dom.
      -      $anchor[anchorMethod].call($anchor, $section);
      +      return n;
           });
         }
       
      -  $(function() {
      -    initWidget();
      -  });
      -})(jQuery);
      +  // Destructive but fast toUnique.
      +  // http://stackoverflow.com/a/25082874
      +  function toUnique(array) {
      +    var c;
      +    var b = array.length || 1;
      +
      +    while (c = --b) {
      +      while (c--) {
      +        if (array[b] === array[c]) {
      +          array.splice(c, 1);
      +        }
      +      }
      +    }
      +    return array;
      +  }
      +
      +  return search;
      +})();
       
       (function($) {
         'use strict';
       
         /**
      -   * Toggle Floating Label state.
      -   * @param {HTMLElement} el - The DOM element.
      +   * Smoothly scroll to location on current page.
      +   * @param el
          * @param options
          * @constructor
          */
      -  function FloatingLabel(el, options) {
      +  function ScrollButton(el, options) {
           this.el = $(el);
      -    this.options = $.extend({}, FloatingLabel.DEFAULTS_, options);
      -    this.group = this.el.closest('.dac-form-input-group');
      -    this.input = this.group.find('.dac-form-input');
      +    this.target = $(this.el.attr('href'));
      +    this.options = $.extend({}, ScrollButton.DEFAULTS_, options);
       
      -    this.checkValue_ = this.checkValue_.bind(this);
      -    this.checkValue_();
      +    if (typeof this.options.offset === 'string') {
      +      this.options.offset = $(this.options.offset).height();
      +    }
       
      -    this.input.on('focus', function() {
      -      this.group.addClass('dac-focused');
      -    }.bind(this));
      -    this.input.on('blur', function() {
      -      this.group.removeClass('dac-focused');
      -      this.checkValue_();
      -    }.bind(this));
      -    this.input.on('keyup', this.checkValue_);
      +    this.el.on('click', this.clickHandler_.bind(this));
         }
       
         /**
      -   * The label is moved out of the textbox when it has a value.
      +   * Default options
      +   * @type {{duration: number, easing: string, offset: number, scrollContainer: string}}
      +   * @private
          */
      -  FloatingLabel.prototype.checkValue_ = function() {
      -    if (this.input.val().length) {
      -      this.group.addClass('dac-has-value');
      -    } else {
      -      this.group.removeClass('dac-has-value');
      +  ScrollButton.DEFAULTS_ = {
      +    duration: 300,
      +    easing: 'swing',
      +    offset: '.dac-header',
      +    scrollContainer: 'html, body'
      +  };
      +
      +  /**
      +   * Scroll logic
      +   * @param event
      +   * @private
      +   */
      +  ScrollButton.prototype.clickHandler_ = function(event) {
      +    if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
      +      return;
      +    }
      +
      +    event.preventDefault();
      +
      +    var position = this.getTargetPosition();
      +    $(this.options.scrollContainer).animate({
      +      scrollTop: position - this.options.offset
      +    }, this.options);
      +  };
      +
      +  ScrollButton.prototype.getTargetPosition = function() {
      +    if (this.options.scrollContainer === ScrollButton.DEFAULTS_.scrollContainer) {
      +      return this.target.offset().top;
           }
      +    var scrollContainer = $(this.options.scrollContainer)[0];
      +    var currentEl = this.target[0];
      +    var pos = 0;
      +    while (currentEl !== scrollContainer && currentEl !== null) {
      +      pos += currentEl.offsetTop;
      +      currentEl = currentEl.offsetParent;
      +    }
      +    return pos;
         };
       
         /**
          * jQuery plugin
          * @param  {object} options - Override default options.
          */
      -  $.fn.dacFloatingLabel = function(options) {
      +  $.fn.dacScrollButton = function(options) {
           return this.each(function() {
      -      new FloatingLabel(this, options);
      +      new ScrollButton(this, options);
           });
         };
       
      +  /**
      +   * Data Attribute API
      +   */
         $(document).on('ready.aranja', function() {
      -    $('.dac-form-floatlabel').each(function() {
      -      $(this).dacFloatingLabel($(this).data());
      +    $('[data-scroll-button]').each(function() {
      +      $(this).dacScrollButton($(this).data());
           });
         });
       })(jQuery);
       
      -/* global toRoot, CAROUSEL_OVERRIDE */
      +/* global getLangPref */
       (function($) {
      -  // Ordering matters
      -  var TAG_MAP = [
      -    {from: 'developerstory', to: 'Android Developer Story'},
      -    {from: 'googleplay', to: 'Google Play'}
      -  ];
      -
      -  function DacCarouselQuery(el) {
      -    this.el = $(el);
      +  var LANG;
       
      -    var opts = this.el.data();
      -    opts.maxResults = parseInt(opts.maxResults || '100', 10);
      -    opts.query = opts.carouselQuery;
      -    var resources = $.queryResources(opts);
      +  function getSearchLang() {
      +    if (!LANG) {
      +      LANG = getLangPref();
       
      -    this.el.empty();
      -    $(resources).map(function() {
      -      var resource = $.extend({}, this, CAROUSEL_OVERRIDE[this.url]);
      -      var slide = $('<article class="dac-expand dac-hero">');
      -      var image = cleanUrl(resource.heroImage || resource.image);
      -      var fullBleed = image && !resource.heroColor;
      +      // Fix zh-cn to be zh-CN.
      +      LANG = LANG.replace(/-\w+/, function(m) { return m.toUpperCase(); });
      +    }
      +    return LANG;
      +  }
       
      -      // Configure background
      -      slide.css({
      -        backgroundImage: fullBleed ? 'url(' + image + ')' : '',
      -        backgroundColor: resource.heroColor || ''
      -      });
      +  function customSearch(query, start) {
      +    var searchParams = {
      +      // current cse instance:
      +      //cx: '001482626316274216503:zu90b7s047u',
      +      // new cse instance:
      +      cx: '000521750095050289010:zpcpi1ea4s8',
      +      key: 'AIzaSyCFhbGnjW06dYwvRCU8h_zjdpS4PYYbEe8',
      +      q: query,
      +      start: start || 1,
      +      num: 9,
      +      hl: getSearchLang(),
      +      fields: 'queries,items(pagemap,link,title,htmlSnippet,formattedUrl)'
      +    };
       
      -      // Should copy be inverted
      -      slide.toggleClass('dac-invert', resource.heroInvert || fullBleed);
      -      slide.toggleClass('dac-darken', fullBleed);
      +    return $.get('https://content.googleapis.com/customsearch/v1?' +  $.param(searchParams));
      +  }
       
      -      // Should be clickable
      -      slide.append($('<a class="dac-hero-carousel-action">').attr('href', cleanUrl(resource.url)));
      +  function renderResults(el, results, searchAppliance) {
      +    var referenceResults = searchAppliance.getReferenceResults();
      +    if (!results.items) {
      +      el.append($('<div>').text('No results'));
      +      return;
      +    }
       
      -      var cols = $('<div class="cols dac-hero-content">');
      +    for (var i = 0; i < results.items.length; i++) {
      +      var item = results.items[i];
      +      var isDuplicate = false;
      +      $(referenceResults.android).each(function(index, result) {
      +        if (item.link.indexOf(result.link) > -1) {
      +          isDuplicate = true;
      +          return false;
      +        }
      +      });
       
      -      // inline image column
      -      var rightCol = $('<div class="col-1of2 col-push-1of2 dac-hero-figure">')
      -        .appendTo(cols);
      +      if (!isDuplicate) {
      +        var hasImage = item.pagemap && item.pagemap.cse_thumbnail;
      +        var sectionMatch = item.link.match(/developer\.android\.com\/(\w*)/);
      +        var section = (sectionMatch && sectionMatch[1]) || 'blog';
       
      -      if (!fullBleed && image) {
      -        rightCol.append($('<img>').attr('src', image));
      -      }
      +        var entry = $('<div>').addClass('dac-custom-search-entry cols');
       
      -      // info column
      -      $('<div class="col-1of2 col-pull-1of2">')
      -        .append($('<div class="dac-hero-tag">').text(formatTag(resource)))
      -        .append($('<h1 class="dac-hero-title">').text(formatTitle(resource)))
      -        .append($('<p class="dac-hero-description">').text(resource.summary))
      -        .append($('<a class="dac-hero-cta">')
      -          .text(formatCTA(resource))
      -          .attr('href', cleanUrl(resource.url))
      -          .prepend($('<span class="dac-sprite dac-auto-chevron">'))
      -        )
      -        .appendTo(cols);
      +        if (hasImage) {
      +          var image = item.pagemap.cse_thumbnail[0];
      +          entry.append($('<div>').addClass('dac-custom-search-image-wrapper')
      +            .append($('<div>').addClass('dac-custom-search-image').css('background-image', 'url(' + image.src + ')')));
      +        }
       
      -      slide.append(cols.wrap('<div class="wrap">').parent());
      -      return slide[0];
      -    }).prependTo(this.el);
      +        entry.append($('<div>').addClass('dac-custom-search-text-wrapper')
      +          .append($('<p>').addClass('dac-custom-search-section').text(section))
      +          .append(
      +            $('<a>').text(item.title).attr('href', item.link).wrap('<h2>').parent().addClass('dac-custom-search-title')
      +          )
      +          .append($('<p>').addClass('dac-custom-search-snippet').html(item.htmlSnippet.replace(/<br>/g, '')))
      +          .append($('<a>').addClass('dac-custom-search-link').text(item.formattedUrl).attr('href', item.link)));
       
      -    // Pagination element.
      -    this.el.append('<div class="dac-hero-carousel-pagination"><div class="wrap" data-carousel-pagination>');
      +        el.append(entry);
      +      }
      +    }
       
      -    this.el.dacCarousel();
      -  }
      +    if (results.queries.nextPage) {
      +      var loadMoreButton = $('<button id="dac-custom-search-load-more">')
      +        .addClass('dac-custom-search-load-more')
      +        .text('Load more')
      +        .click(function() {
      +          loadMoreResults(el, results, searchAppliance);
      +        });
       
      -  function cleanUrl(url) {
      -    if (url && url.indexOf('//') === -1) {
      -      url = toRoot + url;
      +      el.append(loadMoreButton);
           }
      -    return url;
      -  }
      +  };
       
      -  function formatTag(resource) {
      -    // Hmm, need a better more scalable solution for this.
      -    for (var i = 0, mapping; mapping = TAG_MAP[i]; i++) {
      -      if (resource.tags.indexOf(mapping.from) > -1) {
      -        return mapping.to;
      -      }
      -    }
      -    return resource.type;
      -  }
      +  function loadMoreResults(el, results, searchAppliance) {
      +    var query = results.queries.request[0].searchTerms;
      +    var start = results.queries.nextPage[0].startIndex;
      +    var loadMoreButton = el.find('#dac-custom-search-load-more');
       
      -  function formatTitle(resource) {
      -    return resource.title.replace(/android developer story: /i, '');
      -  }
      +    loadMoreButton.text('Loading more...');
       
      -  function formatCTA(resource) {
      -    return resource.type === 'youtube' ? 'Watch the video' : 'Learn more';
      +    customSearch(query, start).then(function(results) {
      +      loadMoreButton.remove();
      +      renderResults(el, results, searchAppliance);
      +    });
         }
       
      -  // jQuery plugin
      -  $.fn.dacCarouselQuery = function() {
      -    return this.each(function() {
      -      var el = $(this);
      -      var data = el.data('dac.carouselQuery');
      +  $.fn.customSearch = function(query, searchAppliance) {
      +    var el = $(this);
       
      -      if (!data) { el.data('dac.carouselQuery', (data = new DacCarouselQuery(el))); }
      +    customSearch(query).then(function(results) {
      +      el.empty();
      +      renderResults(el, results, searchAppliance);
           });
         };
      -
      -  // Data API
      -  $(function() {
      -    $('[data-carousel-query]').dacCarouselQuery();
      -  });
       })(jQuery);
       
      +/* global METADATA */
      +
       (function($) {
      -  /**
      -   * A CSS based carousel, inspired by SequenceJS.
      -   * @param {jQuery} el
      -   * @param {object} options
      -   * @constructor
      -   */
      -  function DacCarousel(el, options) {
      -    this.el = $(el);
      -    this.options = options = $.extend({}, DacCarousel.OPTIONS, this.el.data(), options || {});
      -    this.frames = this.el.find(options.frameSelector);
      -    this.count = this.frames.size();
      -    this.current = options.start;
      +  $.fn.dacSearchRenderHero = function(resources, query) {
      +    var el = $(this);
      +    el.empty();
       
      -    this.initPagination();
      -    this.initEvents();
      -    this.initFrame();
      -  }
      +    var resource = METADATA.searchHeroCollections[query];
       
      -  DacCarousel.OPTIONS = {
      -    auto:      true,
      -    autoTime:  10000,
      -    autoMinTime: 5000,
      -    btnPrev:   '[data-carousel-prev]',
      -    btnNext:   '[data-carousel-next]',
      -    frameSelector: 'article',
      -    loop:      true,
      -    start:     0,
      -    swipeThreshold: 160,
      -    pagination: '[data-carousel-pagination]'
      +    if (resource) {
      +      el.dacHero(resource, true);
      +      el.show();
      +
      +      return true;
      +    } else {
      +      el.hide();
      +    }
         };
      +})(jQuery);
       
      -  DacCarousel.prototype.initPagination = function() {
      -    this.pagination = $([]);
      -    if (!this.options.pagination) { return; }
      +(function($) {
      +  $.fn.dacSearchRenderReferences = function(results, query) {
      +    var referenceCard = $('.suggest-card.reference');
      +    referenceCard.data('searchreferences.dac', {results: results, query: query});
      +    renderResults(referenceCard, results, query, false);
      +  };
       
      -    var pagination = $('<ul class="dac-pagination">');
      -    var parent = this.el;
      -    if (typeof this.options.pagination === 'string') { parent = this.el.find(this.options.pagination); }
      +  var ROW_COUNT_COLLAPSED = 20;
      +  var ROW_COUNT_EXPANDED = 40;
      +  var ROW_COUNT_GOOGLE_COLLAPSED = 1;
      +  var ROW_COUNT_GOOGLE_EXPANDED = 8;
       
      -    if (this.count > 1) {
      -      for (var i = 0; i < this.count; i++) {
      -        var li = $('<li class="dac-pagination-item">').text(i);
      -        if (i === this.options.start) { li.addClass('active'); }
      -        li.click(this.go.bind(this, i));
      +  function onSuggestionClick(e) {
      +    devsite.analytics.trackAnalyticsEvent('event',
      +        'Suggestion Click', 'clicked: ' + $(e.currentTarget).attr('href'),
      +        'query: ' + $('#search_autocomplete').val().toLowerCase());
      +  }
       
      -        pagination.append(li);
      -      }
      -      this.pagination = pagination.children();
      -      parent.append(pagination);
      -    }
      -  };
      +  function buildLink(match) {
      +    var link = $('<a>').attr('href', window.toRoot + match.link);
       
      -  DacCarousel.prototype.initEvents = function() {
      -    var that = this;
      +    var label = match.label;
      +    var classNameStart = label.match(/[A-Z]/) ? label.search(/[A-Z]/) : label.lastIndexOf('.') + 1;
      +    var newLink = '<span class="namespace">' +
      +      label.substr(0, classNameStart) +
      +      '</span>' +
      +      label.substr(classNameStart, label.length);
       
      -    this.touch = {
      -      start: {x: 0, y: 0},
      -      end:   {x: 0, y: 0}
      -    };
      +    link.html(newLink);
      +    return link;
      +  }
       
      -    this.el.on('touchstart', this.touchstart_.bind(this));
      -    this.el.on('touchend', this.touchend_.bind(this));
      -    this.el.on('touchmove', this.touchmove_.bind(this));
      +  function buildSuggestion(match, query) {
      +    var li = $('<li>').addClass('dac-search-results-reference-entry');
       
      -    this.el.hover(function() {
      -      that.pauseRotateTimer();
      -    }, function() {
      -      that.startRotateTimer();
      -    });
      +    var link = buildLink(match);
      +    link.highlightMatches(query);
      +    li.append(link);
      +    return li[0];
      +  }
       
      -    $(this.options.btnPrev).click(function(e) {
      -      e.preventDefault();
      -      that.prev();
      +  function buildResults(results, query) {
      +    return results.map(function(match) {
      +      return buildSuggestion(match, query);
           });
      +  }
       
      -    $(this.options.btnNext).click(function(e) {
      -      e.preventDefault();
      -      that.next();
      -    });
      -  };
      +  function renderAndroidResults(list, gMatches, query) {
      +    list.empty();
       
      -  DacCarousel.prototype.touchstart_ = function(event) {
      -    var t = event.originalEvent.touches[0];
      -    this.touch.start = {x: t.screenX, y: t.screenY};
      -  };
      +    var header = $('<li class="dac-search-results-reference-header">android APIs</li>');
      +    list.append(header);
       
      -  DacCarousel.prototype.touchend_ = function() {
      -    var deltaX = this.touch.end.x - this.touch.start.x;
      -    var deltaY = Math.abs(this.touch.end.y - this.touch.start.y);
      -    var shouldSwipe = (deltaY < Math.abs(deltaX)) && (Math.abs(deltaX) >= this.options.swipeThreshold);
      +    if (gMatches.length > 0) {
      +      list.removeClass('no-results');
       
      -    if (shouldSwipe) {
      -      if (deltaX > 0) {
      -        this.prev();
      -      } else {
      -        this.next();
      -      }
      +      var resources = buildResults(gMatches, query);
      +      list.append(resources);
      +      return true;
      +    } else {
      +      list.append('<li class="dac-search-results-reference-entry-empty">No results</li>');
           }
      -  };
      +  }
       
      -  DacCarousel.prototype.touchmove_ = function(event) {
      -    var t = event.originalEvent.touches[0];
      -    this.touch.end = {x: t.screenX, y: t.screenY};
      -  };
      +  function renderGoogleDocsResults(list, gGoogleMatches, query) {
      +    list = $('.suggest-card.reference ul');
       
      -  DacCarousel.prototype.initFrame = function() {
      -    this.frames.removeClass('active').eq(this.options.start).addClass('active');
      -  };
      +    if (gGoogleMatches.length > 0) {
      +      list.append('<li class="dac-search-results-reference-header">in Google Services</li>');
       
      -  DacCarousel.prototype.startRotateTimer = function() {
      -    if (!this.options.auto || this.rotateTimer) { return; }
      -    this.rotateTimer = setTimeout(this.next.bind(this), this.options.autoTime);
      -  };
      +      var resources = buildResults(gGoogleMatches, query);
      +      list.append(resources);
      +
      +      return true;
      +    }
      +  }
       
      -  DacCarousel.prototype.pauseRotateTimer = function() {
      -    clearTimeout(this.rotateTimer);
      -    this.rotateTimer = null;
      -  };
      +  function renderResults(referenceCard, results, query, expanded) {
      +    var list = referenceCard.find('ul');
      +    list.toggleClass('is-expanded', !!expanded);
       
      -  DacCarousel.prototype.prev = function() {
      -    this.go(this.current - 1);
      -  };
      +    // Figure out how many results we can show in our fixed size box.
      +    var total = expanded ? ROW_COUNT_EXPANDED : ROW_COUNT_COLLAPSED;
      +    var googleCount = expanded ? ROW_COUNT_GOOGLE_EXPANDED : ROW_COUNT_GOOGLE_COLLAPSED;
      +    googleCount = Math.max(googleCount, total - results.android.length);
      +    googleCount = Math.min(googleCount, results.docs.length);
       
      -  DacCarousel.prototype.next = function() {
      -    this.go(this.current + 1);
      -  };
      +    if (googleCount > 0) {
      +      // If there are google results, reserve space for its header.
      +      googleCount++;
      +    }
       
      -  DacCarousel.prototype.go = function(next) {
      -    // Figure out what the next slide is.
      -    while (this.count > 0 && next >= this.count) { next -= this.count; }
      -    while (next < 0) { next += this.count; }
      +    var androidCount = Math.max(0, total - googleCount);
      +    if (androidCount === 0) {
      +      // Reserve space for "No reference results"
      +      googleCount--;
      +    }
       
      -    // Cancel if we're already on that slide.
      -    if (next === this.current) { return; }
      +    renderAndroidResults(list, results.android.slice(0, androidCount), query);
      +    renderGoogleDocsResults(list, results.docs.slice(0, googleCount - 1), query);
       
      -    // Prepare next slide.
      -    this.frames.eq(next).removeClass('out');
      +    var totalResults = results.android.length + results.docs.length;
      +    if (totalResults === 0) {
      +      list.addClass('no-results');
      +    }
       
      -    // Recalculate styles before starting slide transition.
      -    this.el.resolveStyles();
      -    // Update pagination
      -    this.pagination.removeClass('active').eq(next).addClass('active');
      +    // Tweak see more logic to account for references.
      +    var hasMore = totalResults > ROW_COUNT_COLLAPSED && !util.matchesMedia('mobile');
      +    if (hasMore) {
      +      // We can't actually show all matches, only as many as the expanded list
      +      // will fit, so we actually lie if the total results count is more
      +      var moreCount = Math.min(totalResults, ROW_COUNT_EXPANDED + ROW_COUNT_GOOGLE_EXPANDED);
      +      var $moreLink = $('<li class="dac-search-results-reference-entry-empty " data-toggle="show-more">see more matches</li>');
      +      list.append($moreLink.on('click', onToggleMore));
      +    }
      +    var searchEl = $('#search-resources');
      +    searchEl.toggleClass('dac-has-more', searchEl.hasClass('dac-has-more') || (hasMore && !expanded));
      +    searchEl.toggleClass('dac-has-less', searchEl.hasClass('dac-has-less') || (hasMore && expanded));
      +  }
       
      -    // Transition out current frame
      -    this.frames.eq(this.current).toggleClass('active out');
      +  function onToggleMore(e) {
      +    var link = $(e.currentTarget);
      +    var referenceCard = $('.suggest-card.reference');
      +    var data = referenceCard.data('searchreferences.dac');
       
      -    // Transition in a new frame
      -    this.frames.eq(next).toggleClass('active');
      +    if (util.matchesMedia('mobile')) { return; }
       
      -    this.current = next;
      -  };
      +    renderResults(referenceCard, data.results, data.query, link.data('toggle') === 'show-more');
      +  }
       
      -  // Helper which resolves new styles for an element, so it can start transitioning
      -  // from the new values.
      -  $.fn.resolveStyles = function() {
      -    /*jshint expr:true*/
      -    this[0] && this[0].offsetTop;
      -    return this;
      -  };
      +  $(document).on('click', '.dac-search-results-resources [data-toggle="show-more"]', onToggleMore);
      +  $(document).on('click', '.dac-search-results-resources [data-toggle="show-less"]', onToggleMore);
      +  $(document).on('click', '.suggest-card.reference a', onSuggestionClick);
      +})(jQuery);
       
      -  // jQuery plugin
      -  $.fn.dacCarousel = function() {
      -    this.each(function() {
      -      var $el = $(this);
      -      $el.data('dac-carousel', new DacCarousel(this));
      +(function($) {
      +  function highlightPage(query, page) {
      +    page.find('.title').highlightMatches(query);
      +  }
      +
      +  $.fn.dacSearchRenderResources = function(gDocsMatches, query) {
      +    this.resourceWidget(gDocsMatches, {
      +      itemsPerPage: 18,
      +      initialResults: 6,
      +      cardSizes: ['6x2'],
      +      onRenderPage: highlightPage.bind(null, query)
           });
      +
           return this;
         };
      -
      -  // Data API
      -  $(function() {
      -    $('[data-carousel]').dacCarousel();
      -  });
       })(jQuery);
       
      -(function($) {
      +/*global metadata */
      +
      +(function($, metadata) {
         'use strict';
       
      -  function Modal(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleModal.DEFAULTS_, options);
      +  function Search() {
      +    this.body = $('body');
      +    this.lastQuery = null;
      +    this.searchResults = $('#search-results');
      +    this.searchClose = $('[data-search-close]');
      +    this.searchClear = $('[data-search-clear]');
      +    this.searchInput = $('#search_autocomplete');
      +    this.searchResultsContent = $('#dac-search-results-content');
      +    this.searchResultsFor = $('#search-results-for');
      +    this.searchResultsHistory = $('#dac-search-results-history');
      +    this.searchResultsResources = $('#search-resources');
      +    this.searchResultsHero = $('#dac-search-results-hero');
      +    this.searchResultsReference = $('#dac-search-results-reference');
      +    this.searchHeader = $('[data-search]').data('search-input.dac');
      +    this.pageNav = $('a[name=navigation]');
      +    this.currQueryReferenceResults = {};
           this.isOpen = false;
      +  }
       
      -    this.el.on('click', function(event) {
      -      if (!$.contains($('.dac-modal-window')[0], event.target)) {
      -        return this.el.trigger('modal-close');
      +  Search.prototype.init = function() {
      +    this.searchHistory = window.dacStore('search-history');
      +
      +    this.searchInput.focus(this.onSearchChanged.bind(this));
      +    this.searchInput.keypress(this.handleKeyboardShortcut.bind(this));
      +    this.pageNav.keyup(this.handleTabbedToNav.bind(this));
      +    this.searchResults.keyup(this.handleKeyboardShortcut.bind(this));
      +    this.searchInput.on('input', this.onSearchChanged.bind(this));
      +    this.searchClear.click(this.clear.bind(this));
      +    this.searchClose.click(this.close.bind(this));
      +
      +    this.customSearch = $.fn.debounce(function(query) {
      +      $('#dac-custom-search-results').customSearch(query, this);
      +    }.bind(this), 1000);
      +    // Start search shortcut (/)
      +    $('body').keyup(function(event) {
      +      if (event.which === 191 && $(event.target).is(':not(:input)')) {
      +        this.searchInput.focus();
             }
           }.bind(this));
       
      -    this.el.on('modal-open', this.open_.bind(this));
      -    this.el.on('modal-close', this.close_.bind(this));
      -    this.el.on('modal-toggle', this.toggle_.bind(this));
      -  }
      -
      -  Modal.prototype.toggle_ = function() {
      -    this.el.trigger('modal-' + (this.isOpen ? 'close' : 'open'));
      +    $(window).on('popstate', this.onPopState.bind(this));
      +    $(window).hashchange(this.onHashChange.bind(this));
      +    this.onHashChange();
         };
       
      -  Modal.prototype.close_ = function() {
      -    this.el.removeClass('dac-active');
      -    $('body').removeClass('dac-modal-open');
      -    this.isOpen = false;
      -    // When closing the modal for Android Studio downloads, reload the page
      -    // because otherwise we might get stuck with post-download dialog state
      -    if ($("[data-modal='studio_tos']").length) {
      -      location.reload();
      +  Search.prototype.checkRedirectToIndex = function() {
      +    var query = this.getUrlQuery();
      +    var target = window.getLangTarget();
      +    var prefix = (target !== 'en') ? '/intl/' + target : '';
      +    var pathname = location.pathname.slice(prefix.length);
      +    if (query != null && pathname !== '/index.html') {
      +      location.href = prefix + '/index.html' + location.hash;
      +      return true;
           }
         };
       
      -  Modal.prototype.open_ = function() {
      -    this.el.addClass('dac-active');
      -    $('body').addClass('dac-modal-open');
      -    this.isOpen = true;
      -  };
      +  Search.prototype.handleKeyboardShortcut = function(event) {
      +    // Close (esc)
      +    if (event.which === 27) {
      +      this.searchClose.trigger('click');
      +      event.preventDefault();
      +    }
       
      -  function ToggleModal(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleModal.DEFAULTS_, options);
      -    this.modal = this.options.modalToggle ? $('[data-modal="' + this.options.modalToggle + '"]') :
      -      this.el.closest('[data-modal]');
      +    // Previous result (up arrow)
      +    if (event.which === 38) {
      +      this.previousResult();
      +      event.preventDefault();
      +    }
       
      -    this.el.on('click', this.clickHandler_.bind(this));
      +    // Next result (down arrow)
      +    if (event.which === 40) {
      +      this.nextResult();
      +      event.preventDefault();
      +    }
      +
      +    // Navigate to result (enter)
      +    if (event.which === 13) {
      +      this.navigateToResult();
      +      event.preventDefault();
      +    }
      +  };
      +
      +  Search.prototype.handleTabbedToNav = function(event) {
      +    if (this.isOpen) {
      +      this.searchClose.trigger('click');
      +    }
         }
       
      -  ToggleModal.prototype.clickHandler_ = function(event) {
      -    event.preventDefault();
      -    this.modal.trigger('modal-toggle');
      +  Search.prototype.goToResult = function(relativeIndex) {
      +    var links = this.searchResults.find('a').filter(':visible');
      +    var selectedLink = this.searchResults.find('.dac-selected');
      +
      +    if (selectedLink.length) {
      +      var found = $.inArray(selectedLink[0], links);
      +
      +      selectedLink.removeClass('dac-selected');
      +      links.eq(found + relativeIndex).addClass('dac-selected');
      +      return true;
      +    } else {
      +      if (relativeIndex > 0) {
      +        links.first().addClass('dac-selected');
      +      }
      +    }
         };
       
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacModal = function(options) {
      -    return this.each(function() {
      -      new Modal(this, options);
      -    });
      +  Search.prototype.previousResult = function() {
      +    this.goToResult(-1);
         };
       
      -  $.fn.dacToggleModal = function(options) {
      -    return this.each(function() {
      -      new ToggleModal(this, options);
      -    });
      +  Search.prototype.nextResult = function() {
      +    this.goToResult(1);
         };
       
      -  /**
      -   * Data Attribute API
      -   */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-modal]').each(function() {
      -      $(this).dacModal($(this).data());
      -    });
      +  Search.prototype.navigateToResult = function() {
      +    var query = this.getQuery();
      +    var selectedLink = this.searchResults.find('.dac-selected');
       
      -    $('[data-modal-toggle]').each(function() {
      -      $(this).dacToggleModal($(this).data());
      -    });
      -  });
      -})(jQuery);
      +    if (selectedLink.length) {
      +      selectedLink[0].click();
      +    } else {
      +      this.searchHistory.push(query);
      +      this.addQueryToUrl(query);
       
      -(function($) {
      -  'use strict';
      +      var isMobileOrTablet = typeof window.orientation !== 'undefined';
       
      -  /**
      -   * Toggle the visabilty of the mobile navigation.
      -   * @param {HTMLElement} el - The DOM element.
      -   * @param options
      -   * @constructor
      -   */
      -  function ToggleNav(el, options) {
      -    this.el = $(el);
      -    this.options = $.extend({}, ToggleNav.DEFAULTS_, options);
      -    this.options.target = [this.options.navigation];
      +      if (isMobileOrTablet) {
      +        this.searchInput.blur();
      +      }
      +    }
      +  };
       
      -    if (this.options.body) {this.options.target.push('body')}
      -    if (this.options.dimmer) {this.options.target.push(this.options.dimmer)}
      +  Search.prototype.onHashChange = function() {
      +    var query = this.getUrlQuery();
      +    if (query != null && query !== this.getQuery()) {
      +      this.searchInput.val(query);
      +      this.onSearchChanged();
      +    }
      +  };
       
      -    this.el.on('click', this.clickHandler_.bind(this));
      -  }
      +  Search.prototype.clear = function() {
      +    this.searchInput.val('');
      +    window.location.hash = '';
      +    this.onSearchChanged();
      +    this.searchInput.focus();
      +  };
       
      -  /**
      -   * ToggleNav Default Settings
      -   * @type {{body: boolean, dimmer: string, navigation: string, toggleClass: string}}
      -   * @private
      -   */
      -  ToggleNav.DEFAULTS_ = {
      -    body: true,
      -    dimmer: '.dac-nav-dimmer',
      -    navigation: '[data-dac-nav]',
      -    toggleClass: 'dac-nav-open'
      +  Search.prototype.close = function() {
      +    this.removeQueryFromUrl();
      +    this.searchInput.blur();
      +    this.hideOverlay();
      +    this.pageNav.focus();
      +    this.isOpen = false;
         };
       
      -  /**
      -   * The actual toggle logic.
      -   * @param event
      -   * @private
      -   */
      -  ToggleNav.prototype.clickHandler_ = function(event) {
      -    event.preventDefault();
      -    $(this.options.target.join(', ')).toggleClass(this.options.toggleClass);
      +  Search.prototype.getUrlQuery = function() {
      +    var queryMatch = location.hash.match(/q=(.*)&?/);
      +    return queryMatch && queryMatch[1] && decodeURI(queryMatch[1]);
         };
       
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacToggleMobileNav = function(options) {
      -    return this.each(function() {
      -      new ToggleNav(this, options);
      -    });
      +  Search.prototype.getQuery = function() {
      +    return this.searchInput.val().replace(/(^ +)|( +$)/g, '');
         };
       
      -  /**
      -   * Data Attribute API
      -   */
      -  $(window).on('load.aranja', function() {
      -    $('[data-dac-toggle-nav]').each(function() {
      -      $(this).dacToggleMobileNav($(this).data());
      -    });
      -  });
      -})(jQuery);
      +  Search.prototype.getReferenceResults = function() {
      +    return this.currQueryReferenceResults;
      +  };
       
      -(function($) {
      -  'use strict';
      +  Search.prototype.onSearchChanged = function() {
      +    var query = this.getQuery();
       
      -  /**
      -   * Submit the newsletter form to a Google Form.
      -   * @param {HTMLElement} el - The Form DOM element.
      -   * @constructor
      -   */
      -  function NewsletterForm(el) {
      -    this.el = $(el);
      -    this.form = this.el.find('form');
      -    $('<iframe/>').hide()
      -      .attr('name', 'dac-newsletter-iframe')
      -      .attr('src', '')
      -      .insertBefore(this.form);
      -    this.form.on('submit', this.submitHandler_.bind(this));
      -  }
      +    this.showOverlay();
      +    this.render(query);
      +  };
       
      -  /**
      -   * Milliseconds until modal has vanished after modal-close is triggered.
      -   * @type {number}
      -   * @private
      -   */
      -  NewsletterForm.CLOSE_DELAY_ = 300;
      +  Search.prototype.render = function(query) {
      +    if (this.lastQuery === query) { return; }
       
      -  /**
      -   * Switch view to display form after close.
      -   * @private
      -   */
      -  NewsletterForm.prototype.closeHandler_ = function() {
      -    setTimeout(function() {
      -      this.el.trigger('swap-reset');
      -    }.bind(this), NewsletterForm.CLOSE_DELAY_);
      +    if (query.length < 2) {
      +      query = '';
      +    }
      +
      +    this.lastQuery = query;
      +    this.searchResultsFor.text(query);
      +
      +    // CSE results lag behind the metadata/reference results. We need to empty
      +    // the CSE results and add 'Loading' text so user's aren't looking at two
      +    // different sets of search results at one time.
      +    var $loadingEl =
      +        $('<div class="loadingCustomSearchResults">Loading Results...</div>');
      +    $('#dac-custom-search-results').empty().prepend($loadingEl);
      +
      +    this.customSearch(query);
      +    var metadataResults = metadata.search(query);
      +    this.searchResultsResources.dacSearchRenderResources(metadataResults.resources, query);
      +    this.searchResultsReference.dacSearchRenderReferences(metadataResults, query);
      +    this.currQueryReferenceResults = metadataResults;
      +    var hasHero = this.searchResultsHero.dacSearchRenderHero(metadataResults.resources, query);
      +    var hasQuery = !!query;
      +
      +    this.searchResultsReference.toggle(!hasHero);
      +    this.searchResultsContent.toggle(hasQuery);
      +    this.searchResultsHistory.toggle(!hasQuery);
      +    this.addQueryToUrl(query);
      +    this.pushState();
         };
       
      -  /**
      -   * Reset the modal to initial state.
      -   * @private
      -   */
      -  NewsletterForm.prototype.reset_ = function() {
      -    this.form.trigger('reset');
      -    this.el.one('modal-close', this.closeHandler_.bind(this));
      +  Search.prototype.addQueryToUrl = function(query) {
      +    var hash = 'q=' + encodeURI(query);
      +
      +    if (query) {
      +      if (window.history.replaceState) {
      +        window.history.replaceState(null, '', '#' + hash);
      +      } else {
      +        window.location.hash = hash;
      +      }
      +    }
         };
       
      -  /**
      -   * Display a success view on submit.
      -   * @private
      -   */
      -  NewsletterForm.prototype.submitHandler_ = function() {
      -    this.el.one('swap-complete', this.reset_.bind(this));
      -    this.el.trigger('swap-content');
      +  Search.prototype.onPopState = function() {
      +    if (!this.getUrlQuery()) {
      +      this.hideOverlay();
      +      this.searchHeader.unsetActiveState();
      +    }
         };
       
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacNewsletterForm = function(options) {
      -    return this.each(function() {
      -      new NewsletterForm(this, options);
      -    });
      +  Search.prototype.removeQueryFromUrl = function() {
      +    window.location.hash = '';
      +  };
      +
      +  Search.prototype.pushState = function() {
      +    if (window.history.pushState && !this.lastQuery.length) {
      +      window.history.pushState(null, '');
      +    }
      +  };
      +
      +  Search.prototype.showOverlay = function() {
      +    this.isOpen = true;
      +    this.body.addClass('dac-modal-open dac-search-open');
      +  };
      +
      +  Search.prototype.hideOverlay = function() {
      +    this.body.removeClass('dac-modal-open dac-search-open');
         };
       
      -  /**
      -   * Data Attribute API
      -   */
         $(document).on('ready.aranja', function() {
      -    $('[data-newsletter]').each(function() {
      -      $(this).dacNewsletterForm();
      -    });
      +    var search = new Search();
      +    search.init();
         });
      -})(jQuery);
      -
      -(function($) {
      -  'use strict';
      +})(jQuery, metadata);
       
      +window.dacStore = (function(window) {
         /**
      -   * Smoothly scroll to location on current page.
      -   * @param el
      -   * @param options
      +   * Creates a new persistent store.
      +   * If localStorage is unavailable, the items are stored in memory.
      +   *
          * @constructor
      +   * @param {string} name    The name of the store
      +   * @param {number} maxSize The maximum number of items the store can hold.
          */
      -  function ScrollButton(el, options) {
      -    this.el = $(el);
      -    this.target = $(this.el.attr('href'));
      -    this.options = $.extend({}, ScrollButton.DEFAULTS_, options);
      +  var Store = function(name, maxSize) {
      +    var content = [];
       
      -    if (typeof this.options.offset === 'string') {
      -      this.options.offset = $(this.options.offset).height();
      +    var hasLocalStorage = !!window.localStorage;
      +
      +    if (hasLocalStorage) {
      +      try {
      +        content = JSON.parse(window.localStorage.getItem(name) || []);
      +      } catch (e) {
      +        // Store contains invalid data
      +        window.localStorage.removeItem(name);
      +      }
           }
       
      -    this.el.on('click', this.clickHandler_.bind(this));
      -  }
      +    function push(item) {
      +      if (content[0] === item) {
      +        return;
      +      }
       
      -  /**
      -   * Default options
      -   * @type {{duration: number, easing: string, offset: number, scrollContainer: string}}
      -   * @private
      -   */
      -  ScrollButton.DEFAULTS_ = {
      -    duration: 300,
      -    easing: 'swing',
      -    offset: 0,
      -    scrollContainer: 'html, body'
      -  };
      +      content.unshift(item);
       
      -  /**
      -   * Scroll logic
      -   * @param event
      -   * @private
      -   */
      -  ScrollButton.prototype.clickHandler_ = function(event) {
      -    if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
      -      return;
      +      if (maxSize) {
      +        content.splice(maxSize, content.length);
      +      }
      +
      +      if (hasLocalStorage) {
      +        window.localStorage.setItem(name, JSON.stringify(content));
      +      }
           }
       
      -    event.preventDefault();
      +    function all() {
      +      // Return a copy
      +      return content.slice();
      +    }
       
      -    $(this.options.scrollContainer).animate({
      -      scrollTop: this.target.offset().top - this.options.offset
      -    }, this.options);
      +    return {
      +      push: push,
      +      all: all
      +    };
         };
       
      -  /**
      -   * jQuery plugin
      -   * @param  {object} options - Override default options.
      -   */
      -  $.fn.dacScrollButton = function(options) {
      -    return this.each(function() {
      -      new ScrollButton(this, options);
      -    });
      +  var stores = {
      +    'search-history': new Store('search-history', 3)
         };
       
         /**
      -   * Data Attribute API
      +   * Get a named persistent store.
      +   * @param  {string} name
      +   * @return {Store}
          */
      -  $(document).on('ready.aranja', function() {
      -    $('[data-scroll-button]').each(function() {
      -      $(this).dacScrollButton($(this).data());
      -    });
      -  });
      -})(jQuery);
      +  return function getStore(name) {
      +    return stores[name];
      +  };
      +})(window);
       
       (function($) {
         'use strict';
      @@ -5221,10 +6074,16 @@ function showSamples() {
         function SwapContent(el, options) {
           this.el = $(el);
           this.options = $.extend({}, SwapContent.DEFAULTS_, options);
      +    this.options.dynamic = this.options.dynamic === 'true';
           this.containers = this.el.find(this.options.container);
           this.initiallyActive = this.containers.children('.' + this.options.activeClass).eq(0);
           this.el.on('swap-content', this.swap.bind(this));
           this.el.on('swap-reset', this.reset.bind(this));
      +    this.el.find(this.options.swapButton).on('click keypress', function(e) {
      +      if (e.type == 'keypress' && e.which == 13 || e.type == 'click') {
      +        this.swap();
      +      }
      +    }.bind(this));
         }
       
         /**
      @@ -5235,6 +6094,8 @@ function showSamples() {
         SwapContent.DEFAULTS_ = {
           activeClass: 'dac-active',
           container: '[data-swap-container]',
      +    dynamic: 'true',
      +    swapButton: '[data-swap-button]',
           transitionSpeed: 500
         };
       
      @@ -5268,9 +6129,16 @@ function showSamples() {
          * Perform the swap of content.
          */
         SwapContent.prototype.swap = function() {
      -    console.log(this.containers);
           this.containers.each(function(index, container) {
             container = $(container);
      +
      +      if (!this.options.dynamic) {
      +        container.children().toggleClass(this.options.activeClass);
      +        this.complete.bind(this);
      +        $('.' + this.options.activeClass).focus();
      +        return;
      +      }
      +
             container.height(this.currentHeight(container)).children().toggleClass(this.options.activeClass);
             container.animate({height: this.currentHeight(container)}, this.options.transitionSpeed,
               this.complete.bind(this));
      @@ -5297,6 +6165,178 @@ function showSamples() {
         });
       })(jQuery);
       
      +/* Tabs */
      +(function($) {
      +  'use strict';
      +
      +  /**
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function Tabs(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, Tabs.DEFAULTS_, options);
      +    this.init();
      +  }
      +
      +  Tabs.DEFAULTS_ = {
      +    activeClass: 'dac-active',
      +    viewDataAttr: 'tab-view',
      +    itemDataAttr: 'tab-item'
      +  };
      +
      +  Tabs.prototype.init = function() {
      +    var itemDataAttribute = '[data-' + this.options.itemDataAttr + ']';
      +    this.tabEl_ = this.el.find(itemDataAttribute);
      +    this.tabViewEl_ = this.el.find('[data-' + this.options.viewDataAttr + ']');
      +    this.el.on('click.dac-tabs', itemDataAttribute, this.changeTabs.bind(this));
      +  };
      +
      +  Tabs.prototype.changeTabs = function(event) {
      +    var current = $(event.currentTarget);
      +    var index = current.index();
      +
      +    if (current.hasClass(this.options.activeClass)) {
      +      current.add(this.tabViewEl_.eq(index)).removeClass(this.options.activeClass);
      +    } else {
      +      this.tabEl_.add(this.tabViewEl_).removeClass(this.options.activeClass);
      +      current.add(this.tabViewEl_.eq(index)).addClass(this.options.activeClass);
      +    }
      +  };
      +
      +  /**
      +   * jQuery plugin
      +   */
      +  $.fn.dacTabs = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      new Tabs(el, el.data());
      +    });
      +  };
      +
      +  /**
      +   * Data Attribute API
      +   */
      +  $(function() {
      +    $('[data-tabs]').dacTabs();
      +  });
      +})(jQuery);
      +
      +/* Toast Component */
      +(function($) {
      +  'use strict';
      +  /**
      +   * @constant
      +   * @type {String}
      +   */
      +  var LOCAL_STORAGE_KEY = 'toast-closed-index';
      +
      +  /**
      +   * Dictionary from local storage.
      +   */
      +  var toastDictionary = localStorage.getItem(LOCAL_STORAGE_KEY);
      +  toastDictionary = toastDictionary ? JSON.parse(toastDictionary) : {};
      +
      +  /**
      +   * Variable used for caching the body.
      +   */
      +  var bodyCached;
      +
      +  /**
      +   * @param {HTMLElement} el - The DOM element.
      +   * @param {Object} options
      +   * @constructor
      +   */
      +  function Toast(el, options) {
      +    this.el = $(el);
      +    this.options = $.extend({}, Toast.DEFAULTS_, options);
      +    this.init();
      +  }
      +
      +  Toast.DEFAULTS_ = {
      +    closeBtnClass: 'dac-toast-close-btn',
      +    closeDuration: 200,
      +    visibleClass: 'dac-visible',
      +    wrapClass: 'dac-toast-wrap'
      +  };
      +
      +  /**
      +   * Generate a close button.
      +   * @returns {*|HTMLElement}
      +   */
      +  Toast.prototype.closeBtn = function() {
      +    this.closeBtnEl = this.closeBtnEl || $('<button class="' + this.options.closeBtnClass + '">' +
      +      '<span class="dac-button dac-raised dac-primary">OK</span>' +
      +    '</button>');
      +    return this.closeBtnEl;
      +  };
      +
      +  /**
      +   * Initialize a new toast element
      +   */
      +  Toast.prototype.init = function() {
      +    this.hash = this.el.text().replace(/[\s\n\t]/g, '').split('').slice(0, 128).join('');
      +
      +    if (toastDictionary[this.hash]) {
      +      return;
      +    }
      +
      +    this.closeBtn().on('click', this.onClickHandler.bind(this));
      +    this.el.find('.' + this.options.wrapClass).append(this.closeBtn());
      +    this.el.addClass(this.options.visibleClass);
      +    this.dynamicPadding(this.el.outerHeight());
      +  };
      +
      +  /**
      +   * Add padding to make sure all page is visible.
      +   */
      +  Toast.prototype.dynamicPadding = function(val) {
      +    var currentPadding = parseInt(bodyCached.css('padding-bottom') || 0);
      +    bodyCached.css('padding-bottom', val + currentPadding);
      +  };
      +
      +  /**
      +   * Remove a toast from the DOM
      +   */
      +  Toast.prototype.remove = function() {
      +    this.dynamicPadding(-this.el.outerHeight());
      +    this.el.remove();
      +  };
      +
      +  /**
      +   * Handle removal of the toast.
      +   */
      +  Toast.prototype.onClickHandler = function() {
      +    // Only fadeout toasts from top of stack. Others are removed immediately.
      +    var duration = this.el.index() === 0 ? this.options.closeDuration : 0;
      +    this.el.fadeOut(duration, this.remove.bind(this));
      +
      +    // Save closed state.
      +    toastDictionary[this.hash] = 1;
      +    localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(toastDictionary));
      +  };
      +
      +  /**
      +   * jQuery plugin
      +   * @param  {object} options - Override default options.
      +   */
      +  $.fn.dacToast = function() {
      +    return this.each(function() {
      +      var el = $(this);
      +      new Toast(el, el.data());
      +    });
      +  };
      +
      +  /**
      +   * Data Attribute API
      +   */
      +  $(function() {
      +    bodyCached = $('#body-content');
      +    $('[data-toast]').dacToast();
      +  });
      +})(jQuery);
      +
       (function($) {
         function Toggle(el) {
           $(el).on('click.dac.togglesection', this.toggle);
      @@ -5341,8 +6381,12 @@ function showSamples() {
       
           // If we're hiding, first set the maxHeight we're transitioning from.
           if (!visible) {
      -      $el.css('maxHeight', contentHeight + 'px')
      -        .resolveStyles();
      +      $el.css({
      +          transitionDuration: '0s',
      +          maxHeight: contentHeight + 'px'
      +        })
      +        .resolveStyles()
      +        .css('transitionDuration', '');
           }
       
           // Transition to new state
      @@ -5350,7 +6394,12 @@ function showSamples() {
       
           // Reset maxHeight to css value after transition.
           setTimeout(function() {
      -      $el.css('maxHeight', '');
      +      $el.css({
      +          transitionDuration: '0s',
      +          maxHeight: ''
      +        })
      +        .resolveStyles()
      +        .css('transitionDuration', '');
           }, duration);
         }
       
      @@ -5375,3 +6424,267 @@ function showSamples() {
         $(document)
           .on('click.toggle', '[data-toggle="section"]', Toggle.prototype.toggle);
       })(jQuery);
      +
      +(function(window) {
      +  /**
      +   * Media query breakpoints. Should match CSS.
      +   */
      +  var BREAKPOINTS = {
      +    mobile: [0, 719],
      +    tablet: [720, 959],
      +    desktop: [960, 9999]
      +  };
      +
      +  /**
      +   * Fisher-Yates Shuffle (Knuth shuffle).
      +   * @param {Array} input
      +   * @returns {Array} shuffled array.
      +   */
      +  function shuffle(input) {
      +    for (var i = input.length; i >= 0; i--) {
      +      var randomIndex = Math.floor(Math.random() * (i + 1));
      +      var randomItem = input[randomIndex];
      +      input[randomIndex] = input[i];
      +      input[i] = randomItem;
      +    }
      +
      +    return input;
      +  }
      +
      +  /**
      +   * Matches media breakpoints like in CSS.
      +   * @param {string} form of either mobile, tablet or desktop.
      +   */
      +  function matchesMedia(form) {
      +    var breakpoint = BREAKPOINTS[form];
      +    return window.innerWidth >= breakpoint[0] && window.innerWidth <= breakpoint[1];
      +  }
      +
      +  window.util = {
      +    shuffle: shuffle,
      +    matchesMedia: matchesMedia
      +  };
      +})(window);
      +
      +(function($, window) {
      +  'use strict';
      +
      +  var YouTubePlayer = (function() {
      +    var player;
      +
      +    function VideoPlayer() {
      +      this.mPlayerPaused = false;
      +      this.doneSetup = false;
      +    }
      +
      +    VideoPlayer.prototype.setup = function() {
      +      // loads the IFrame Player API code asynchronously.
      +      $.getScript('https://www.youtube.com/iframe_api');
      +
      +      // Add the shadowbox HTML to the body
      +      $('body').prepend(
      +'<div id="video-player" class="Video">' +
      +  '<div id="video-overlay" class="Video-overlay" />' +
      +  '<div class="Video-container">' +
      +    '<div class="Video-frame">' +
      +      '<span class="Video-loading">Loading&hellip;</span>' +
      +      '<div id="youTubePlayer"></div>' +
      +    '</div>' +
      +    '<div class="Video-controls">' +
      +      '<button id="picture-in-picture" class="Video-button Video-button--picture-in-picture">' +
      +      '<button id="close-video" class="Video-button Video-button--close" />' +
      +    '</div>' +
      +  '</div>' +
      +'</div>');
      +
      +      this.videoPlayer = $('#video-player');
      +
      +      var pictureInPictureButton = this.videoPlayer.find('#picture-in-picture');
      +      pictureInPictureButton.on('click.aranja', this.toggleMinimizeVideo.bind(this));
      +
      +      var videoOverlay = this.videoPlayer.find('#video-overlay');
      +      var closeButton = this.videoPlayer.find('#close-video');
      +      var closeVideo = this.closeVideo.bind(this);
      +      videoOverlay.on('click.aranja', closeVideo);
      +      closeButton.on('click.aranja', closeVideo);
      +
      +      this.doneSetup = true;
      +    };
      +
      +    VideoPlayer.prototype.startYouTubePlayer = function(videoId) {
      +      this.videoPlayer.show();
      +
      +      if (!this.isLoaded) {
      +        this.queueVideo = videoId;
      +        return;
      +      }
      +
      +      this.mPlayerPaused = false;
      +      // check if we've already created this player
      +      if (!this.youTubePlayer) {
      +        // check if there's a start time specified
      +        var idAndHash = videoId.split('#');
      +        var startTime = 0;
      +        if (idAndHash.length > 1) {
      +          startTime = idAndHash[1].split('t=')[1] !== undefined ? idAndHash[1].split('t=')[1] : 0;
      +        }
      +        // enable localized player
      +        var lang = getLangPref();
      +        var captionsOn = lang === 'en' ? 0 : 1;
      +
      +        this.youTubePlayer = new YT.Player('youTubePlayer', {
      +          height: 720,
      +          width: 1280,
      +          videoId: idAndHash[0],
      +          // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
      +          playerVars: {start: startTime, hl: lang, cc_load_policy: captionsOn},
      +          // jscs:enable
      +          events: {
      +            'onReady': this.onPlayerReady.bind(this),
      +            'onStateChange': this.onPlayerStateChange.bind(this)
      +          }
      +        });
      +      } else {
      +        // if a video different from the one already playing was requested, cue it up
      +        if (videoId !== this.getVideoId()) {
      +          this.youTubePlayer.cueVideoById(videoId);
      +        }
      +        this.youTubePlayer.playVideo();
      +      }
      +    };
      +
      +    VideoPlayer.prototype.onPlayerReady = function(event) {
      +      if (!isMobile) {
      +        event.target.playVideo();
      +        this.mPlayerPaused = false;
      +      }
      +    };
      +
      +    VideoPlayer.prototype.toggleMinimizeVideo = function(event) {
      +      event.stopPropagation();
      +      this.videoPlayer.toggleClass('Video--picture-in-picture');
      +    };
      +
      +    VideoPlayer.prototype.closeVideo = function() {
      +      try {
      +        this.youTubePlayer.pauseVideo();
      +      } catch (e) {
      +      }
      +      this.videoPlayer.fadeOut(200, function() {
      +        this.videoPlayer.removeClass('Video--picture-in-picture');
      +      }.bind(this));
      +    };
      +
      +    VideoPlayer.prototype.getVideoId = function() {
      +      // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
      +      return this.youTubePlayer && this.youTubePlayer.getVideoData().video_id;
      +      // jscs:enable
      +    };
      +
      +    /* Track youtube playback for analytics */
      +    VideoPlayer.prototype.onPlayerStateChange = function(event) {
      +      var videoId = this.getVideoId();
      +      var currentTime = this.youTubePlayer && this.youTubePlayer.getCurrentTime();
      +
      +      // Video starts, send the video ID
      +      if (event.data === YT.PlayerState.PLAYING) {
      +        if (this.mPlayerPaused) {
      +          devsite.analytics.trackAnalyticsEvent('event',
      +              'Videos', 'Resume', videoId);
      +        } else {
      +          // track the start playing event so we know from which page the video was selected
      +          devsite.analytics.trackAnalyticsEvent('event',
      +              'Videos', 'Start: ' + videoId, 'on: ' + document.location.href);
      +        }
      +        this.mPlayerPaused = false;
      +      }
      +
      +      // Video paused, send video ID and video elapsed time
      +      if (event.data === YT.PlayerState.PAUSED) {
      +        devsite.analytics.trackAnalyticsEvent('event',
      +            'Videos', 'Paused: ' + videoId, 'on: ' + currentTime);
      +        this.mPlayerPaused = true;
      +      }
      +
      +      // Video finished, send video ID and video elapsed time
      +      if (event.data === YT.PlayerState.ENDED) {
      +        devsite.analytics.trackAnalyticsEvent('event',
      +            'Videos', 'Finished: ' + videoId, 'on: ' + currentTime);
      +        this.mPlayerPaused = true;
      +      }
      +    };
      +
      +    return {
      +      getPlayer: function() {
      +        if (!player) {
      +          player = new VideoPlayer();
      +        }
      +
      +        return player;
      +      }
      +    };
      +  })();
      +
      +  var videoPlayer = YouTubePlayer.getPlayer();
      +
      +  window.onYouTubeIframeAPIReady = function() {
      +    videoPlayer.isLoaded = true;
      +
      +    if (videoPlayer.queueVideo) {
      +      videoPlayer.startYouTubePlayer(videoPlayer.queueVideo);
      +    }
      +  };
      +
      +  function wrapLinkInPlayer(e) {
      +    e.preventDefault();
      +
      +    if (!videoPlayer.doneSetup) {
      +      videoPlayer.setup();
      +    }
      +
      +    var videoIdMatches = $(e.currentTarget).attr('href').match(/(?:youtu.be\/|v=)([^&]*)/);
      +    var videoId = videoIdMatches && videoIdMatches[1];
      +
      +    if (videoId) {
      +      videoPlayer.startYouTubePlayer(videoId);
      +    }
      +  }
      +
      +  $(document).on('click.video', 'a[href*="youtube.com/watch"], a[href*="youtu.be"]', wrapLinkInPlayer);
      +})(jQuery, window);
      +
      +/**
      + * Wide table
      + *
      + * Wraps tables in a scrollable area so you can read them on mobile.
      + */
      +(function($) {
      +  function initWideTable() {
      +    $('table.jd-sumtable').each(function(i, table) {
      +      $(table).wrap('<div class="dac-expand wide-table">');
      +    });
      +  }
      +
      +  $(function() {
      +    initWideTable();
      +  });
      +})(jQuery);
      +
      +/** Utilities */
      +
      +/* returns the given string with all HTML brackets converted to entities
      +    TODO: move this to the site's JS library */
      +function escapeHTML(string) {
      +  return string.replace(/</g,"&lt;")
      +                .replace(/>/g,"&gt;");
      +};
      +
      +function getQueryVariable(variable) {
      +  var query = window.location.search.substring(1);
      +  var vars = query.split("&");
      +  for (var i=0;i<vars.length;i++) {
      +    var pair = vars[i].split("=");
      +    if(pair[0] == variable){return pair[1];}
      +  }
      +  return(false);
      +};
      diff --git a/tools/droiddoc/templates-sdk/body_tag.cs b/tools/droiddoc/templates-sdk/body_tag.cs
      new file mode 100644
      index 00000000000..5761b71f719
      --- /dev/null
      +++ b/tools/droiddoc/templates-sdk/body_tag.cs
      @@ -0,0 +1,15 @@
      +<body class="gc-documentation <?cs
      +  if:(reference.gms || reference.gcm)
      +    ?>google<?cs
      +  /if ?><?cs
      +  if:(guide||develop||training||reference||tools||sdk)
      +    ?>develop<?cs
      +    if:reference
      +      ?> reference api apilevel-<?cs var:class.since ?><?cs var:package.since ?><?cs
      +    /if ?><?cs
      +  elif:design
      +    ?>design<?cs
      +  elif:distribute
      +    ?>distribute<?cs
      +  /if ?>">
      +<div id="doc-api-level" class="<?cs var:class.since ?><?cs var:package.since ?>" style="display:none"></div>
      diff --git a/tools/droiddoc/templates-sdk/class.cs b/tools/droiddoc/templates-sdk/class.cs
      index 8312b25de0c..dee7a4c9d0c 100644
      --- a/tools/droiddoc/templates-sdk/class.cs
      +++ b/tools/droiddoc/templates-sdk/class.cs
      @@ -1,261 +1,92 @@
      -<?cs include:"doctype.cs" ?>
      +<?cs # THIS CREATES A CLASS OR INTERFACE PAGE FROM .java FILES ?>
       <?cs include:"macros.cs" ?>
       <?cs include:"macros_override.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/Article">
      -  <div id="doc-api-level" class="<?cs var:class.since ?>" style="display:none"></div>
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -<div class="col-12"  id="doc-col">
      -
      -<div id="api-info-block">
      -
      -<?cs # are there inherited members ?>
      -<?cs each:cl=class.inherited ?>
      -  <?cs if:subcount(cl.methods) ?>
      -   <?cs set:inhmethods = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.constants) ?>
      -   <?cs set:inhconstants = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.fields) ?>
      -   <?cs set:inhfields = #1 ?>
      -  <?cs /if ?>
      -  <?cs if:subcount(cl.attrs) ?>
      -   <?cs set:inhattrs = #1 ?>
      -  <?cs /if ?>
      -<?cs /each ?>
      -
      -<div class="sum-details-links">
      -<?cs if:inhattrs || inhconstants || inhfields || inhmethods || (!class.subclasses.hidden &&
      -     (subcount(class.subclasses.direct) || subcount(class.subclasses.indirect))) ?>
      -Summary:
      -<?cs if:subcount(class.inners) ?>
      -  <a href="#nestedclasses">Nested Classes</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.attrs) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lattrs">XML Attrs</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhattrs ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhattrs">Inherited XML Attrs</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.enumConstants) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#enumconstants">Enums</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.constants) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#constants">Constants</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhconstants ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhconstants">Inherited Constants</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.fields) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lfields">Fields</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhfields ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhfields">Inherited Fields</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.ctors.public) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubctors">Ctors</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.ctors.protected) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#proctors">Protected Ctors</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.methods.public) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubmethods">Methods</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:subcount(class.methods.protected) ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#promethods">Protected Methods</a>
      -  <?cs set:linkcount = #1 ?>
      -<?cs /if ?>
      -<?cs if:inhmethods ?>
      -  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhmethods">Inherited Methods</a>
      -<?cs /if ?>
      -&#124; <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
      -<?cs /if ?>
      -</div><!-- end sum-details-links -->
      -<div class="api-level">
      -  <?cs call:since_tags(class) ?><?cs
      -  if:class.deprecatedsince
      -    ?><br>Deprecated since <a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html#ApiLevels"
      -        >API level <?cs var:class.deprecatedsince ?></a><?cs
      -  /if ?>
      -  <?cs call:federated_refs(class) ?>
      -</div>
      -</div><!-- end api-info-block -->
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<!-- ======== START OF CLASS DATA ======== -->
      -
      -<div id="jd-header">
      -    <?cs var:class.scope ?>
      -    <?cs var:class.static ?> 
      -    <?cs var:class.final ?> 
      -    <?cs var:class.abstract ?>
      -    <?cs var:class.kind ?>
      -<h1 itemprop="name"><?cs var:class.name ?></h1>
      -
      -<?cs set:colspan = subcount(class.inheritance) ?>
      -<?cs each:supr = class.inheritance ?>
      -  <?cs if:colspan == 2 ?>
      -    extends <?cs call:type_link(supr.short_class) ?><br/>
      -  <?cs /if ?>
      -  <?cs if:last(supr) && subcount(supr.interfaces) ?>
      -      implements 
      -      <?cs each:t=supr.interfaces ?>
      -        <?cs call:type_link(t) ?> 
      -      <?cs /each ?>
      -  <?cs /if ?>
      -  <?cs set:colspan = colspan-1 ?>
      -<?cs /each ?>
      -<?cs call:show_annotations_list(class) ?>
      -
      -</div><!-- end header -->
      -
      -<div id="naMessage"></div>
      -
      -<div id="jd-content" class="api apilevel-<?cs var:class.since ?>">
      -<table class="jd-inheritance-table">
      -<?cs set:colspan = subcount(class.inheritance) ?>
      -<?cs each:supr = class.inheritance ?>
      -    <tr>
      -        <?cs loop:i = 1, (subcount(class.inheritance)-colspan), 1 ?>
      -            <td class="jd-inheritance-space">&nbsp;<?cs if:(subcount(class.inheritance)-colspan) == i ?>&nbsp;&nbsp;&#x21b3;<?cs /if ?></td>
      -        <?cs /loop ?> 	
      -        <td colspan="<?cs var:colspan ?>" class="jd-inheritance-class-cell"><?cs
      -            if:colspan == 1
      -                ?><?cs call:class_name(class.qualifiedType) ?><?cs 
      -            else 
      -                ?><?cs call:type_link(supr.class) ?><?cs
      -            /if ?></td>
      -    </tr>
      -    <?cs set:colspan = colspan-1 ?>
      -<?cs /each ?>
      -</table>
      -
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -
      -<?cs if:subcount(class.subclasses.direct) && !class.subclasses.hidden ?>
      -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
      -<?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses
      -<?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?>
      -</td></tr></table>
      -<?cs /if ?>
      -
      -<?cs if:subcount(class.subclasses.indirect) && !class.subclasses.hidden ?>
      -<table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="12" style="border:none;margin:0;padding:0;">
      -<?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses
      -<?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?>
      -</td></tr></table>
      -<?cs /if ?>
      -
      -<div class="jd-descr">
      -<?cs call:deprecated_warning(class) ?>
      -<?cs if:subcount(class.descr) ?>
      -<h2>Class Overview</h2>
      -<p itemprop="articleBody"><?cs call:tag_list(class.descr) ?></p>
      -<?cs /if ?>
      -
      -<?cs call:see_also_tags(class.seeAlso) ?>
      -
      -</div><!-- jd-descr -->
      -
      -
      -<?cs # summary macros ?>
      -
      -<?cs def:write_method_summary(methods, included) ?>
      +<?cs
      +####################
      +# MACRO FUNCTION USED ONLY IN THIS TEMPLATE TO GENERATE API REFERENCE
      +# FIRST, THE FUNCTIONS FOR THE SUMMARY AT THE TOP OF THE PAGE
      +####################
      +?>
      +
      +<?cs
      +# Prints the table cells for the summary of methods.
      +?><?cs def:write_method_summary(methods, included) ?>
       <?cs set:count = #1 ?>
       <?cs each:method = methods ?>
      -	 <?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:method.since ?>" >
      -        <td class="jd-typecol"><nobr>
      -            <?cs var:method.abstract ?>
      -            <?cs var:method.default ?>
      -            <?cs var:method.static ?>
      -            <?cs var:method.final ?>
      -            <?cs call:type_link(method.generic) ?>
      -            <?cs call:type_link(method.returnType) ?></nobr>
      -        </td>
      -        <td class="jd-linkcol" width="100%"><nobr>
      -        <span class="sympad"><?cs call:cond_link(method.name, toroot, method.href, included) ?></span>(<?cs call:parameter_list(method.params) ?>)</nobr>
      -        <?cs if:subcount(method.shortDescr) || subcount(method.deprecated) ?>
      -        <div class="jd-descrdiv">
      -          <?cs call:short_descr(method) ?>
      -          <?cs call:show_annotations_list(method) ?>
      -        </div>
      +  <?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      +  <tr class="api apilevel-<?cs var:method.since ?>" >
      +  <?cs # leave out this cell if there is no return type = if constructors ?>
      +  <?cs if:subcount(method.returnType) ?>
      +    <td><code>
      +        <?cs var:method.abstract ?>
      +        <?cs var:method.default ?>
      +        <?cs var:method.static ?>
      +        <?cs var:method.final ?>
      +        <?cs call:type_link(method.generic) ?>
      +        <?cs call:type_link(method.returnType) ?></code>
      +    </td>
         <?cs /if ?>
      -  </td></tr>
      -<?cs set:count = count + #1 ?>
      +    <td width="100%">
      +      <code>
      +      <?cs call:cond_link(method.name, toroot, method.href, included) ?>(<?cs call:parameter_list(method.params, 0) ?>)
      +      </code>
      +      <?cs if:subcount(method.shortDescr) || subcount(method.deprecated) ?>
      +        <p><?cs call:short_descr(method) ?>
      +        <?cs call:show_annotations_list(method) ?></p>
      +      <?cs /if ?>
      +    </td>
      +  </tr>
      +  <?cs set:count = count + #1 ?>
       <?cs /each ?>
       <?cs /def ?>
       
      -<?cs def:write_field_summary(fields, included) ?>
      +<?cs
      +# Print the table cells for the summary of fields.
      +?><?cs def:write_field_summary(fields, included) ?>
       <?cs set:count = #1 ?>
      -    <?cs each:field=fields ?>
      -      <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -          <td class="jd-typecol"><nobr>
      -          <?cs var:field.scope ?>
      -          <?cs var:field.static ?>
      -          <?cs var:field.final ?>
      -          <?cs call:type_link(field.type) ?></nobr></td>
      -          <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
      -          <td class="jd-descrcol" width="100%">
      -            <?cs call:short_descr(field) ?>
      -            <?cs call:show_annotations_list(field) ?>
      -          </td>
      -      </tr>
      -      <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      +<?cs each:field=fields ?>
      +  <tr class="api apilevel-<?cs var:field.since ?>" >
      +    <td><code>
      +    <?cs var:field.scope ?>
      +    <?cs var:field.static ?>
      +    <?cs var:field.final ?>
      +    <?cs call:type_link(field.type) ?></code></td>
      +    <td width="100%">
      +      <code><?cs call:cond_link(field.name, toroot, field.href, included) ?></code>
      +      <p><?cs call:short_descr(field) ?>
      +      <?cs call:show_annotations_list(field) ?></p>
      +    </td>
      +  </tr>
      +  <?cs set:count = count + #1 ?>
      +<?cs /each ?>
       <?cs /def ?>
       
      -<?cs def:write_constant_summary(fields, included) ?>
      +<?cs
      +# Print the table cells for the summary of constants
      +?><?cs def:write_constant_summary(fields, included) ?>
       <?cs set:count = #1 ?>
           <?cs each:field=fields ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -        <td class="jd-typecol"><?cs call:type_link(field.type) ?></td>
      -        <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, included) ?></td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(field) ?>
      -          <?cs call:show_annotations_list(field) ?>
      +    <tr class="api apilevel-<?cs var:field.since ?>" >
      +        <td><code><?cs call:type_link(field.type) ?></code></td>
      +        <td width="100%">
      +          <code><?cs call:cond_link(field.name, toroot, field.href, included) ?></code>
      +          <p><?cs call:short_descr(field) ?>
      +          <?cs call:show_annotations_list(field) ?></p>
               </td>
           </tr>
           <?cs set:count = count + #1 ?>
           <?cs /each ?>
       <?cs /def ?>
       
      -<?cs def:write_attr_summary(attrs, included) ?>
      +<?cs
      +# Print the table cells for the summary of attributes
      +?><?cs def:write_attr_summary(attrs, included) ?>
       <?cs set:count = #1 ?>
      -    <tr>
      -        <td><nobr><em>Attribute Name</em></nobr></td>
      -        <td><nobr><em>Related Method</em></nobr></td>
      -        <td><nobr><em>Description</em></nobr></td>
      -    </tr>
           <?cs each:attr=attrs ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:attr.since ?>" >
      -        <td class="jd-linkcol"><?cs if:included ?><a href="<?cs var:toroot ?><?cs var:attr.href ?>"><?cs /if ?><?cs var:attr.name ?><?cs if:included ?></a><?cs /if ?></td>
      -        <td class="jd-linkcol"><?cs each:m=attr.methods ?>
      -            <?cs call:cond_link(m.name, toroot, m.href, included) ?>
      -            <?cs /each ?>
      -        </td>
      -        <td class="jd-descrcol" width="100%">
      +    <tr class="api apilevel-<?cs var:attr.since ?>" >
      +        <td><?cs if:included ?><a href="<?cs var:toroot ?><?cs var:attr.href ?>"><?cs /if
      +          ?><code><?cs var:attr.name ?></code><?cs if:included ?></a><?cs /if ?></td>
      +        <td width="100%">
                 <?cs call:short_descr(attr) ?>&nbsp;
                 <?cs call:show_annotations_list(attr) ?>
               </td>
      @@ -264,30 +95,220 @@
           <?cs /each ?>
       <?cs /def ?>
       
      -<?cs def:write_inners_summary(classes) ?>
      +<?cs
      +# Print the table cells for the inner classes
      +?><?cs def:write_inners_summary(classes) ?>
       <?cs set:count = #1 ?>
         <?cs each:cl=class.inners ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
      -      <td class="jd-typecol"><nobr>
      +    <tr class="api apilevel-<?cs var:cl.since ?>" >
      +      <td class="jd-typecol"><code>
               <?cs var:cl.scope ?>
      -        <?cs var:cl.static ?> 
      -        <?cs var:cl.final ?> 
      +        <?cs var:cl.static ?>
      +        <?cs var:cl.final ?>
               <?cs var:cl.abstract ?>
      -        <?cs var:cl.kind ?></nobr></td>
      -      <td class="jd-linkcol"><?cs call:type_link(cl.type) ?></td>
      +        <?cs var:cl.kind ?></code></td>
             <td class="jd-descrcol" width="100%">
      -        <?cs call:short_descr(cl) ?>&nbsp;
      -        <?cs call:show_annotations_list(cl) ?>
      +        <code><?cs call:type_link(cl.type) ?></code>
      +        <p><?cs call:short_descr(cl) ?>&nbsp;
      +        <?cs call:show_annotations_list(cl) ?></p>
             </td>
           </tr>
           <?cs set:count = count + #1 ?>
           <?cs /each ?>
       <?cs /def ?>
      +<?cs
      +###################
      +# END OF FUNCTIONS FOR API SUMMARY
      +# START OF FUNCTIONS FOR THE API DETAILS
      +###################
      +?>
      +<?cs
      +# Print the table cells for the summary of constants
      +?>
      +<?cs def:write_field_details(fields) ?>
      +<?cs each:field=fields ?>
      +<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      +<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      +<A NAME="<?cs var:field.anchor ?>"></A>
      +<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      +<div class="api apilevel-<?cs var:field.since ?>">
      +    <h3 class="api-name"><?cs var:field.name ?></h3>
      +    <div class="api-level">
      +      <?cs call:since_tags(field) ?>
      +      <?cs call:federated_refs(field) ?>
      +    </div>
      +<pre class="api-signature no-pretty-print">
      +<?cs if:subcount(field.scope) ?><?cs var:field.scope
      +?> <?cs /if ?><?cs if:subcount(field.static) ?><?cs var:field.static
      +?> <?cs /if ?><?cs if:subcount(field.final) ?><?cs var:field.final
      +?> <?cs /if ?><?cs if:subcount(field.type) ?><?cs call:type_link(field.type)
      +?> <?cs /if ?><?cs var:field.name ?></pre>
      +    <?cs call:show_annotations_list(field) ?>
      +    <?cs call:description(field) ?>
      +    <?cs if:subcount(field.constantValue) ?>
      +      <p>Constant Value:
      +      <?cs if:field.constantValue.isString ?>
      +          <?cs var:field.constantValue.str ?>
      +      <?cs else ?>
      +          <?cs var:field.constantValue.dec ?>
      +          (<?cs var:field.constantValue.hex ?>)
      +      <?cs /if ?>
      +    <?cs /if ?>
      +</div>
      +<?cs /each ?>
      +<?cs /def ?>
      +
      +<?cs def:write_method_details(methods) ?>
      +<?cs each:method=methods ?>
      +<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      +<A NAME="<?cs var:method.anchor ?>"></A>
      +<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      +<div class="api apilevel-<?cs var:method.since ?>">
      +    <h3 class="api-name"><?cs var:method.name ?></h3>
      +    <div class="api-level">
      +      <div><?cs call:since_tags(method) ?></div>
      +      <?cs call:federated_refs(method) ?>
      +    </div>
      +<pre class="api-signature no-pretty-print">
      +<?cs if:subcount(method.scope) ?><?cs var:method.scope
      +?> <?cs /if ?><?cs if:subcount(method.static) ?><?cs var:method.static
      +?> <?cs /if ?><?cs if:subcount(method.final) ?><?cs var:method.final
      +?> <?cs /if ?><?cs if:subcount(method.abstract) ?><?cs var:method.abstract
      +?> <?cs /if ?><?cs if:subcount(method.returnType) ?><?cs call:type_link(method.returnType)
      +?> <?cs /if ?><?cs var:method.name ?> (<?cs call:parameter_list(method.params, 1) ?>)</pre>
      +    <?cs call:show_annotations_list(method) ?>
      +    <?cs call:description(method) ?>
      +</div>
      +<?cs /each ?>
      +<?cs /def ?>
       
      -<?cs # end macros ?>
      +<?cs def:write_attr_details(attrs) ?>
      +<?cs each:attr=attrs ?>
      +<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      +<A NAME="<?cs var:attr.anchor ?>"></A>
      +<h3 class="api-name"><?cs var:attr.name ?></h3>
      +<?cs call:show_annotations_list(attr) ?>
      +<?cs call:description(attr) ?>
      +<?cs if:subcount(attr.methods) ?>
      +  <p><b>Related methods:</b></p>
      +  <ul class="nolist">
      +  <?cs each:m=attr.methods ?>
      +    <li><a href="<?cs var:toroot ?><?cs var:m.href ?>"><?cs var:m.name ?></a></li>
      +  <?cs /each ?>
      +  </ul>
      +<?cs /if ?>
      +<?cs /each ?>
      +<?cs /def ?>
      +<?cs
      +#########################
      +# END OF MACROS
      +# START OF PAGE PRINTING
      +#########################
      +?>
      +<?cs include:"doctype.cs" ?>
      +<html<?cs if:devsite ?> devsite<?cs /if ?>>
      +<?cs include:"head_tag.cs" ?>
      +<?cs include:"body_tag.cs" ?>
      +<?cs include:"header.cs" ?>
      +<?cs include:"page_info.cs" ?>
      +<?cs # This DIV spans the entire document to provide scope for some scripts ?>
      +<div class="api apilevel-<?cs var:class.since ?>" id="jd-content">
      +<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      +<!-- ======== START OF CLASS DATA ======== -->
      +<?cs
      +#
      +# Page header with class name and signature
      +#
      +?>
      +<h1 class="api-title"><?cs var:class.name ?></h1>
      +<p>
      +<code class="api-signature">
      +  <?cs var:class.scope ?>
      +  <?cs var:class.static ?>
      +  <?cs var:class.final ?>
      +  <?cs var:class.abstract ?>
      +  <?cs var:class.kind ?>
      +  <?cs var:class.name ?>
      +</code>
      +<br>
      +<?cs set:colspan = subcount(class.inheritance) ?>
      +<?cs each:supr = class.inheritance ?>
      +<code class="api-signature">
      +  <?cs if:colspan == 2 ?>
      +    extends <?cs call:type_link(supr.short_class) ?>
      +  <?cs /if ?>
      +  <?cs if:last(supr) && subcount(supr.interfaces) ?>
      +      implements
      +      <?cs each:t=supr.interfaces ?>
      +        <?cs call:type_link(t) ?><?cs
      +          if: name(t)!=subcount(supr.interfaces)-1
      +            ?>, <?cs /if ?>
      +      <?cs /each ?>
      +  <?cs /if ?>
      +  <?cs set:colspan = colspan-1 ?>
      +</code>
      +<?cs /each ?>
      +</p><?cs
      +#
      +# Class inheritance tree
      +#
      +?><table class="jd-inheritance-table">
      +<?cs set:colspan = subcount(class.inheritance) ?>
      +<?cs each:supr = class.inheritance ?>
      +  <tr>
      +    <?cs loop:i = 1, (subcount(class.inheritance)-colspan), 1 ?>
      +      <td class="jd-inheritance-space">&nbsp;<?cs
      +        if:(subcount(class.inheritance)-colspan) == i
      +          ?>&nbsp;&nbsp;&#x21b3;<?cs
      +        /if ?></td>
      +    <?cs /loop ?>
      +    <td colspan="<?cs var:colspan ?>" class="jd-inheritance-class-cell"><?cs
      +      if:colspan == 1
      +          ?><?cs call:class_name(class.qualifiedType) ?><?cs
      +      else
      +          ?><?cs call:type_link(supr.class) ?><?cs
      +      /if ?>
      +    </td>
      +  </tr>
      +  <?cs set:colspan = colspan-1 ?>
      +<?cs /each ?>
      +</table><?cs
      +#
      +# Collapsible list of subclasses
      +#
      +?><?cs
      +if:subcount(class.subclasses.direct) && !class.subclasses.hidden ?>
      +  <table class="jd-sumtable jd-sumtable-subclasses">
      +  <tr><td style="border:none;margin:0;padding:0;">
      +    <?cs call:expando_trigger("subclasses-direct", "closed") ?>Known Direct Subclasses
      +    <?cs call:expandable_class_list("subclasses-direct", class.subclasses.direct, "list") ?>
      +  </td></tr>
      +  </table>
      +  <?cs /if ?>
      +  <?cs if:subcount(class.subclasses.indirect) && !class.subclasses.hidden ?>
      +  <table class="jd-sumtable jd-sumtable-subclasses"><tr><td colspan="2" style="border:none;margin:0;padding:0;">
      +  <?cs call:expando_trigger("subclasses-indirect", "closed") ?>Known Indirect Subclasses
      +  <?cs call:expandable_class_list("subclasses-indirect", class.subclasses.indirect, "list") ?>
      +  </td></tr></table><?cs
      +/if ?>
      +<?cs call:show_annotations_list(class) ?>
      +<br><hr><?cs
      +#
      +# The long-form class description.
      +#
      +?><?cs call:deprecated_warning(class) ?>
       
      -<div class="jd-descr">
      -<?cs # make sure there's a summary view to display ?>
      +<?cs if:subcount(class.descr) ?>
      +  <p><?cs call:tag_list(class.descr) ?></p>
      +<?cs /if ?>
      +
      +<?cs call:see_also_tags(class.seeAlso) ?>
      +<?cs
      +#################
      +# CLASS SUMMARY
      +#################
      +?>
      +<?cs # make sure there is a summary view to display ?>
       <?cs if:subcount(class.inners)
            || subcount(class.attrs)
            || inhattrs
      @@ -301,19 +322,21 @@
            || subcount(class.methods.public)
            || subcount(class.methods.protected)
            || inhmethods ?>
      -<h2>Summary</h2>
      +<h2 class="api-section">Summary</h2>
       
       <?cs if:subcount(class.inners) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ======== NESTED CLASS SUMMARY ======== -->
      -<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
      +<table id="nestedclasses" class="responsive">
      +<tr><th colspan="2"><h3>Nested classes</h3></th></tr>
       <?cs call:write_inners_summary(class.inners) ?>
       <?cs /if ?>
       
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <?cs if:subcount(class.attrs) ?>
       <!-- =========== FIELD SUMMARY =========== -->
      -<table id="lattrs" class="jd-sumtable"><tr><th colspan="12">XML Attributes</th></tr>
      +<table id="lattrs" class="responsive">
      +<tr><th colspan="2"><h3>XML attributes</h3></th></tr>
       <?cs call:write_attr_summary(class.attrs, 1) ?>
       <?cs /if ?>
       
      @@ -321,15 +344,17 @@
       <?cs if:inhattrs ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== FIELD SUMMARY =========== -->
      -<table id="inhattrs" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited XML Attributes</div></th></tr>
      +<table id="inhattrs" class="responsive inhtable">
      +<tr><th><h3>Inherited XML attributes</h3></th></tr>
       <?cs each:cl=class.inherited ?>
       <?cs if:subcount(cl.attrs) ?>
       <tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      +<td colspan="2">
      +<?cs call:expando_trigger("inherited-attrs-"+cl.qualified, "closed") ?>From
      +<?cs var:cl.kind ?>
      +<code>
      +  <?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      +</code>
       <div id="inherited-attrs-<?cs var:cl.qualified ?>">
         <div id="inherited-attrs-<?cs var:cl.qualified ?>-list"
               class="jd-inheritedlinks">
      @@ -348,25 +373,27 @@
       <?cs if:subcount(class.enumConstants) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="enumconstants" class="jd-sumtable"><tr><th colspan="12">Enum Values</th></tr>
      +<table id="enumconstants" class="responsive constants">
      +  <tr><th colspan="2"><h3>Enum values</h3></th></tr>
       <?cs set:count = #1 ?>
      -    <?cs each:field=class.enumConstants ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:field.since ?>" >
      -        <td class="jd-descrcol"><?cs call:type_link(field.type) ?>&nbsp;</td>
      -        <td class="jd-linkcol"><?cs call:cond_link(field.name, toroot, field.href, cl.included) ?>&nbsp;</td>
      -        <td class="jd-descrcol" width="100%">
      -          <?cs call:short_descr(field) ?>&nbsp;
      -          <?cs call:show_annotations_list(field) ?>
      -        </td>
      -    </tr>
      -    <?cs set:count = count + #1 ?>
      -    <?cs /each ?>
      +  <?cs each:field=class.enumConstants ?>
      +  <tr class="api apilevel-<?cs var:field.since ?>" >
      +    <td><code><?cs call:type_link(field.type) ?></code>&nbsp;</td>
      +    <td width="100%">
      +      <code><?cs call:cond_link(field.name, toroot, field.href, cl.included) ?></code>
      +      <p><?cs call:short_descr(field) ?>&nbsp;
      +      <?cs call:show_annotations_list(field) ?></p>
      +    </td>
      +  </tr>
      +  <?cs set:count = count + #1 ?>
      +  <?cs /each ?>
       <?cs /if ?>
       
       <?cs if:subcount(class.constants) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr>
      +<table id="constants" class="responsive constants">
      +<tr><th colspan="2"><h3>Constants</h3></th></tr>
       <?cs call:write_constant_summary(class.constants, 1) ?>
       </table>
       <?cs /if ?>
      @@ -375,25 +402,27 @@
       <?cs if:inhconstants ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== ENUM CONSTANT SUMMARY =========== -->
      -<table id="inhconstants" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Constants</div></th></tr>
      +<table id="inhconstants" class="responsive constants inhtable">
      +<tr><th><h3>Inherited constants</h3></th></tr>
       <?cs each:cl=class.inherited ?>
       <?cs if:subcount(cl.constants) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      -<div id="inherited-constants-<?cs var:cl.qualified ?>">
      -  <div id="inherited-constants-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-constants-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_constant_summary(cl.constants, cl.included) ?></table>
      +  <tr class="api apilevel-<?cs var:cl.since ?>" >
      +  <td>
      +  <?cs call:expando_trigger("inherited-constants-"+cl.qualified, "closed") ?>From
      +  <?cs var:cl.kind ?>
      +  <code>
      +    <?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      +  </code>
      +  <div id="inherited-constants-<?cs var:cl.qualified ?>">
      +    <div id="inherited-constants-<?cs var:cl.qualified ?>-list"
      +          class="jd-inheritedlinks">
      +    </div>
      +    <div id="inherited-constants-<?cs var:cl.qualified ?>-summary" style="display: none;">
      +      <table class="jd-sumtable-expando responsive">
      +      <?cs call:write_constant_summary(cl.constants, cl.included) ?></table>
      +    </div>
         </div>
      -</div>
      -</td></tr>
      +  </td></tr>
       <?cs /if ?>
       <?cs /each ?>
       </table>
      @@ -402,7 +431,8 @@
       <?cs if:subcount(class.fields) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== FIELD SUMMARY =========== -->
      -<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr>
      +<table id="lfields" class="responsive properties">
      +<tr><th colspan="2"><h3>Fields</h3></th></tr>
       <?cs call:write_field_summary(class.fields, 1) ?>
       </table>
       <?cs /if ?>
      @@ -411,25 +441,27 @@
       <?cs if:inhfields ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- =========== FIELD SUMMARY =========== -->
      -<table id="inhfields" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Fields</div></th></tr>
      +<table id="inhfields" class="properties inhtable">
      +<tr><th><h3>Inherited fields</h3></th></tr>
       <?cs each:cl=class.inherited ?>
       <?cs if:subcount(cl.fields) ?>
      -<tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12">
      -<?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>From <?cs var:cl.kind ?>
      -<?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      -<div id="inherited-fields-<?cs var:cl.qualified ?>">
      -  <div id="inherited-fields-<?cs var:cl.qualified ?>-list"
      -        class="jd-inheritedlinks">
      -  </div>
      -  <div id="inherited-fields-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_field_summary(cl.fields, cl.included) ?></table>
      +  <tr class="api apilevel-<?cs var:cl.since ?>" >
      +  <td>
      +  <?cs call:expando_trigger("inherited-fields-"+cl.qualified, "closed") ?>From
      +  <?cs var:cl.kind ?>
      +  <code>
      +    <?cs call:cond_link(cl.qualified, toroot, cl.link, cl.included) ?>
      +  </code>
      +  <div id="inherited-fields-<?cs var:cl.qualified ?>">
      +    <div id="inherited-fields-<?cs var:cl.qualified ?>-list"
      +          class="jd-inheritedlinks">
      +    </div>
      +    <div id="inherited-fields-<?cs var:cl.qualified ?>-summary" style="display: none;">
      +      <table class="jd-sumtable-expando responsive">
      +      <?cs call:write_field_summary(cl.fields, cl.included) ?></table>
      +    </div>
         </div>
      -</div>
      -</td></tr>
      +  </td></tr>
       <?cs /if ?>
       <?cs /each ?>
       </table>
      @@ -438,7 +470,8 @@
       <?cs if:subcount(class.ctors.public) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ======== CONSTRUCTOR SUMMARY ======== -->
      -<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
      +<table id="pubctors" class="responsive constructors">
      +<tr><th colspan="2"><h3>Public constructors</h3></th></tr>
       <?cs call:write_method_summary(class.ctors.public, 1) ?>
       </table>
       <?cs /if ?>
      @@ -446,7 +479,8 @@
       <?cs if:subcount(class.ctors.protected) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ======== CONSTRUCTOR SUMMARY ======== -->
      -<table id="proctors" class="jd-sumtable"><tr><th colspan="12">Protected Constructors</th></tr>
      +<table id="proctors" class="responsive constructors">
      +<tr><th colspan="2"><h3>Protected constructors</h3></th></tr>
       <?cs call:write_method_summary(class.ctors.protected, 1) ?>
       </table>
       <?cs /if ?>
      @@ -454,7 +488,8 @@
       <?cs if:subcount(class.methods.public) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========== METHOD SUMMARY =========== -->
      -<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
      +<table id="pubmethods" class="responsive methods">
      +<tr><th colspan="2"><h3>Public methods</h3></th></tr>
       <?cs call:write_method_summary(class.methods.public, 1) ?>
       </table>
       <?cs /if ?>
      @@ -462,7 +497,8 @@
       <?cs if:subcount(class.methods.protected) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========== METHOD SUMMARY =========== -->
      -<table id="promethods" class="jd-sumtable"><tr><th colspan="12">Protected Methods</th></tr>
      +<table id="promethods" class="reponsive methods">
      +<tr><th colspan="2"><h3>Protected methods</h3></th></tr>
       <?cs call:write_method_summary(class.methods.protected, 1) ?>
       </table>
       <?cs /if ?>
      @@ -471,28 +507,31 @@
       <?cs if:inhmethods ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========== METHOD SUMMARY =========== -->
      -<table id="inhmethods" class="jd-sumtable"><tr><th>
      -  <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
      -  <div style="clear:left;">Inherited Methods</div></th></tr>
      +<table id="inhmethods" class="methods inhtable">
      +<tr><th><h3>Inherited methods</h3></th></tr>
       <?cs each:cl=class.inherited ?>
       <?cs if:subcount(cl.methods) ?>
       <tr class="api apilevel-<?cs var:cl.since ?>" >
      -<td colspan="12"><?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?>
      -From <?cs var:cl.kind ?>
      -<?cs if:cl.included ?>
      -  <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      -<?cs elif:cl.federated ?>
      -  <a href="<?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      -<?cs else ?>
      -  <?cs var:cl.qualified ?>
      -<?cs /if ?>
      +<td colspan="2">
      +<?cs call:expando_trigger("inherited-methods-"+cl.qualified, "closed") ?>From
      +<?cs var:cl.kind ?>
      +<code>
      +  <?cs if:cl.included ?>
      +    <a href="<?cs var:toroot ?><?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      +  <?cs elif:cl.federated ?>
      +    <a href="<?cs var:cl.link ?>"><?cs var:cl.qualified ?></a>
      +  <?cs else ?>
      +    <?cs var:cl.qualified ?>
      +  <?cs /if ?>
      +</code>
       <div id="inherited-methods-<?cs var:cl.qualified ?>">
         <div id="inherited-methods-<?cs var:cl.qualified ?>-list"
               class="jd-inheritedlinks">
         </div>
         <div id="inherited-methods-<?cs var:cl.qualified ?>-summary" style="display: none;">
      -    <table class="jd-sumtable-expando">
      -    <?cs call:write_method_summary(cl.methods, cl.included) ?></table>
      +    <table class="jd-sumtable-expando responsive">
      +      <?cs call:write_method_summary(cl.methods, cl.included) ?>
      +    </table>
         </div>
       </div>
       </td></tr>
      @@ -501,111 +540,16 @@
       </table>
       <?cs /if ?>
       <?cs /if ?>
      -</div><!-- jd-descr (summary) -->
      -
      -<!-- Details -->
      -
      -<?cs def:write_field_details(fields) ?>
      -<?cs each:field=fields ?>
      -<?cs # this next line must be exactly like this to be parsed by eclipse ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:field.anchor ?>"></A>
      -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -<div class="jd-details api apilevel-<?cs var:field.since ?>"> 
      -    <h4 class="jd-details-title">
      -      <span class="normal">
      -        <?cs var:field.scope ?> 
      -        <?cs var:field.static ?> 
      -        <?cs var:field.final ?> 
      -        <?cs call:type_link(field.type) ?>
      -      </span>
      -        <?cs var:field.name ?>
      -    </h4>
      -      <div class="api-level">
      -        <?cs call:since_tags(field) ?>
      -        <?cs call:federated_refs(field) ?>
      -      </div>
      -    <div class="jd-details-descr">
      -      <?cs call:show_annotations_list(field) ?>
      -      <?cs call:description(field) ?>
      -    <?cs if:subcount(field.constantValue) ?>
      -        <div class="jd-tagdata">
      -        <span class="jd-tagtitle">Constant Value: </span>
      -        <span>
      -            <?cs if:field.constantValue.isString ?>
      -                <?cs var:field.constantValue.str ?>
      -            <?cs else ?>
      -                <?cs var:field.constantValue.dec ?>
      -                (<?cs var:field.constantValue.hex ?>)
      -            <?cs /if ?>
      -        </span>
      -        </div>
      -    <?cs /if ?>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_method_details(methods) ?>
      -<?cs each:method=methods ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:method.anchor ?>"></A>
      -<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
      -<div class="jd-details api apilevel-<?cs var:method.since ?>"> 
      -    <h4 class="jd-details-title">
      -      <span class="normal">
      -        <?cs var:method.scope ?>
      -        <?cs var:method.abstract ?>
      -        <?cs var:method.default ?>
      -        <?cs var:method.static ?>
      -        <?cs var:method.final ?>
      -        <?cs call:type_link(method.returnType) ?>
      -      </span>
      -      <span class="sympad"><?cs var:method.name ?></span>
      -      <span class="normal">(<?cs call:parameter_list(method.params) ?>)</span>
      -    </h4>
      -      <div class="api-level">
      -        <div><?cs call:since_tags(method) ?></div>
      -        <?cs call:federated_refs(method) ?>
      -      </div>
      -    <div class="jd-details-descr">
      -      <?cs call:show_annotations_list(method) ?>
      -      <?cs call:description(method) ?>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -<?cs def:write_attr_details(attrs) ?>
      -<?cs each:attr=attrs ?>
      -<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
      -<A NAME="<?cs var:attr.anchor ?>"></A>
      -<div class="jd-details"> 
      -    <h4 class="jd-details-title"><?cs var:attr.name ?>
      -    </h4>
      -    <div class="jd-details-descr">
      -        <?cs call:show_annotations_list(attr) ?>
      -        <?cs call:description(attr) ?>
      -
      -        <div class="jd-tagdata">
      -            <h5 class="jd-tagtitle">Related Methods</h5>
      -            <ul class="nolist">
      -            <?cs each:m=attr.methods ?>
      -                <li><a href="<?cs var:toroot ?><?cs var:m.href ?>"><?cs var:m.name ?></a></li>
      -            <?cs /each ?>
      -            </ul>
      -        </div>
      -    </div>
      -</div>
      -<?cs /each ?>
      -<?cs /def ?>
      -
      -
      +<?cs
      +################
      +# CLASS DETAILS
      +################
      +?>
       <!-- XML Attributes -->
       <?cs if:subcount(class.attrs) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= FIELD DETAIL ======== -->
      -<h2>XML Attributes</h2>
      +<h2 class="api-section">XML attributes</h2>
       <?cs call:write_attr_details(class.attrs) ?>
       <?cs /if ?>
       
      @@ -613,7 +557,7 @@
       <?cs if:subcount(class.enumConstants) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= ENUM CONSTANTS DETAIL ======== -->
      -<h2>Enum Values</h2>
      +<h2 class="api-section">Enum values</h2>
       <?cs call:write_field_details(class.enumConstants) ?>
       <?cs /if ?>
       
      @@ -621,7 +565,7 @@
       <?cs if:subcount(class.constants) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= ENUM CONSTANTS DETAIL ======== -->
      -<h2>Constants</h2>
      +<h2 class="api-section">Constants</h2>
       <?cs call:write_field_details(class.constants) ?>
       <?cs /if ?>
       
      @@ -629,7 +573,7 @@
       <?cs if:subcount(class.fields) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= FIELD DETAIL ======== -->
      -<h2>Fields</h2>
      +<h2 class="api-section">Fields</h2>
       <?cs call:write_field_details(class.fields) ?>
       <?cs /if ?>
       
      @@ -637,7 +581,7 @@
       <?cs if:subcount(class.ctors.public) ?>
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= CONSTRUCTOR DETAIL ======== -->
      -<h2>Public Constructors</h2>
      +<h2 class="api-section">Public constructors</h2>
       <?cs call:write_method_details(class.ctors.public) ?>
       <?cs /if ?>
       
      @@ -645,7 +589,7 @@
       <!-- ========= CONSTRUCTOR DETAIL ======== -->
       <!-- Protected ctors -->
       <?cs if:subcount(class.ctors.protected) ?>
      -<h2>Protected Constructors</h2>
      +<h2 class="api-section">Protected constructors</h2>
       <?cs call:write_method_details(class.ctors.protected) ?>
       <?cs /if ?>
       
      @@ -653,26 +597,50 @@
       <!-- ========= METHOD DETAIL ======== -->
       <!-- Public methdos -->
       <?cs if:subcount(class.methods.public) ?>
      -<h2>Public Methods</h2>
      +<h2 class="api-section">Public methods</h2>
       <?cs call:write_method_details(class.methods.public) ?>
       <?cs /if ?>
       
       <?cs # this next line must be exactly like this to be parsed by eclipse ?>
       <!-- ========= METHOD DETAIL ======== -->
       <?cs if:subcount(class.methods.protected) ?>
      -<h2>Protected Methods</h2>
      +<h2 class="api-section">Protected methods</h2>
       <?cs call:write_method_details(class.methods.protected) ?>
       <?cs /if ?>
       
       <?cs # the next two lines must be exactly like this to be parsed by eclipse ?>
       <!-- ========= END OF CLASS DATA ========= -->
      -<A NAME="navbar_top"></A>
      -</div> <!-- jd-content -->
       
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      +</div><!-- end jd-content -->
      +
      +<?cs if:devsite ?>
      +
      +<div class="data-reference-resources-wrapper">
      +  <?cs if:subcount(class.package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:list("Annotations", class.package.annotations) ?>
      +    <?cs call:list("Interfaces", class.package.interfaces) ?>
      +    <?cs call:list("Classes", class.package.classes) ?>
      +    <?cs call:list("Enums", class.package.enums) ?>
      +    <?cs call:list("Exceptions", class.package.exceptions) ?>
      +    <?cs call:list("Errors", class.package.errors) ?>
      +  </ul>
      +  <?cs elif:subcount(package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:class_link_list("Annotations", package.annotations) ?>
      +    <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      +    <?cs call:class_link_list("Classes", package.classes) ?>
      +    <?cs call:class_link_list("Enums", package.enums) ?>
      +    <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      +    <?cs call:class_link_list("Errors", package.errors) ?>
      +  </ul>
      +  <?cs /if ?>
      +</div>
      +<?cs /if ?>
       
      +<?cs if:!devsite ?>
      +<?cs include:"footer.cs" ?>
       <?cs include:"trailer.cs" ?>
      -
      +<?cs /if ?>
       </body>
       </html>
      diff --git a/tools/droiddoc/templates-sdk/classes.cs b/tools/droiddoc/templates-sdk/classes.cs
      index 32966a0fe4e..007b57ee43e 100644
      --- a/tools/droiddoc/templates-sdk/classes.cs
      +++ b/tools/droiddoc/templates-sdk/classes.cs
      @@ -1,34 +1,27 @@
      -<?cs include:"doctype.cs" ?>
      +<?cs # THIS CREATES A LIST OF ALL PACKAGES AND NAMES IT packages.html ?>
       <?cs include:"macros.cs" ?>
       <?cs include:"macros_override.cs" ?>
      +<?cs include:"doctype.cs" ?>
       <html<?cs if:devsite ?> devsite<?cs /if ?>>
       <?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/Article">
      -  <a name="top"></a>
      +<?cs include:"body_tag.cs" ?>
       <?cs include:"header.cs" ?>
       
      -<div class="col-12" id="doc-col">
      -
      -<div id="jd-header">
       <h1><?cs var:page.title ?></h1>
      -</div>
      +<p>These are the API classes. See all
      +<a href="packages.html">API packages</a>.</p>
       
      -<div id="jd-content">
      -<p>These are the Android API classes. See all <a href="packages.html">API packages</a>.</p>
      -<div class="jd-letterlist"><?cs each:letter=docs.classes ?>
      -    <a href="#letter_<?cs name:letter ?>"><?cs name:letter ?></a>&nbsp;&nbsp;<?cs /each?>
      +<div class="jd-letterlist"><?cs
      +  each:letter=docs.classes ?>
      +    <a href="#letter_<?cs name:letter ?>"><?cs
      +      name:letter ?></a>&nbsp;&nbsp;<?cs
      +  /each?>
       </div>
       
       <?cs each:letter=docs.classes ?>
       <?cs set:count = #1 ?>
       <h2 id="letter_<?cs name:letter ?>"><?cs name:letter ?></h2>
      -<table class="jd-sumtable">
      +<table>
           <?cs set:cur_row = #0 ?>
           <?cs each:cl = letter ?>
               <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.since ?>" >
      @@ -43,12 +36,34 @@
       </table>
       <?cs /each ?>
       
      -</div><!-- end jd-content -->
      +<?cs if:devsite ?>
      +<div class="data-reference-resources-wrapper">
      +  <?cs if:subcount(class.package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:list("Annotations", class.package.annotations) ?>
      +    <?cs call:list("Interfaces", class.package.interfaces) ?>
      +    <?cs call:list("Classes", class.package.classes) ?>
      +    <?cs call:list("Enums", class.package.enums) ?>
      +    <?cs call:list("Exceptions", class.package.exceptions) ?>
      +    <?cs call:list("Errors", class.package.errors) ?>
      +  </ul>
      +  <?cs elif:subcount(package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:class_link_list("Annotations", package.annotations) ?>
      +    <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      +    <?cs call:class_link_list("Classes", package.classes) ?>
      +    <?cs call:class_link_list("Enums", package.enums) ?>
      +    <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      +    <?cs call:class_link_list("Errors", package.errors) ?>
      +  </ul>
      +  <?cs /if ?>
      +</div>
      +<?cs /if ?>
       
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
       
      +<?cs if:!devsite ?>
      +<?cs include:"footer.cs" ?>
       <?cs include:"trailer.cs" ?>
      -
      +<?cs /if ?>
       </body>
       </html>
      diff --git a/tools/droiddoc/templates-sdk/components/masthead.cs b/tools/droiddoc/templates-sdk/components/masthead.cs
      index e17612d908f..1fef96594a9 100644
      --- a/tools/droiddoc/templates-sdk/components/masthead.cs
      +++ b/tools/droiddoc/templates-sdk/components/masthead.cs
      @@ -1,55 +1,8 @@
       <?cs def:custom_masthead() ?>
      -<a name="top"></a>
      -
      -<!-- dialog to prompt lang pref change when loaded from hardcoded URL
      -<div id="langMessage" style="display:none">
      -  <div>
      -    <div class="lang en">
      -      <p>You requested a page in English, would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang es">
      -      <p>You requested a page in Spanish (Español), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ja">
      -      <p>You requested a page in Japanese (日本語), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ko">
      -      <p>You requested a page in Korean (한국어), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang ru">
      -      <p>You requested a page in Russian (Русский), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang zh-cn">
      -      <p>You requested a page in Simplified Chinese (简体中文), would you like to proceed with this language setting?</p>
      -    </div>
      -    <div class="lang zh-tw">
      -      <p>You requested a page in Traditional Chinese (繁體中文), would you like to proceed with this language setting?</p>
      -    </div>
      -    <a href="#" class="button yes" onclick="return false;">
      -      <span class="lang en">Yes</span>
      -      <span class="lang es">Sí</span>
      -      <span class="lang ja">Yes</span>
      -      <span class="lang ko">Yes</span>
      -      <span class="lang ru">Yes</span>
      -      <span class="lang zh-cn">是的</span>
      -      <span class="lang zh-tw">没有</span>
      -    </a>
      -    <a href="#" class="button" onclick="$('#langMessage').hide();return false;">
      -      <span class="lang en">No</span>
      -      <span class="lang es">No</span>
      -      <span class="lang ja">No</span>
      -      <span class="lang ko">No</span>
      -      <span class="lang ru">No</span>
      -      <span class="lang zh-cn">没有</span>
      -      <span class="lang zh-tw">没有</span>
      -    </a>
      -  </div>
      -</div> -->
      -
      -<?cs if:!devsite ?><?cs # leave out the global header for devsite; it is in devsite template ?>
      +  <a name="top"></a>
         <!-- Header -->
         <div id="header-wrapper">
      -    <div class="dac-header" id="header"><?cs call:butter_bar() ?>
      +    <div class="dac-header <?cs if:ndk ?>dac-ndk<?cs /if ?>" id="header">
             <div class="dac-header-inner">
               <a class="dac-nav-toggle" data-dac-toggle-nav href="javascript:;" title="Open navigation">
                 <span class="dac-nav-hamburger">
      @@ -58,9 +11,10 @@
                   <span class="dac-nav-hamburger-bot"></span>
                 </span>
               </a>
      -        <?cs if:ndk ?><a class="dac-header-logo" href="<?cs var:toroot ?>ndk/index.html">
      -          <img class="dac-header-logo-image" src="<?cs var:toroot ?>assets/images/android_logo_ndk.png"
      -              srcset="<?cs var:toroot ?>assets/images/android_logo_ndk@2x.png 2x"
      +        <?cs if:ndk ?><a class="dac-header-logo" style="width:144px;" href="<?cs var:toroot
      +        ?>ndk/index.html">
      +          <img class="dac-header-logo-image" src="<?cs var:toroot ?>assets/images/android_logo.png"
      +              srcset="<?cs var:toroot ?>assets/images/android_logo@2x.png 2x"
                     width="32" height="36" alt="Android" /> NDK
                 </a><?cs else ?><a class="dac-header-logo" href="<?cs var:toroot ?>index.html">
                 <img class="dac-header-logo-image" src="<?cs var:toroot ?>assets/images/android_logo.png"
      @@ -68,33 +22,107 @@
                     width="32" height="36" alt="Android" /> Developers
                 </a><?cs /if ?>
       
      -        <ul class="dac-header-crumbs">
      -          <?cs # More <li> elements added here with javascript ?>
      -          <?cs if:!section.landing ?><li class="dac-header-crumbs-item"><span class="dac-header-crumbs-link current <?cs
      -            if:ndk ?>ndk<?cs /if ?>"><?cs var:page.title ?></a></li><?cs
      -          /if ?>
      -        </ul>
      -
      -        <?cs # ADD SEARCH AND MENU ?>
      -        <?cs if:!ndk ?>
      -        <?cs call:header_search_widget() ?>
      -        <?cs /if ?>
      +        <?cs if:ndk
      +        ?><ul class="dac-header-tabs">
      +          <li>
      +            <a href="<?cs var:toroot ?>ndk/guides/index.html" class="dac-header-tab"
      +            zh-tw-lang="API 指南"
      +            zh-cn-lang="API 指南"
      +            ru-lang="Руководства по API"
      +            ko-lang="API 가이드"
      +            ja-lang="API ガイド"
      +            es-lang="Guías de la API">Guides</a>
      +          </li>
      +          <li>
      +            <a href="<?cs var:toroot ?>ndk/reference/index.html" class="dac-header-tab"
      +            zh-tw-lang="參考資源"
      +            zh-cn-lang="参考"
      +            ru-lang="Справочник"
      +            ko-lang="참조문서"
      +            ja-lang="リファレンス"
      +            es-lang="Referencia">Reference</a>
      +          </li>
      +          <li>
      +            <a href="<?cs var:toroot ?>ndk/samples/index.html" class="dac-header-tab"
      +           >Samples</a>
      +          </li>
      +          <li>
      +            <a href="<?cs var:toroot ?>ndk/downloads/index.html" class="dac-header-tab"
      +            >Downloads</a>
      +          </li>
      +        </ul><?cs else
      +        ?><?cs
      +        #
      +        # For the reference only docs, include just one tab
      +        #
      +        ?><?cs if:referenceonly
      +          ?><ul class="dac-header-tabs">
      +            <li><a href="<?cs var:toroot ?>reference/packages.html" class="dac-header-tab"><?cs
      +              if:sdk.preview
      +                ?>Android <?cs var:sdk.codename ?>
      +                  Preview <?cs var:sdk.preview.version ?><?cs
      +              else
      +                ?>Android <?cs var:sdk.version ?>
      +                  r<?cs var:sdk.rel.id ?><?cs
      +              /if ?></a>
      +            </li>
      +          </ul>
      +        <?cs else ?><?cs
      +        #
      +        # End reference only docs, now the online DAC tabs...
      +        #
      +        ?><ul class="dac-header-tabs">
      +          <li>
      +          <a class="dac-header-tab" href="<?cs var:toroot ?>design/index.html"
      +             zh-tw-lang="設計"
      +             zh-cn-lang="设计"
      +             ru-lang="Проектирование"
      +             ko-lang="디자인"
      +             ja-lang="設計"
      +             es-lang="Diseñar">Design</a>
      +          </li>
      +          <li>
      +          <a class="dac-header-tab" href="<?cs var:toroot ?>develop/index.html"
      +             zh-tw-lang="開發"
      +             zh-cn-lang="开发"
      +             ru-lang="Разработка"
      +             ko-lang="개발"
      +             ja-lang="開発"
      +             es-lang="Desarrollar">Develop</a>
      +          </li>
      +          <li>
      +          <a class="dac-header-tab" href="<?cs var:toroot ?>distribute/index.html"
      +             zh-tw-lang="發佈"
      +             zh-cn-lang="分发"
      +             ru-lang="Распространение"
      +             ko-lang="배포"
      +             ja-lang="配布"
      +             es-lang="Distribuir">Distribute</a>
      +          </li>
      +        </ul><?cs
      +        /if ?><?cs
      +        #
      +        # End if/else reference only docs
      +        #
      +        ?><?cs
      +        /if ?><?cs # end if/else ndk ?>
       
      -        <?cs if:ndk ?><a class="dac-header-console-btn" href="//developer.android.com">
      -          <span class="dac-visible-desktop-inline">Back to Android Developers</span>
      +        <?cs if:ndk ?><a class="dac-header-console-btn" href="http://developer.android.com">
      +          Back to Android Developers
               </a><?cs else ?><a class="dac-header-console-btn" href="https://play.google.com/apps/publish/">
                 <span class="dac-sprite dac-google-play"></span>
                 <span class="dac-visible-desktop-inline">Developer</span>
                 Console
      -        </a><?cs /if ?>
      +        </a><?cs /if ?><?cs
       
      +        # ADD SEARCH AND MENU ?><?cs
      +        if:!ndk ?><?cs
      +          if:!referenceonly ?><?cs
      +            call:header_search_widget() ?><?cs
      +          /if ?><?cs
      +        /if ?>
             </div><!-- end header-wrap.wrap -->
           </div><!-- end header -->
      -
      -    <div id="searchResults" class="wrap" style="display:none;">
      -      <h2 id="searchTitle">Results</h2>
      -      <div id="leftSearchControl" class="search-control">Loading...</div>
      -    </div>
         </div> <!--end header-wrapper -->
       
         <?cs if:ndk ?>
      @@ -102,14 +130,10 @@
         <nav class="dac-nav">
           <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
       
      -    <ul class="dac-nav-list" data-dac-nav>
      -      <li class="dac-nav-item dac-nav-head">
      -        <a class="dac-nav-link dac-nav-logo" data-dac-toggle-nav href="javascript:;" title="Close navigation">
      -          <img class="dac-logo-image" src="<?cs var:toroot ?>assets/images/android_logo_ndk.png"
      -               srcset="<?cs var:toroot ?>assets/images/android_logo_ndk@2x.png 2x"
      -               width="32" height="36" alt="Android" /> NDK
      -        </a>
      -      </li>
      +    <div class="dac-nav-sidebar" data-swap data-dynamic="false" data-transition-speed="300" data-dac-nav>
      +                   <div data-swap-container>
      +        <?cs call:custom_left_nav() ?>
      +      <ul id="dac-main-navigation" class="dac-nav-list dac-swap-section dac-left dac-no-anim">
             <li class="dac-nav-item guides">
               <a class="dac-nav-link" href="<?cs var:toroot ?>ndk/guides/index.html"
                  zh-tw-lang="API 指南"
      @@ -136,185 +160,163 @@
               <a class="dac-nav-link" href="<?cs var:toroot ?>ndk/downloads/index.html"
                  >Downloads</a>
             </li>
      -    </ul>
      +      </ul>
      +    </div>
      +                       </div>
         </nav>
         <!-- end NDK navigation-->
      +
      +
      +
         <?cs else ?>
      -  <!-- Standard DAC Navigation-->
      +  <!-- Navigation-->
         <nav class="dac-nav">
           <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
       
      -    <ul class="dac-nav-list" data-dac-nav>
      -      <li class="dac-nav-item dac-nav-head">
      -        <a class="dac-nav-link dac-nav-logo" data-dac-toggle-nav href="javascript:;" title="Close navigation">
      -          <img class="dac-logo-image" src="<?cs var:toroot ?>assets/images/android_logo.png"
      -               srcset="<?cs var:toroot ?>assets/images/android_logo@2x.png 2x"
      -               width="32" height="36" alt="Android" /> Developers
      -        </a>
      -      </li><?cs
      -      #
      -      # For the reference only docs, include just one tab
      -      #
      -      ?><?cs if:referenceonly ?>
      -      <li class="dac-nav-item develop">
      -        <a class="dac-nav-link has-subnav" href="<?cs var:toroot ?>reference/packages.html" zh-tw-lang="參考資源"
      -        zh-cn-lang="参考" ru-lang="Справочник" ko-lang="참조문서" ja-lang="リファレンス"
      -        es-lang="Referencia">API Reference</a>
      -      <div class="dac-nav-secondary develop">
      -        <h1 style="font-size: 20px; line-height: 24px; margin: 20px; color:#444"
      -          ><?cs
      -          if:sdk.preview
      -            ?>Android <?cs var:sdk.codename ?>
      -              Preview <?cs var:sdk.preview.version ?><?cs
      -          else
      -            ?>Android <?cs var:sdk.version ?>
      -              r<?cs var:sdk.rel.id ?><?cs
      -          /if ?></h1>
      -      </div>
      -      </li>
      -      <?cs else ?><?cs
      -      #
      -      # End reference only docs, now the online DAC tabs...
      -      #
      -      ?><li class="dac-nav-item home">
      -        <a class="dac-nav-link dac-visible-mobile-block" href="<?cs var:toroot ?>index.html">Home</a>
      -        <ul class="dac-nav-secondary about">
      -          <li class="dac-nav-item about">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>about/index.html">Android</a>
      -          </li>
      -          <li class="dac-nav-item wear">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>wear/index.html">Wear</a>
      -          </li>
      -          <li class="dac-nav-item tv">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>tv/index.html">TV</a>
      -          </li>
      -          <li class="dac-nav-item auto">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>auto/index.html">Auto</a>
      -          </li>
      -        </ul>
      -      </li>
      -      <li class="dac-nav-item design">
      -        <a class="dac-nav-link" href="<?cs var:toroot ?>design/index.html"
      -           zh-tw-lang="設計"
      -           zh-cn-lang="设计"
      -           ru-lang="Проектирование"
      -           ko-lang="디자인"
      -           ja-lang="設計"
      -           es-lang="Diseñar">Design</a>
      -      </li>
      -      <li class="dac-nav-item develop">
      -        <a class="dac-nav-link" href="<?cs var:toroot ?>develop/index.html"
      -           zh-tw-lang="開發"
      -           zh-cn-lang="开发"
      -           ru-lang="Разработка"
      -           ko-lang="개발"
      -           ja-lang="開発"
      -           es-lang="Desarrollar">Develop</a>
      -        <ul class="dac-nav-secondary develop">
      -          <li class="dac-nav-item training">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>training/index.html"
      -               zh-tw-lang="訓練課程"
      -               zh-cn-lang="培训"
      -               ru-lang="Курсы"
      -               ko-lang="교육"
      -               ja-lang="トレーニング"
      -               es-lang="Capacitación">Training</a>
      -          </li>
      -          <li class="dac-nav-item guide">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>guide/index.html"
      -               zh-tw-lang="API 指南"
      -               zh-cn-lang="API 指南"
      -               ru-lang="Руководства по API"
      -               ko-lang="API 가이드"
      -               ja-lang="API ガイド"
      -               es-lang="Guías de la API">API Guides</a>
      -          </li>
      -          <li class="dac-nav-item reference">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>reference/packages.html"
      -               zh-tw-lang="參考資源"
      -               zh-cn-lang="参考"
      -               ru-lang="Справочник"
      -               ko-lang="참조문서"
      -               ja-lang="リファレンス"
      -               es-lang="Referencia">Reference</a>
      -          </li>
      -          <li class="dac-nav-item tools">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>sdk/index.html"
      -               zh-tw-lang="相關工具"
      -               zh-cn-lang="工具"
      -               ru-lang="Инструменты"
      -               ko-lang="도구"
      -               ja-lang="ツール"
      -               es-lang="Herramientas">Tools</a></li>
      -          <li class="dac-nav-item google">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>google/index.html">Google Services</a>
      -          </li>
      -          <?cs if:android.hasSamples ?>
      -          <li class="dac-nav-item samples">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>samples/index.html">Samples</a>
      -          </li><?cs /if ?>
      -          <li class="dac-nav-item preview">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>preview/index.html">Preview</a>
      -          </li>
      -        </ul>
      -      </li>
      -      <li class="dac-nav-item distribute">
      -        <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/<?cs if:android.whichdoc == 'offline' ?>googleplay/<?cs /if ?>index.html"
      -           zh-tw-lang="發佈"
      -           zh-cn-lang="分发"
      -           ru-lang="Распространение"
      -           ko-lang="배포"
      -           ja-lang="配布"
      -           es-lang="Distribuir">Distribute</a>
      -        <ul class="dac-nav-secondary distribute">
      -          <li class="dac-nav-item googleplay">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/googleplay/index.html">Google Play</a></li>
      -          <li class="dac-nav-item essentials">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/essentials/index.html">Essentials</a></li>
      -          <li class="dac-nav-item users">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/users/index.html">Get Users</a></li>
      -          <li class="dac-nav-item engage">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/engage/index.html">Engage &amp; Retain</a></li>
      -          <li class="dac-nav-item monetize">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/monetize/index.html">Earn</a>
      -          </li>
      -          <li class="dac-nav-item analyze">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/analyze/index.html">Analyze</a>
      -          </li>
      -          <li class="dac-nav-item stories">
      -            <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/stories/index.html">Stories</a>
      -          </li>
      +    <div class="dac-nav-sidebar" data-swap data-dynamic="false" data-transition-speed="300" data-dac-nav>
      +      <div <?cs if:!referenceonly ?>data-swap-container<?cs /if ?>>
      +        <?cs call:custom_left_nav() ?>
      +        <?cs if:!referenceonly ?>
      +        <ul id="dac-main-navigation" class="dac-nav-list dac-swap-section dac-left dac-no-anim">
      +        <li class="dac-nav-item home">
      +          <a class="dac-nav-link" href="<?cs var:toroot ?>index.html">Home</a>
      +          <i class="dac-sprite dac-expand-more-black dac-nav-sub-slider"></i>
      +          <ul class="dac-nav-secondary about">
      +            <li class="dac-nav-item versions">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>about/versions/nougat/index.html">Android</a>
      +            </li>
      +            <li class="dac-nav-item wear">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>wear/index.html">Wear</a>
      +            </li>
      +            <li class="dac-nav-item tv">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>tv/index.html">TV</a>
      +            </li>
      +            <li class="dac-nav-item auto">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>auto/index.html">Auto</a>
      +            </li>
      +          </ul>
      +        </li>
      +        <li class="dac-nav-item design">
      +          <a class="dac-nav-link" href="<?cs var:toroot ?>design/index.html"
      +             zh-tw-lang="設計"
      +             zh-cn-lang="设计"
      +             ru-lang="Проектирование"
      +             ko-lang="디자인"
      +             ja-lang="設計"
      +             es-lang="Diseñar">Design</a>
      +        </li>
      +        <li class="dac-nav-item develop">
      +          <a class="dac-nav-link" href="<?cs var:toroot ?>develop/index.html"
      +             zh-tw-lang="開發"
      +             zh-cn-lang="开发"
      +             ru-lang="Разработка"
      +             ko-lang="개발"
      +             ja-lang="開発"
      +             es-lang="Desarrollar">Develop</a>
      +          <i class="dac-sprite dac-expand-more-black dac-nav-sub-slider"></i>
      +          <ul class="dac-nav-secondary develop">
      +            <li class="dac-nav-item training">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>training/index.html"
      +                 zh-tw-lang="訓練課程"
      +                 zh-cn-lang="培训"
      +                 ru-lang="Курсы"
      +                 ko-lang="교육"
      +                 ja-lang="トレーニング"
      +                 es-lang="Capacitación">Training</a>
      +            </li>
      +            <li class="dac-nav-item guide">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>guide/index.html"
      +                 zh-tw-lang="API 指南"
      +                 zh-cn-lang="API 指南"
      +                 ru-lang="Руководства по API"
      +                 ko-lang="API 가이드"
      +                 ja-lang="API ガイド"
      +                 es-lang="Guías de la API">API Guides</a>
      +            </li>
      +            <li class="dac-nav-item reference">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>reference/packages.html"
      +                 zh-tw-lang="參考資源"
      +                 zh-cn-lang="参考"
      +                 ru-lang="Справочник"
      +                 ko-lang="참조문서"
      +                 ja-lang="リファレンス"
      +                 es-lang="Referencia">Reference</a>
      +            </li>
      +            <li class="dac-nav-item tools">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>sdk/index.html"
      +                 zh-tw-lang="相關工具"
      +                 zh-cn-lang="工具"
      +                 ru-lang="Инструменты"
      +                 ko-lang="도구"
      +                 ja-lang="ツール"
      +                 es-lang="Herramientas">Tools</a></li>
      +            <li class="dac-nav-item google">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>google/index.html">Google Services</a>
      +            </li>
      +            <?cs if:android.hasSamples ?>
      +            <li class="dac-nav-item samples">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>samples/index.html">Samples</a>
      +            </li>
      +            <?cs /if ?>
      +          </ul>
      +        </li>
      +        <li class="dac-nav-item distribute">
      +          <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/<?cs if:android.whichdoc == 'offline' ?>googleplay/<?cs /if ?>index.html"
      +             zh-tw-lang="發佈"
      +             zh-cn-lang="分发"
      +             ru-lang="Распространение"
      +             ko-lang="배포"
      +             ja-lang="配布"
      +             es-lang="Distribuir">Distribute</a>
      +          <i class="dac-sprite dac-expand-more-black dac-nav-sub-slider"></i>
      +          <ul class="dac-nav-secondary distribute">
      +            <li class="dac-nav-item googleplay">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/googleplay/index.html">Google Play</a></li>
      +            <li class="dac-nav-item essentials">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/essentials/index.html">Essentials</a></li>
      +            <li class="dac-nav-item users">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/users/index.html">Get Users</a></li>
      +            <li class="dac-nav-item engage">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/engage/index.html">Engage &amp; Retain</a></li>
      +            <li class="dac-nav-item monetize">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/monetize/index.html">Earn</a>
      +            </li>
      +            <li class="dac-nav-item analyze">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/analyze/index.html">Analyze</a>
      +            </li>
      +            <li class="dac-nav-item stories">
      +              <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/stories/index.html">Stories</a>
      +            </li>
      +          </ul>
      +        </li>
      +        <!--<li class="dac-nav-item preview">
      +          <a class="dac-nav-link" href="<?cs var:toroot ?>preview/index.html">Preview</a>
      +        </li>-->
               </ul>
      -      </li><?cs
      -      /if ?><?cs
      -      #
      -      # End if/else reference only docs
      -      #
      -      ?>
      -    </ul>
      +        <?cs /if ?><?cs # end if referenceonly ?>
      +      </div>
      +    </div>
         </nav>
         <!-- end navigation-->
         <?cs /if ?>
      -<?cs /if ?><?cs # end if/else !devsite ?>
       
      -<?cs
      -/def ?><?cs # end custom_masthead() ?>
      +<!-- Nav Setup -->
      +<script>$('[data-dac-nav]').dacNav();</script>
       
      +<?cs
      +/def ?><?cs # end custom_masthead() ?><?cs
       
      -<?cs # (UN)COMMENT THE INSIDE OF THIS METHOD TO TOGGLE VISIBILITY ?>
      -<?cs def:butter_bar() ?>
      +def:toast() ?><?cs
       
      -<?cs # HIDE THE BUTTER BAR
      +# (UN)COMMENT TO TOGGLE VISIBILITY
       
      -    <div style="height:20px"><!-- spacer to bump header down --></div>
      -    <div id="butterbar-wrapper">
      -      <div id="butterbar">
      -        <a href="//googleblog.blogspot.com/" id="butterbar-message">
      -          The Android 5.0 SDK will be available on October 17th!
      -        </a>
      +  <div class="dac-toast-group">
      +    <div class="dac-toast" data-toast>
      +      <div class="dac-toast-wrap">
      +        This is a demo notification <a href="#">Learn more</a>.
             </div>
           </div>
      +  </div>
       
      -?>
      -
      -<?cs /def ?>
      +?><?cs
      +/def ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/customizations.cs b/tools/droiddoc/templates-sdk/customizations.cs
      index 4cf5abb58e5..0b938ac5d14 100644
      --- a/tools/droiddoc/templates-sdk/customizations.cs
      +++ b/tools/droiddoc/templates-sdk/customizations.cs
      @@ -1,362 +1,33 @@
      -<?cs
      -def:mobile_nav_toggle() ?>
      -  <div class="dac-visible-mobile-block" data-toggle="section">
      -    <span class="dac-toggle-expand dac-devdoc-toggle"><i class="dac-sprite dac-expand-more-black"></i> Show navigation</span>
      -    <span class="dac-toggle-collapse dac-devdoc-toggle" data-toggle-section><i class="dac-sprite dac-expand-less-black"></i> Hide navigation</span>
      -  </div>
      +<?cs def:body_content_wrap_start() ?>
      +  <div class="wrap clearfix" id="body-content">
       <?cs /def ?><?cs
       
       def:fullpage() ?>
         <div id="body-content">
           <div>
      -<?cs /def ?>
      -<?cs
      -def:sdk_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -<?cs /def ?><?cs
      -
      -def:no_nav() ?>
      -  <div class="wrap clearfix" id="body-content">
      -    <div>
      -<?cs /def ?><?cs
      -
      -def:tools_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:training_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
       <?cs /def ?><?cs
       
      -def:googleplay_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      +# The default side navigation for the reference docs ?><?cs
      +def:reference_default_nav() ?>
      +  <!-- Fullscreen toggler -->
      +  <button data-fullscreen class="dac-nav-fullscreen">
      +    <i class="dac-sprite dac-fullscreen"></i>
      +  </button>
       
      -def:preview_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      +  <script>$('[data-fullscreen]').dacFullscreen();</script>
      +  <!-- End: Fullscreen toggler -->
       
      -def:essentials_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:users_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:engage_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:analyze_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:monetize_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:disttools_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:stories_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?><?cs
      -
      -def:guide_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:design_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -<?cs
      -def:distribute_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/distribute/distribute_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:samples_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?>
      -        </div>
      -      </div>
      -
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:google_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
      -        </div>
      -      </div>
      -      <script type="text/javascript">
      -       showGoogleRefTree();
      -
      -      </script>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -<?cs
      -def:about_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      -
      -
      -<?cs
      -def:wear_nav() ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <?cs call:mobile_nav_toggle() ?>
      -      <div class="dac-toggle-content" id="devdoc-nav">
      -        <div class="scroll-pane">
      -<?cs include:"../../../../frameworks/base/docs/html/wear/wear_toc.cs" ?>
      -        </div>
      -      </div>
      -    </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      +  <?cs if:reference.gcm || reference.gms ?>
      +    <?cs include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
      +    <script type="text/javascript">
      +      showGoogleRefTree();
           </script>
      -<?cs /def ?>
      -
      -
      -<?cs # The default side navigation for the reference docs ?><?cs
      -def:default_left_nav() ?>
      -<?cs if:reference.gcm || reference.gms ?>
      -  <?cs call:google_nav() ?>
      -<?cs else ?>
      -  <div class="wrap clearfix" id="body-content"><div class="cols">
      -    <div class="col-4 dac-hidden-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -      <div id="devdoc-nav">
      +  <?cs else ?>
      +    <div id="devdoc-nav">
             <div id="api-nav-header">
               <div id="api-level-toggle">
                 <label for="apiLevelCheckbox" class="disabled"
      -            title="Select your target API level to dim unavailable APIs">API level: </label>
      +                 title="Select your target API level to dim unavailable APIs">API level: </label>
                 <div class="select-wrapper">
                   <select id="apiLevelSelector">
                     <!-- option elements added by buildApiLevelSelector() -->
      @@ -364,98 +35,46 @@
                 </div>
               </div><!-- end toggle -->
               <div id="api-nav-title">Android APIs</div>
      -        </div><!-- end nav header -->
      +      </div><!-- end nav header -->
             <script>
               var SINCE_DATA = [ <?cs
                 each:since = since ?>'<?cs
                   var:since.name ?>'<?cs
                   if:!last(since) ?>, <?cs /if ?><?cs
      -          /each
      -        ?> ];
      +            /each
      +          ?> ];
               buildApiLevelSelector();
             </script>
       
      -      <div id="swapper">
      -        <div id="nav-panels">
      -          <div id="resize-packages-nav">
      -            <div id="packages-nav" class="scroll-pane">
      -
      -              <ul>
      -                <?cs call:package_link_list(docs.packages) ?>
      -              </ul><br/>
      -
      -            </div> <!-- end packages-nav -->
      -          </div> <!-- end resize-packages -->
      -          <div id="classes-nav" class="scroll-pane">
      -
      -
      -<?cs
      -            if:subcount(class.package) ?>
      -            <ul>
      -              <?cs call:list("Annotations", class.package.annotations) ?>
      -              <?cs call:list("Interfaces", class.package.interfaces) ?>
      -              <?cs call:list("Classes", class.package.classes) ?>
      -              <?cs call:list("Enums", class.package.enums) ?>
      -              <?cs call:list("Exceptions", class.package.exceptions) ?>
      -              <?cs call:list("Errors", class.package.errors) ?>
      -            </ul><?cs
      -            elif:subcount(package) ?>
      -            <ul>
      -              <?cs call:class_link_list("Annotations", package.annotations) ?>
      -              <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      -              <?cs call:class_link_list("Classes", package.classes) ?>
      -              <?cs call:class_link_list("Enums", package.enums) ?>
      -              <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      -              <?cs call:class_link_list("Errors", package.errors) ?>
      -            </ul><?cs
      -            else ?>
      -              <p style="padding:10px">Select a package to view its members</p><?cs
      -            /if ?><br/>
      -
      -
      -          </div><!-- end classes -->
      -        </div><!-- end nav-panels -->
      -        <div id="nav-tree" style="display:none" class="scroll-pane">
      -          <div id="tree-list"></div>
      -        </div><!-- end nav-tree -->
      -      </div><!-- end swapper -->
      -      <div id="nav-swap">
      -      <a class="fullscreen">fullscreen</a>
      -      <a href='#' onclick='swapNav();return false;'><span id='tree-link'>Use Tree Navigation</span><span id='panel-link' style='display:none'>Use Panel Navigation</span></a>
      +      <div class="dac-reference-nav" data-reference-tree>
      +        <ul class="dac-reference-nav-list" data-reference-namespaces>
      +          <?cs call:package_link_list(docs.packages) ?>
      +        </ul>
      +
      +        <?cs if:subcount(class.package) ?>
      +        <ul data-reference-resources>
      +          <?cs call:list("Annotations", class.package.annotations) ?>
      +          <?cs call:list("Interfaces", class.package.interfaces) ?>
      +          <?cs call:list("Classes", class.package.classes) ?>
      +          <?cs call:list("Enums", class.package.enums) ?>
      +          <?cs call:list("Exceptions", class.package.exceptions) ?>
      +          <?cs call:list("Errors", class.package.errors) ?>
      +        </ul>
      +        <?cs elif:subcount(package) ?>
      +        <ul data-reference-resources>
      +          <?cs call:class_link_list("Annotations", package.annotations) ?>
      +          <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      +          <?cs call:class_link_list("Classes", package.classes) ?>
      +          <?cs call:class_link_list("Enums", package.enums) ?>
      +          <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      +          <?cs call:class_link_list("Errors", package.errors) ?>
      +        </ul>
      +        <?cs /if ?>
             </div>
      -    </div> <!-- end devdoc-nav -->
      -    </div> <!-- end side-nav -->
      -    <script type="text/javascript">
      -      // init fullscreen based on user pref
      -      var fullscreen = readCookie("fullscreen");
      -      if (fullscreen != 0) {
      -        if (fullscreen == "false") {
      -          toggleFullscreen(false);
      -        } else {
      -          toggleFullscreen(true);
      -        }
      -      }
      -      // init nav version for mobile
      -      if (isMobile) {
      -        swapNav(); // tree view should be used on mobile
      -        $('#nav-swap').hide();
      -      } else {
      -        chooseDefaultNav();
      -        if ($("#nav-tree").is(':visible')) {
      -          init_default_navtree("<?cs var:toroot ?>");
      -        }
      -      }
      -      // scroll the selected page into view
      -      $(document).ready(function() {
      -        scrollIntoView("packages-nav");
      -        scrollIntoView("classes-nav");
      -        });
      -    </script>
      -<?cs /if ?>
      -    <?cs
      -/def ?>
      +    </div>
      +  <?cs /if ?>
      +<?cs /def ?><?cs
       
      -<?cs
       def:ndk_nav() ?>
         <div class="wrap clearfix" id="body-content"><div class="cols">
           <div class="col-3 dac-toggle dac-mobile" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
      @@ -471,150 +90,159 @@
               </div>
             </div>
           </div> <!-- end side-nav -->
      -    <script>
      -      $(document).ready(function() {
      -        scrollIntoView("devdoc-nav");
      -        });
      -    </script>
      -<?cs /def ?>
      +<?cs /def ?><?cs
       
      -<?cs
       def:header_search_widget() ?>
      -  <div class="dac-header-search" id="search-container">
      -    <div class="dac-header-search-inner">
      -      <div class="dac-sprite dac-search dac-header-search-btn" id="search-btn"></div>
      -      <form class="dac-header-search-form" onsubmit="return submit_search()">
      -        <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
      -          onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
      -          onkeydown="return search_changed(event, true, '<?cs var:toroot ?>')"
      -          onkeyup="return search_changed(event, false, '<?cs var:toroot ?>')"
      -          class="dac-header-search-input" placeholder="Search" />
      -          <a class="dac-header-search-close hide" id="search-close">close</a>
      -      </form>
      -    </div><!-- end dac-header-search-inner -->
      -  </div><!-- end dac-header-search -->
      +  <form data-search class="dac-header-search">
      +    <button class="dac-header-search-close" data-search-close>
      +      <i class="dac-sprite dac-back-arrow"></i>
      +    </button>
       
      -  <div class="search_filtered_wrapper">
      -    <div class="suggest-card reference no-display">
      -      <ul class="search_filtered">
      -      </ul>
      +    <div class="dac-header-search-inner">
      +      <i class="dac-sprite dac-search-white dac-header-search-icon"></i>
      +      <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q" class="dac-header-search-input" placeholder="Search" />
      +      <button class="dac-header-search-clear dac-hidden" data-search-clear>
      +        <i class="dac-sprite dac-close-black"></i>
      +      </button>
           </div>
      -    <div class="suggest-card develop no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -      <div class="child-card guides no-display">
      -      </div>
      -      <div class="child-card training no-display">
      -      </div>
      -      <div class="child-card samples no-display">
      +  </form>
      +<?cs /def ?><?cs
      +
      +def:search_results() ?>
      +  <div id="search-results" class="dac-search-results">
      +    <div id="dac-search-results-history" class="dac-search-results-history">
      +      <div class="wrap dac-search-results-history-wrap">
      +        <div class="cols">
      +          <div class="col-1of2 col-tablet-1of2 col-mobile-1of1">
      +            <h2>Most visited</h2>
      +            <div class="resource-flow-layout" data-history-query="history:most/visited" data-maxresults="3" data-cardsizes="18x2"></div>
      +          </div>
      +
      +          <div class="col-1of2 col-tablet-1of2 col-mobile-1of1">
      +            <h2>Recently visited</h2>
      +            <div class="resource-flow-layout cols" data-history-query="history:recent" data-allow-duplicates="true" data-maxresults="3" data-cardsizes="18x2"></div>
      +          </div>
      +        </div>
             </div>
           </div>
      -    <div class="suggest-card design no-display">
      -      <ul class="search_filtered">
      -      </ul>
      -    </div>
      -    <div class="suggest-card distribute no-display">
      -      <ul class="search_filtered">
      -      </ul>
      +
      +    <div id="dac-search-results-content" class="dac-search-results-content">
      +      <div class="dac-search-results-metadata wrap">
      +        <div class="dac-search-results-for">
      +          <h2>Results for <span id="search-results-for"></span></h2>
      +        </div>
      +
      +        <div id="dac-search-results-hero"></div>
      +
      +        <div class="dac-search-results-hero cols">
      +          <div id="dac-search-results-reference" class="col-3of6 col-tablet-1of2 col-mobile-1of1">
      +            <div class="suggest-card reference no-display">
      +              <ul class="dac-search-results-reference">
      +              </ul>
      +            </div>
      +          </div>
      +          <div id="dac-custom-search-results"></div>
      +        </div>
      +      </div>
      +
           </div>
         </div>
      -<?cs /def ?>
      -
      +<?cs /def ?><?cs
       
      -<?cs
      -def:custom_left_nav() ?><?cs
      -  if:ndk ?><?cs
      -    if:fullpage ?><?cs
      -      call:fullpage() ?><?cs
      -    elif:nonavpage ?><?cs
      -      call:no_nav() ?><?cs
      -    elif:guide || reference || samples || downloads ?><?cs
      -      call:ndk_nav() ?><?cs
      -    else ?><?cs
      -      call:default_left_nav() ?> <?cs
      -    /if ?><?cs
      -  else ?><?cs
      -    if:fullpage ?><?cs
      -      call:fullpage() ?><?cs
      -    elif:nonavpage ?><?cs
      -      call:no_nav() ?><?cs
      -    elif:guide ?><?cs
      -      call:guide_nav() ?><?cs
      -    elif:design ?><?cs
      -      call:design_nav() ?><?cs
      -    elif:training ?><?cs
      -      call:training_nav() ?><?cs
      -    elif:tools ?><?cs
      -      call:tools_nav() ?><?cs
      -    elif:google ?><?cs
      -      call:google_nav() ?><?cs
      -    elif:samples ?><?cs
      -      call:samples_nav() ?><?cs
      -    elif:preview ?><?cs
      -      call:preview_nav() ?><?cs
      -    elif:distribute ?><?cs
      -      if:googleplay ?><?cs
      -        call:googleplay_nav() ?><?cs
      -      elif:essentials ?><?cs
      -        call:essentials_nav() ?><?cs
      -      elif:users ?><?cs
      -        call:users_nav() ?><?cs
      -      elif:engage ?><?cs
      -        call:engage_nav() ?><?cs
      -      elif:monetize ?><?cs
      -        call:monetize_nav() ?><?cs
      -      elif:analyze ?><?cs
      -        call:analyze_nav() ?><?cs
      -      elif:disttools ?><?cs
      -        call:disttools_nav() ?><?cs
      -      elif:stories ?><?cs
      -        call:stories_nav() ?><?cs
      -      /if ?><?cs
      -    elif:about ?><?cs
      -      call:about_nav() ?><?cs
      -    elif:distribute ?><?cs
      -      call:distribute_nav() ?><?cs
      -    elif:wear ?><?cs
      -      call:wear_nav() ?><?cs
      -    else ?><?cs
      -      call:default_left_nav() ?> <?cs
      -    /if ?><?cs
      -  /if ?><?cs
      -/def ?>
      +def:custom_left_nav() ?>
      +  <?cs if:(!fullpage && !nonavpage) || forcelocalnav ?>
      +    <?cs if:!referenceonly ?>
      +    <a class="dac-nav-back-button dac-swap-section dac-up dac-no-anim" data-swap-button href="javascript:;">
      +      <i class="dac-sprite dac-nav-back"></i> <span class="dac-nav-back-title">Back</span>
      +    </a>
      +    <?cs /if ?>
      +    <div class="dac-nav-sub dac-swap-section dac-right dac-active" itemscope
      +      itemtype="http://schema.org/SiteNavigationElement" <?cs
      +        if:referenceonly ?>style="top:0 !important;"<?cs /if ?>>
      +      <?cs if:ndk ?>
      +        <?cs if:guide ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/ndk/guides/guides_toc.cs" ?>
      +        <?cs elif:reference ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/ndk/reference/reference_toc.cs" ?>
      +        <?cs elif:downloads ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/ndk/downloads/downloads_toc.cs" ?>
      +        <?cs elif:samples ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/ndk/samples/samples_toc.cs" ?>
      +        <?cs else ?>
      +          <?cs call:reference_default_nav() ?>
      +        <?cs /if ?>
      +      <?cs elif:guide ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?>
      +      <?cs elif:design ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
      +      <?cs elif:training ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?>
      +      <?cs elif:tools ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?>
      +      <?cs elif:google ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
      +      <?cs elif:samples ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?>
      +      <?cs elif:preview ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?>
      +      <?cs elif:preview ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/wear/preview/preview_toc.cs" ?>
      +      <?cs elif:distribute ?>
      +        <?cs if:googleplay ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?>
      +        <?cs elif:essentials ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?>
      +        <?cs elif:users ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?>
      +        <?cs elif:engage ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?>
      +        <?cs elif:monetize ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?>
      +        <?cs elif:analyze ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?>
      +        <?cs elif:disttools ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?>
      +        <?cs elif:stories ?>
      +          <?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?>
      +        <?cs /if ?>
      +      <?cs elif:about ?>
      +        <?cs include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?>
      +      <?cs else ?>
      +        <?cs call:reference_default_nav() ?>
      +      <?cs /if ?>
      +    </div>
      +  <?cs /if ?>
      +<?cs /def ?><?cs
       
      -<?cs # appears at the bottom of every page ?><?cs
      +# appears at the bottom of every page ?><?cs
       def:custom_cc_copyright() ?>
         Except as noted, this content is
      -  licensed under <a href="//creativecommons.org/licenses/by/2.5/">
      +  licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
         Creative Commons Attribution 2.5</a>. For details and
         restrictions, see the <a href="<?cs var:toroot ?>license.html">Content
      -  License</a>.<?cs
      -/def ?>
      +  License</a>.
      +<?cs /def ?><?cs
       
      -<?cs
       def:custom_copyright() ?>
         Except as noted, this content is licensed under <a
      -  href="//www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
      +  href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
         For details and restrictions, see the <a href="<?cs var:toroot ?>license.html">
      -  Content License</a>.<?cs
      -/def ?>
      +  Content License</a>.
      +<?cs /def ?><?cs
       
      -<?cs
       def:custom_footerlinks() ?>
      -  <a href="<?cs var:toroot ?>about/index.html">About Android</a>
      +  <a href="<?cs var:toroot ?>about/android.html">About Android</a>
         <a href="<?cs var:toroot ?>auto/index.html">Auto</a>
         <a href="<?cs var:toroot ?>tv/index.html">TV</a>
         <a href="<?cs var:toroot ?>wear/index.html">Wear</a>
         <a href="<?cs var:toroot ?>legal.html">Legal</a>
      -  <?cs
      -/def ?>
      -
      -<?cs # appears on the right side of the blue bar at the bottom off every page ?><?cs
      -def:custom_buildinfo() ?><?cs
      -  if:!google && !reference.gcm && !reference.gms ?>
      -    Android <?cs var:sdk.version ?>&nbsp;r<?cs var:sdk.rel.id ?> &mdash; <?cs
      -  /if ?>
      -<script src="<?cs var:toroot ?>timestamp.js" type="text/javascript"></script>
      -<script>document.write(BUILD_TIMESTAMP)</script>
      -<?cs /def ?>
      +<?cs /def ?><?cs
       
      +# appears on the right side of the blue bar at the bottom off every page ?><?cs
      +def:custom_buildinfo() ?>
      +  <?cs if:!google && !reference.gcm && !reference.gms ?>
      +    Android <?cs var:sdk.version ?>&nbsp;r<?cs var:sdk.rel.id ?> &mdash;
      +  <?cs /if ?>
      +  <script src="<?cs var:toroot ?>timestamp.js" type="text/javascript"></script>
      +  <script>document.write(BUILD_TIMESTAMP)</script>
      +<?cs /def ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/designpage.cs b/tools/droiddoc/templates-sdk/designpage.cs
      index d9c2681290a..d75ce0ad9ce 100644
      --- a/tools/droiddoc/templates-sdk/designpage.cs
      +++ b/tools/droiddoc/templates-sdk/designpage.cs
      @@ -7,12 +7,12 @@
             Android Design<?cs if:page.title ?> - <?cs var:page.title ?><?cs /if ?>
           </title>
           <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
      -    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic">
      +    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic">
           <link rel="stylesheet" href="<?cs var:toroot ?>assets/yui-3.3.0-reset-min.css">
      -    <link rel="stylesheet" href="<?cs var:toroot ?>assets/design/default.css?v=19">
      +    <link rel="stylesheet" href="<?cs var:toroot ?>assets/design/default.css">
           <script src="<?cs var:toroot ?>assets/jquery-1.6.2.min.js"></script>
           <script>var SITE_ROOT = '<?cs var:toroot ?>design';</script>
      -    <script src="<?cs var:toroot ?>assets/design/default.js?v=19"></script>
      +    <script src="<?cs var:toroot ?>assets/design/default.js"></script>
         </head>
         <body class="gc-documentation 
           <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      @@ -42,10 +42,6 @@
             <?cs elif:header.title ?><h2><?cs var:header.title ?></h2>
                          <?cs else ?><h2><?cs var:page.title ?></h2>
           <?cs /if ?>
      -  <div class="paging-links" itemscope itemtype="http://schema.org/SiteNavigationElement">
      -    <a href="#" class="prev-page-link">Previous</a>
      -    <a href="#" class="next-page-link">Next</a>
      -  </div>
       </div>
       <?cs /if ?>
       
      @@ -70,16 +66,16 @@
       
               <p id="copyright">
                 Except as noted, this content is licensed under
      -          <a href="//creativecommons.org/licenses/by/2.5/">
      +          <a href="http://creativecommons.org/licenses/by/2.5/">
                 Creative Commons Attribution 2.5</a>.<br>
                 For details and restrictions, see the
      -          <a href="//developer.android.com/license.html">Content License</a>.
      +          <a href="http://developer.android.com/license.html">Content License</a>.
               </p>
       
               <p>
      -          <a href="//www.android.com/terms.html">Site Terms of Service</a> &ndash;
      -          <a href="//www.android.com/privacy.html">Privacy Policy</a> &ndash;
      -          <a href="//www.android.com/branding.html">Brand Guidelines</a>
      +          <a href="http://www.android.com/terms.html">Site Terms of Service</a> &ndash;
      +          <a href="http://www.android.com/privacy.html">Privacy Policy</a> &ndash;
      +          <a href="http://www.android.com/branding.html">Brand Guidelines</a>
               </p>
       
             </div>
      diff --git a/tools/droiddoc/templates-sdk/docpage.cs b/tools/droiddoc/templates-sdk/docpage.cs
      index d41adaabd17..e8a5ba3fe13 100644
      --- a/tools/droiddoc/templates-sdk/docpage.cs
      +++ b/tools/droiddoc/templates-sdk/docpage.cs
      @@ -1,10 +1,10 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      +<?cs if:!devsite ?><?cs
      +  include:"doctype.cs" ?><?cs /if ?><?cs
      +  include:"macros.cs" ?><html<?cs if:devsite ?> devsite<?cs /if ?>>
       <?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation
      -
      -<?cs # add document classes for navigation header selection (and other stuff) ?>
      +<body<?cs
      +if:!devsite ?> class="gc-documentation<?cs
      +# add document classes for navigation header selection (and other stuff) ?>
       <?cs
         if:(google || reference.gms || reference.gcm) ?>google <?cs /if ?><?cs
         if:ndk ?>ndk<?cs
      @@ -13,10 +13,9 @@
           if:reference ?> reference<?cs /if ?><?cs
           if:downloads ?> downloads<?cs /if ?><?cs
         else ?><?cs
      -    if:(guide||develop||training||reference||tools||sdk||google||samples||preview) ?>develop<?cs
      +    if:(guide||develop||training||reference||tools||sdk||google||samples) ?>develop<?cs
             if:guide ?> guide<?cs /if ?><?cs
             if:samples ?> samples<?cs /if ?><?cs
      -      if:preview ?> preview<?cs /if ?><?cs
           elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?>distribute<?cs
             if:googleplay ?> googleplay<?cs /if ?><?cs
             if:essentials ?> essentials<?cs /if ?><?cs
      @@ -26,29 +25,42 @@
             if:disttools ?> disttools<?cs /if ?><?cs
             if:stories ?> stories<?cs /if ?><?cs
             if:analyze ?> analyze<?cs /if ?><?cs
      -    elif:(about||wear||tv||auto) ?>about<?cs
      -    elif:design ?>design<?cs
      +    elif:(design||vision||material||patterns||devices||designdownloads) ?> design<?cs
      +      if:vision ?> vision<?cs /if ?><?cs
      +      if:material ?> material<?cs /if ?><?cs
      +      if:patterns ?> patterns<?cs /if ?><?cs
      +      if:devices ?> devices<?cs /if ?><?cs
      +      if:designdownloads ?> designdownloads<?cs /if ?><?cs
      +    elif:(about||versions||wear||tv||auto) ?> about<?cs
      +      if:versions ?> versions<?cs /if ?><?cs
      +      if:wear ?> wear<?cs /if ?><?cs
      +      if:tv ?> tv<?cs /if ?><?cs
      +      if:auto ?> auto<?cs /if ?><?cs
      +    elif:(preview) ?> preview<?cs
           /if ?><?cs
           if:page.trainingcourse ?> trainingcourse<?cs /if ?><?cs
      -/if ?>" itemscope itemtype="http://schema.org/Article"><?cs
      -include:"header.cs" ?>
      -
      -<div <?cs
      -  if:fullpage
      -    ?>class="fullpage"<?cs
      -  elif:(design||tools||about||sdk||googleplay||essentials||users||engage||monetize||disttools||stories) && !nonavpage
      -    ?>class="col-13" id="doc-col"<?cs
      -  elif:!nonavpage
      -    ?>class="col-12" id="doc-col"<?cs /if ?> >
      -
      -<?cs if:(design||training||walkthru) && !page.trainingcourse && !page.article ?><?cs # header logic for docs that provide previous/next buttons ?>
      -  <?cs if:header.hide ?>
      -  <?cs else ?>
      -  <div class="content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
      +  /if ?>" itemscope itemtype="http://schema.org/Article"><?cs
      +/if ?>><?cs
      +include:"header.cs" ?><?cs
      +
      +if:(design||training||walkthru) && !page.trainingcourse && !page.article ?><?cs
      +# header logic for docs that provide previous/next buttons ?><?cs
      +  if:(header.hide||devsite) ?><?cs
      +  else ?>
      +    <div class="content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
             <?cs if:header.justLinks ?>&nbsp;
      -      <?cs else ?><h1 itemprop="name"><?cs var:page.title ?></h1>
      -      <?cs /if ?>
      -    <?cs if:training ?>
      +      <?cs else ?>
      +        <ul class="dac-header-crumbs">
      +          <?cs # More <li> elements added here with javascript ?>
      +        </ul>
      +
      +        <!-- Breadcrumb Setup -->
      +        <script>$('.dac-nav-list').dacCurrentPage().dacCrumbs();</script>
      +
      +        <h1 itemprop="name"><?cs var:page.title ?>
      +      </h1><?cs
      +      /if ?><?cs
      +      if:training ?>
             <div class="training-nav-top" itemscope itemtype="http://schema.org/SiteNavigationElement">
               <a href="#" class="prev-page-link hide"
                   zh-tw-lang="上一堂課"
      @@ -74,9 +86,9 @@
                   ja-lang="開始する"
                   es-lang="Empezar"
                   >Get started</a>
      -      </div>
      -    <?cs elif:!page.trainingcourse ?>
      -      <div class="paging-links" itemscope itemtype="http://schema.org/SiteNavigationElement">
      +      </div><?cs
      +      elif:!page.trainingcourse ?>
      +      <?cs # <div class="paging-linkss" itemscope itemtype="http://schema.org/SiteNavigationElement">
               <a href="#" class="prev-page-link hide"
                   zh-tw-lang="上一堂課"
                   zh-cn-lang="上一课"
      @@ -93,12 +105,12 @@
                   ja-lang="次へ"
                   es-lang="Siguiente"
                   >Next</a>
      -      </div>
      -    <?cs /if ?><?cs # end if training ?>
      +      </div> ?><?cs
      +      /if ?><?cs # end if training ?>
         </div>
      -  <?cs /if ?><?cs # end if header.hide ?>
      +  <?cs /if ?><?cs # end if header.hide ?><?cs
       
      -<?cs elif:samplesProjectIndex ?>
      +elif:samplesProjectIndex ?>
         <div id="api-info-block">
         <div class="sum-details-links">
         Overview
      @@ -108,18 +120,9 @@
         </div><!-- end breadcurmb block -->
         <h1 itemprop="name"><?cs var:projectDir ?></h1>
       
      -<?cs else ?>
      -  <?cs if:training ?>
      -<?cs # horrible horrible hack to move TOC up when the next/prev links are not there ?>
      -<style>
      -  #tb-wrapper {
      -    margin-top:6px;
      -  }
      -</style>
      -  <?cs /if ?>
      -
      -  <?cs if:(!fullpage && !header.hide) ?>
      -    <?cs if:page.landing ?><?cs # header logic for docs that are landing pages ?>
      +<?cs else ?><?cs
      +  if:(!fullpage && !header.hide && !devsite) ?><?cs
      +    if:page.landing ?><?cs # header logic for docs that are landing pages ?>
             <div class="landing-banner">
               <?cs if:page.landing.image ?><?cs # use two-column layout only if there is an image ?>
               <div class="cols">
      @@ -137,8 +140,15 @@
               </div>
               <?cs /if ?>
             </div>
      -    <?cs else ?>
      -      <?cs if:tab1 ?><div id="title-tabs-wrapper"><?cs /if ?>
      +    <?cs else ?><?cs
      +      if:tab1 ?><div id="title-tabs-wrapper"><?cs /if ?>
      +        <ul class="dac-header-crumbs">
      +          <?cs # More <li> elements added here with javascript ?>
      +        </ul>
      +
      +        <!-- Breadcrumb Setup -->
      +        <p><script>$('.dac-nav-list').dacCurrentPage().dacCrumbs();</script></p>
      +
               <h1 itemprop="name" <?cs if:tab1 ?>class="with-title-tabs"<?cs /if ?>><?cs var:page.title ?></h1><?cs
                 if:tab1 ?><ul id="title-tabs">
                     <li class="selected"><a href="<?cs var:tab1.link ?>"><?cs var:tab1 ?></a></li>
      @@ -148,24 +158,73 @@
                     <li><a href="<?cs var:tab3.link ?>"><?cs var:tab3 ?></a></li><?cs /if ?>
                   </ul>
                 <?cs /if ?>
      -      <?cs if:tab1 ?></div><!-- end tab-wrapper --><?cs /if ?>
      -    <?cs /if ?>
      -  <?cs /if ?>
      -<?cs /if ?><?cs # end if design ?>
      +      <?cs if:tab1 ?></div><!-- end tab-wrapper --><?cs /if ?><?cs
      +    /if ?><?cs
      +  /if ?><?cs
      +/if ?><?cs # end if design ?><?cs
       
      -  <?cs # THIS IS THE MAIN DOC CONTENT ?>
      +if devsite ?><?cs
      +  if:tab1 ?>
      +  <div id="title-tabs-wrapper">
      +    <ul id="title-tabs">
      +      <li class="selected"><a href="<?cs var:tab1.link ?>"><?cs var:tab1 ?></a></li>
      +      <?cs if:tab2 ?>
      +      <li><a href="<?cs var:tab2.link ?>"><?cs var:tab2 ?></a></li><?cs /if ?>
      +      <?cs if:tab3 ?>
      +      <li><a href="<?cs var:tab3.link ?>"><?cs var:tab3 ?></a></li><?cs /if ?>
      +    </ul>
      +  </div><!-- end tab-wrapper --><?cs
      +  /if ?><?cs
      +/if ?><?cs
      +
      +# THIS IS THE MAIN DOC CONTENT ?><?cs
      +  if:!devsite ?>
         <div id="jd-content">
      +    <div class="jd-descr" itemprop="articleBody"><?cs
      +  /if ?><?cs
      +  if:(!fullpage && !header.hide && devsite) ?><?cs
      +    if:page.landing ?><?cs # header logic for docs that are landing pages ?>
      +        <div class="landing-banner">
      +          <?cs if:page.landing.image ?><?cs # use two-column layout only if there is an image ?>
      +          <div class="cols">
      +            <div class="col-6">
      +              <img src="<?cs var:toroot ?><?cs var:page.landing.image ?>" alt="" />
      +            </div>
      +            <div class="col-6">
      +          <?cs /if ?>
      +            <h1 itemprop="name" style="margin-bottom:0;"><?cs var:page.title ?></h1>
      +            <p itemprop="description"><?cs var:page.landing.intro ?></p>
      +
      +            <p><a class="next-page-link topic-start-link"></a></p><?cs
      +            if:page.landing.image ?>
      +            </div>
      +          </div><?cs
      +          /if ?>
      +        </div><?cs
      +    /if ?><?cs
      +  /if ?>
       
      +<?cs call:tag_list(root.descr) ?><?cs
       
      -    <div class="jd-descr" itemprop="articleBody">
      -    <?cs call:tag_list(root.descr) ?>
      -    </div>
      +if:!devsite ?>
      +    </div><!-- end jd-descr --><?cs
      +/if ?><?cs
       
      -    <?cs if:!fullscreen && (design||training||walkthru) && !page.landing && !page.trainingcourse && !footer.hide ?>
      +if:!fullscreen && (design||training||walkthru) && !page.landing && !page.trainingcourse
      +      && !footer.hide && !devsite?>
             <div class="content-footer <?cs
                           if:fullpage ?>wrap<?cs /if ?>"
                           itemscope itemtype="http://schema.org/SiteNavigationElement">
                 <div class="paging-links">
      +            <a href="#" class="prev-page-link hide"
      +              zh-tw-lang="上一堂課"
      +              zh-cn-lang="上一课"
      +              ru-lang="Предыдущий"
      +              ko-lang="이전"
      +              ja-lang="前へ"
      +              es-lang="Anterior"
      +              ><span class="page-link-caption">Previous</span>
      +            </a>
                   <a href="#" class="next-page-link hide"
                       zh-tw-lang="下一堂課"
                       zh-cn-lang="下一课"
      @@ -173,7 +232,8 @@
                       ko-lang="다음"
                       ja-lang="次へ"
                       es-lang="Siguiente"
      -                >Next</a>
      +                ><span class="page-link-caption">Next</span>
      +            </a>
                   <a href="#" class="start-class-link hide"
                       zh-tw-lang="開始上課"
                       zh-cn-lang="开始"
      @@ -182,22 +242,20 @@
                       ja-lang="開始する"
                       es-lang="Empezar"
                       >Get started</a>
      -            <a href="#" class="next-class-link hide">Next class</a>
      +            <a href="#" class="next-class-link hide">
      +              <span class="page-link-caption">Next class</span>
      +            </a>
                 </div>
      -      </div>
      -    <?cs /if ?>
      -
      -  </div> <!-- end jd-content -->
      +      </div><?cs
      +    /if ?><?cs
      +if:!devsite ?>
      +  </div> <!-- end jd-content --><?cs
      +/if ?><?cs
       
      +if:!devsite ?>
       <?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
       <?cs include:"trailer.cs" ?>
      -  <script src="https://developer.android.com/ytblogger_lists_unified.js?v=19" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_lists_unified.js?v=19" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_extras.js?v=19" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_collections.js?v=19" type="text/javascript"></script>
      -  <script src="<?cs var:toroot ?>jd_tag_helpers.js?v=19" type="text/javascript"></script>
      +<?cs /if ?>
       
       </body>
       </html>
      diff --git a/tools/droiddoc/templates-sdk/footer.cs b/tools/droiddoc/templates-sdk/footer.cs
      index 095c7fd64ea..af34a1add90 100644
      --- a/tools/droiddoc/templates-sdk/footer.cs
      +++ b/tools/droiddoc/templates-sdk/footer.cs
      @@ -1,19 +1,20 @@
      +<?cs # page footer content ?>
       <div class="wrap">
         <div class="dac-footer<?cs if:fullpage ?> dac-landing<?cs /if ?>">
           <div class="cols dac-footer-main">
             <div class="col-1of2">
      -        <a class="dac-footer-getnews" data-modal-toggle="newsletter" href="javascript:;">Get news &amp; tips <span
      +        <a class="dac-footer-getnews" id="newsletter" data-modal-toggle="newsletter" href="javascript:;">Get news &amp; tips <span
                 class="dac-fab dac-primary"><i class="dac-sprite dac-mail"></i></span></a>
             </div>
             <div class="col-1of2 dac-footer-reachout">
               <div class="dac-footer-contact">
      -          <a class="dac-footer-contact-link" href="//android-developers.blogspot.com/">Blog</a>
      +          <a class="dac-footer-contact-link" href="http://android-developers.blogspot.com/">Blog</a>
                 <a class="dac-footer-contact-link" href="/support.html">Support</a>
               </div>
               <div class="dac-footer-social">
      -          <a class="dac-fab dac-footer-social-link" href="https://www.youtube.com/user/androiddevelopers"><i class="dac-sprite dac-youtube"></i></a>
      -          <a class="dac-fab dac-footer-social-link" href="https://plus.google.com/+AndroidDevelopers"><i class="dac-sprite dac-gplus"></i></a>
      -          <a class="dac-fab dac-footer-social-link" href="https://twitter.com/AndroidDev"><i class="dac-sprite dac-twitter"></i></a>
      +          <a class="dac-button-social dac-youtube dac-footer-social-link" href="https://www.youtube.com/user/androiddevelopers"><i class="dac-sprite dac-youtube"></i></a>
      +          <a class="dac-button-social dac-gplus dac-footer-social-link" href="https://plus.google.com/+AndroidDevelopers"><i class="dac-sprite dac-gplus"></i></a>
      +          <a class="dac-button-social dac-twitter dac-footer-social-link" href="https://twitter.com/AndroidDev"><i class="dac-sprite dac-twitter"></i></a>
               </div>
             </div>
           </div>
      @@ -34,7 +35,7 @@
           <?cs /if ?>
       
           <p class="dac-footer-links">
      -      <a href="/about/index.html">About Android</a>
      +      <a href="/about/android.html">About Android</a>
             <a href="/auto/index.html">Auto</a>
             <a href="/tv/index.html">TV</a>
             <a href="/wear/index.html">Wear</a>
      @@ -56,48 +57,54 @@
             </span>
           </p>
         </div>
      -</div> <!-- end footer -->
      +</div>
      +<!-- end footer -->
      +
      +<?cs call:toast() ?>
       
       <div data-modal="newsletter" data-newsletter data-swap class="dac-modal newsletter">
         <div class="dac-modal-container">
           <div class="dac-modal-window">
             <header class="dac-modal-header">
      -        <button class="dac-modal-header-close" data-modal-toggle><i class="dac-sprite dac-close"></i></button>
      +        <div class="dac-modal-header-actions">
      +          <button class="dac-modal-header-close" data-modal-toggle></button>
      +        </div>
               <div class="dac-swap" data-swap-container>
                 <section class="dac-swap-section dac-active dac-down">
      -            <h2 class="norule dac-modal-header-title">Get the latest Android developer news and tips that will help you find success on Google Play.</h2>
      -            <p class="dac-modal-header-subtitle">&#42; Required Fields</p>
      +            <h2 class="norule dac-modal-header-title" data-t="newsletter.title"></h2>
      +            <p class="dac-modal-header-subtitle" data-t="newsletter.requiredHint"></p>
                 </section>
                 <section class="dac-swap-section dac-up">
      -            <h2 class="norule dac-modal-header-title">Hooray!</h2>
      +            <h2 class="norule dac-modal-header-title" data-t="newsletter.successTitle">Hooray!</h2>
                 </section>
               </div>
             </header>
             <div class="dac-swap" data-swap-container>
               <section class="dac-swap-section dac-active dac-left">
                 <form action="https://docs.google.com/forms/d/1QgnkzbEJIDu9lMEea0mxqWrXUJu0oBCLD7ar23V0Yys/formResponse" class="dac-form" method="post" target="dac-newsletter-iframe">
      +            <input type="hidden" name="entry.935454734" data-newsletter-language>
                   <section class="dac-modal-content">
                     <fieldset class="dac-form-fieldset">
                       <div class="cols">
                         <div class="col-1of2 newsletter-leftCol">
                           <div class="dac-form-input-group">
      -                      <label for="newsletter-full-name" class="dac-form-floatlabel">Full name</label>
      +                      <label for="newsletter-full-name" class="dac-form-floatlabel" data-t="newsletter.name">Full name</label>
                             <input type="text" class="dac-form-input" name="entry.1357890476" id="newsletter-full-name" required>
                             <span class="dac-form-required">*</span>
                           </div>
                           <div class="dac-form-input-group">
      -                      <label for="newsletter-email" class="dac-form-floatlabel">Email address</label>
      +                      <label for="newsletter-email" class="dac-form-floatlabel" data-t="newsletter.email">Email address</label>
                             <input type="email" class="dac-form-input" name="entry.472100832" id="newsletter-email" required>
                             <span class="dac-form-required">*</span>
                           </div>
                         </div>
                         <div class="col-1of2 newsletter-rightCol">
                           <div class="dac-form-input-group">
      -                      <label for="newsletter-company" class="dac-form-floatlabel">Company / developer name</label>
      +                      <label for="newsletter-company" class="dac-form-floatlabel" data-t="newsletter.company">Company / developer name</label>
                             <input type="text" class="dac-form-input" name="entry.1664780309" id="newsletter-company">
                           </div>
                           <div class="dac-form-input-group">
      -                      <label for="newsletter-play-store" class="dac-form-floatlabel">One of your Play Store app URLs</label>
      +                      <label for="newsletter-play-store" class="dac-form-floatlabel" data-t="newsletter.appUrl">One of your Play Store app URLs</label>
                             <input type="url" class="dac-form-input" name="entry.47013838" id="newsletter-play-store" required>
                             <span class="dac-form-required">*</span>
                           </div>
      @@ -107,22 +114,22 @@
                     <fieldset class="dac-form-fieldset">
                       <div class="cols">
                         <div class="col-1of2 newsletter-leftCol">
      -                    <legend class="dac-form-legend">Which best describes your business:<span class="dac-form-required">*</span>
      +                    <legend class="dac-form-legend"><span data-t="newsletter.business.label">Which best describes your business:</span><span class="dac-form-required">*</span>
                           </legend>
                           <div class="dac-form-radio-group">
                             <input type="radio" value="Apps" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-app" required>
                             <label for="newsletter-business-type-app" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-app" class="dac-form-label">Apps</label>
      +                      <label for="newsletter-business-type-app" class="dac-form-label" data-t="newsletter.business.apps">Apps</label>
                           </div>
                           <div class="dac-form-radio-group">
                             <input type="radio" value="Games" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-games" required>
                             <label for="newsletter-business-type-games" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-games" class="dac-form-label">Games</label>
      +                      <label for="newsletter-business-type-games" class="dac-form-label" data-t="newsletter.business.games">Games</label>
                           </div>
                           <div class="dac-form-radio-group">
                             <input type="radio" value="Apps and Games" class="dac-form-radio" name="entry.1796324055" id="newsletter-business-type-appsgames" required>
                             <label for="newsletter-business-type-appsgames" class="dac-form-radio-button"></label>
      -                      <label for="newsletter-business-type-appsgames" class="dac-form-label">Apps &amp; Games</label>
      +                      <label for="newsletter-business-type-appsgames" class="dac-form-label" data-t="newsletter.business.both">Apps &amp; Games</label>
                           </div>
                         </div>
                         <div class="col-1of2 newsletter-rightCol newsletter-checkboxes">
      @@ -133,7 +140,7 @@
                                 <label for="newsletter-add" class="dac-form-checkbox-button"></label>
                               </div>
                               <div class="dac-media-body">
      -                          <label for="newsletter-add" class="dac-form-label dac-form-aside">Add me to the mailing list for the monthly newsletter and occasional emails about development and Google Play opportunities.<span class="dac-form-required">*</span></label>
      +                          <label for="newsletter-add" class="dac-form-label dac-form-aside"><span data-t="newsletter.confirmMailingList"></span><span class="dac-form-required">*</span></label>
                               </div>
                             </div>
                           </div>
      @@ -144,7 +151,7 @@
                                 <label for="newsletter-terms" class="dac-form-checkbox-button"></label>
                               </div>
                               <div class="dac-media-body">
      -                          <label for="newsletter-terms" class="dac-form-label dac-form-aside">I acknowledge that the information provided in this form will be subject to <a href="https://www.google.com/policies/privacy/">Google's privacy policy</a>.<span class="dac-form-required">*</span></label>
      +                          <label for="newsletter-terms" class="dac-form-label dac-form-aside"><span data-t="newsletter.privacyPolicy" data-t-html></span><span class="dac-form-required">*</span></label>
                               </div>
                             </div>
                           </div>
      @@ -163,12 +170,50 @@
               </section>
               <section class="dac-swap-section dac-right">
                 <div class="dac-modal-content">
      -            <p class="newsletter-success-message">
      -              You have successfully signed up for the latest Android developer news and tips.
      -            </p>
      +            <p class="newsletter-success-message" data-t="newsletter.successDetails"></p>
                 </div>
               </section>
             </div>
           </div>
         </div>
      -</div> <!-- end footer -->
      +</div>
      +<!-- end newsletter modal -->
      +
      +<!-- start reset language header modal -->
      +<div data-modal="langform" class="dac-modal" id="langform">
      +  <div class="dac-modal-container">
      +    <div class="dac-modal-window">
      +      <header class="dac-modal-header">
      +        <div class="dac-modal-header-actions">
      +          <button class="dac-modal-header-close" data-modal-toggle></button>
      +        </div>
      +        <section class="dac-swap-section dac-active dac-down">
      +          <h2 class="norule dac-modal-header-title"></h2>
      +        </section>
      +      </header>
      +      <section class="dac-swap-section dac-active dac-left">
      +          <section class="dac-modal-content">
      +            <fieldset class="dac-form-fieldset">
      +              <div class="cols">
      +                <div class="col-2of2 langform-leftCol">
      +                  <p id="resetLangText"></p>
      +                  <p id="resetLangCta"></p>
      +                </div>
      +              </div>
      +            </fieldset>
      +          </section>
      +          <footer class="dac-modal-footer" id="langfooter">
      +            <div class="cols">
      +              <div class="col-2of5">
      +              </div>
      +            </div>
      +              <button class="button dac-primary dac-modal-action lang yes" data-t="newsletter.resetLangButtonYes" data-modal-toggle></button>
      +              <button class="button dac-primary dac-modal-action lang no" data-t="newsletter.resetLangButtonNo" data-modal-toggle></button>
      +            </a>
      +          </footer>
      +        </form>
      +      </section>
      +    </div>
      +  </div>
      +</div>
      +<!-- end langreset modal -->
      diff --git a/tools/droiddoc/templates-sdk/head_tag.cs b/tools/droiddoc/templates-sdk/head_tag.cs
      index 1dbb3c30629..0c5bb78213a 100644
      --- a/tools/droiddoc/templates-sdk/head_tag.cs
      +++ b/tools/droiddoc/templates-sdk/head_tag.cs
      @@ -1,26 +1,161 @@
       <head>
      -<?cs
      -  ####### If building devsite, add some meta data needed for when generating the top nav ######### ?>
      -<?cs
      -  if:devsite ?><?cs
      -    if:guide||develop||training||reference||tools||sdk||google||samples
      -      ?><meta name="top_category" value="develop" /><?cs
      -    elif:google
      -      ?><meta name="top_category" value="google" /><?cs
      -    elif:reference && !(reference.gms || reference.gcm)
      -      ?><meta name="top_category" value="css-fullscreen" /><?cs
      -    /if ?>
      -  <?cs
      -  /if
      -?><?cs
      -  # END if/else devsite ?>
      +  <title><?cs
      +if:devsite ?><?cs
      +  if:page.title ?><?cs
      +    var:html_strip(page.title) ?><?cs
      +  else ?>Android Developers<?cs
      +  /if ?><?cs
      +else ?><?cs
      +  if:page.title ?><?cs
      +    var:page.title ?> | <?cs
      +  /if ?>Android Developers
      +<?cs /if ?><?cs
      +# END if/else devsite ?></title><?cs
      +  ####### If building devsite, add some meta data needed for when generating the top nav ######### ?><?cs
      +if:devsite ?>
      +  <meta name="top_category" value="<?cs
      +      if:ndk ?>ndk<?cs
      +      elif:(guide||develop||training||reference||tools||sdk||google||reference.gms||reference.gcm||samples) ?>develop<?cs
      +      elif:(topic||libraries||instantapps||perf||arc) ?>develop<?cs
      +      elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?>distribute<?cs
      +      elif:(design||vision||material||patterns||devices||designdownloads) ?>design<?cs
      +      elif:(about||versions||wear||tv||auto) ?>about<?cs
      +      elif:wearpreview ?>about<?cs
      +      elif:work ?>about<?cs
      +      elif:preview ?>preview<?cs
      +      else ?>none<?cs
      +      /if ?>" /><?cs set:dac_subcategory_set = #1 ?>
      +  <meta name="subcategory" value="<?cs
      +      if:ndk ?><?cs
      +        if:guide ?>guide<?cs
      +        elif:samples ?>samples<?cs
      +          if:(samplesDocPage&&!samplesProjectIndex) ?> samples-docpage<?cs /if ?><?cs
      +        elif:reference ?>reference<?cs
      +        elif:downloads ?>downloads<?cs
      +        else ?>none<?cs set:dac_subcategory_set = #0 ?><?cs /if ?><?cs
      +      else ?><?cs
      +        if:(guide||develop||training||reference||tools||sdk||samples) ?><?cs
      +          if:guide ?>guide<?cs
      +          elif:training ?><?cs
      +            if:page.trainingcourse ?>trainingcourse<?cs
      +            else ?>training<?cs /if ?><?cs
      +          elif:reference ?>reference<?cs
      +          elif:samples ?>samples<?cs
      +            if:(samplesDocPage&&!samplesProjectIndex) ?> samples-docpage<?cs /if ?><?cs
      +          else ?>none<?cs set:dac_subcategory_set = #0 ?><?cs /if ?><?cs
      +        elif:(google||reference.gms||reference.gcm) ?>google<?cs
      +        elif:(topic||libraries||perf||arc) ?><?cs
      +          if:libraries ?>libraries<?cs
      +          elif:instantapps ?>instantapps<?cs
      +          elif:perf ?>perf<?cs
      +          elif:arc ?>arc<?cs
      +          else ?>none<?cs set:dac_subcategory_set = #0 ?><?cs /if ?><?cs
      +        elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?><?cs
      +          if:googleplay ?>googleplay<?cs
      +          elif:essentials ?>essentials<?cs
      +          elif:users ?>users<?cs
      +          elif:engage ?>engage<?cs
      +          elif:monetize ?>monetize<?cs
      +          elif:disttools ?>disttools<?cs
      +          elif:stories ?>stories<?cs
      +          elif:analyze ?>analyze<?cs
      +          else ?>none<?cs set:dac_subcategory_set = #0 ?><?cs /if ?><?cs
      +        elif:(about||versions||wear||tv||auto) ?>about<?cs
      +        elif:preview ?>preview<?cs
      +        elif:wearpreview ?>wear<?cs
      +        elif:work ?>work<?cs
      +        elif:design ?>design<?cs
      +        elif:walkthru ?>walkthru<?cs
      +        else ?>none<?cs set:dac_subcategory_set = #0 ?><?cs /if ?><?cs
      +      /if ?>" /><?cs
      +      if:nonavpage ?>
      +  <meta name="hide_toc" value='True' /><?cs
      +      elif: !nonavpage && dac_subcategory_set && !tools && !sdk ?>
      +  <meta name="book_path" value="<?cs
      +        if:ndk ?>/ndk<?cs
      +          if:guide ?>/guides<?cs
      +          elif:samples ?>/samples<?cs
      +          elif:reference ?>/reference<?cs
      +          elif:downloads ?>/downloads<?cs /if ?><?cs
      +        else ?><?cs
      +          if:(guide||develop||training||reference||tools||sdk||samples) ?><?cs
      +            if:guide ?>/guide<?cs
      +            elif:training ?>/training<?cs
      +            elif:reference ?>/reference<?cs
      +            elif:samples ?>/samples<?cs /if ?><?cs
      +          elif:(google||reference.gms||reference.gcm) ?>/google<?cs
      +          elif:(topic||libraries||perf) ?>/topic<?cs
      +            if:libraries ?>/libraries<?cs
      +            elif:instantapps ?>/instant-apps<?cs
      +            elif:perf ?>/performance<?cs
      +            elif:arc ?>/arc<?cs /if ?><?cs
      +          elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?>/distribute<?cs
      +            if:googleplay ?>/googleplay<?cs
      +            elif:essentials ?>/essentials<?cs
      +            elif:users ?>/users<?cs
      +            elif:engage ?>/engage<?cs
      +            elif:monetize ?>/monetize<?cs
      +            elif:disttools ?>/tools<?cs
      +            elif:stories ?>/stories<?cs
      +            elif:analyze ?>/analyze<?cs /if ?><?cs
      +          elif:(about||versions||wear||tv||auto) ?>/about<?cs
      +          elif:preview ?>/preview<?cs
      +          elif:wearpreview ?>/wear/preview<?cs
      +          elif:work ?>/work<?cs
      +          elif:design ?>/design<?cs
      +          elif:reference.testSupport ?>/reference/android/support/test<?cs
      +          elif:reference.wearableSupport ?>/reference/android/support/wearable<?cs
      +          elif:walkthru ?>/walkthru<?cs /if ?><?cs
      +        /if ?>/_book.yaml" /><?cs
      +        /if ?>
      +  <meta name="project_path" value="<?cs
      +      if:(guide||develop||training||reference||tools||sdk||samples) ?><?cs
      +        if:guide ?>/guide<?cs
      +        elif:training ?>/training<?cs
      +        elif:reference ?>/reference<?cs
      +        elif:samples ?>/samples<?cs /if ?><?cs
      +      elif:(google||reference.gms||reference.gcm) ?>/google<?cs
      +      elif:(topic||libraries) ?>/develop<?cs
      +      elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories||analyze) ?>/distribute<?cs
      +        if:googleplay ?>/googleplay<?cs
      +        elif:essentials ?>/essentials<?cs
      +        elif:users ?>/users<?cs
      +        elif:engage ?>/engage<?cs
      +        elif:monetize ?>/monetize<?cs
      +        elif:disttools ?>/tools<?cs
      +        elif:stories ?>/stories<?cs
      +        elif:analyze ?>/analyze<?cs
      +        else ?><?cs /if ?><?cs
      +      elif:(about||versions||wear||tv||auto) ?>/about<?cs
      +      elif:wearpreview ?>/wear<?cs
      +      elif:work ?>/work<?cs
      +      elif:preview ?>/preview<?cs
      +      elif:design ?>/design<?cs /if ?>/_project.yaml" /><?cs
      +
      +      if:page.tags && page.tags != "" ?>
      +  <meta name="keywords" value='<?cs var:page.tags ?>' /><?cs
      +      /if ?><?cs
      +      if:meta.tags && meta.tags != "" ?>
      +  <meta name="meta_tags" value='<?cs var:meta.tags ?>' /><?cs
      +      /if ?><?cs
      +      if:fullpage ?>
      +  <meta name="full_width" value="True" /><?cs
      +      /if ?><?cs
      +      if:page.landing ?>
      +  <meta name="page_type" value="landing" /><?cs
      +      /if ?><?cs
      +      if:page.article ?>
      +  <meta name="page_type" value="article" /><?cs
      +      /if ?><?cs
      +      if:page.image ?>
      +  <meta name="image_path" value='<?cs var:page.image ?>' /><?cs
      +      /if ?><?cs
      +/if ?><?cs # END if/else devsite ?><?cs
      +
      +  if:!devsite ?>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
       <meta content="IE=edge" http-equiv="X-UA-Compatible">
      -<?cs
      -  if:page.metaDescription ?>
      -<meta name="Description" content="<?cs var:page.metaDescription ?>"><?cs
      -  /if ?>
       <link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>favicon.ico" />
       <link rel="alternate" href="http://developer.android.com/<?cs var:path.canonical ?>" hreflang="en" />
       <link rel="alternate" href="http://developer.android.com/intl/es/<?cs var:path.canonical ?>" hreflang="es" />
      @@ -32,42 +167,32 @@
       <link rel="alternate" href="http://developer.android.com/intl/vi/<?cs var:path.canonical ?>" hreflang="vi" />
       <link rel="alternate" href="http://developer.android.com/intl/zh-cn/<?cs var:path.canonical ?>" hreflang="zh-cn" />
       <link rel="alternate" href="http://developer.android.com/intl/zh-tw/<?cs var:path.canonical ?>" hreflang="zh-tw" />
      +<?cs /if ?><?cs
      +# END if/else !devsite ?><?cs
       
      -<title><?cs
      -  if:page.title ?><?cs
      -    var:page.title ?> | <?cs
      -  /if ?>Android Developers</title>
      -
      +      if:page.metaDescription ?>
      +  <meta name="description" content="<?cs var:page.metaDescription ?>"><?cs
      +      /if ?><?cs
      +  if:!devsite ?>
       <!-- STYLESHEETS -->
       <link rel="stylesheet"
       href="<?cs
      -if:android.whichdoc != 'online' ?>https:<?cs
      +if:android.whichdoc != 'online' ?>http:<?cs
       /if ?>//fonts.googleapis.com/css?family=Roboto+Condensed">
       <link rel="stylesheet" href="<?cs
      -if:android.whichdoc != 'online' ?>https:<?cs
      +if:android.whichdoc != 'online' ?>http:<?cs
       /if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
         title="roboto">
       <?cs
         if:ndk ?><link rel="stylesheet" href="<?cs
      -  if:android.whichdoc != 'online' ?>https:<?cs
      +  if:android.whichdoc != 'online' ?>http:<?cs
         /if ?>//fonts.googleapis.com/css?family=Roboto+Mono:400,500,700" title="roboto-mono" type="text/css"><?cs
       /if ?>
      -<link href="<?cs var:toroot ?>assets/css/default.css?v=19" rel="stylesheet" type="text/css">
      -
      -<?cs if:reference && !(reference.gms || reference.gcm || preview) ?>
      -<!-- FULLSCREEN STYLESHEET -->
      -<link href="<?cs var:toroot ?>assets/css/fullscreen.css" rel="stylesheet" class="fullscreen"
      -type="text/css">
      -<?cs /if ?>
      +<link href="<?cs var:toroot ?>assets/css/default.css?v=16" rel="stylesheet" type="text/css">
       
       <!-- JAVASCRIPT -->
      -<script src="<?cs if:android.whichdoc != 'online' ?>https:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script>
      -<?cs
      -if:devsite
      -  ?><script src="<?cs var:toroot ?>_static/js/android_3p-bundle.js" type="text/javascript"></script><?cs
      -else
      -  ?><script src="<?cs var:toroot ?>assets/js/android_3p-bundle.js" type="text/javascript"></script><?cs
      -/if ?><?cs
      +<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script>
      +<script src="<?cs var:toroot ?>assets/js/android_3p-bundle.js" type="text/javascript"></script><?cs
         if:page.customHeadTag ?>
       <?cs var:page.customHeadTag ?><?cs
         /if ?>
      @@ -77,14 +202,7 @@
         var devsite = <?cs if:devsite ?>true<?cs else ?>false<?cs /if ?>;
         var useUpdatedTemplates = <?cs if:useUpdatedTemplates ?>true<?cs else ?>false<?cs /if ?>;
       </script>
      -<script src="<?cs var:toroot ?>assets/js/docs.js?v=19" type="text/javascript"></script>
      -
      -<?cs if:helpoutsWidget ?>
      -<script type="text/javascript" src="https://helpouts.google.com/ps/res/embed.js" defer async
      -    data-helpouts-embed data-helpouts-vertical="programming"
      -    data-helpouts-tags="<?cs var:page.tags ?>" data-helpouts-prefix="android"
      -    data-helpouts-standalone="true"></script>
      -<?cs /if ?>
      +<script src="<?cs var:toroot ?>assets/js/docs.js?v=17" type="text/javascript"></script>
       
       <script>
         (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      @@ -96,6 +214,6 @@
         ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'});  // New tracker);
         ga('send', 'pageview');
         ga('universal.send', 'pageview'); // Send page view for new tracker.
      -</script>
      -
      +</script><?cs /if ?><?cs
      +# END if/else !devsite ?>
       </head>
      diff --git a/tools/droiddoc/templates-sdk/header.cs b/tools/droiddoc/templates-sdk/header.cs
      index e8301bed93d..a9273937f35 100644
      --- a/tools/droiddoc/templates-sdk/header.cs
      +++ b/tools/droiddoc/templates-sdk/header.cs
      @@ -1,3 +1,11 @@
      -<?cs call:custom_masthead() ?>
      -<?cs call:custom_left_nav() ?>
      +<?cs if:!devsite ?><?cs # leave out the global header for devsite; it is in devsite template ?>
      +  <?cs call:custom_masthead() ?>
       
      +  <?cs if:(fullpage) ?>
      +    <?cs call:fullpage() ?>
      +  <?cs else ?>
      +    <?cs call:body_content_wrap_start() ?>
      +  <?cs /if ?>
      +
      +  <?cs call:search_results() ?>
      +<?cs /if ?><?cs # end if/else !devsite ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/jd_lists_unified.cs b/tools/droiddoc/templates-sdk/jd_lists_unified.cs
      index 417a5c1b2ef..4a6f4f75718 100644
      --- a/tools/droiddoc/templates-sdk/jd_lists_unified.cs
      +++ b/tools/droiddoc/templates-sdk/jd_lists_unified.cs
      @@ -1 +1,10 @@
      +window.METADATA = window.METADATA || {};
      +METADATA['<?cs var:metadata.lang ?>'] = {};
      +
      +METADATA['<?cs var:metadata.lang ?>'].about = [];
      +METADATA['<?cs var:metadata.lang ?>'].design = [];
      +METADATA['<?cs var:metadata.lang ?>'].develop = [];
      +METADATA['<?cs var:metadata.lang ?>'].distribute = [];
      +METADATA['<?cs var:metadata.lang ?>'].extras = [];
      +
       <?cs var:reference_tree ?>
      diff --git a/tools/droiddoc/templates-sdk/lists.cs b/tools/droiddoc/templates-sdk/lists.cs
      new file mode 100644
      index 00000000000..ede8c4351df
      --- /dev/null
      +++ b/tools/droiddoc/templates-sdk/lists.cs
      @@ -0,0 +1,8 @@
      +var <?cs
      +  if:reference.testSupport ?>SUPPORT_TEST_<?cs
      +  elif: reference.wearableSupport ?>SUPPORT_WEARABLE_<?cs 
      +  /if ?>DATA = [
      +<?cs each:page = docs.pages
      +?>      { id:<?cs var: page.id ?>, label:"<?cs var:page.label ?>", link:"<?cs var:page.link ?>", type:"<?cs var:page.type ?>", deprecated:"<?cs var:page.deprecated ?>" }<?cs if:!last(page) ?>,<?cs /if ?>
      +<?cs /each ?>
      +    ];
      diff --git a/tools/droiddoc/templates-sdk/macros_override.cs b/tools/droiddoc/templates-sdk/macros_override.cs
      index 9d146b1b502..5b92fe3d10c 100644
      --- a/tools/droiddoc/templates-sdk/macros_override.cs
      +++ b/tools/droiddoc/templates-sdk/macros_override.cs
      @@ -35,10 +35,17 @@
         </table>
       <?cs /def ?>
       
      -<?cs def:doc_root_override() ?><?cs
      -  if:referenceonly
      -    ?>https://developer.android.com/<?cs
      -  else ?><?cs
      -    var:toroot ?><?cs
      -  /if ?><?cs
      +<?cs
      +# Prints a comma separated list of parameters with optional line breaks
      +?><?cs
      +def:parameter_list(params, linebreaks) ?><?cs
      +  each:param = params ?><?cs
      +      call:simple_type_link(param.type)?> <?cs
      +      var:param.name ?><?cs
      +      if: name(param)!=subcount(params)-1
      +        ?>, <?cs if:linebreaks
      +?>
      +                <?cs /if ?><?cs
      +      /if ?><?cs
      +  /each ?><?cs
       /def ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/package.cs b/tools/droiddoc/templates-sdk/package.cs
      index 72d5538ad52..d3efdda554a 100644
      --- a/tools/droiddoc/templates-sdk/package.cs
      +++ b/tools/droiddoc/templates-sdk/package.cs
      @@ -1,50 +1,25 @@
      -<?cs include:"doctype.cs" ?>
      +<?cs # THIS CREATES A PACKAGE SUMMARY PAGE FROM EACH package.html FILES
      +     # AND NAMES IT package-summary.html ?>
       <?cs include:"macros.cs" ?>
       <?cs include:"macros_override.cs" ?>
      +<?cs include:"doctype.cs" ?>
       <html<?cs if:devsite ?> devsite<?cs /if ?>>
       <?cs include:"head_tag.cs" ?>
      -
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>">
      -  <div id="doc-api-level" class="<?cs var:package.since ?>" style="display:none"></div>
      -  <a name="top"></a>
      +<?cs include:"body_tag.cs" ?>
       <?cs include:"header.cs" ?>
      +<?cs include:"page_info.cs" ?>
      +<div class="api apilevel-<?cs var:package.since ?>" id="jd-content">
       
      -<div class="col-12" id="doc-col">
      -
      -<div id="api-info-block">
      -<div class="api-level">
      -  <?cs call:since_tags(package) ?>
      -  <?cs call:federated_refs(package) ?>
      -</div>
      -</div>
      -
      -<div id="jd-header">
      -  package
      -  <h1><?cs var:package.name ?></h1>
      -</div><!-- end header -->
      -
      -<div id="naMessage"></div>
      -
      -<div id="jd-content" class="api apilevel-<?cs var:package.since ?>">
      +<h1><?cs var:package.name ?></h1>
       
       <?cs if:subcount(package.descr) ?>
      -  <div class="jd-descr">
      -    <?cs call:tag_list(package.descr) ?>
      -  </div>
      +  <?cs call:tag_list(package.descr) ?>
       <?cs /if ?>
       
       <?cs def:class_table(label, classes) ?>
         <?cs if:subcount(classes) ?>
           <h2><?cs var:label ?></h2>
      -    <div class="jd-sumtable">
           <?cs call:class_link_table(classes) ?>
      -    </div>
         <?cs /if ?>
       <?cs /def ?>
       
      @@ -55,12 +30,35 @@
       <?cs call:class_table("Exceptions", package.exceptions) ?>
       <?cs call:class_table("Errors", package.errors) ?>
       
      -</div><!-- end jd-content -->
      +</div><!-- end apilevel -->
       
      -<?cs include:"footer.cs" ?>
      -</div><!-- doc-content -->
      +<?cs if:devsite ?>
      +<div class="data-reference-resources-wrapper">
      +  <?cs if:subcount(class.package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:list("Annotations", class.package.annotations) ?>
      +    <?cs call:list("Interfaces", class.package.interfaces) ?>
      +    <?cs call:list("Classes", class.package.classes) ?>
      +    <?cs call:list("Enums", class.package.enums) ?>
      +    <?cs call:list("Exceptions", class.package.exceptions) ?>
      +    <?cs call:list("Errors", class.package.errors) ?>
      +  </ul>
      +  <?cs elif:subcount(package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:class_link_list("Annotations", package.annotations) ?>
      +    <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      +    <?cs call:class_link_list("Classes", package.classes) ?>
      +    <?cs call:class_link_list("Enums", package.enums) ?>
      +    <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      +    <?cs call:class_link_list("Errors", package.errors) ?>
      +  </ul>
      +  <?cs /if ?>
      +</div>
      +<?cs /if ?>
       
      +<?cs if:!devsite ?>
      +<?cs include:"footer.cs" ?>
       <?cs include:"trailer.cs" ?>
      -
      +<?cs /if ?>
       </body>
       </html>
      diff --git a/tools/droiddoc/templates-sdk/packages.cs b/tools/droiddoc/templates-sdk/packages.cs
      index fe6a5aa64a0..3fcfb8188d8 100644
      --- a/tools/droiddoc/templates-sdk/packages.cs
      +++ b/tools/droiddoc/templates-sdk/packages.cs
      @@ -1,33 +1,19 @@
      -<?cs include:"doctype.cs" ?>
      +<?cs # THIS CREATES A LIST OF ALL PACKAGES AND NAMES IT packages.html ?>
       <?cs include:"macros.cs" ?>
      +<?cs include:"doctype.cs" ?>
       <html<?cs if:devsite ?> devsite<?cs /if ?>>
       <?cs include:"head_tag.cs" ?>
      -<body class="gc-documentation <?cs if:(reference.gms || reference.gcm) ?>google<?cs /if ?>
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -    if:reference ?> reference<?cs
      -    /if ?><?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>">
      -  <a name="top"></a>
      +<?cs include:"body_tag.cs" ?>
       <?cs include:"header.cs" ?>
       
      -<div class="col-12" id="doc-col">
      -
      -<div id="jd-header">
       <h1><?cs var:page.title ?></h1>
      -</div>
      -
      -<div id="jd-content">
      -
      -<div class="jd-descr">
      -<p><?cs call:tag_list(root.descr) ?></p>
      -</div>
      +<p>These are the API packages.
      +See all <a href="classes.html">API classes</a>.</p>
       
       <?cs set:count = #1 ?>
      -<table class="jd-sumtable">
      +<table>
       <?cs each:pkg = docs.packages ?>
      -    <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:pkg.since ?>" >
      +    <tr class="api apilevel-<?cs var:pkg.since ?>" >
               <td class="jd-linkcol"><?cs call:package_link(pkg) ?></td>
               <td class="jd-descrcol" width="100%"><?cs call:tag_list(pkg.shortDescr) ?></td>
           </tr>
      @@ -35,12 +21,33 @@
       <?cs /each ?>
       </table>
       
      -</div><!-- end jd-content -->
      +<?cs if:devsite ?>
      +<div class="data-reference-resources-wrapper">
      +  <?cs if:subcount(class.package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:list("Annotations", class.package.annotations) ?>
      +    <?cs call:list("Interfaces", class.package.interfaces) ?>
      +    <?cs call:list("Classes", class.package.classes) ?>
      +    <?cs call:list("Enums", class.package.enums) ?>
      +    <?cs call:list("Exceptions", class.package.exceptions) ?>
      +    <?cs call:list("Errors", class.package.errors) ?>
      +  </ul>
      +  <?cs elif:subcount(package) ?>
      +  <ul data-reference-resources>
      +    <?cs call:class_link_list("Annotations", package.annotations) ?>
      +    <?cs call:class_link_list("Interfaces", package.interfaces) ?>
      +    <?cs call:class_link_list("Classes", package.classes) ?>
      +    <?cs call:class_link_list("Enums", package.enums) ?>
      +    <?cs call:class_link_list("Exceptions", package.exceptions) ?>
      +    <?cs call:class_link_list("Errors", package.errors) ?>
      +  </ul>
      +  <?cs /if ?>
      +</div>
      +<?cs /if ?>
       
      +<?cs if:!devsite ?>
       <?cs include:"footer.cs" ?>
      -</div> <!-- end doc-content -->
      -
       <?cs include:"trailer.cs" ?>
      -
      +<?cs /if ?>
       </body>
       </html>
      diff --git a/tools/droiddoc/templates-sdk/page_info.cs b/tools/droiddoc/templates-sdk/page_info.cs
      new file mode 100644
      index 00000000000..fad12741947
      --- /dev/null
      +++ b/tools/droiddoc/templates-sdk/page_info.cs
      @@ -0,0 +1,109 @@
      +<?cs # optional, more info about the page, such as API level and links ?>
      +<?cs
      +# A modal dialog when API level is set too low for this page
      +?><div id="naMessage"></div>
      +<?cs
      +#
      +# If this is a package summary page...
      +#
      +?><?cs
      +if:subcount(package)
      +?>
      +<div id="api-info-block">
      +<div class="api-level">
      +  <?cs call:since_tags(package) ?>
      +  <?cs call:federated_refs(package) ?>
      +</div>
      +</div><?cs
      +#
      +# Or if this is a class page...
      +#
      +?><?cs
      +elif:subcount(class)
      +?>
      +<div id="api-info-block">
      +<div class="api-level">
      +  <?cs call:since_tags(class) ?><?cs
      +  if:class.deprecatedsince
      +    ?><br>Deprecated since <a href="<?cs var:toroot ?>guide/topics/manifest/uses-sdk-element.html#ApiLevels"
      +        >API level <?cs var:class.deprecatedsince ?></a><?cs
      +  /if ?>
      +  <?cs call:federated_refs(class) ?>
      +</div>
      +
      +<?cs # Set variables about whether there are inherited members; no output ?>
      +<?cs each:cl=class.inherited ?>
      +  <?cs if:subcount(cl.methods) ?>
      +   <?cs set:inhmethods = #1 ?>
      +  <?cs /if ?>
      +  <?cs if:subcount(cl.constants) ?>
      +   <?cs set:inhconstants = #1 ?>
      +  <?cs /if ?>
      +  <?cs if:subcount(cl.fields) ?>
      +   <?cs set:inhfields = #1 ?>
      +  <?cs /if ?>
      +  <?cs if:subcount(cl.attrs) ?>
      +   <?cs set:inhattrs = #1 ?>
      +  <?cs /if ?>
      +<?cs /each ?>
      +
      +<div class="sum-details-links">
      +<?cs if:inhattrs || inhconstants || inhfields || inhmethods || (!class.subclasses.hidden &&
      +     (subcount(class.subclasses.direct) || subcount(class.subclasses.indirect))) ?>
      +Summary:
      +<?cs if:subcount(class.inners) ?>
      +  <a href="#nestedclasses">Nested Classes</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.attrs) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lattrs">XML Attrs</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:inhattrs ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhattrs">Inherited XML Attrs</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.enumConstants) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#enumconstants">Enums</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.constants) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#constants">Constants</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:inhconstants ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhconstants">Inherited Constants</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.fields) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#lfields">Fields</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:inhfields ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhfields">Inherited Fields</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.ctors.public) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubctors">Ctors</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.ctors.protected) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#proctors">Protected Ctors</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.methods.public) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#pubmethods">Methods</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:subcount(class.methods.protected) ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#promethods">Protected Methods</a>
      +  <?cs set:linkcount = #1 ?>
      +<?cs /if ?>
      +<?cs if:inhmethods ?>
      +  <?cs if:linkcount ?>&#124; <?cs /if ?><a href="#inhmethods">Inherited Methods</a>
      +<?cs /if ?>
      +&#124; <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
      +<?cs /if ?>
      +</div><!-- end sum-details-links -->
      +</div><!-- end api-info-block --><?cs
      +/if ?><?cs # end of if package or class ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/sample.cs b/tools/droiddoc/templates-sdk/sample.cs
      index 7b4bf0f88e4..2c5b9d2def4 100644
      --- a/tools/droiddoc/templates-sdk/sample.cs
      +++ b/tools/droiddoc/templates-sdk/sample.cs
      @@ -5,11 +5,6 @@
       <body class="gc-documentation develop samples" itemscope itemtype="http://schema.org/Article">
       <?cs include:"header.cs" ?>
       
      -<div <?cs if:fullpage
      -?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute
      -?>class="col-13" id="doc-col"<?cs else
      -?>class="col-12" id="doc-col"<?cs /if ?> >
      -
       <!-- start breadcrumb block -->
       <div id="api-info-block">
         <div class="sum-details-links">
      @@ -30,7 +25,7 @@
       <div id="pathCrumb">
       <?cs each:item = parentdirs ?>
         <?cs if:LinkifyPathCrumb
      -    ?><a href="<?cs var:toroot ?><?cs var:item.Link ?>"><?cs var:item.Name ?></a> / 
      +    ?><a href="<?cs var:toroot ?><?cs var:item.Link ?>"><?cs var:item.Name ?></a> /
         <?cs else
           ?><?cs var:item.Name ?> / <?cs /if ?>
       <?cs /each ?>
      @@ -135,17 +130,10 @@
       
         </div> <!-- end jd-content -->
       
      -<?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
      -
      -<?cs include:"trailer.cs" ?>
      +  <?cs if:!devsite ?>
      +  <?cs include:"footer.cs" ?>
      +  <?cs include:"trailer.cs" ?>
      +  <?cs /if ?>
       
       </body>
       </html>
      -
      -
      -
      -
      -
      -
      -
      diff --git a/tools/droiddoc/templates-sdk/sampleindex.cs b/tools/droiddoc/templates-sdk/sampleindex.cs
      index e62d3fe9de5..db648ff2a72 100644
      --- a/tools/droiddoc/templates-sdk/sampleindex.cs
      +++ b/tools/droiddoc/templates-sdk/sampleindex.cs
      @@ -5,11 +5,6 @@
       <body class="gc-documentation develop samples" itemscope itemtype="http://schema.org/Article">
       <?cs include:"header.cs" ?>
       
      -<div <?cs if:fullpage
      -?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute
      -?>class="col-13" id="doc-col"<?cs else 
      -?>class="col-12" id="doc-col"<?cs /if ?> >
      -
       <!-- start breadcrumb block -->
       <div id="api-info-block">
       <div class="sum-details-links">
      @@ -126,7 +121,6 @@
         </div> <!-- end jd-content -->
       
       <?cs include:"footer.cs" ?>
      -</div><!-- end doc-content -->
       
       <?cs include:"trailer.cs" ?>
       
      diff --git a/tools/droiddoc/templates-sdk/samples_navtree_data.cs b/tools/droiddoc/templates-sdk/samples_navtree_data.cs
      index 24ac7b77cbd..b9b42141c97 100644
      --- a/tools/droiddoc/templates-sdk/samples_navtree_data.cs
      +++ b/tools/droiddoc/templates-sdk/samples_navtree_data.cs
      @@ -1,3 +1,8 @@
      -var SAMPLES_NAVTREE_DATA =
      -<?cs var:reference_tree ?>
      -;
      +toc:
      +- title: About the Samples
      +  path: /samples/index.html
      +
      +- title: What's New
      +  path: /samples/new/index.html
      +
      +<?cs var:samples_toc_tree ?>
      \ No newline at end of file
      diff --git a/tools/droiddoc/templates-sdk/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs
      deleted file mode 100644
      index c6679a677d9..00000000000
      --- a/tools/droiddoc/templates-sdk/sdkpage.cs
      +++ /dev/null
      @@ -1,443 +0,0 @@
      -<?cs include:"doctype.cs" ?>
      -<?cs include:"macros.cs" ?>
      -<?cs include:"../../../../frameworks/base/docs/html/sdk/sdk_vars.cs" ?>
      -<html<?cs if:devsite ?> devsite<?cs /if ?>>
      -<?cs if:sdk.redirect ?>
      -  <head>
      -    <title>Redirecting...</title>
      -    <meta http-equiv="refresh" content="0;url=<?cs var:toroot ?>sdk/<?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>index.html<?cs /if ?>">
      -  </head>
      -<?cs else ?>
      -  <?cs include:"head_tag.cs" ?>
      -<?cs /if ?>
      -<body class="gc-documentation
      -  <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
      -  elif:design ?>design<?cs
      -  elif:distribute ?>distribute<?cs
      -  /if ?>" itemscope itemtype="http://schema.org/CreativeWork">
      -  <a name="top"></a>
      -<?cs include:"header.cs" ?>
      -
      -
      -<div <?cs if:fullpage
      -?><?cs else
      -?>class="col-13" id="doc-col"<?cs /if ?> >
      -
      -<?cs if:sdk.redirect ?>
      -
      -<div class="g-unit">
      -  <div id="jd-content">
      -    <p>Redirecting to
      -    <a href="<?cs var:toroot ?>sdk/<?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>index.html<?cs /if ?>"><?cs
      -      if:sdk.redirect.path ?><?cs var:sdk.redirect.path ?><?cs
      -      else ?>Download the SDK<?cs /if ?>
      -    </a> ...</p>
      -
      -<?cs else ?>
      -<?cs # else, if NOT redirect ...
      -#
      -#
      -# The following is for SDK/NDK pages
      -#
      -#
      -?>
      -
      -<?cs if:header.hide ?><?cs else ?>
      -<h1 itemprop="name"><?cs var:page.title ?></h1>
      -<?cs /if ?>
      -  <div id="jd-content" itemprop="description">
      -
      -<?cs if:sdk.not_latest_version ?>
      -  <div class="special">
      -    <p><strong>This is NOT the current Android SDK release.</strong></p>
      -    <p><a href="/sdk/index.html">Download the current Android SDK</a></p>
      -  </div>
      -<?cs /if ?>
      -
      -
      -<?cs if:ndk ?>
      -<?cs #
      -#
      -#
      -#
      -#
      -#
      -#
      -# the following is for the NDK
      -#
      -# (nested in if/else redirect)
      -#
      -#
      -#
      -#
      -?>
      -
      -  <table class="download" id="download-table">
      -    <tr>
      -      <th>Platform</th>
      -      <th>Package</th>
      -      <th style="white-space:nowrap">Size (Bytes)</th>
      -      <th>SHA1 Checksum</th>
      -  </tr>
      -  <tr>
      -    <td>Windows 32-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.win32_download ?>"><?cs var:ndk.win32_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win32_bytes ?></td>
      -    <td><?cs var:ndk.win32_checksum ?></td>
      -  </tr>
      - <!-- <tr>
      -   <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/ndk/<?cs var:ndk.win32.legacy_download ?>"><?cs var:ndk.win32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.win32.legacy_checksum ?></td>
      -  </tr> -->
      -  <tr>
      -    <td>Windows 64-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.win64_download ?>"><?cs var:ndk.win64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win64_bytes ?></td>
      -    <td><?cs var:ndk.win64_checksum ?></td>
      -  </tr>
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.win64.legacy_download ?>"><?cs var:ndk.win64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.win64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.win64.legacy_checksum ?></td>
      -  </tr> -->
      -<!--   (this item is deprecated)
      -  <tr>
      -    <td>Mac OS X 32-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.mac32_download ?>"><?cs var:ndk.mac32_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac32_bytes ?></td>
      -    <td><?cs var:ndk.mac32_checksum ?></td>
      -  </tr> -->
      - <!-- (this item is deprecated)
      -  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.mac32.legacy_download ?>"><?cs var:ndk.mac32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.mac32.legacy_checksum ?></td>
      -  </tr> -->
      -    <td>Mac OS X 64-bit</td>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.mac64_download ?>"><?cs var:ndk.mac64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac64_bytes ?></td>
      -    <td><?cs var:ndk.mac64_checksum ?></td>
      -  </tr>
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.mac64.legacy_download ?>"><?cs var:ndk.mac64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.mac64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.mac64.legacy_checksum ?></td>
      -  </tr> -->
      - <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.linux32.legacy_download ?>"><?cs var:ndk.linux32.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux32.legacy_bytes ?></td>
      -    <td><?cs var:ndk.linux32.legacy_checksum ?></td>
      -  </tr> -->
      -  <tr>
      -    <td>Linux 64-bit (x86)</td>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.linux64_download ?>"><?cs var:ndk.linux64_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux64_bytes ?></td>
      -    <td><?cs var:ndk.linux64_checksum ?></td>
      -  </tr>
      -  <!--  <tr>
      -    <td>
      -  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
      -     href="//dl.google.com/android/repository/<?cs var:ndk.linux64.legacy_download ?>"><?cs var:ndk.linux64.legacy_download ?></a>
      -    </td>
      -    <td><?cs var:ndk.linux64.legacy_bytes ?></td>
      -    <td><?cs var:ndk.linux64.legacy_checksum ?></td>
      -  </tr> -->
      -
      -  </table>
      -
      -  <?cs ########  HERE IS THE JD DOC CONTENT ######### ?>
      -  <?cs call:tag_list(root.descr) ?>
      -
      -
      -<?cs ########  The NDK version of the download script ######### ?>
      -<script>
      -  function onDownload(link) {
      -
      -    $("#downloadForRealz").html("Download " + $(link).text());
      -    $("#downloadForRealz").attr('href',$(link).attr('href'));
      -
      -    return false;
      -  }
      -
      -
      -  function onAgreeChecked() {
      -    if ($("input#agree").is(":checked")) {
      -      $("a#downloadForRealz").removeClass('disabled');
      -    } else {
      -      $("a#downloadForRealz").addClass('disabled');
      -    }
      -  }
      -
      -
      -  function onDownloadForRealz(link) {
      -    if ($("input#agree").is(':checked')) {
      -      $("div.sdk-terms").slideUp();
      -      $("h2#tos-header").text('Now downloading...');
      -      $(".sdk-terms-intro").text('Your download is in progress.');
      -      $("#sdk-terms-form").fadeOut('slow', function() {
      -        setTimeout(function() {
      -          // close the dialog
      -          $('#ndk_tos').trigger('modal-close');
      -          // reload to refresh the tos or optionally forward the user
      -           location.reload();
      -        }, 3000);
      -      });
      -      ga('send', 'event', 'SDK', 'NDK tools', $("#downloadForRealz").html());
      -      return true;
      -    } else {
      -      return false;
      -    }
      -  }
      -
      -
      -  $(window).hashchange( function(){
      -    if (location.hash == "") {
      -      location.reload();
      -    }
      -  });
      -
      -</script>
      -
      -  <?cs else ?>
      -<?cs # end if NDK ...
      -#
      -#
      -#
      -#
      -#
      -#
      -# the following is for the SDK
      -#
      -# (nested in if/else redirect and if/else NDK)
      -#
      -#
      -#
      -#
      -?>
      -  <?cs if:android.whichdoc == "online" ?>
      -
      -
      -<?cs ########  HERE IS THE JD DOC CONTENT FOR ONLINE ######### ?>
      -<?cs call:tag_list(root.descr) ?>
      -
      -
      -<?cs #######  TODO: Remove this whole file from processing. ######## ?>
      -
      -
      -<?cs ########  The Android Studio version of the download script ######### ?>
      -<script>
      -  var os;
      -  var bundlename;
      -  var $toolslink;
      -
      -  if (navigator.appVersion.indexOf("Mobile")!=-1) {
      -    // Do nothing for any "mobile" user agent
      -  } else if (navigator.appVersion.indexOf("Win")!=-1) {
      -    os = "Windows";
      -    bundlename = '#win-bundle';
      -    $toolslink = $('#win-tools');
      -  } else if (navigator.appVersion.indexOf("Mac")!=-1) {
      -    os = "Mac";
      -    bundlename = '#mac-bundle';
      -    $toolslink = $('#mac-tools');
      -  } else if (navigator.appVersion.indexOf("Linux")!=-1 && navigator.appVersion.indexOf("Android")==-1) {
      -    os = "Linux";
      -    bundlename = '#linux-bundle';
      -    $toolslink = $('#linux-tools');
      -  }
      -
      -  if (os != undefined) {
      -    $('#not-supported').hide();
      -
      -    /* set up primary Android Studio download button */
      -    idname = bundlename + "-size";
      -    sizeMB = $(idname).text().split(' MB')[0];
      -    $('.download-bundle-button > .small').html(" for " + os + " <em>(" + sizeMB + " MB)</em>");
      -    $('.download-bundle-button').click(function() {return onDownload(this,true,true);}).attr('href', bundlename);
      -  }
      -
      -
      -  function onDownload(link, button, bundle) {
      -
      -    /* set text for download button */
      -    if (button) {
      -      $("#downloadForRealz").html($(link).text());
      -    } else {
      -      $("#downloadForRealz").html("Download " + $(link).text());
      -    }
      -
      -    $("#downloadForRealz").attr('bundle', bundle);
      -    if (bundle && !button) {
      -      $("a#downloadForRealz").attr("name", "#" + $(link).attr('id'));
      -    } else {
      -      $("h2#tos-header").text('Download the Android SDK Tools');
      -      $("a#downloadForRealz").attr("name", $(link).attr('href'));
      -    }
      -
      -    return false;
      -  }
      -
      -
      -  function onAgreeChecked() {
      -    /* verify that the TOS is agreed */
      -    if ($("input#agree").is(":checked")) {
      -
      -      /* if downloading the bundle */
      -      if ($("#downloadForRealz").attr('bundle')) {
      -        /* construct the name of the link we want */
      -        linkId = $("a#downloadForRealz").attr("name");
      -        /* set the real url for download */
      -        $("a#downloadForRealz").attr("href", $(linkId).attr("href"));
      -      } else {
      -        $("a#downloadForRealz").attr("href", $("a#downloadForRealz").attr("name"));
      -      }
      -
      -      /* reveal the download button */
      -      $("a#downloadForRealz").removeClass('disabled');
      -    } else {
      -      $("a#downloadForRealz").addClass('disabled');
      -    }
      -  }
      -
      -  function onDownloadForRealz(link) {
      -    if ($("input#agree").is(':checked')) {
      -      $("div.sdk-terms").slideUp();
      -      if ($("#downloadForRealz").attr('bundle') == 'true') {
      -        $("h2#tos-header").text('Now downloading Android Studio!');
      -        $(".sdk-terms-intro").text('Redirecting to the install instructions...');
      -        $("#sdk-terms-form").slideUp(function() {
      -          setTimeout(function() {
      -            window.location = "/sdk/installing/index.html";
      -          }, 2000);
      -        });
      -      } else {
      -        $("h2#tos-header").text('Now downloading the Android SDK Tools!');
      -        $(".sdk-terms-intro").html("<p>Because you've chosen to download " +
      -          "only the Android SDK tools (and not Android Studio), there are no " +
      -          "setup procedures to follow.</p><p>For information about how to " +
      -          "keep your SDK tools up to date, refer to the " +
      -          "<a href='/tools/help/sdk-manager.html'>SDK Manager</a> guide.</p>");
      -        $("#sdk-terms-form").slideUp();
      -      }
      -      ga('send', 'event', 'SDK', 'IDE and Tools', $("#downloadForRealz").html());
      -      return true;
      -    } else {
      -      return false;
      -    }
      -  }
      -
      -  $(window).hashchange( function(){
      -    if (location.hash == "") {
      -      location.reload();
      -    }
      -  });
      -
      -</script>
      -
      -
      -
      -
      -<?cs # THIS DIV WAS OPENED IN INDEX.JD ?>
      -
      -
      -
      -
      -  <?cs else ?> <?cs # end if online ?>
      -
      -    <?cs if:sdk.preview ?><?cs # it's preview offline docs ?>
      -      <p>Welcome developers! We are pleased to provide you with a preview SDK for the upcoming
      -    Android 3.0 release, to give you a head-start on developing applications for it.
      -    </p>
      -
      -      <p>See the <a
      -    href="<?cs var:toroot ?>sdk/preview/start.html">Getting Started</a> document for more information
      -    about how to set up the preview SDK and get started.</p>
      -    <style type="text/css">
      -    .non-preview { display:none; }
      -    </style>
      -
      -    <?cs else ?><?cs # it's normal offline docs ?>
      -
      -      <?cs ########  HERE IS THE JD DOC CONTENT FOR OFFLINE ######### ?>
      -      <?cs call:tag_list(root.descr) ?>
      -      <style type="text/css">
      -        body .offline { display:block; }
      -        body .online { display:none; }
      -      </style>
      -      <script>
      -        $('.reqs').show();
      -      </script>
      -    <?cs /if ?>
      -
      -  <?cs /if ?> <?cs # end if/else online ?>
      -
      -<?cs /if ?> <?cs # end if/else NDK ?>
      -
      -<?cs /if ?> <?cs # end if/else redirect ?>
      -
      -
      -</div><!-- end jd-content -->
      -
      -<?cs if:!sdk.redirect ?>
      -<?cs include:"footer.cs" ?>
      -<?cs /if ?>
      -
      -</div><!-- end g-unit -->
      -
      -<?cs include:"trailer.cs" ?>
      -<script src="https://developer.android.com/ytblogger_lists_unified.js?v=17" type="text/javascript"></script>
      -<script src="/jd_lists_unified.js?v=17" type="text/javascript"></script>
      -<script src="/jd_extras.js?v=17" type="text/javascript"></script>
      -<script src="/jd_collections.js?v=17" type="text/javascript"></script>
      -<script src="/jd_tag_helpers.js?v=17" type="text/javascript"></script>
      -
      -<!-- Start of Tag -->
      -<script type="text/javascript">
      -var axel = Math.random() + "";
      -var a = axel * 10000000000000;
      -document.write('<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>');
      -</script>
      -<noscript>
      -<iframe src="https://2507573.fls.doubleclick.net/activityi;src=2507573;type=other026;cat=googl348;ord=1?" width="1" height="1" frameborder="0" style="display:none"></iframe>
      -</noscript>
      -<!-- End of Tag -->
      -</body>
      -</html>
      -
      -
      -
      diff --git a/tools/droiddoc/templates-sdk/trailer.cs b/tools/droiddoc/templates-sdk/trailer.cs
      index 225b2c16944..2050475fd10 100644
      --- a/tools/droiddoc/templates-sdk/trailer.cs
      +++ b/tools/droiddoc/templates-sdk/trailer.cs
      @@ -1,4 +1,7 @@
      -</div> <!-- end .cols --> <?cs # normally opened by header.cs ?>
      +<?cs
      +# Other, non-visible things needed at the end of the page,
      +# because not every page needs footer content, but does need other stuff
      +?>
       </div> <!-- end body-content --> <?cs # normally opened by header.cs ?>
       
       <?cs if:carousel ?>
      @@ -19,3 +22,17 @@
       </script>
       <?cs /if ?>
       
      +<script src="https://developer.android.com/ytblogger_lists_unified.js" defer></script>
      +<script src="/jd_lists_unified_en.js?v=17" defer></script>
      +<script src="/reference/lists.js?v=17" defer></script>
      +<script src="/reference/gcm_lists.js?v=17" defer></script>
      +<script src="/reference/gms_lists.js?v=17" defer></script>
      +<script>
      +  // Load localized metadata.
      +  (function(lang) {
      +    if (lang === 'en') { return; }
      +
      +    // Write it to the document so it gets evaluated before DOMContentReady.
      +    document.write('<script src="/jd_lists_unified_' + lang + '.js?v=14" defer></' + 'script>');
      +  })(getLangPref())
      +</script>
      diff --git a/tools/droiddoc/templates-sdk/yaml_navtree.cs b/tools/droiddoc/templates-sdk/yaml_navtree.cs
      new file mode 100644
      index 00000000000..e5a6404ecc0
      --- /dev/null
      +++ b/tools/droiddoc/templates-sdk/yaml_navtree.cs
      @@ -0,0 +1,14 @@
      +<?cs
      +
      +# print out the yaml nav for the reference docs, only printing the title,
      +path, and status_text (API level) for each package.
      +
      +?>
      +reference:<?cs
      +each:page = docs.pages?><?cs
      +  if:page.type == "package"?>
      +- title: <?cs var:page.label ?>
      +  path: /<?cs var:page.link ?>
      +  status_text: apilevel-<?cs var:page.apilevel ?><?cs
      +  /if?><?cs
      +/each ?>
      diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
      index 6e5c9d6c804..823cd33496c 100755
      --- a/tools/releasetools/add_img_to_target_files.py
      +++ b/tools/releasetools/add_img_to_target_files.py
      @@ -39,6 +39,7 @@
       
       import build_image
       import common
      +import sparse_img
       
       OPTIONS = common.OPTIONS
       
      @@ -48,6 +49,19 @@
       OPTIONS.replace_verity_private_key = False
       OPTIONS.verity_signer_path = None
       
      +def GetCareMap(which, imgname):
      +  """Generate care_map of system (or vendor) partition"""
      +
      +  assert which in ("system", "vendor")
      +  _, blk_device = common.GetTypeAndDevice("/" + which, OPTIONS.info_dict)
      +
      +  simg = sparse_img.SparseImage(imgname)
      +  care_map_list = []
      +  care_map_list.append(blk_device)
      +  care_map_list.append(simg.care_map.to_string_raw())
      +  return care_map_list
      +
      +
       def AddSystem(output_zip, prefix="IMAGES/", recovery_img=None, boot_img=None):
         """Turn the contents of SYSTEM into a system image and store it in
         output_zip."""
      @@ -55,7 +69,7 @@ def AddSystem(output_zip, prefix="IMAGES/", recovery_img=None, boot_img=None):
         prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "system.img")
         if os.path.exists(prebuilt_path):
           print("system.img already exists in %s, no need to rebuild..." % prefix)
      -    return
      +    return prebuilt_path
       
         def output_sink(fn, data):
           ofile = open(os.path.join(OPTIONS.input_tmp, "SYSTEM", fn), "w")
      @@ -72,6 +86,7 @@ def output_sink(fn, data):
                               block_list=block_list)
         common.ZipWrite(output_zip, imgname, prefix + "system.img")
         common.ZipWrite(output_zip, block_list, prefix + "system.map")
      +  return imgname
       
       
       def BuildSystem(input_dir, info_dict, block_list=None):
      @@ -80,6 +95,24 @@ def BuildSystem(input_dir, info_dict, block_list=None):
         return CreateImage(input_dir, info_dict, "system", block_list=block_list)
       
       
      +def AddSystemOther(output_zip, prefix="IMAGES/"):
      +  """Turn the contents of SYSTEM_OTHER into a system_other image
      +  and store it in output_zip."""
      +
      +  prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "system_other.img")
      +  if os.path.exists(prebuilt_path):
      +    print "system_other.img already exists in %s, no need to rebuild..." % (prefix,)
      +    return
      +
      +  imgname = BuildSystemOther(OPTIONS.input_tmp, OPTIONS.info_dict)
      +  common.ZipWrite(output_zip, imgname, prefix + "system_other.img")
      +
      +def BuildSystemOther(input_dir, info_dict):
      +  """Build the (sparse) system_other image and return the name of a temp
      +  file containing it."""
      +  return CreateImage(input_dir, info_dict, "system_other", block_list=None)
      +
      +
       def AddVendor(output_zip, prefix="IMAGES/"):
         """Turn the contents of VENDOR into a vendor image and store in it
         output_zip."""
      @@ -87,13 +120,14 @@ def AddVendor(output_zip, prefix="IMAGES/"):
         prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "vendor.img")
         if os.path.exists(prebuilt_path):
           print("vendor.img already exists in %s, no need to rebuild..." % prefix)
      -    return
      +    return prebuilt_path
       
         block_list = common.MakeTempFile(prefix="vendor-blocklist-", suffix=".map")
         imgname = BuildVendor(OPTIONS.input_tmp, OPTIONS.info_dict,
                               block_list=block_list)
         common.ZipWrite(output_zip, imgname, prefix + "vendor.img")
         common.ZipWrite(output_zip, block_list, prefix + "vendor.map")
      +  return imgname
       
       
       def BuildVendor(input_dir, info_dict, block_list=None):
      @@ -146,8 +180,9 @@ def CreateImage(input_dir, info_dict, what, block_list=None):
       
         image_props = build_image.ImagePropFromGlobalDict(info_dict, what)
         fstab = info_dict["fstab"]
      -  if fstab:
      -    image_props["fs_type"] = fstab["/" + what].fs_type
      +  mount_point = "/" + what
      +  if fstab and mount_point in fstab:
      +    image_props["fs_type"] = fstab[mount_point].fs_type
       
         # Use a fixed timestamp (01/01/2009) when packaging the image.
         # Bug: 24377993
      @@ -346,6 +381,9 @@ def AddImagesToTargetFiles(filename):
         except KeyError:
           has_oem = False
       
      +  has_system_other = "SYSTEM_OTHER/" in input_zip.namelist()
      +  
      +
         OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.input_tmp)
       
         common.ZipClose(input_zip)
      @@ -388,10 +426,15 @@ def banner(s):
               recovery_image.AddToZip(output_zip)
       
         banner("system")
      -  AddSystem(output_zip, recovery_img=recovery_image, boot_img=boot_image)
      +  system_imgname = AddSystem(output_zip, recovery_img=recovery_image,
      +                             boot_img=boot_image)
      +  vendor_imgname = None
         if has_vendor:
           banner("vendor")
      -    AddVendor(output_zip)
      +    vendor_imgname = AddVendor(output_zip)
      +  if has_system_other:
      +    banner("system_other")
      +    AddSystemOther(output_zip)
         banner("userdata")
         AddUserdata(output_zip)
         banner("extrauserdata")
      @@ -409,7 +452,19 @@ def banner(s):
         if os.path.exists(ab_partitions):
           with open(ab_partitions, 'r') as f:
             lines = f.readlines()
      +    # For devices using A/B update, generate care_map for system and vendor
      +    # partitions (if present), then write this file to target_files package.
      +    care_map_list = []
           for line in lines:
      +      if line.strip() == "system" and OPTIONS.info_dict.get(
      +          "system_verity_block_device", None) is not None:
      +        assert os.path.exists(system_imgname)
      +        care_map_list += GetCareMap("system", system_imgname)
      +      if line.strip() == "vendor" and OPTIONS.info_dict.get(
      +          "vendor_verity_block_device", None) is not None:
      +        assert os.path.exists(vendor_imgname)
      +        care_map_list += GetCareMap("vendor", vendor_imgname)
      +
             img_name = line.strip() + ".img"
             img_radio_path = os.path.join(OPTIONS.input_tmp, "RADIO", img_name)
             if os.path.exists(img_radio_path):
      @@ -420,6 +475,10 @@ def banner(s):
             img_path = 'IMAGES/' + img_name
             assert img_path in output_zip.namelist(), "cannot find " + img_name
       
      +    if care_map_list:
      +      file_path = "META/care_map.txt"
      +      common.ZipWriteStr(output_zip, file_path, '\n'.join(care_map_list))
      +
         common.ZipClose(output_zip)
       
       def main(argv):
      diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
      index 0f3f190bd5e..36732e12809 100644
      --- a/tools/releasetools/blockimgdiff.py
      +++ b/tools/releasetools/blockimgdiff.py
      @@ -342,19 +342,20 @@ def HashBlocks(self, source, ranges): # pylint: disable=no-self-use
           return ctx.hexdigest()
       
         def WriteTransfers(self, prefix):
      -    def WriteTransfersZero(out, to_zero):
      -      """Limit the number of blocks in command zero to 1024 blocks.
      +    def WriteSplitTransfers(out, style, target_blocks):
      +      """Limit the size of operand in command 'new' and 'zero' to 1024 blocks.
       
             This prevents the target size of one command from being too large; and
             might help to avoid fsync errors on some devices."""
       
      -      zero_blocks_limit = 1024
      +      assert (style == "new" or style == "zero")
      +      blocks_limit = 1024
             total = 0
      -      while to_zero:
      -        zero_blocks = to_zero.first(zero_blocks_limit)
      -        out.append("zero %s\n" % (zero_blocks.to_string_raw(),))
      -        total += zero_blocks.size()
      -        to_zero = to_zero.subtract(zero_blocks)
      +      while target_blocks:
      +        blocks_to_write = target_blocks.first(blocks_limit)
      +        out.append("%s %s\n" % (style, blocks_to_write.to_string_raw()))
      +        total += blocks_to_write.size()
      +        target_blocks = target_blocks.subtract(blocks_to_write)
             return total
       
           out = []
      @@ -478,7 +479,7 @@ def WriteTransfersZero(out, to_zero):
       
             if xf.style == "new":
               assert xf.tgt_ranges
      -        out.append("%s %s\n" % (xf.style, xf.tgt_ranges.to_string_raw()))
      +        assert tgt_size == WriteSplitTransfers(out, xf.style, xf.tgt_ranges)
               total += tgt_size
             elif xf.style == "move":
               assert xf.tgt_ranges
      @@ -538,7 +539,7 @@ def WriteTransfersZero(out, to_zero):
             elif xf.style == "zero":
               assert xf.tgt_ranges
               to_zero = xf.tgt_ranges.subtract(xf.src_ranges)
      -        assert WriteTransfersZero(out, to_zero) == to_zero.size()
      +        assert WriteSplitTransfers(out, xf.style, to_zero) == to_zero.size()
               total += to_zero.size()
             else:
               raise ValueError("unknown transfer style '%s'\n" % xf.style)
      @@ -568,7 +569,7 @@ def WriteTransfersZero(out, to_zero):
       
           # Zero out extended blocks as a workaround for bug 20881595.
           if self.tgt.extended:
      -      assert (WriteTransfersZero(out, self.tgt.extended) ==
      +      assert (WriteSplitTransfers(out, "zero", self.tgt.extended) ==
                     self.tgt.extended.size())
             total += self.tgt.extended.size()
       
      diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
      index 864d904aa10..1f9536005e7 100755
      --- a/tools/releasetools/build_image.py
      +++ b/tools/releasetools/build_image.py
      @@ -436,6 +436,8 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
             build_command.extend(["-z", prop_dict["squashfs_compressor"]])
           if "squashfs_compressor_opt" in prop_dict:
             build_command.extend(["-zo", prop_dict["squashfs_compressor_opt"]])
      +    if "squashfs_block_size" in prop_dict:
      +      build_command.extend(["-b", prop_dict["squashfs_block_size"]])
           if "squashfs_disable_4k_align" in prop_dict and prop_dict.get("squashfs_disable_4k_align") == "true":
             build_command.extend(["-a"])
         elif fs_type.startswith("f2fs"):
      @@ -586,8 +588,22 @@ def copy_prop(src_p, dest_p):
           copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
           copy_prop("system_squashfs_compressor", "squashfs_compressor")
           copy_prop("system_squashfs_compressor_opt", "squashfs_compressor_opt")
      +    copy_prop("system_squashfs_block_size", "squashfs_block_size")
           copy_prop("system_squashfs_disable_4k_align", "squashfs_disable_4k_align")
           copy_prop("system_base_fs_file", "base_fs_file")
      +  elif mount_point == "system_other":
      +    # We inherit the selinux policies of /system since we contain some of its files.
      +    d["mount_point"] = "system"
      +    copy_prop("fs_type", "fs_type")
      +    copy_prop("system_fs_type", "fs_type")
      +    copy_prop("system_size", "partition_size")
      +    copy_prop("system_journal_size", "journal_size")
      +    copy_prop("system_verity_block_device", "verity_block_device")
      +    copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
      +    copy_prop("system_squashfs_compressor", "squashfs_compressor")
      +    copy_prop("system_squashfs_compressor_opt", "squashfs_compressor_opt")
      +    copy_prop("system_squashfs_block_size", "squashfs_block_size")
      +    copy_prop("system_base_fs_file", "base_fs_file")
         elif mount_point == "data":
           # Copy the generic fs type first, override with specific one if available.
           copy_prop("fs_type", "fs_type")
      @@ -609,6 +625,7 @@ def copy_prop(src_p, dest_p):
           copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
           copy_prop("vendor_squashfs_compressor", "squashfs_compressor")
           copy_prop("vendor_squashfs_compressor_opt", "squashfs_compressor_opt")
      +    copy_prop("vendor_squashfs_block_size", "squashfs_block_size")
           copy_prop("vendor_squashfs_disable_4k_align", "squashfs_disable_4k_align")
           copy_prop("vendor_base_fs_file", "base_fs_file")
         elif mount_point == "oem":
      @@ -654,6 +671,8 @@ def main(argv):
           mount_point = ""
           if image_filename == "system.img":
             mount_point = "system"
      +    elif image_filename == "system_other.img":
      +      mount_point = "system_other"
           elif image_filename == "userdata.img":
             mount_point = "data"
           elif image_filename == "cache.img":
      diff --git a/tools/releasetools/check_target_files_signatures.py b/tools/releasetools/check_target_files_signatures.py
      index df3be2f0697..a6746c6a318 100755
      --- a/tools/releasetools/check_target_files_signatures.py
      +++ b/tools/releasetools/check_target_files_signatures.py
      @@ -254,7 +254,7 @@ def LoadZipFile(self, filename):
                   fullname = os.path.join(dirpath, fn)
                   displayname = fullname[len(d)+1:]
                   apk = APK(fullname, displayname)
      -            self.apks[apk.package] = apk
      +            self.apks[apk.filename] = apk
                   self.apks_by_basename[os.path.basename(apk.filename)] = apk
       
                   self.max_pkg_len = max(self.max_pkg_len, len(apk.package))
      @@ -327,7 +327,7 @@ def PrintCerts(self):
               else:
                 print("  %-*s  %-*s" % (self.max_fn_len, apk.filename,
                                         self.max_pkg_len, apk.package))
      -      print()
      +        print()
       
         def CompareWith(self, other):
           """Look for instances where a given package that exists in both
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 9e2b9a368ee..5cd1aca0269 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -275,11 +275,18 @@ def makeint(key):
         makeint("boot_size")
         makeint("fstab_version")
       
      -  if d.get("no_recovery", False) == "true":
      -    d["fstab"] = None
      -  else:
      +  system_root_image = d.get("system_root_image", None) == "true"
      +  if d.get("no_recovery", None) != "true":
      +    recovery_fstab_path = "RECOVERY/RAMDISK/etc/recovery.fstab"
           d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"],
      -                                   d["device_type"], d.get("system_root_image", False))
      +        recovery_fstab_path, system_root_image)
      +  elif d.get("recovery_as_boot", None) == "true":
      +    recovery_fstab_path = "BOOT/RAMDISK/etc/recovery.fstab"
      +    d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], d["device_type"],
      +        recovery_fstab_path, system_root_image)
      +  else:
      +    d["fstab"] = None
      +
         d["build.prop"] = LoadBuildProp(read_helper)
         return d
       
      @@ -302,7 +309,8 @@ def LoadDictionaryFromLines(lines):
             d[name] = value
         return d
       
      -def LoadRecoveryFSTab(read_helper, fstab_version, type, system_root_image=False):
      +def LoadRecoveryFSTab(read_helper, fstab_version, type, recovery_fstab_path,
      +                      system_root_image=False):
         class Partition(object):
           def __init__(self, mount_point, fs_type, device, length, device2, context):
             self.mount_point = mount_point
      @@ -313,9 +321,9 @@ def __init__(self, mount_point, fs_type, device, length, device2, context):
             self.context = context
       
         try:
      -    data = read_helper("RECOVERY/RAMDISK/etc/recovery.fstab")
      +    data = read_helper(recovery_fstab_path)
         except KeyError:
      -    print("Warning: could not find RECOVERY/RAMDISK/etc/recovery.fstab")
      +    print("Warning: could not find %s" % format(recovery_fstab_path))
           data = ""
       
         if fstab_version == 1:
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 08b8dd7cf83..44bcb7c2619 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -125,6 +125,16 @@
             Override build.prop items with custom vendor init.
             Enabled when TARGET_UNIFIED_DEVICE is defined in BoardConfig
       
      +  --payload_signer <signer>
      +      Specify the signer when signing the payload and metadata for A/B OTAs.
      +      By default (i.e. without this flag), it calls 'openssl pkeyutl' to sign
      +      with the package private key. If the private key cannot be accessed
      +      directly, a payload signer that knows how to do that should be specified.
      +      The signer will be supplied with "-inkey <path_to_key>",
      +      "-in <input_file>" and "-out <output_file>" parameters.
      +
      +  --payload_signer_args <args>
      +      Specify the arguments needed for payload signer.
       """
       
       from __future__ import print_function
      @@ -138,6 +148,7 @@
       import multiprocessing
       import os
       import subprocess
      +import shlex
       import tempfile
       import zipfile
       
      @@ -177,6 +188,8 @@
       OPTIONS.backuptool = False
       OPTIONS.override_device = 'auto'
       OPTIONS.override_prop = False
      +OPTIONS.payload_signer = None
      +OPTIONS.payload_signer_args = []
       
       def MostPopularKey(d, default):
         """Given a dict, return the key corresponding to the largest
      @@ -974,15 +987,17 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
               int(i) for i in
               OPTIONS.info_dict.get("blockimgdiff_versions", "1").split(","))
       
      -  # Check first block of system partition for remount R/W only if
      -  # disk type is ext4
      -  system_partition = OPTIONS.source_info_dict["fstab"]["/system"]
      -  check_first_block = system_partition.fs_type == "ext4"
      +  # Check the first block of the source system partition for remount R/W only
      +  # if the filesystem is ext4.
      +  system_src_partition = OPTIONS.source_info_dict["fstab"]["/system"]
      +  check_first_block = system_src_partition.fs_type == "ext4"
         # Disable using imgdiff for squashfs. 'imgdiff -z' expects input files to be
         # in zip formats. However with squashfs, a) all files are compressed in LZ4;
         # b) the blocks listed in block map may not contain all the bytes for a given
         # file (because they're rounded to be 4K-aligned).
      -  disable_imgdiff = system_partition.fs_type == "squashfs"
      +  system_tgt_partition = OPTIONS.target_info_dict["fstab"]["/system"]
      +  disable_imgdiff = (system_src_partition.fs_type == "squashfs" or
      +                     system_tgt_partition.fs_type == "squashfs")
         system_diff = common.BlockDifference("system", system_tgt, system_src,
                                              check_first_block,
                                              version=blockimgdiff_version,
      @@ -1278,17 +1293,19 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
               "default_system_dev_certificate",
               "build/target/product/security/testkey")
       
      -  # A/B updater expects key in RSA format.
      -  cmd = ["openssl", "pkcs8",
      -         "-in", OPTIONS.package_key + OPTIONS.private_key_suffix,
      -         "-inform", "DER", "-nocrypt"]
      -  rsa_key = common.MakeTempFile(prefix="key-", suffix=".key")
      -  cmd.extend(["-out", rsa_key])
      -  p1 = common.Run(cmd, stdout=subprocess.PIPE)
      -  p1.wait()
      -  assert p1.returncode == 0, "openssl pkcs8 failed"
      -
      -  # Stage the output zip package for signing.
      +  # A/B updater expects a signing key in RSA format. Gets the key ready for
      +  # later use in step 3, unless a payload_signer has been specified.
      +  if OPTIONS.payload_signer is None:
      +    cmd = ["openssl", "pkcs8",
      +           "-in", OPTIONS.package_key + OPTIONS.private_key_suffix,
      +           "-inform", "DER", "-nocrypt"]
      +    rsa_key = common.MakeTempFile(prefix="key-", suffix=".key")
      +    cmd.extend(["-out", rsa_key])
      +    p1 = common.Run(cmd, stdout=subprocess.PIPE)
      +    p1.wait()
      +    assert p1.returncode == 0, "openssl pkcs8 failed"
      +
      +  # Stage the output zip package for package signing.
         temp_zip_file = tempfile.NamedTemporaryFile()
         output_zip = zipfile.ZipFile(temp_zip_file, "w",
                                      compression=zipfile.ZIP_DEFLATED)
      @@ -1349,21 +1366,30 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
         signed_metadata_sig_file = common.MakeTempFile(prefix="signed-sig-",
                                                        suffix=".bin")
         # 3a. Sign the payload hash.
      -  cmd = ["openssl", "pkeyutl", "-sign",
      -         "-inkey", rsa_key,
      -         "-pkeyopt", "digest:sha256",
      -         "-in", payload_sig_file,
      -         "-out", signed_payload_sig_file]
      +  if OPTIONS.payload_signer is not None:
      +    cmd = [OPTIONS.payload_signer]
      +    cmd.extend(OPTIONS.payload_signer_args)
      +  else:
      +    cmd = ["openssl", "pkeyutl", "-sign",
      +           "-inkey", rsa_key,
      +           "-pkeyopt", "digest:sha256"]
      +  cmd.extend(["-in", payload_sig_file,
      +              "-out", signed_payload_sig_file])
      +
         p1 = common.Run(cmd, stdout=subprocess.PIPE)
         p1.wait()
         assert p1.returncode == 0, "openssl sign payload failed"
       
         # 3b. Sign the metadata hash.
      -  cmd = ["openssl", "pkeyutl", "-sign",
      -         "-inkey", rsa_key,
      -         "-pkeyopt", "digest:sha256",
      -         "-in", metadata_sig_file,
      -         "-out", signed_metadata_sig_file]
      +  if OPTIONS.payload_signer is not None:
      +    cmd = [OPTIONS.payload_signer]
      +    cmd.extend(OPTIONS.payload_signer_args)
      +  else:
      +    cmd = ["openssl", "pkeyutl", "-sign",
      +           "-inkey", rsa_key,
      +           "-pkeyopt", "digest:sha256"]
      +  cmd.extend(["-in", metadata_sig_file,
      +              "-out", signed_metadata_sig_file])
         p1 = common.Run(cmd, stdout=subprocess.PIPE)
         p1.wait()
         assert p1.returncode == 0, "openssl sign metadata failed"
      @@ -1391,12 +1417,30 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
         p1.wait()
         assert p1.returncode == 0, "brillo_update_payload properties failed"
       
      +  if OPTIONS.wipe_user_data:
      +    with open(properties_file, "a") as f:
      +      f.write("POWERWASH=1\n")
      +    metadata["ota-wipe"] = "yes"
      +
         # Add the signed payload file and properties into the zip.
         common.ZipWrite(output_zip, properties_file, arcname="payload_properties.txt")
         common.ZipWrite(output_zip, signed_payload_file, arcname="payload.bin",
                         compress_type=zipfile.ZIP_STORED)
         WriteMetadata(metadata, output_zip)
       
      +  # If dm-verity is supported for the device, copy contents of care_map
      +  # into A/B OTA package.
      +  if OPTIONS.info_dict.get("verity") == "true":
      +    target_zip = zipfile.ZipFile(target_file, "r")
      +    care_map_path = "META/care_map.txt"
      +    namelist = target_zip.namelist()
      +    if care_map_path in namelist:
      +      care_map_data = target_zip.read(care_map_path)
      +      common.ZipWriteStr(output_zip, "care_map.txt", care_map_data)
      +    else:
      +      print "Warning: cannot find care map file in target_file package"
      +    common.ZipClose(target_zip)
      +
         # Sign the whole package to comply with the Android OTA package format.
         common.ZipClose(output_zip)
         SignOutput(temp_zip_file.name, output_file)
      @@ -2036,6 +2080,10 @@ def option_handler(o, a):
             OPTIONS.override_device = a
           elif o in ("--override_prop",):
             OPTIONS.override_prop = bool(a.lower() == 'true')
      +    elif o == "--payload_signer":
      +      OPTIONS.payload_signer = a
      +    elif o == "--payload_signer_args":
      +      OPTIONS.payload_signer_args = shlex.split(a)
           else:
             return False
           return True
      @@ -2067,7 +2115,9 @@ def option_handler(o, a):
                                        "log_diff=",
                                        "backup=",
                                        "override_device=",
      -                                 "override_prop="
      +                                 "override_prop=",
      +                                 "payload_signer=",
      +                                 "payload_signer_args=",
                                    ], extra_option_handler=option_handler)
       
         if len(args) != 2:
      diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
      index 7cf97c97bb5..9aa614fcb08 100755
      --- a/tools/releasetools/sign_target_files_apks.py
      +++ b/tools/releasetools/sign_target_files_apks.py
      @@ -51,10 +51,12 @@
             in which they appear on the command line.
       
         -o  (--replace_ota_keys)
      -      Replace the certificate (public key) used by OTA package
      -      verification with the one specified in the input target_files
      -      zip (in the META/otakeys.txt file).  Key remapping (-k and -d)
      -      is performed on this key.
      +      Replace the certificate (public key) used by OTA package verification
      +      with the ones specified in the input target_files zip (in the
      +      META/otakeys.txt file). Key remapping (-k and -d) is performed on the
      +      keys. For A/B devices, the payload verification key will be replaced
      +      as well. If there're multiple OTA keys, only the first one will be used
      +      for payload verification.
       
         -t  (--tag_changes)  <+tag>,<-tag>,...
             Comma-separated list of changes to make to the set of tags (in
      @@ -63,6 +65,19 @@
             removed.  Changes are processed in the order they appear.
             Default value is "-test-keys,-dev-keys,+release-keys".
       
      +  --replace_verity_private_key <key>
      +      Replace the private key used for verity signing. It expects a filename
      +      WITHOUT the extension (e.g. verity_key).
      +
      +  --replace_verity_public_key <key>
      +      Replace the certificate (public key) used for verity verification. The
      +      key file replaces the one at BOOT/RAMDISK/verity_key (or ROOT/verity_key
      +      for devices using system_root_image). It expects the key filename WITH
      +      the extension (e.g. verity_key.pub).
      +
      +  --replace_verity_keyid <path_to_X509_PEM_cert_file>
      +      Replace the veritykeyid in BOOT/cmdline of input_target_file_zip
      +      with keyid of the cert pointed by <path_to_X509_PEM_cert_file>.
       """
       
       from __future__ import print_function
      @@ -98,6 +113,7 @@
       OPTIONS.replace_ota_keys = False
       OPTIONS.replace_verity_public_key = False
       OPTIONS.replace_verity_private_key = False
      +OPTIONS.replace_verity_keyid = False
       OPTIONS.tag_changes = ("-test-keys", "-dev-keys", "+release-keys")
       
       def GetApkCerts(tf_zip):
      @@ -177,7 +193,9 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
                        for i in input_tf_zip.infolist()
                        if i.filename.endswith('.apk')])
         rebuild_recovery = False
      +  system_root_image = misc_info.get("system_root_image") == "true"
       
      +  # tmpdir will only be used to regenerate the recovery-from-boot patch.
         tmpdir = tempfile.mkdtemp()
         def write_to_temp(fn, attr, data):
           fn = os.path.join(tmpdir, fn)
      @@ -205,25 +223,6 @@ def write_to_temp(fn, attr, data):
           data = input_tf_zip.read(info.filename)
           out_info = copy.copy(info)
       
      -    # Replace keys if requested.
      -    if (info.filename == "META/misc_info.txt" and
      -        OPTIONS.replace_verity_private_key):
      -      ReplaceVerityPrivateKey(input_tf_zip, output_tf_zip, misc_info,
      -                              OPTIONS.replace_verity_private_key[1])
      -    elif (info.filename in ("BOOT/RAMDISK/verity_key",
      -                            "BOOT/verity_key") and
      -          OPTIONS.replace_verity_public_key):
      -      new_data = ReplaceVerityPublicKey(output_tf_zip, info.filename,
      -                                        OPTIONS.replace_verity_public_key[1])
      -      write_to_temp(info.filename, info.external_attr, new_data)
      -    # Copy BOOT/, RECOVERY/, META/, ROOT/ to rebuild recovery patch.
      -    elif (info.filename.startswith("BOOT/") or
      -          info.filename.startswith("RECOVERY/") or
      -          info.filename.startswith("META/") or
      -          info.filename.startswith("ROOT/") or
      -          info.filename == "SYSTEM/etc/recovery-resource.dat"):
      -      write_to_temp(info.filename, info.external_attr, data)
      -
           # Sign APKs.
           if info.filename.endswith(".apk"):
             name = os.path.basename(info.filename)
      @@ -237,16 +236,21 @@ def write_to_temp(fn, attr, data):
               # an APK we're not supposed to sign.
               print("NOT signing: %s" % name)
               common.ZipWriteStr(output_tf_zip, out_info, data)
      +
      +    # System properties.
           elif info.filename in ("SYSTEM/build.prop",
                                  "VENDOR/build.prop",
                                  "BOOT/RAMDISK/default.prop",
      +                           "ROOT/default.prop",
                                  "RECOVERY/RAMDISK/default.prop"):
             print("rewriting %s:" % info.filename)
             new_data = RewriteProps(data, misc_info)
             common.ZipWriteStr(output_tf_zip, out_info, new_data)
             if info.filename in ("BOOT/RAMDISK/default.prop",
      +                           "ROOT/default.prop",
                                  "RECOVERY/RAMDISK/default.prop"):
               write_to_temp(info.filename, info.external_attr, new_data)
      +
           elif info.filename.endswith("mac_permissions.xml"):
             print("rewriting %s with new keys." % info.filename)
             new_data = ReplaceCerts(data)
      @@ -255,30 +259,94 @@ def write_to_temp(fn, attr, data):
             print("rewriting %s with new keys." % info.filename)
             new_data = ReplaceCerts(data)
             common.ZipWriteStr(output_tf_zip, out_info, new_data)
      +
      +    # Trigger a rebuild of the recovery patch if needed.
           elif info.filename in ("SYSTEM/recovery-from-boot.p",
                                  "SYSTEM/etc/recovery.img",
                                  "SYSTEM/bin/install-recovery.sh"):
             rebuild_recovery = True
      +
      +    # Don't copy OTA keys if we're replacing them.
           elif (OPTIONS.replace_ota_keys and
      -          info.filename in ("RECOVERY/RAMDISK/res/keys",
      -                            "SYSTEM/etc/security/otacerts.zip")):
      -      # don't copy these files if we're regenerating them below
      +          info.filename in (
      +              "BOOT/RAMDISK/res/keys",
      +              "BOOT/RAMDISK/etc/update_engine/update-payload-key.pub.pem",
      +              "RECOVERY/RAMDISK/res/keys",
      +              "SYSTEM/etc/security/otacerts.zip",
      +              "SYSTEM/etc/update_engine/update-payload-key.pub.pem")):
             pass
      +
      +    # Skip META/misc_info.txt if we will replace the verity private key later.
           elif (OPTIONS.replace_verity_private_key and
                 info.filename == "META/misc_info.txt"):
             pass
      +
      +    # Skip verity public key if we will replace it.
           elif (OPTIONS.replace_verity_public_key and
                 info.filename in ("BOOT/RAMDISK/verity_key",
      -                            "BOOT/verity_key")):
      +                            "ROOT/verity_key")):
             pass
      +
      +    # Skip verity keyid (for system_root_image use) if we will replace it.
      +    elif (OPTIONS.replace_verity_keyid and
      +          info.filename == "BOOT/cmdline"):
      +      pass
      +
      +    # Skip the care_map as we will regenerate the system/vendor images.
      +    elif (info.filename == "META/care_map.txt"):
      +      pass
      +
      +    # Copy BOOT/, RECOVERY/, META/, ROOT/ to rebuild recovery patch. This case
      +    # must come AFTER other matching rules.
      +    elif (info.filename.startswith("BOOT/") or
      +          info.filename.startswith("RECOVERY/") or
      +          info.filename.startswith("META/") or
      +          info.filename.startswith("ROOT/") or
      +          info.filename == "SYSTEM/etc/recovery-resource.dat"):
      +      write_to_temp(info.filename, info.external_attr, data)
      +      common.ZipWriteStr(output_tf_zip, out_info, data)
      +
      +    # A non-APK file; copy it verbatim.
           else:
      -      # a non-APK file; copy it verbatim
             common.ZipWriteStr(output_tf_zip, out_info, data)
       
         if OPTIONS.replace_ota_keys:
           new_recovery_keys = ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info)
           if new_recovery_keys:
      -      write_to_temp("RECOVERY/RAMDISK/res/keys", 0o755 << 16, new_recovery_keys)
      +      if system_root_image:
      +        recovery_keys_location = "BOOT/RAMDISK/res/keys"
      +      else:
      +        recovery_keys_location = "RECOVERY/RAMDISK/res/keys"
      +      # The "new_recovery_keys" has been already written into the output_tf_zip
      +      # while calling ReplaceOtaKeys(). We're just putting the same copy to
      +      # tmpdir in case we need to regenerate the recovery-from-boot patch.
      +      write_to_temp(recovery_keys_location, 0o755 << 16, new_recovery_keys)
      +
      +  # Replace the keyid string in META/misc_info.txt.
      +  if OPTIONS.replace_verity_private_key:
      +    ReplaceVerityPrivateKey(input_tf_zip, output_tf_zip, misc_info,
      +                            OPTIONS.replace_verity_private_key[1])
      +
      +  if OPTIONS.replace_verity_public_key:
      +    if system_root_image:
      +      dest = "ROOT/verity_key"
      +    else:
      +      dest = "BOOT/RAMDISK/verity_key"
      +    # We are replacing the one in boot image only, since the one under
      +    # recovery won't ever be needed.
      +    new_data = ReplaceVerityPublicKey(
      +        output_tf_zip, dest, OPTIONS.replace_verity_public_key[1])
      +    write_to_temp(dest, 0o755 << 16, new_data)
      +
      +  # Replace the keyid string in BOOT/cmdline.
      +  if OPTIONS.replace_verity_keyid:
      +    new_cmdline = ReplaceVerityKeyId(input_tf_zip, output_tf_zip,
      +      OPTIONS.replace_verity_keyid[1])
      +    # Writing the new cmdline to tmpdir is redundant as the bootimage
      +    # gets build in the add_image_to_target_files and rebuild_recovery
      +    # is not exercised while building the boot image for the A/B
      +    # path
      +    write_to_temp("BOOT/cmdline", 0o755 << 16, new_cmdline)
       
         if rebuild_recovery:
           recovery_img = common.GetBootableImage(
      @@ -411,7 +479,8 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info):
                                  "build/target/product/security/testkey")
           mapped_keys.append(
               OPTIONS.key_map.get(devkey, devkey) + ".x509.pem")
      -    print("META/otakeys.txt has no keys; using", mapped_keys[0])
      +    print("META/otakeys.txt has no keys; using %s for OTA package"
      +          " verification." % (mapped_keys[0],))
       
         # recovery uses a version of the key that has been slightly
         # predigested (by DumpPublicKey.java) and put in res/keys.
      @@ -424,8 +493,13 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info):
         new_recovery_keys, _ = p.communicate()
         if p.returncode != 0:
           raise common.ExternalError("failed to run dumpkeys")
      -  common.ZipWriteStr(output_tf_zip, "RECOVERY/RAMDISK/res/keys",
      -                     new_recovery_keys)
      +
      +  # system_root_image puts the recovery keys at BOOT/RAMDISK.
      +  if misc_info.get("system_root_image") == "true":
      +    recovery_keys_location = "BOOT/RAMDISK/res/keys"
      +  else:
      +    recovery_keys_location = "RECOVERY/RAMDISK/res/keys"
      +  common.ZipWriteStr(output_tf_zip, recovery_keys_location, new_recovery_keys)
       
         # Save the base64 key representation in the update for key-change
         # validations
      @@ -447,8 +521,31 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info):
         common.ZipWriteStr(output_tf_zip, "SYSTEM/etc/security/otacerts.zip",
                            temp_file.getvalue())
       
      +  # For A/B devices, update the payload verification key.
      +  if misc_info.get("ab_update") == "true":
      +    # Unlike otacerts.zip that may contain multiple keys, we can only specify
      +    # ONE payload verification key.
      +    if len(mapped_keys) > 1:
      +      print("\n  WARNING: Found more than one OTA keys; Using the first one"
      +            " as payload verification key.\n\n")
      +
      +    print "Using %s for payload verification." % (mapped_keys[0],)
      +    cmd = common.Run(
      +        ["openssl", "x509", "-pubkey", "-noout", "-in", mapped_keys[0]],
      +        stdout=subprocess.PIPE)
      +    pubkey, _ = cmd.communicate()
      +    common.ZipWriteStr(
      +        output_tf_zip,
      +        "SYSTEM/etc/update_engine/update-payload-key.pub.pem",
      +        pubkey)
      +    common.ZipWriteStr(
      +        output_tf_zip,
      +        "BOOT/RAMDISK/etc/update_engine/update-payload-key.pub.pem",
      +        pubkey)
      +
         return new_recovery_keys
       
      +
       def ReplaceVerityPublicKey(targetfile_zip, filename, key_path):
         print("Replacing verity public key with %s" % key_path)
         with open(key_path) as f:
      @@ -456,6 +553,7 @@ def ReplaceVerityPublicKey(targetfile_zip, filename, key_path):
         common.ZipWriteStr(targetfile_zip, filename, data)
         return data
       
      +
       def ReplaceVerityPrivateKey(targetfile_input_zip, targetfile_output_zip,
                                   misc_info, key_path):
         print("Replacing verity private key with %s" % key_path)
      @@ -465,6 +563,32 @@ def ReplaceVerityPrivateKey(targetfile_input_zip, targetfile_output_zip,
         common.ZipWriteStr(targetfile_output_zip, "META/misc_info.txt", new_misc_info)
         misc_info["verity_key"] = key_path
       
      +
      +def ReplaceVerityKeyId(targetfile_input_zip, targetfile_output_zip, keypath):
      +  in_cmdline = targetfile_input_zip.read("BOOT/cmdline")
      +  # copy in_cmdline to output_zip if veritykeyid is not present in in_cmdline
      +  if "veritykeyid" not in in_cmdline:
      +    common.ZipWriteStr(targetfile_output_zip, "BOOT/cmdline", in_cmdline)
      +    return in_cmdline
      +  out_cmdline = []
      +  for param in in_cmdline.split():
      +    if "veritykeyid" in param:
      +      # extract keyid using openssl command
      +      p = common.Run(["openssl", "x509", "-in", keypath, "-text"], stdout=subprocess.PIPE)
      +      keyid, stderr = p.communicate()
      +      keyid = re.search(r'keyid:([0-9a-fA-F:]*)', keyid).group(1).replace(':', '').lower()
      +      print "Replacing verity keyid with %s error=%s" % (keyid, stderr)
      +      out_cmdline.append("veritykeyid=id:%s" % (keyid,))
      +    else:
      +      out_cmdline.append(param)
      +
      +  out_cmdline = ' '.join(out_cmdline)
      +  out_cmdline = out_cmdline.strip()
      +  print "out_cmdline %s" % (out_cmdline)
      +  common.ZipWriteStr(targetfile_output_zip, "BOOT/cmdline", out_cmdline)
      +  return out_cmdline
      +
      +
       def BuildKeyMap(misc_info, key_mapping_options):
         for s, d in key_mapping_options:
           if s is None:   # -d option
      @@ -562,6 +686,8 @@ def option_handler(o, a):
             OPTIONS.replace_verity_public_key = (True, a)
           elif o == "--replace_verity_private_key":
             OPTIONS.replace_verity_private_key = (True, a)
      +    elif o == "--replace_verity_keyid":
      +      OPTIONS.replace_verity_keyid = (True, a)
           else:
             return False
           return True
      @@ -574,7 +700,8 @@ def option_handler(o, a):
                                                     "replace_ota_keys",
                                                     "tag_changes=",
                                                     "replace_verity_public_key=",
      -                                              "replace_verity_private_key="],
      +                                              "replace_verity_private_key=",
      +                                              "replace_verity_keyid="],
                                    extra_option_handler=option_handler)
       
         if len(args) != 2:
      
      From 44572bbbc6f3f10e09f05a09cae72fcbb5c9c8b4 Mon Sep 17 00:00:00 2001
      From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
      Date: Sun, 6 Mar 2016 22:06:28 +0100
      Subject: [PATCH 350/502] build: Fix a race condition while building the
       recovery patch (needed for msm8226)
      
      RECOVERY_PATCH_INSTALL has a dependency on RECOVERY_FROM_BOOT_PATCH.
      This is correct, because RECOVERY_PATCH_INSTALL uses make_recovery_patch
      which needs the imgdiff tool. imgdiff on the other hand is a dependency
      of RECOVERY_FROM_BOOT_PATCH. This should ensure that all dependencies
      are met.
      However, RECOVERY_FROM_BOOT_PATCH is defined after
      RECOVERY_PATCH_INSTALL, making the dependency effectively non-existant.
      Moving RECOVERY_FROM_BOOT_PATCH before RECOVERY_PATCH_INSTALL fixes a
      race-condition where sometimes imgdiff was not build before
      RECOVERY_PATCH_INSTALL is called.
      
      Upstream is not affected by this bug, since it does not contain
      RECOVERY_PATCH_INSTALL anymore.
      
      The following error can be observed whenever someone hits this race
      condition (which is basically always reproducible when building with
      -j1):
      Installing recovery patch to system partition
      Warning: could not find SYSTEM/build.prop in <built-in function zip>
      using prebuilt recovery.img from BOOTABLE_IMAGES...
      using prebuilt boot.img from BOOTABLE_IMAGES...
      Traceback (most recent call last):
        File "./build/tools/releasetools/make_recovery_patch", line 55, in <module>
          main(sys.argv[1:])
        File "./build/tools/releasetools/make_recovery_patch", line 51, in main
          common.MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img)
        File "build/tools/releasetools/common.py", line 1461, in MakeRecoveryPatch
          _, _, patch = d.ComputePatch()
        File "build/tools/releasetools/common.py", line 1146, in ComputePatch
          p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        File "build/tools/releasetools/common.py", line 100, in Run
          return subprocess.Popen(args, **kwargs)
        File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
          errread, errwrite)
        File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
          raise child_exception
      OSError: [Errno 2] No such file or directory
      build/core/Makefile:1047: recipe for target
          'out/target/product/t00n/system/bin/install-recovery.sh' failed
      
      Fixes: 3d1c612e5c82 ("Revert "Revert "core: Makefile: Build
      install-recovery into the system image""")
      
      Change-Id: I28e8c845ffc830553ca5177cbe22ae72b185b437
      ---
       core/Makefile | 25 +++++++++++++++++++++++++
       1 file changed, 25 insertions(+)
      
      diff --git a/core/Makefile b/core/Makefile
      index 77115a88c84..df2704a94b0 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -1251,6 +1251,31 @@ else
       endif
       endif
       
      +# The system partition needs room for the recovery image as well.  We
      +# now store the recovery image as a binary patch using the boot image
      +# as the source (since they are very similar).  Generate the patch so
      +# we can see how big it's going to be, and include that in the system
      +# image size check calculation.
      +ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),)
      +intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
      +ifndef BOARD_CANT_BUILD_RECOVERY_FROM_BOOT_PATCH
      +RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
      +else
      +RECOVERY_FROM_BOOT_PATCH :=
      +endif
      +$(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) \
      +                             $(INSTALLED_BOOTIMAGE_TARGET) \
      +			     $(HOST_OUT_EXECUTABLES)/imgdiff \
      +	                     $(HOST_OUT_EXECUTABLES)/bsdiff
      +	@echo -e ${CL_CYN}"Construct recovery from boot"${CL_RST}
      +	mkdir -p $(dir $@)
      +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true)
      +	PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/bsdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
      +else
      +	PATH=$(HOST_OUT_EXECUTABLES):$$PATH $(HOST_OUT_EXECUTABLES)/imgdiff $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@
      +endif
      +endif
      +
       ifdef RECOVERY_RESOURCE_ZIP
       $(RECOVERY_RESOURCE_ZIP): $(INSTALLED_RECOVERYIMAGE_TARGET) | $(ZIPTIME)
       	$(hide) mkdir -p $(dir $@)
      
      From 1f5ea6a35d1b109e0639fcc3fa809f0edbaa2114 Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Thu, 27 Oct 2016 22:34:55 +0300
      Subject: [PATCH 351/502] build: ReStore The Shit
      
      Change-Id: I3b96371883f84675df4ddaba54fb8a2ef7b0ae3e
      ---
       tools/releasetools/add_img_to_target_files.py | 4 ++--
       tools/releasetools/common.py                  | 2 +-
       tools/releasetools/ota_from_target_files.py   | 2 +-
       3 files changed, 4 insertions(+), 4 deletions(-)
      
      diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
      index 823cd33496c..b67fa0a34ee 100755
      --- a/tools/releasetools/add_img_to_target_files.py
      +++ b/tools/releasetools/add_img_to_target_files.py
      @@ -101,7 +101,7 @@ def AddSystemOther(output_zip, prefix="IMAGES/"):
       
         prebuilt_path = os.path.join(OPTIONS.input_tmp, prefix, "system_other.img")
         if os.path.exists(prebuilt_path):
      -    print "system_other.img already exists in %s, no need to rebuild..." % (prefix,)
      +    print("system_other.img already exists in %s, no need to rebuild..." % prefix)
           return
       
         imgname = BuildSystemOther(OPTIONS.input_tmp, OPTIONS.info_dict)
      @@ -382,7 +382,7 @@ def AddImagesToTargetFiles(filename):
           has_oem = False
       
         has_system_other = "SYSTEM_OTHER/" in input_zip.namelist()
      -  
      +
       
         OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.input_tmp)
       
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 5cd1aca0269..97e23b91c53 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -278,7 +278,7 @@ def makeint(key):
         system_root_image = d.get("system_root_image", None) == "true"
         if d.get("no_recovery", None) != "true":
           recovery_fstab_path = "RECOVERY/RAMDISK/etc/recovery.fstab"
      -    d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"],
      +    d["fstab"] = LoadRecoveryFSTab(read_helper, d["fstab_version"], d["device_type"],
               recovery_fstab_path, system_root_image)
         elif d.get("recovery_as_boot", None) == "true":
           recovery_fstab_path = "BOOT/RAMDISK/etc/recovery.fstab"
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 44bcb7c2619..82e5096ddd0 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -1438,7 +1438,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
             care_map_data = target_zip.read(care_map_path)
             common.ZipWriteStr(output_zip, "care_map.txt", care_map_data)
           else:
      -      print "Warning: cannot find care map file in target_file package"
      +      print("Warning: cannot find care map file in target_file package")
           common.ZipClose(target_zip)
       
         # Sign the whole package to comply with the Android OTA package format.
      
      From 14ccc31e6336d5a1d9a33d128815c9244ce91314 Mon Sep 17 00:00:00 2001
      From: Steve Kondik <steve@cyngn.com>
      Date: Fri, 28 Oct 2016 16:09:19 +0200
      Subject: [PATCH 352/502] cm: mka nicer
      
      Change-Id: Iec38c313c9eb88a74c7bf7a5cf424131b568ac0a
      ---
       envsetup.sh | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index a31de1eec94..98948535fda 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2225,7 +2225,7 @@ function mka() {
                       make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
                       ;;
                   *)
      -                mk_timer schedtool -B -n 1 -e ionice -n 1 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
      +                mk_timer schedtool -B -n 10 -e ionice -n 7 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
                       ;;
               esac
       
      
      From 8fe78df7c6eaedc2079478f6421d269db7c93e01 Mon Sep 17 00:00:00 2001
      From: Hashbang173 <hashbang173@gmail.com>
      Date: Fri, 28 Oct 2016 18:28:50 -0400
      Subject: [PATCH 353/502] roomservice: update for n7.1
      
      Change-Id: Ia1a01f2e18ad6785d39f51b466a5d5a1b6d553be
      ---
       tools/roomservice.py | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/tools/roomservice.py b/tools/roomservice.py
      index 110c7b5d261..8f5eed44110 100755
      --- a/tools/roomservice.py
      +++ b/tools/roomservice.py
      @@ -157,7 +157,7 @@ def add_to_manifest_dependencies(repositories):
       
               print ('Adding dependency: %s -> %s' % (repo_name, repo_target))
               project = ElementTree.Element("project", attrib = { "path": repo_target,
      -            "remote": "aicp", "name": repo_name, "revision": "n7.0" })
      +            "remote": "aicp", "name": repo_name, "revision": "n7.1" })
       
               if 'branch' in repository:
                   project.set('revision',repository['branch'])
      @@ -188,7 +188,7 @@ def add_to_manifest(repositories):
       
               print('Adding dependency: AICP/%s -> %s' % (repo_name, repo_target))
               project = ElementTree.Element("project", attrib = { "path": repo_target,
      -            "remote": "aicp", "name": "AICP/%s" % repo_name, "revision": "n7.0" })
      +            "remote": "aicp", "name": "AICP/%s" % repo_name, "revision": "n7.1" })
       
               if 'branch' in repository:
                   project.set('revision',repository['branch'])
      @@ -261,7 +261,7 @@ def has_branch(branches, revision):
       
                   repo_path = "device/%s/%s" % (manufacturer, device)
       
      -            add_to_manifest([{'repository':repo_name,'target_path':repo_path,'branch':'n7.0'}])
      +            add_to_manifest([{'repository':repo_name,'target_path':repo_path,'branch':'n7.1'}])
       
                   print("Syncing repository to retrieve project.")
                   os.system('repo sync --force-sync %s' % repo_path)
      
      From 6fb2322b421a3f2bd0292718fa574ce0555a6518 Mon Sep 17 00:00:00 2001
      From: Steve Kondik <steve@cyngn.com>
      Date: Fri, 28 Oct 2016 15:14:49 -0700
      Subject: [PATCH 354/502] build: Fix LOCAL_PROTOC_OUTPUT
      
       * This code was refactored in 7.1 adjust accordingly.
       * This is used by projects like ril-caf where the proto-c generated
         sources dir might not match the project path.
      
      Change-Id: I7a7d0bb7a397b02deb5406a591059a877ac2c6da
      ---
       core/binary.mk | 5 ++---
       1 file changed, 2 insertions(+), 3 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 48a0b23fee1..7d6ef923afa 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -668,10 +668,9 @@ define copy-proto-files
       $(if $(PRIVATE_PROTOC_OUTPUT), \
          $(if $(call streq,$(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT)),, \
          $(eval proto_generated_path := $(dir $(subst $(PRIVATE_PROTOC_INPUT),$(PRIVATE_PROTOC_OUTPUT),$@)))
      -   $(eval proto_target_files := $(patsubst %.pb$(PRIVATE_PROTOC_SUFFIX), %.pb.*, $@))
          @mkdir -p $(dir $(proto_generated_path))
      -   @echo "Protobuf relocation: $(proto_target_files) => $(proto_generated_path)"
      -   @cp -f $(proto_target_files) $(proto_generated_path) ),)
      +   @echo "Protobuf relocation: $(basename $@).h => $(proto_generated_path)"
      +   @cp -f $(basename $@).h $(proto_generated_path) ),)
       endef
       
       
      
      From 713f7d048fd344e605e5b28689620cfc3c718a8a Mon Sep 17 00:00:00 2001
      From: Hashbang173 <hashbang173@gmail.com>
      Date: Sat, 29 Oct 2016 18:26:22 -0400
      Subject: [PATCH 355/502] binary: fix proto generation
      
       * Make it inline with CM
      
      Change-Id: Ibacd11337fd028169a21beba22dedf82c858592c
      ---
       core/binary.mk | 5 +++--
       1 file changed, 3 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 7d6ef923afa..1b11a8ae3ef 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -673,15 +673,16 @@ $(if $(PRIVATE_PROTOC_OUTPUT), \
          @cp -f $(basename $@).h $(proto_generated_path) ),)
       endef
       
      -
       # Ensure the transform-proto-to-cc rule is only defined once in multilib build.
       ifndef $(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined
       $(proto_generated_cpps): PRIVATE_PROTO_INCLUDES := $(TOP)
       $(proto_generated_cpps): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS) $(my_protoc_flags)
      +$(proto_generated_cpps): PRIVATE_PROTOC_OUTPUT := $(LOCAL_PROTOC_OUTPUT)
      +$(proto_generated_cpps): PRIVATE_PROTOC_INPUT := $(LOCAL_PATH)
       $(proto_generated_cpps): PRIVATE_RENAME_CPP_EXT := $(my_rename_cpp_ext)
       $(proto_generated_cpps): $(proto_gen_dir)/%.pb$(my_proto_source_suffix): %.proto $(my_protoc_deps) $(PROTOC)
       	$(transform-proto-to-cc)
      -$(copy-proto-files)
      +	$(copy-proto-files)
       
       $(my_host)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_proto_defined := true
       endif
      
      From 658b1ef2bb7375c51560ddadf8658d0d087bfd4c Mon Sep 17 00:00:00 2001
      From: AndropaX <kpax.mar@gmail.com>
      Date: Wed, 2 Nov 2016 07:10:46 +0100
      Subject: [PATCH 356/502] build: Increase diff timeout
      
      This sometimes breaks packing on weak PCs
      
      Change-Id: I1f10ef8b046e06be865d9e5213095afae251a29d
      ---
       tools/releasetools/common.py | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 97e23b91c53..41559c4aa30 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -1387,7 +1387,7 @@ def run():
                 err.append(e)
             th = threading.Thread(target=run)
             th.start()
      -      th.join(timeout=300)   # 5 mins
      +      th.join(timeout=600)   # 10 mins
             if th.is_alive():
               print("WARNING: diff command timed out")
               p.terminate()
      
      From 6f3a78fffa7d05f0233c6f9eb1578b8f3465553b Mon Sep 17 00:00:00 2001
      From: Sam Mortimer <sam@mortimer.me.uk>
      Date: Sat, 5 Nov 2016 22:03:27 +0300
      Subject: [PATCH 357/502] build: Always create a kernel defconfig build
       artifact
      
      It's just easier having it always built for you
      (and it really takes no time).
      
      Change-Id: If183cef50b1de0bf228e27bab77607df71350345
      ---
       core/tasks/kernel.mk | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index da36185749f..b623f569adf 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -288,6 +288,8 @@ $(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONA
       			echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \
       			echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \
       			$(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi
      +	# Create defconfig build artifact
      +	$(hide) $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig
       	$(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \
       			echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \
       			$(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(KERNEL_OUT) $(KERNEL_OUT)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \
      
      From aab6ea97cf047118b547b8a07fbe67eab28426fa Mon Sep 17 00:00:00 2001
      From: Aravind Asam <aasam@codeaurora.org>
      Date: Tue, 5 Apr 2016 18:07:49 -0700
      Subject: [PATCH 358/502] Build options for enabling proprietary Clang compiler
      
      Needed for enabling proprietary Clang compiler
      
      Change-Id: I33a6a4c4c40722ce66dd7398ff647c33e5dfbdea
      ---
       core/binary.mk     | 16 ++++++++++++++++
       core/clear_vars.mk |  1 +
       2 files changed, 17 insertions(+)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 1b11a8ae3ef..6486a736f45 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -218,6 +218,8 @@ ifdef LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
       my_clang := $(strip $(LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
       endif
       
      +my_qcclang := $(strip $(LOCAL_QCCLANG))
      +
       # clang is enabled by default for host builds
       # enable it unless we've specifically disabled clang above
       ifdef LOCAL_IS_HOST_MODULE
      @@ -260,6 +262,12 @@ endif
       my_cppflags := $(my_cpp_std_version) $(my_cppflags)
       
       
      +ifeq ($(QCCLANG),true)
      +    ifeq ($(my_qcclang),)
      +        my_qcclang := true
      +    endif
      +endif
      +
       # arch-specific static libraries go first so that generic ones can depend on them
       my_static_libraries := $(LOCAL_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_static_libraries)
       my_whole_static_libraries := $(LOCAL_WHOLE_STATIC_LIBRARIES_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)) $(LOCAL_WHOLE_STATIC_LIBRARIES_$(my_32_64_bit_suffix)) $(my_whole_static_libraries)
      @@ -335,6 +343,14 @@ my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CFL
       my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CONLYFLAGS)
       my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CPPFLAGS)
       my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
      +    ifeq ($(my_qcclang),true)
      +        ifeq ($(strip $(my_cc)),)
      +            my_cc := $(QCCLANG_PATH)/clang -mno-ae
      +        endif
      +        ifeq ($(strip $(my_cxx)),)
      +            my_cxx := $(QCCLANG_PATH)/clang++ -mno-ae
      +        endif
      +    endif
       else
       my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CFLAGS)
       my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_CONLYFLAGS)
      diff --git a/core/clear_vars.mk b/core/clear_vars.mk
      index 6a80a3625c2..09ad4be2170 100644
      --- a/core/clear_vars.mk
      +++ b/core/clear_vars.mk
      @@ -157,6 +157,7 @@ LOCAL_COMPATIBILITY_SUPPORT_FILES:=
       LOCAL_CTS_TEST_PACKAGE:=
       LOCAL_CTS_TEST_RUNNER:=
       LOCAL_CLANG:=
      +LOCAL_QCCLANG:=
       LOCAL_JAR_EXCLUDE_FILES:=
       LOCAL_JAR_PACKAGES:=
       LOCAL_JAR_EXCLUDE_PACKAGES:=
      
      From 4e1038746d12f81ad8c64f02f6d5bf3575105a2d Mon Sep 17 00:00:00 2001
      From: Weiming Zhao <weimingz@codeaurora.org>
      Date: Wed, 8 Jun 2016 15:59:13 -0700
      Subject: [PATCH 359/502] Replace hard-coded flags with variables-based
      
      Currently, we always apply some flags to clang, which are actually not
      always available.
      
      Change-Id: Ia6404c36453cb10fc93624f1ae7d9f7aec587ebf
      ---
       core/binary.mk | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 6486a736f45..89292b87b8b 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -345,10 +345,10 @@ my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_C
       my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
           ifeq ($(my_qcclang),true)
               ifeq ($(strip $(my_cc)),)
      -            my_cc := $(QCCLANG_PATH)/clang -mno-ae
      +            my_cc := $(QCCLANG_PATH)/clang $(SDLLVM_AE_FLAG)
               endif
               ifeq ($(strip $(my_cxx)),)
      -            my_cxx := $(QCCLANG_PATH)/clang++ -mno-ae
      +            my_cxx := $(QCCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG)
               endif
           endif
       else
      
      From f60382e057d65519c1806252b8649e1e25be5890 Mon Sep 17 00:00:00 2001
      From: Weiming Zhao <weimingz@codeaurora.org>
      Date: Fri, 17 Jun 2016 11:59:43 -0700
      Subject: [PATCH 360/502] Add -Wno-vectorizer-no-neon flag for all compiles
      
      Prevent the warning for SDLLVM
      
      Change-Id: Ie44b6ea12fab6a6f198a00c360fee98980f0b40c
      ---
       core/binary.mk | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 89292b87b8b..90af7593ab3 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -345,10 +345,10 @@ my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_C
       my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
           ifeq ($(my_qcclang),true)
               ifeq ($(strip $(my_cc)),)
      -            my_cc := $(QCCLANG_PATH)/clang $(SDLLVM_AE_FLAG)
      +            my_cc := $(QCCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
               ifeq ($(strip $(my_cxx)),)
      -            my_cxx := $(QCCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG)
      +            my_cxx := $(QCCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
           endif
       else
      
      From d87cd2b960e7465f6485d13f3000848a4511d3a7 Mon Sep 17 00:00:00 2001
      From: Mandeep Singh Grang <mgrang@codeaurora.org>
      Date: Fri, 20 May 2016 15:12:11 -0700
      Subject: [PATCH 361/502] Control building shared libs, static libs and
       executables with SDLLVM LTO
      
      Change-Id: Ie71d09b0853954c44a37f708894eef68c2f6aafd
      ---
       core/binary.mk         | 14 +++++++-------
       core/clear_vars.mk     |  4 +++-
       core/executable.mk     | 10 ++++++++++
       core/shared_library.mk | 10 ++++++++++
       core/static_library.mk | 10 ++++++++++
       5 files changed, 40 insertions(+), 8 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 90af7593ab3..9f3d75a56d3 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -218,7 +218,7 @@ ifdef LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)
       my_clang := $(strip $(LOCAL_CLANG_$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH)))
       endif
       
      -my_qcclang := $(strip $(LOCAL_QCCLANG))
      +my_sdclang := $(strip $(LOCAL_SDCLANG))
       
       # clang is enabled by default for host builds
       # enable it unless we've specifically disabled clang above
      @@ -262,9 +262,9 @@ endif
       my_cppflags := $(my_cpp_std_version) $(my_cppflags)
       
       
      -ifeq ($(QCCLANG),true)
      -    ifeq ($(my_qcclang),)
      -        my_qcclang := true
      +ifeq ($(SDCLANG),true)
      +    ifeq ($(my_sdclang),)
      +        my_sdclang := true
           endif
       endif
       
      @@ -343,12 +343,12 @@ my_target_global_cflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CFL
       my_target_global_conlyflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CONLYFLAGS)
       my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_CPPFLAGS)
       my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
      -    ifeq ($(my_qcclang),true)
      +    ifeq ($(my_sdclang),true)
               ifeq ($(strip $(my_cc)),)
      -            my_cc := $(QCCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
      +            my_cc := $(SDCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
               ifeq ($(strip $(my_cxx)),)
      -            my_cxx := $(QCCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
      +            my_cxx := $(SDCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
           endif
       else
      diff --git a/core/clear_vars.mk b/core/clear_vars.mk
      index 09ad4be2170..cf6699a4b6b 100644
      --- a/core/clear_vars.mk
      +++ b/core/clear_vars.mk
      @@ -157,7 +157,9 @@ LOCAL_COMPATIBILITY_SUPPORT_FILES:=
       LOCAL_CTS_TEST_PACKAGE:=
       LOCAL_CTS_TEST_RUNNER:=
       LOCAL_CLANG:=
      -LOCAL_QCCLANG:=
      +LOCAL_SDCLANG:=
      +LOCAL_SDCLANG_LTO:=
      +LOCAL_SDCLANG_EXTRA_FLAGS_32:=
       LOCAL_JAR_EXCLUDE_FILES:=
       LOCAL_JAR_PACKAGES:=
       LOCAL_JAR_EXCLUDE_PACKAGES:=
      diff --git a/core/executable.mk b/core/executable.mk
      index e22ea0ec00d..5a33db7bbbb 100644
      --- a/core/executable.mk
      +++ b/core/executable.mk
      @@ -42,6 +42,10 @@ endif
       
       my_skip_non_preferred_arch :=
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +include $(SDCLANG_FLAG_DEFS)
      +endif
      +
       # check if preferred arch is supported
       include $(BUILD_SYSTEM)/module_arch_supported.mk
       ifeq ($(my_module_arch_supported),true)
      @@ -80,4 +84,10 @@ LOCAL_NO_2ND_ARCH_MODULE_SUFFIX :=
       
       my_module_arch_supported :=
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +ifeq ($(LOCAL_SDCLANG_LTO), true)
      +include $(SDCLANG_LTO_DEFS)
      +endif
      +endif
      +
       endif
      diff --git a/core/shared_library.mk b/core/shared_library.mk
      index 2f483414a20..26c455da467 100644
      --- a/core/shared_library.mk
      +++ b/core/shared_library.mk
      @@ -21,6 +21,10 @@ endif
       endif # my_module_multilib == both
       
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +include $(SDCLANG_FLAG_DEFS)
      +endif
      +
       LOCAL_2ND_ARCH_VAR_PREFIX :=
       include $(BUILD_SYSTEM)/module_arch_supported.mk
       
      @@ -48,6 +52,12 @@ LOCAL_2ND_ARCH_VAR_PREFIX :=
       
       endif # TARGET_2ND_ARCH
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +ifeq ($(LOCAL_SDCLANG_LTO), true)
      +include $(SDCLANG_LTO_DEFS)
      +endif
      +endif
      +
       my_module_arch_supported :=
       
       ###########################################################
      diff --git a/core/static_library.mk b/core/static_library.mk
      index a8ae399b68a..61a63d065d4 100644
      --- a/core/static_library.mk
      +++ b/core/static_library.mk
      @@ -6,6 +6,10 @@ ifndef my_module_multilib
       my_module_multilib := both
       endif
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +include $(SDCLANG_FLAG_DEFS)
      +endif
      +
       LOCAL_2ND_ARCH_VAR_PREFIX :=
       include $(BUILD_SYSTEM)/module_arch_supported.mk
       
      @@ -33,6 +37,12 @@ LOCAL_2ND_ARCH_VAR_PREFIX :=
       
       endif # TARGET_2ND_ARCH
       
      +ifeq ($(LOCAL_SDCLANG), true)
      +ifeq ($(LOCAL_SDCLANG_LTO), true)
      +include $(SDCLANG_LTO_DEFS)
      +endif
      +endif
      +
       my_module_arch_supported :=
       
       ###########################################################
      
      From 6b8c6b23d7c08e0bf5dae007b5279c880551e99d Mon Sep 17 00:00:00 2001
      From: Ameya Thakur <ameyat@codeaurora.org>
      Date: Mon, 8 Aug 2016 12:28:56 -0700
      Subject: [PATCH 362/502] Fix bug in the handling of LOCAL_HAL_STATIC_LIBRARIES
      
      The lib indicated by LOCAL_HAL_STATIC_LIBRARIES(foo) currently gets appended
      to the end of the my_static_libraries list. As a result if foo is the only one
      to reference something from the static_libraries_list(bar) we die during
      linking since the linker would have stripped out bar. Fix this by prepending
      foo to the my_static_libraries list instead.
      
      Change-Id: Iefffcac65dd5f05d9be2d036b42729610d2394b3
      ---
       core/binary.mk | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 9f3d75a56d3..3d1c94f6264 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -278,8 +278,8 @@ include $(BUILD_SYSTEM)/cxx_stl_setup.mk
       ifdef LOCAL_HAL_STATIC_LIBRARIES
       $(foreach lib, $(LOCAL_HAL_STATIC_LIBRARIES), \
           $(eval b_lib := $(filter $(lib).%,$(BOARD_HAL_STATIC_LIBRARIES)))\
      -    $(if $(b_lib), $(eval my_static_libraries += $(b_lib)),\
      -                   $(eval my_static_libraries += $(lib).default)))
      +    $(if $(b_lib), $(eval my_static_libraries := $(b_lib) $(my_static_libraries)),\
      +                   $(eval my_static_libraries := $(lib).default $(my_static_libraries))))
       b_lib :=
       endif
       
      
      From 2f5ed8e5f4327f7046f02b1320820ea27991beaf Mon Sep 17 00:00:00 2001
      From: Steve Kondik <steve@cyngn.com>
      Date: Tue, 8 Nov 2016 12:51:59 -0800
      Subject: [PATCH 363/502] build: Require devices to opt-in for SDCLANG
      
       * Only devices which see a measureable benefit should use this
         since it requires more resources to build.
       * Set TARGET_USE_SDCLANG to true in your BoardConfig if your
         device benefits from it.
      
      Change-Id: I12ee20b0627ff0ca121d653cde482e5449a768cc
      ---
       core/binary.mk | 4 +++-
       1 file changed, 3 insertions(+), 1 deletion(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 3d1c94f6264..78431e78083 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -264,7 +264,9 @@ my_cppflags := $(my_cpp_std_version) $(my_cppflags)
       
       ifeq ($(SDCLANG),true)
           ifeq ($(my_sdclang),)
      -        my_sdclang := true
      +        ifeq ($(TARGET_USE_SDCLANG),true)
      +            my_sdclang := true
      +        endif
           endif
       endif
       
      
      From 5b9bdffad0b02cb1b0276f14a6fd671c87cfdb09 Mon Sep 17 00:00:00 2001
      From: Steve Kondik <steve@cyngn.com>
      Date: Tue, 8 Nov 2016 21:18:43 -0800
      Subject: [PATCH 364/502] Merge tag 'android-7.1.0_r7' of
       https://android.googlesource.com/platform/build into HEAD
      
      Android 7.1.0 release 7
      
      Change-Id: I080763364ade3e76da95a9295fc355ea30ad9858
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 006dce65dff..bbb8e6bb079 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NDE63P
      +export BUILD_ID=NDE63X
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 31fb679b4c0..47dc01cead1 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2016-10-05
      +      PLATFORM_SECURITY_PATCH := 2016-11-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 57645f764c8fe414b2b90105856e2f22206efee1 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Fri, 11 Nov 2016 00:33:50 +0300
      Subject: [PATCH 365/502] build: qcom_target: Enable BOARD_USES_ADRENO
      
      Newer QCOM HALs use this flag for libc2dcolorconvert,
      examples being msm8937 and msm8996 media HALs.
      
      Change-Id: I28e8a42b58b4f5f71126df7ad97c377724da5bab
      ---
       core/qcom_target.mk | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 03279825494..e103cb12ef1 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -27,6 +27,8 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           qcom_flags += -DQCOM_BSP
           qcom_flags += -DQTI_BSP
       
      +    BOARD_USES_ADRENO := true
      +
           TARGET_USES_QCOM_BSP := true
       
           # Tell HALs that we're compiling an AOSP build with an in-line kernel
      
      From 962bde89566194188fcb6f287b2280cb8202d45a Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Fri, 11 Nov 2016 06:44:19 +0300
      Subject: [PATCH 366/502] build: kernel: Set prefix based on KERNEL_ARCH
      
      KERNEL_ARCH specifies the kernel architecture, not TARGET_ARCH.
      
      Change-Id: I97407caa15cacf53489e8ebb31f5c059991a9493
      ---
       core/tasks/kernel.mk | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index b623f569adf..d5f561f0b16 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -214,11 +214,11 @@ endif
       TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX))
       ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),)
       KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)
      -else ifeq ($(TARGET_ARCH),arm64)
      +else ifeq ($(KERNEL_ARCH),arm64)
       KERNEL_TOOLCHAIN_PREFIX ?= aarch64-linux-androidkernel-
      -else ifeq ($(TARGET_ARCH),arm)
      +else ifeq ($(KERNEL_ARCH),arm)
       KERNEL_TOOLCHAIN_PREFIX ?= arm-linux-androidkernel-
      -else ifeq ($(TARGET_ARCH),x86)
      +else ifeq ($(KERNEL_ARCH),x86)
       KERNEL_TOOLCHAIN_PREFIX ?= x86_64-linux-androidkernel-
       endif
       
      
      From c81324e6f5702b4722c5cef8de31b4eff38ddca2 Mon Sep 17 00:00:00 2001
      From: Steve Kondik <steve@cyngn.com>
      Date: Fri, 11 Nov 2016 10:20:22 +0300
      Subject: [PATCH 367/502] build: Autodetect SDCLANG in
       prebuilts/snapdragon-llvm
      
       * Will be used by the build servers
      
      Change-Id: I5d31a7c41adc283cb9336314e9d54412cc740e9e
      ---
       envsetup.sh | 7 +++++++
       1 file changed, 7 insertions(+)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 98948535fda..693f73fdd39 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2483,6 +2483,13 @@ function fixup_common_out_dir() {
           fi
       }
       
      +# Enable SD-LLVM if available
      +if [ -d $(gettop)/prebuilts/snapdragon-llvm/toolchains ]; then
      +    export SDCLANG=true
      +    export SDCLANG_PATH=$(gettop)/prebuilts/snapdragon-llvm/toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt/linux-x86_64/bin
      +    export SDCLANG_LTO_DEFS=$(gettop)/device/qcom/common/sdllvm-lto-defs.mk
      +fi
      +
       # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set.
       function set_java_home() {
           # Clear the existing JAVA_HOME value if we set it ourselves, so that
      
      From 192cea1bacb8b1f20d82a92ff5d98a420217c6d6 Mon Sep 17 00:00:00 2001
      From: Alexander Martinz <eviscerationls@gmail.com>
      Date: Fri, 11 Nov 2016 10:23:03 +0300
      Subject: [PATCH 368/502] envsetup: block SDCLANG on Darwin for now
      
      Snapdragon LLVM is not supported on Darwin yet.
      There might be the case where the directory structure is set up
      by default and the build system will try to execute the linux binaries.
      
      This will fail obviously:
        /bin/bash: /Volumes/Android/build/prebuilts/snapdragon-llvm/toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt/linux-x86_64/bin/clang: cannot execute binary file
      
      Change-Id: I1f4d0bbda88b540b7ac3159f8e83de4501b9073b
      Signed-off-by: Alexander Martinz <eviscerationls@gmail.com>
      ---
       envsetup.sh | 13 ++++++++++---
       1 file changed, 10 insertions(+), 3 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 693f73fdd39..e27a15b47d9 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2485,9 +2485,16 @@ function fixup_common_out_dir() {
       
       # Enable SD-LLVM if available
       if [ -d $(gettop)/prebuilts/snapdragon-llvm/toolchains ]; then
      -    export SDCLANG=true
      -    export SDCLANG_PATH=$(gettop)/prebuilts/snapdragon-llvm/toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt/linux-x86_64/bin
      -    export SDCLANG_LTO_DEFS=$(gettop)/device/qcom/common/sdllvm-lto-defs.mk
      +    case `uname -s` in
      +        Darwin)
      +            # Darwin is not supported yet
      +            ;;
      +        *)
      +            export SDCLANG=true
      +            export SDCLANG_PATH=$(gettop)/prebuilts/snapdragon-llvm/toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt/linux-x86_64/bin
      +            export SDCLANG_LTO_DEFS=$(gettop)/device/qcom/common/sdllvm-lto-defs.mk
      +            ;;
      +    esac
       fi
       
       # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set.
      
      From 5f83d2de42232b7490f82e948f89c0b4f2e4b88f Mon Sep 17 00:00:00 2001
      From: Ethan Chen <intervigil@gmail.com>
      Date: Mon, 14 Nov 2016 09:08:08 +0300
      Subject: [PATCH 369/502] qcom_target: Remove unused support for CAF manifests
      
      * This code was introduced to support building from Qualcomm hardware
        manifests, placing the appropriate Qualcomm HALs at the AOSP
        hardware/qcom/$(HAL_TYPE) location. This isn't a supported use case
        anymore, so remove the dead code.
      
      Change-Id: Id7d53b33f53289bc1ead8eb983d7e252940b0387
      ---
       core/qcom_target.mk | 15 ---------------
       1 file changed, 15 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index e103cb12ef1..7d6abdbcbd5 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -80,21 +80,6 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
               endif
           endif
       
      -# HACK: check to see if build uses standard QC HAL paths by checking for CM path structure
      -AOSP_VARIANT_MAKEFILE := $(wildcard hardware/qcom/audio/default/Android.mk)
      -ifeq ("$(AOSP_VARIANT_MAKEFILE)","")
      -$(call project-set-path,qcom-audio,hardware/qcom/audio)
      -$(call project-set-path,qcom-display,hardware/qcom/display)
      -$(call project-set-path,qcom-media,hardware/qcom/media)
      -$(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera)
      -$(call set-device-specific-path,GPS,gps,hardware/qcom/gps)
      -$(call set-device-specific-path,SENSORS,sensors,hardware/qcom/sensors)
      -$(call set-device-specific-path,LOC_API,loc-api,vendor/qcom/opensource/location)
      -$(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource/dataservices)
      -$(call project-set-path,ril,hardware/ril)
      -$(call project-set-path,wlan,hardware/qcom/wlan)
      -$(call project-set-path,bt-vendor,hardware/qcom/bt)
      -else
       $(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT))
       
       ifeq ($(SONY_BF64_KERNEL_VARIANT),true)
      
      From 344f4cc1a5f3594864f7b0f9700e65c493d44176 Mon Sep 17 00:00:00 2001
      From: Ethan Chen <intervigil@gmail.com>
      Date: Mon, 14 Nov 2016 11:48:23 +0300
      Subject: [PATCH 370/502] qcom_target: Remove unused sony HAL support
      
      Change-Id: I046d860127918858af98e9ab73bebc253502d08f
      ---
       core/qcom_target.mk | 6 ------
       1 file changed, 6 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 7d6abdbcbd5..fe41daffa6f 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -81,14 +81,8 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           endif
       
       $(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT))
      -
      -ifeq ($(SONY_BF64_KERNEL_VARIANT),true)
      -$(call project-set-path,qcom-display,hardware/qcom/display-caf/sony)
      -$(call project-set-path,qcom-media,hardware/qcom/media-caf/sony)
      -else
       $(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT))
       $(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT))
      -endif
       
       $(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera)
       $(call set-device-specific-path,GPS,gps,hardware/qcom/gps)
      
      From 1d0c1357064781c9081272430efb93724bf6061d Mon Sep 17 00:00:00 2001
      From: doc HD <doc.divxm@gmail.com>
      Date: Mon, 14 Nov 2016 11:51:51 +0300
      Subject: [PATCH 371/502] build: Remove unneeded endif
      
      Change-Id: Idced60de644b4bb74cc160116180baf021304de1
      ---
       core/qcom_target.mk | 1 -
       1 file changed, 1 deletion(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index fe41daffa6f..a3a0965f010 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -93,7 +93,6 @@ $(call set-device-specific-path,DATASERVICES,dataservices,vendor/qcom/opensource
       $(call ril-set-path-variant,ril)
       $(call wlan-set-path-variant,wlan-caf)
       $(call bt-vendor-set-path-variant,bt-caf)
      -endif # AOSP_VARIANT_MAKEFILE
       
       else
       
      
      From 200e9b584705170e0979f971cb84518381c802e7 Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca.stefani.ge1@gmail.com>
      Date: Fri, 25 Nov 2016 00:18:37 +0300
      Subject: [PATCH 372/502] build: Set android jack args to global jack server
       args if existing
      
      Change-Id: Iafd416aaac81642c7ec736712b45ecbe05b0d55e
      ---
       envsetup.sh | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index e27a15b47d9..8620c22923a 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2497,6 +2497,11 @@ if [ -d $(gettop)/prebuilts/snapdragon-llvm/toolchains ]; then
           esac
       fi
       
      +# Android specific JACK args
      +if [ -n "$JACK_SERVER_VM_ARGUMENTS" ] && [ -z "$ANDROID_JACK_VM_ARGS" ]; then
      +    export ANDROID_JACK_VM_ARGS=$JACK_SERVER_VM_ARGUMENTS
      +fi
      +
       # Force JAVA_HOME to point to java 1.7/1.8 if it isn't already set.
       function set_java_home() {
           # Clear the existing JAVA_HOME value if we set it ourselves, so that
      
      From 61dcb0056371d7228305cda015a1edc25f2c909a Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca.stefani.ge1@gmail.com>
      Date: Fri, 25 Nov 2016 09:47:50 +0300
      Subject: [PATCH 373/502] build: kernel: Remove duplicated targets
      
      We call them already in TARGET_KERNEL_BINARIES
      
      Change-Id: I1a9cf89d59416fdb6c9c570d17fb490440d44159
      ---
       core/tasks/kernel.mk | 2 --
       1 file changed, 2 deletions(-)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index d5f561f0b16..0b85b19b2d2 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -320,8 +320,6 @@ TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_IN
       $(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES
       
       $(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES)
      -	$(mv-modules)
      -	$(clean-module-folder)
       
       $(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG)
       	@echo "Building Kernel Headers"
      
      From c07e0932c6890edfb6365c5beecb7c11062a57b9 Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca.stefani.ge1@gmail.com>
      Date: Tue, 29 Nov 2016 21:41:05 +0100
      Subject: [PATCH 374/502] binary: Append cc/cxx wrapper to sdclang
      
      * Make ccache great again
      
      Change-Id: I20da69f3f8ce695e7e5e4bdd06f7436cc5331003
      ---
       core/binary.mk | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 78431e78083..460e72fa73b 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -347,10 +347,10 @@ my_target_global_cppflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_C
       my_target_global_ldflags := $($(LOCAL_2ND_ARCH_VAR_PREFIX)CLANG_TARGET_GLOBAL_LDFLAGS)
           ifeq ($(my_sdclang),true)
               ifeq ($(strip $(my_cc)),)
      -            my_cc := $(SDCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
      +            my_cc := $(my_cc_wrapper) $(SDCLANG_PATH)/clang $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
               ifeq ($(strip $(my_cxx)),)
      -            my_cxx := $(SDCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
      +            my_cxx := $(my_cxx_wrapper) $(SDCLANG_PATH)/clang++ $(SDLLVM_AE_FLAG) -Wno-vectorizer-no-neon
               endif
           endif
       else
      
      From 45ad7a6a8f50399de4f6d1c2b5a8b694e036d39a Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Tue, 29 Nov 2016 15:56:50 +0100
      Subject: [PATCH 375/502] build: Conditionally disable ccache for modules with
       FDO enabled
      
      ccache supports the compiler option -fprofile-use since v3.2. If the
      current wrapper is ccache v3.2 or newer, don't disable it when FDO
      is turned on.
      
      Change-Id: I506010173f60b791eae0d65afeac36995c57dbe6
      ---
       core/binary.mk | 30 ++++++++++++++++++++++++++----
       1 file changed, 26 insertions(+), 4 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 460e72fa73b..069a3dd85d5 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -313,10 +313,32 @@ ifneq ($(filter true always, $(LOCAL_FDO_SUPPORT)),)
           my_cflags += $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_FDO_OPTIMIZE_CFLAGS)
           my_fdo_build := true
         endif
      -  # Disable ccache (or other compiler wrapper) except gomacc, which
      -  # can handle -fprofile-use properly.
      -  my_cc_wrapper := $(filter $(GOMA_CC),$(my_cc_wrapper))
      -  my_cxx_wrapper := $(filter $(GOMA_CC),$(my_cxx_wrapper))
      +  # Disable ccache (or other compiler wrapper) except gomacc, unless
      +  # it can handle -fprofile-use properly.
      +
      +  # ccache supports -fprofile-use as of version 3.2. Parse the version output
      +  # of each wrapper to determine if it's ccache 3.2 or newer.
      +  is_cc_ccache := $(shell if [ "`$(my_cc_wrapper) -V 2>/dev/null | head -1 | cut -d' ' -f1`" = ccache ]; then echo true; fi)
      +  ifeq ($(is_cc_ccache),true)
      +    cc_ccache_version := $(shell $(my_cc_wrapper) -V | head -1 | grep -o '[[:digit:]]\+\.[[:digit:]]\+')
      +    vmajor := $(shell echo $(cc_ccache_version) | cut -d'.' -f1)
      +    vminor := $(shell echo $(cc_ccache_version) | cut -d'.' -f2)
      +    cc_ccache_ge_3_2 = $(shell if [ $(vmajor) -gt 3 -o $(vmajor) -eq 3 -a $(vminor) -ge 2 ]; then echo true; fi)
      +  endif
      +  is_cxx_ccache := $(shell if [ "`$(my_cxx_wrapper) -V 2>/dev/null | head -1 | cut -d' ' -f1`" = ccache ]; then echo true; fi)
      +  ifeq ($(is_cxx_ccache),true)
      +    cxx_ccache_version := $(shell $(my_cxx_wrapper) -V | head -1 | grep -o '[[:digit:]]\+\.[[:digit:]]\+')
      +    vmajor := $(shell echo $(cxx_ccache_version) | cut -d'.' -f1)
      +    vminor := $(shell echo $(cxx_ccache_version) | cut -d'.' -f2)
      +    cxx_ccache_ge_3_2 = $(shell if [ $(vmajor) -gt 3 -o $(vmajor) -eq 3 -a $(vminor) -ge 2 ]; then echo true; fi)
      +  endif
      +
      +  ifneq ($(cc_ccache_ge_3_2),true)
      +    my_cc_wrapper := $(filter $(GOMA_CC),$(my_cc_wrapper))
      +  endif
      +  ifneq ($(cxx_ccache_ge_3_2),true)
      +    my_cxx_wrapper := $(filter $(GOMA_CC),$(my_cxx_wrapper))
      +  endif
       endif
       
       ###########################################################
      
      From 6fe5e9879b4f031787db5aa693d67184b1b81ffb Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Thu, 1 Dec 2016 14:41:34 -0800
      Subject: [PATCH 376/502] NMF62
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index c3d6c40af03..72a09ef02b6 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF26O
      +export BUILD_ID=NMF62
      
      From ec0073a9e288f991743166f87dcdd34057e5a398 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 16 Nov 2016 13:49:55 -0800
      Subject: [PATCH 377/502] Updating Security String to 2017-01-01 on nyc-dev
      
      (cherry picked from commit 202380f93e063b0b21b9305ebb3bfbc62c800bfa)
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 2c8a21f14a7..e9770a83e71 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2016-12-05
      +      PLATFORM_SECURITY_PATCH := 2017-01-01
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From cbb44f2dba3f66fb08aab36e49b7c56d37ede0b4 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 16 Nov 2016 13:50:48 -0800
      Subject: [PATCH 378/502] Updating Security String to 2017-01-05 on nyc-dev
      
      b/32949407
      
      (cherry picked from commit 190129bc61b35e1b516a5e111d2b14ef8108c023)
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index e9770a83e71..550fc70ce70 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-01-01
      +      PLATFORM_SECURITY_PATCH := 2017-01-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 1988cd35edacdec4b17206839bb72e5db473ad94 Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Thu, 1 Dec 2016 14:47:15 -0800
      Subject: [PATCH 379/502] NMF26R
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 72a09ef02b6..9d72ddbf361 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF62
      +export BUILD_ID=NMF26R
      
      From ad30fe94069908104e1666814380214ca0645783 Mon Sep 17 00:00:00 2001
      From: Raienryu97 <cherukupallip@gmail.com>
      Date: Sun, 4 Dec 2016 17:44:54 +0530
      Subject: [PATCH 380/502] repopick: default to our own gerrit
      
      Change-Id: Id48ce6b6fc07fc1fc7a824bacdf8997ac0bf3312
      ---
       tools/repopick.py | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/tools/repopick.py b/tools/repopick.py
      index 9bf26bd18de..f069eed1bdc 100755
      --- a/tools/repopick.py
      +++ b/tools/repopick.py
      @@ -121,12 +121,12 @@ def fetch_query(remote_url, query):
               raise Exception('Gerrit URL should be in the form http[s]://hostname/ or ssh://[user@]host[:port]')
       
       if __name__ == '__main__':
      -    # Default to CyanogenMod Gerrit
      -    default_gerrit = 'http://review.cyanogenmod.org'
      +    # Default to AICP Gerrit
      +    default_gerrit = 'http://gerrit.aicp-rom.com'
       
           parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description=textwrap.dedent('''\
               repopick.py is a utility to simplify the process of cherry picking
      -        patches from CyanogenMod's Gerrit instance (or any gerrit instance of your choosing)
      +        patches from AICP's Gerrit instance (or any gerrit instance of your choosing)
       
               Given a list of change numbers, repopick will cd into the project path
               and cherry pick the latest patch available.
      
      From b367c52dcb8e816557de1fdf088ec1efeedf792c Mon Sep 17 00:00:00 2001
      From: Hashbang173 <hashbang173@gmail.com>
      Date: Sun, 4 Dec 2016 14:20:48 -0500
      Subject: [PATCH 381/502] roomservice: Add support for authenticated GitHub API
       requests
      
      Uses authentication if $GITHUB_API_USERNAME and $GITHUB_API_TOKEN
      environmental vairables are set.
      
      Change-Id: I57acaaf1a7210691fc271d2a5cfe8a5d46232e1a
      ---
       tools/roomservice.py | 10 +++++++++-
       1 file changed, 9 insertions(+), 1 deletion(-)
      
      diff --git a/tools/roomservice.py b/tools/roomservice.py
      index 8f5eed44110..7774ab608d5 100755
      --- a/tools/roomservice.py
      +++ b/tools/roomservice.py
      @@ -58,7 +58,15 @@
       
       page = 1
       while not depsonly:
      -    result = json.loads(urllib.request.urlopen("https://api.github.com/users/AICP/repos?page=%d" % page).read().decode())
      +    try:
      +        request = urllib.request.Request("https://api.github.com/users/AICP/repos?page=%d" % page)
      +        if os.environ.get('GITHUB_API_USERNAME') is not None and os.environ.get('GITHUB_API_TOKEN') is not None:
      +            base64string = base64.encodestring(('%s:%s' % (os.environ.get('GITHUB_API_USERNAME'), os.environ.get('GITHUB_API_TOKEN'))).encode()).decode().replace('\n', '')
      +            request.add_header("Authorization", "Basic %s" % base64string)
      +        result = json.loads(urllib.request.urlopen(request).read().decode())
      +    except:
      +        print("API Error")
      +        break
           if len(result) == 0:
               break
           for res in result:
      
      From 373adac3b5bb957687b90bc16db74b64cd863c38 Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Tue, 6 Dec 2016 12:15:35 -0800
      Subject: [PATCH 382/502] NMF26S
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 9d72ddbf361..e457464485a 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF26R
      +export BUILD_ID=NMF26S
      
      From 59f3ddcfee4a95462c1a8a31255169b6d9fcbc1e Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <invisiblek@cyanogenmod.org>
      Date: Tue, 6 Dec 2016 09:45:46 -0600
      Subject: [PATCH 383/502] blockimgdiff: plz don't spam my terminal, thx
      
      Change-Id: I44b1e7b2725e781ea65209f1b26f521f12a67a00
      ---
       tools/releasetools/blockimgdiff.py | 9 ++++-----
       1 file changed, 4 insertions(+), 5 deletions(-)
      
      diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
      index 17642382ea6..4de81d05d49 100644
      --- a/tools/releasetools/blockimgdiff.py
      +++ b/tools/releasetools/blockimgdiff.py
      @@ -697,17 +697,16 @@ def ComputePatches(self, prefix):
             for xf in self.transfers:
               if xf.style == "zero":
                 tgt_size = xf.tgt_ranges.size() * self.tgt.blocksize
      -          print("%10d %10d (%6.2f%%) %7s %s %s" % (
      -              tgt_size, tgt_size, 100.0, xf.style, xf.tgt_name,
      -              str(xf.tgt_ranges)))
      +          print("%10d %10d (%6.2f%%) %7s %s" % (
      +              tgt_size, tgt_size, 100.0, xf.style, xf.tgt_name))
       
               elif xf.style == "new":
                 for piece in self.tgt.ReadRangeSet(xf.tgt_ranges):
                   new_f.write(piece)
                 tgt_size = xf.tgt_ranges.size() * self.tgt.blocksize
      -          print("%10d %10d (%6.2f%%) %7s %s %s" % (
      +          print("%10d %10d (%6.2f%%) %7s %s" % (
                     tgt_size, tgt_size, 100.0, xf.style,
      -              xf.tgt_name, str(xf.tgt_ranges)))
      +              xf.tgt_name))
       
               elif xf.style == "diff":
                 src = self.src.ReadRangeSet(xf.src_ranges)
      
      From 479165500647091fdd8c1b08add45946461c745f Mon Sep 17 00:00:00 2001
      From: =?UTF-8?q?M=C3=A5rten=20Kongstad?= <marten.kongstad@sonymobile.com>
      Date: Mon, 27 Jul 2015 12:24:40 +0200
      Subject: [PATCH 384/502] OMS7-N: adb shell command to access
       OverlayManagerService
      
      Add a command to communicate with the OverlayManagerService for
      debugging purposes. This mirrors the am and pm commands.
      
      This commit restores the functionality after the Nougat rebase from
      Sony.
      
      Example use:
          $ adb shell om list
          com.android.systemui
              [ ] com.test.awesome-home-button
      
          $ adb shell om enable com.test.awesome-home-button
      
          $ adb shell om list
          com.android.systemui
              [x] com.test.awesome-home-button
      
      Co-authored-by: Martin Wallgren <martin.wallgren@sonymobile.com>
      Signed-off-by: Zoran Jovanovic <zoran.jovanovic@sonymobile.com>
      Change-Id: If424b8ef6052e4121902b630279c0ebaf416203c
      ---
       target/product/base.mk | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/target/product/base.mk b/target/product/base.mk
      index dcd48e72d9b..a12f939a629 100644
      --- a/target/product/base.mk
      +++ b/target/product/base.mk
      @@ -108,6 +108,7 @@ PRODUCT_PACKAGES += \
           mtpd \
           ndc \
           netd \
      +    om \
           ping \
           ping6 \
           platform.xml \
      
      From e30cdc423ef3f940e0612923e7b3b6c04c688297 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <invisiblek@cyanogenmod.org>
      Date: Thu, 1 Dec 2016 20:06:14 -0600
      Subject: [PATCH 385/502] core: allow specifying building ramdisk(s) with lzma
      
      * Add a flag that specifies which ramdisk(s) to compress with lzma
      * If not specified, fall back to gzip
      * Example: LZMA_RAMDISK_TARGETS := boot,recovery
      
      Change-Id: I9cce4da90343fb6dfb7039863649e37d78262726
      ---
       core/Makefile | 22 +++++++++++++++++-----
       1 file changed, 17 insertions(+), 5 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 75b86176fd5..657237064f5 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -562,6 +562,18 @@ endif
       
       # -----------------------------------------------------------------
       # the ramdisk
      +BOOT_RAMDISK_COMPRESSOR := $(MINIGZIP)
      +RECOVERY_RAMDISK_COMPRESSOR := $(MINIGZIP)
      +ifneq ($(LZMA_RAMDISK_TARGETS),)
      +  ifneq (,$(findstring boot,$(LZMA_RAMDISK_TARGETS)))
      +    BOOT_RAMDISK_COMPRESSOR := lzma -f -c
      +  endif
      +  ifneq (,$(findstring recovery,$(LZMA_RAMDISK_TARGETS)))
      +    RECOVERY_RAMDISK_COMPRESSOR := lzma -f -c
      +    TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK := true
      +  endif
      +endif
      +
       INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, \
       	$(ALL_PREBUILT) \
       	$(ALL_GENERATED_SOURCES) \
      @@ -573,12 +585,12 @@ BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
       INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
       $(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP)
       	$(call pretty,"Target ram disk: $@")
      -	$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@
      +	$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $@
       
       .PHONY: ramdisk-nodeps
       ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP)
       	@echo "make $@: ignoring dependencies"
      -	$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET)
      +	$(hide) $(MKBOOTFS) -d $(TARGET_OUT) $(TARGET_ROOT_OUT) | $(BOOT_RAMDISK_COMPRESSOR) > $(INSTALLED_RAMDISK_TARGET)
       
       ifneq ($(strip $(TARGET_NO_KERNEL)),true)
       
      @@ -1197,7 +1209,7 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \
       	$(call pretty,"Target boot image from recovery: $@")
       	$(call build-recoveryramdisk)
       	$(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk)
      -	$(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk)
      +	$(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk)
       	$(call build-recoveryimage-target, $@)
       endif
       
      @@ -1217,7 +1229,7 @@ $(recovery_uncompressed_ramdisk): $(MKBOOTFS) \
       $(recovery_ramdisk): $(MINIGZIP) \
       		$(recovery_uncompressed_ramdisk)
       	@echo "----- Making compressed recovery ramdisk ------"
      -	$(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $@
      +	$(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $@
       
       ifndef BOARD_CUSTOM_BOOTIMG_MK
       $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTIMG) $(recovery_ramdisk) $(recovery_kernel) \
      @@ -1288,7 +1300,7 @@ recoveryimage-nodeps:
       	@echo "make $@: ignoring dependencies"
       	$(call build-recoveryramdisk)
       	$(hide) $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) > $(recovery_uncompressed_ramdisk)
      -	$(hide) $(MINIGZIP) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk)
      +	$(hide) $(RECOVERY_RAMDISK_COMPRESSOR) < $(recovery_uncompressed_ramdisk) > $(recovery_ramdisk)
       	$(call build-recoveryimage-target, $(INSTALLED_RECOVERYIMAGE_TARGET))
       
       else # INSTALLED_RECOVERYIMAGE_TARGET not defined
      
      From a3bfabffcf86f5f5110bc041dc32c94042d9f8d9 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sat, 10 Dec 2016 14:16:13 +0300
      Subject: [PATCH 386/502] build: envsetup: Add mmmap command
      
      It doesn't make sense to have:
      1. mm and mmp
      2. mma and mmap
      3. mmm and mmmp
      4. mmma BUT NO mmmap
      
      Add the mmmap command for consistency.
      
      Change-Id: I8cb1041113e6d56a0ac1d34898b07615da22b459
      ---
       envsetup.sh | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 8620c22923a..8ecc0340d43 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2457,6 +2457,7 @@ EOF
       alias mmp='dopush mm'
       alias mmmp='dopush mmm'
       alias mmap='dopush mma'
      +alias mmmap='dopush mmma'
       alias mkap='dopush mka'
       alias cmkap='dopush cmka'
       
      
      From 926baee4d221203d8f90562c7c133a4287790f1f Mon Sep 17 00:00:00 2001
      From: Adrian DC <radian.dc@gmail.com>
      Date: Sun, 11 Dec 2016 08:08:38 +0300
      Subject: [PATCH 387/502] repopick: Avoid failing on commits lookup
      
       * Some projects with multiple merges and
          discountinuous histories could trigger
          an error here when the HEAD~{?} does
          not exist, hence avoid this by ignoring
          the commit and continue the search
      
      Change-Id: Ice28c87d1bf8897da52236b637bbb0c5d349f848
      ---
       tools/repopick.py | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/tools/repopick.py b/tools/repopick.py
      index f069eed1bdc..ca0330ce629 100755
      --- a/tools/repopick.py
      +++ b/tools/repopick.py
      @@ -328,6 +328,8 @@ def fetch_query(remote_url, query):
               # Check if change is already picked to HEAD...HEAD~check_picked_count
               found_change = False
               for i in range(0, check_picked_count):
      +            if subprocess.call(['git', 'cat-file', '-e', 'HEAD~{0}'.format(i)], cwd=project_path, stderr=open(os.devnull, 'wb')):
      +                continue
                   output = subprocess.check_output(['git', 'show', '-q', 'HEAD~{0}'.format(i)], cwd=project_path).split()
                   if 'Change-Id:' in output:
                       head_change_id = ''
      
      From 44f3bdf9eec3cc53ef6ddfae9100f0d0af6eff69 Mon Sep 17 00:00:00 2001
      From: kuantung <kuantung@google.com>
      Date: Mon, 12 Dec 2016 16:43:30 -0800
      Subject: [PATCH 388/502] NOF26T
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index e457464485a..8a0208136a2 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF26S
      +export BUILD_ID=NOF26T
      
      From d46fc6575eee81dea27655f44c903fca10912dab Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Mon, 12 Dec 2016 19:46:57 -0600
      Subject: [PATCH 389/502] Merge tag 'android-7.1.1_r6'
      
      Android 7.1.1 release 6
      
      Change-Id: I6bca91229f411c624676b90dc8ccc273ecf7b12c
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index c3d6c40af03..e6dba3fae60 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF26O
      +export BUILD_ID=NMF26Q
      
      From 4d4d49273a7fcb3cc0d0dcf8e91a72eba9ce7090 Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca.stefani.ge1@gmail.com>
      Date: Sun, 18 Dec 2016 16:57:49 +0100
      Subject: [PATCH 390/502] envsetup: Split cached vars
      
      * Broken after ZSH v5.3
      
      Change-Id: I99febebfa22efd702c2dea13369a9dd90f8e6120
      ---
       envsetup.sh | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 8ecc0340d43..3558f142a56 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -91,11 +91,11 @@ function build_build_var_cache()
       function destroy_build_var_cache()
       {
           unset BUILD_VAR_CACHE_READY
      -    for v in $cached_vars; do
      +    for v in $(echo $cached_vars | tr " " "\n"); do
             unset var_cache_$v
           done
           unset cached_vars
      -    for v in $cached_abs_vars; do
      +    for v in $(echo $cached_abs_vars | tr " " "\n"); do
             unset abs_var_cache_$v
           done
           unset cached_abs_vars
      
      From 3dfc14732cc58522f866cfb25511dcd2fb7b3776 Mon Sep 17 00:00:00 2001
      From: SpiritCroc <spiritcroc@gmail.com>
      Date: Fri, 16 Dec 2016 16:00:01 +0100
      Subject: [PATCH 391/502] Roomservice: allow adding remove-project
      
      In your device tree, add aicp.removal.dependencies in case some
      dependencies included in aicp.dependencies conflict with the current
      default manifest.
      
      Modified roomservice to call roomcleaner which does all the removals.
      Roomcleaner is in fact a modified copy of roomservice.
      
      Original commit-history of roomservice:
      
      commit d0419da633382089a5cce0fa508468810bb3188f
      Author: Koushik Dutta <koushd@gmail.com>
      Date:   Sat Nov 26 18:51:42 2011 -0800
      
          roomservice delivers you lunch combos from the CyanogenMod github.
      
          fix roomservice formatting
      
          support product names with _ in them
      
          fix roomservice to handle pagination
      
          Change-Id: I4923c2f768094dbad8e06a72d9f27d46414030ab
      
          roomservice: Add lightweight dependencies to repositories
      
          Roomservice can already fetch your cm_<device> without the need for a
          manifest entry.
      
          However, when working with common repositories, there is no way of
          actually fetching them without adding to the manifest. This patch
          introduces a lightweight dependency system. Each repository can have a
          cm.dependencies in the following json format:
      
          [
            {
              "repository": "repository_name_on_cm_organization"
              "target_path": "target/path"
            },
            ...
          ]
      
          For instance, for cm_anzu I need android_device_semc_msm7x30-common and
          android_device_semc_mogami-common. I would add both to cm.dependencies
          as follows:
      
          [
            {
              "repository": "android_device_semc_msm7x30-common",
              "target_path": "device/semc/msm7x30-common"
            },
            {
              "repository": "android_device_semc_mogami-common",
              "target_path": "device/semc/mogami-common"
            }
          ]
      
          Roomservice would then fetch the anzu repository, parse the dependency
          files and add/fetch/sync these additional repositories if they don't
          exist already.
      
          This also adds pretty printing to the output xml.
      
          Change-Id: I9cc847adfc717a06439bc6094213ed6492343158
      
          roomservice: Add branch support to cm.dependencies
      
          Allow the cm.dependencies entries to provide an optional "branch" for
          the repository dependencies. Added to fully support
          http://wiki.cyanogenmod.com/wiki/Integrated_kernel_building
      
          Change-Id: I35b51920d296afa329411af6172c7bd9aeef4af8
      
          roomservice: Fill in dependencies for already-deployed repositories
      
          Change-Id: I01fd408c9c4bfa78097c7f848b2556d2b2b180f3
      
          roomservice: Extend dependency-checks to devices in main manifest
      
          CM currently keeps devices inherited from AOSP in the main manifest,
          so take that into account as well when checking device paths
      
          Change-Id: I9663f283617f237428b4eaa0cd60b5de2b86a7b9
      
          make compatible with github v3 api
      
          Change-Id: Iff6f1f9099cdc5d2b49e04000b5fe3d04aa5d7e4
      
          Fixed build for full-eng
      
          Previously
          Traceback (most recent call last):
            File "build/tools/roomservice.py", line 153, in <module>
              repo_path = get_from_manifest(device)
          NameError: name 'device' is not defined
      
          ** Don't have a product spec for: 'full'
          ** Do you have the right repo manifest?
      
          Now
          ============================================
          PLATFORM_VERSION_CODENAME=REL
          PLATFORM_VERSION=4.0.4
          TARGET_PRODUCT=full
          TARGET_BUILD_VARIANT=eng
          TARGET_BUILD_TYPE=release
          TARGET_BUILD_APPS=
          TARGET_ARCH=arm
          TARGET_ARCH_VARIANT=armv7-a
          HOST_ARCH=x86
          HOST_OS=linux
          HOST_BUILD_TYPE=release
          BUILD_ID=IMM76L
          ============================================
      
          Change-Id: Ib513705aba9a7a52a971ab64102ecbe9fddfb97a
      
          roomservice: Bump github request per_page to 100
      
          Change the number of repos per page from the default 30
          to 100.
      
          We seem to be hitting the rate limit on the jenkins server.
      
          Change-Id: Ie733feaa0414cbfebb7efcfc1e24d94e1e466d1b
      
          roomservice: Add support for netrc
      
          Change-Id: I1f5e11e40125abd0c4e4c8d8294d4fc09bfdc30a
      
          roomservice: Handle missing netrc file
      
          Change-Id: If981fe79dc3e2191434301239b0cd585be8b4730
      
          roomservice.py: Verbose error when a branch is missing.
          Also add ROOMSERVICE_BRANCHES environment variable to use fallback branches.
      
          Change-Id: I3c2b1d79fc185c1f1e1d658e5ca4f78e688780e2
      
          roomservice.py: Fixups around fallback branches not being used by dependencies when ROOMSERVICE_BRANCHES is defined.
      
          Change-Id: Ifb42a023cae5f62ac8f9cf7832125b91b431169c
      
          roomservice: Allow following up tag references
      
          This is now needed for release builds
      
          Change-Id: I8c5f87341059b3b15ee853312b71df73790ad0d8
      
          build: local_manifest.xml deprecated, use local_manifests
      
          Patch Set 2:- Use roomservice.xml instead of cm.xml.
      
          Change-Id: I3d8a6ef3907b92808662cbba912cea5ed38d0bde
      
          Fix fallback branch search in roomservice
      
          If you provided a fallback branch to roomservice via the
          ROOMSERVICE_BRANCHES environment var the branch search would fail
          if the device repo had any tags.
      
          Fixed this by appending the tag search results to the branch
          search results instead of overwriting them
      
          Change-Id: I73a11af1500bd04e346f08ec3f83454502f3a169
      
          roomservice: Fix wrong assumption about path of active manifest
      
          Change-Id: Id740ff4b848e6ccbfd658be4846197b8ca519237
      
          roomservice: When validating the presence of a repo, check main manifest too
      
          Change-Id: If680536484074b473458723d93e783d074d7f669
      
          roomservice: Bump devices per page to 200
      
          Limit was reached again when attempting to
          lunch various projects, such as steelhead.
      
          Change-Id: I2f3b9705e07e1e47b86857aeb383cf7c99fcdbdc
          Signed-off-by: William Roberts <bill.c.roberts@gmail.com>
      
          roomservice: Fix assumptions about the branch naming
      
          We can't just split from the last slash anymore, since we're using
          those to distinguish the stabilization branches
      
          Change-Id: Ia175dd317f508e99b275b56e9c83bd4729a75ddb
      
          roomservice: Add recursive dependencies
      
          Dependency repositories can now have dependencies themselves
      
          Change-Id: I33a28709170da52bc98f4a62387927e3a11b2450
      
          roomservice: python3 support
      
          Change-Id: I7621818ba7ed997676728fe865f37a25b3a5b8b5
          Signed-off-by: Chirayu Desai <cdesai@cyanogenmod.org>
      
          roomservice: Improve new device retrieval
      
          Without credentials, GitHub's search API limits requests to 60/hr.
          The existing method to add a new device is to fetch JSON-formatted info
          for ALL CM repositories and then search for the device. In doing so,
          more than 10 pages of results are returned (i.e. more than 10 requests
          per device). This is clumsy, slow, and limits use of roomservice to
          only ~5 devices per hour.
      
          Instead, only return search results for repositories that have the
          device name in the repository name. Then, one device = one request.
          It's faster and allows closer to 60 device setups / hr.
      
          Additional bailouts are included to stop the script earlier than later
          if a device is not found.
      
          Change-Id: I7f914d7ede82da0f100d9fd6cf8b603177962e48
      
          roomservice: Fix search of devices forked to CM
      
          Commit "roomservice: Improve new device retrieval" introduced a
          regression where repositories that were forked to CM were omitted from
          search results. This fixes that issue.
      
          Change-Id: I7bf54129b5da1749abe5b2b9a492cb93e6ee41a6
      
          roomservice: Improve error handling on search
      
          Use the relevant forms of 'except' for urllib and parsing instead of a
          general except which was performed too late anyways.
      
          Change-Id: Ia1fc89dd5a8a703fc0175aef7b6dd013a44a2c8e
      
          roomservice: use force-sync when adding projects with roomservice
      
          This works around the error
          GitError: --force-sync not enabled; cannot overwrite a local work tree
          when using roomservice.
      
          Since this should only trigger when the device repos haven't been
          checked out yet, we can use force-sync to overwrite any roomservice
          device paths in the .repo directory.
      
          Change-Id: Iac54a8a2f2913f82f8ca6497b8785a9d5769640b
          Ticket: CYNGNOS-735
      
          roomservice: check uniqueness by path, not name
      
          For repos such as hardware/qcom/media-caf we are using the same name
          with different branches for different paths.
      
          for eg.
            CyanogenMod/hardware_qcom_media-caf(branch:8994)
             - fetch to : /hardware/qcom/media-caf/8994
            CyanogenMod/hardware_qcom_media-caf(branch:8960)
             - fetch to : /hardware/qcom/media-caf/8960
      
          For such cases roomservice won't pick up a new path
          if one already exists.
      
          We should check for unique by target path instead.
      
          Change-Id: I89e561ca9a2d57ede8cf782f431a8e829ea47ee5
          Signed-off-by: Arnav Gupta <championswimmer@gmail.com>
      
      commit 6cb0e68159dadb367be69f747b8bf31da53f356d
      Author: Anthony King <anthonydking@slimroms.net>
      Date:   Tue Nov 3 00:23:11 2015 +0000
      
          py3: update all the things
      
          Change-Id: I5e11b46b7c2f7f8760d6c0e713ca99c1e88b7cd3
      
          py3: update releasetools with proper print syntax
      
          Change-Id: I48534a72e6559f60af5f9b1c09040b34b7575b63
      
          py3: ota_from_target_files.py: fix logic that broke
      
          Change-Id: I032097c463598d1246feb92c02567175a65f90fd
      
      commit 73f68876ae1449fbe7ef15648c9c86c9b6b1b27a
      Author: LorDClockaN <lordclockan@gmail.com>
      Date:   Sat Aug 27 17:15:10 2016 +0200
      
          AICPfy
      
          Change-Id: I5c9599da2e68a17bafc73e8afabc06f6d54a77b6
      
      commit 8fe78df7c6eaedc2079478f6421d269db7c93e01
      Author: Hashbang173 <hashbang173@gmail.com>
      Date:   Fri Oct 28 18:28:50 2016 -0400
      
          roomservice: update for n7.1
      
          Change-Id: Ia1a01f2e18ad6785d39f51b466a5d5a1b6d553be
      
      commit b367c52dcb8e816557de1fdf088ec1efeedf792c
      Author: Hashbang173 <hashbang173@gmail.com>
      Date:   Sun Dec 4 14:20:48 2016 -0500
      
          roomservice: Add support for authenticated GitHub API requests
      
          Uses authentication if $GITHUB_API_USERNAME and $GITHUB_API_TOKEN
          environmental vairables are set.
      
          Change-Id: I57acaaf1a7210691fc271d2a5cfe8a5d46232e1a
      
      Change-Id: I97e62956f76d7c6bc9aca73ab1453b65a3209780
      ---
       tools/roomcleaner.py | 229 +++++++++++++++++++++++++++++++++++++++++++
       tools/roomservice.py |   9 +-
       2 files changed, 235 insertions(+), 3 deletions(-)
       create mode 100755 tools/roomcleaner.py
      
      diff --git a/tools/roomcleaner.py b/tools/roomcleaner.py
      new file mode 100755
      index 00000000000..668a04e5d74
      --- /dev/null
      +++ b/tools/roomcleaner.py
      @@ -0,0 +1,229 @@
      +#!/usr/bin/env python
      +# Copyright (C) 2012 The CyanogenMod Project
      +# Copyright (C) 2012-2016 AICP 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.
      +
      +from __future__ import print_function
      +
      +import base64
      +import filecmp
      +import json
      +import netrc
      +import os
      +import re
      +import sys
      +try:
      +  # For python3
      +  import urllib.error
      +  import urllib.parse
      +  import urllib.request
      +except ImportError:
      +  # For python2
      +  import imp
      +  import urllib2
      +  import urlparse
      +  urllib = imp.new_module('urllib')
      +  urllib.error = urllib2
      +  urllib.parse = urlparse
      +  urllib.request = urllib2
      +
      +from xml.etree import ElementTree
      +
      +device_path = sys.argv[1]
      +
      +if device_path.endswith("/"):
      +    device_path = device_path[:-1]
      +
      +try:
      +    device = device_path[device_path.rfind("/") + 1:]
      +except:
      +    device = device_path
      +
      +repositories = []
      +
      +page = 1
      +
      +local_manifests = r'.repo/local_manifests'
      +if not os.path.exists(local_manifests): os.makedirs(local_manifests)
      +
      +removal_manifest = ".repo/local_manifests/00_aicp_removals.xml"
      +tmp_removal_manifest = ".repo/local_manifests/tmp_aicp_removals.xml"
      +
      +def exists_in_tree(lm, repository):
      +    for child in lm.getchildren():
      +        if child.attrib['name'].endswith(repository):
      +            return child
      +    return None
      +
      +# in-place prettyprint formatter
      +def indent(elem, level=0):
      +    i = "\n" + level*"  "
      +    if len(elem):
      +        if not elem.text or not elem.text.strip():
      +            elem.text = i + "  "
      +        if not elem.tail or not elem.tail.strip():
      +            elem.tail = i
      +        for elem in elem:
      +            indent(elem, level+1)
      +        if not elem.tail or not elem.tail.strip():
      +            elem.tail = i
      +    else:
      +        if level and (not elem.tail or not elem.tail.strip()):
      +            elem.tail = i
      +
      +def is_in_manifest(projectname):
      +    try:
      +        lm = ElementTree.parse(tmp_removal_manifest)
      +        lm = lm.getroot()
      +    except:
      +        lm = ElementTree.Element("manifest")
      +
      +    for localpath in lm.findall("remove-project"):
      +        if localpath.get("name") == projectname:
      +            return 1
      +
      +    return None
      +
      +def add_to_manifest_dependencies(repositories):
      +    try:
      +        lm = ElementTree.parse(tmp_removal_manifest)
      +        lm = lm.getroot()
      +    except:
      +        lm = ElementTree.Element("manifest")
      +
      +    for repository in repositories:
      +        repo_name = repository['repository']
      +        existing_project = exists_in_tree(lm, repo_name)
      +        if existing_project != None:
      +            print('Remove-project for AICP/%s already exists' % (repo_name))
      +            continue
      +
      +        print ('Adding remove-project to manifest: %s' % (repo_name))
      +        project = ElementTree.Element("remove-project", attrib = { "name": repo_name })
      +
      +        lm.append(project)
      +
      +    indent(lm, 0)
      +    raw_xml = ElementTree.tostring(lm).decode()
      +    raw_xml = '<?xml version="1.0" encoding="UTF-8"?>\n' + raw_xml
      +
      +    f = open(tmp_removal_manifest, 'w')
      +    f.write(raw_xml)
      +    f.close()
      +
      +def add_to_manifest(repositories):
      +    try:
      +        lm = ElementTree.parse(tmp_removal_manifest)
      +        lm = lm.getroot()
      +    except:
      +        lm = ElementTree.Element("manifest")
      +
      +    for repository in repositories:
      +        repo_name = repository['repository']
      +        if exists_in_tree(lm, repo_name):
      +            print('Remove-project for AICP/%s already exists' % (repo_name))
      +            continue
      +
      +        print ('Adding remove-project to manifest: %s' % (repo_name))
      +        project = ElementTree.Element("remove-project", attrib = { "name": "AICP/%s" % (repo_name) })
      +
      +        lm.append(project)
      +
      +    indent(lm, 0)
      +    raw_xml = ElementTree.tostring(lm).decode()
      +    raw_xml = '<?xml version="1.0" encoding="UTF-8"?>\n' + raw_xml
      +
      +    f = open(tmp_removal_manifest, 'w')
      +    f.write(raw_xml)
      +    f.close()
      +
      +def fetch_dependencies(repo_path):
      +    #print('Looking for required remove-projects')
      +    dependencies_path = repo_path + '/aicp.removal.dependencies'
      +    syncable_repos = []
      +
      +    if os.path.exists(dependencies_path):
      +        dependencies_file = open(dependencies_path, 'r')
      +        dependencies = json.loads(dependencies_file.read())
      +        fetch_list = []
      +
      +        for dependency in dependencies:
      +            if not is_in_manifest("%s" % dependency['repository']):
      +                fetch_list.append(dependency)
      +
      +        dependencies_file.close()
      +
      +        if len(fetch_list) > 0:
      +            add_to_manifest_dependencies(fetch_list)
      +
      +    if len(syncable_repos) > 0:
      +        print('Syncing dependencies')
      +        os.system('repo sync --force-sync %s' % ' '.join(syncable_repos))
      +
      +def remove_removals(removal_manifest):
      +    tmp_manifest_disable = ".repo/local_manifests/aicp_manifest.xml"
      +    tmp_manifest_disabled = ".repo/local_manifests/tmp_disabled"
      +    syncable_repos = []
      +    try:
      +        lm = ElementTree.parse(removal_manifest)
      +        lm = lm.getroot()
      +    except:
      +        lm = ElementTree.Element("manifest")
      +    for child in lm.getchildren():
      +        syncable_repos.append(child.attrib['name'])
      +    os.system('rm %s' % removal_manifest)
      +
      +    if os.path.exists(tmp_manifest_disable):
      +        os.system('mv %s %s' % (tmp_manifest_disable, tmp_manifest_disabled))
      +    for remove_dep in syncable_repos:
      +        remove_dependency(os.popen('repo list -p %s' % remove_dep).read()[:-1], tmp_manifest_disabled)
      +    if os.path.exists(tmp_manifest_disabled):
      +        os.system('mv %s %s' % (tmp_manifest_disabled, tmp_manifest_disable))
      +
      +    os.system('repo sync --force-sync %s' % ' '.join(syncable_repos))
      +
      +def remove_dependency(dependency_paths, manifest_path):
      +    try:
      +        lm = ElementTree.parse(manifest_path)
      +        lm = lm.getroot()
      +    except:
      +        lm = ElementTree.Element("manifest")
      +    for child in lm.getchildren():
      +        for dependency_path in dependency_paths.split('\n'):
      +            if child.attrib['path'] == dependency_path:
      +                print('Removing dependency %s from local manifest to avoid conflicts' % child.attrib['path'])
      +                lm.remove(child)
      +    f = open(manifest_path, 'w')
      +    f.write(ElementTree.tostring(lm).decode())
      +    f.close()
      +
      +fetch_dependencies(device_path)
      +
      +if os.path.exists(removal_manifest):
      +    if os.path.exists(tmp_removal_manifest):
      +        if filecmp.cmp(removal_manifest, tmp_removal_manifest):
      +            print('Leaving repo removals in local manifest unchanged')
      +            os.system('rm %s' % tmp_removal_manifest)
      +        else:
      +            print('Updating repo removals in local manifest')
      +            remove_removals(removal_manifest)
      +            os.system('mv %s %s' % (tmp_removal_manifest, removal_manifest))
      +    else:
      +        print('Removing previous repo removals from local manifest')
      +        remove_removals(removal_manifest)
      +elif os.path.exists(tmp_removal_manifest):
      +    print('Created repo removals for local manifest')
      +    os.system('mv %s %s' % (tmp_removal_manifest, removal_manifest))
      +else:
      +    print('No remove-project used or required')
      diff --git a/tools/roomservice.py b/tools/roomservice.py
      index 7774ab608d5..22bf9bd6298 100755
      --- a/tools/roomservice.py
      +++ b/tools/roomservice.py
      @@ -216,11 +216,14 @@ def add_to_manifest(repositories):
           f.write(raw_xml)
           f.close()
       
      -def fetch_dependencies(repo_path, fallback_branch = None):
      +def fetch_dependencies(repo_path, fallback_branch = None, first_dependency = False):
           print('Looking for dependencies')
           dependencies_path = repo_path + '/aicp.dependencies'
           syncable_repos = []
       
      +    if first_dependency:
      +        os.system('build/tools/roomcleaner.py %s' % repo_path)
      +
           if os.path.exists(dependencies_path):
               dependencies_file = open(dependencies_path, 'r')
               dependencies = json.loads(dependencies_file.read())
      @@ -253,7 +256,7 @@ def has_branch(branches, revision):
       if depsonly:
           repo_path = get_from_manifest(device)
           if repo_path:
      -        fetch_dependencies(repo_path)
      +        fetch_dependencies(repo_path, None, True)
           else:
               print("Trying dependencies-only mode on a non-existing device tree?")
       
      @@ -275,7 +278,7 @@ def has_branch(branches, revision):
                   os.system('repo sync --force-sync %s' % repo_path)
                   print("Repository synced!")
       
      -            fetch_dependencies(repo_path)
      +            fetch_dependencies(repo_path, None, True)
                   print("Done")
                   sys.exit()
       
      
      From 82c876c820375ba19250ad0c0d8fd8885113fedc Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Sun, 12 Jun 2016 14:35:03 +0200
      Subject: [PATCH 392/502] Add hosts and custom files persistance on flash
      
      We had all the files needed for this from an era
      long time ago (AOKP) lol.
      So I just added the persist command to be launched
      when Backup command is launched
      
      Change-Id: I54352e9485931c4c79bf144f58e355838d74ce67
      ---
       tools/releasetools/edify_generator.py       | 3 +++
       tools/releasetools/ota_from_target_files.py | 3 ++-
       2 files changed, 5 insertions(+), 1 deletion(-)
      
      diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py
      index 57a1b438274..a1c50cd9db8 100644
      --- a/tools/releasetools/edify_generator.py
      +++ b/tools/releasetools/edify_generator.py
      @@ -170,6 +170,9 @@ def ValidateSignatures(self, command):
           # Exit code 124 == abort. run_program returns raw, so left-shift 8bit
           self.script.append('run_program("/tmp/install/bin/otasigcheck.sh") != "31744" || abort("Can\'t install this package on top of incompatible data. Please try another package or run a factory reset");')
       
      +  def RunPersist(self, command):
      +    self.script.append(('run_program("/tmp/install/bin/persist.sh", "%s");' % command))
      +
         def ShowProgress(self, frac, dur):
           """Update the progress bar, advancing it over 'frac' over the next
           'dur' seconds.  'dur' may be zero to advance it via SetProgress
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 82e5096ddd0..ca55512d640 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -564,7 +564,6 @@ def CopyInstallTools(output_zip):
             install_target = os.path.join("install", os.path.relpath(root, install_path), f)
             output_zip.write(install_source, install_target)
       
      -
       def WriteFullOTAPackage(input_zip, output_zip):
         # TODO: how to determine this?  We don't know what version it will
         # be installed on top of. For now, we expect the API just won't
      @@ -673,6 +672,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
         if OPTIONS.backuptool:
           script.Mount("/system")
           script.RunBackup("backup")
      +    script.RunPersist("save")
           script.Unmount("/system")
       
         system_progress = 0.75
      @@ -800,6 +800,7 @@ def output_sink(fn, data):
           if block_based:
             script.Mount("/system")
           script.RunBackup("restore")
      +    script.RunPersist("restore")
           if block_based:
             script.Unmount("/system")
       
      
      From e789b3b0c7d063633d470b35a5d2c744899efa13 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 7 Dec 2016 15:00:20 -0800
      Subject: [PATCH 393/502] Update Security String to 2017-02-01 on nyc-dev
      
      Change-Id: I0e2dd0afcb6dd490dd81afb879890eeb41bf121d
      (cherry picked from commit 35901a7fd0eb5eae6c26cc11291da990364e663d)
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 550fc70ce70..3bda4868f26 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-01-05
      +      PLATFORM_SECURITY_PATCH := 2017-02-01
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From e0183ab920ef2a8f6b003b13cc37d610af1b74ab Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 7 Dec 2016 15:01:08 -0800
      Subject: [PATCH 394/502] Update Security String to 2017-02-05 on nyc-dev
      
      Change-Id: I761c90cd025b2862a3b6fe1cf12e6aebc5fa809f
      (cherry picked from commit af635660098e5686dd82888fe579d8e3b952cfbc)
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 3bda4868f26..ffd6148a3a3 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-02-01
      +      PLATFORM_SECURITY_PATCH := 2017-02-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 3c17cdff50672272ad76b202091d6d443f9b94e2 Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Mon, 19 Dec 2016 13:30:35 -0800
      Subject: [PATCH 395/502] NOF26U
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 8a0208136a2..2adfe40f36b 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NOF26T
      +export BUILD_ID=NOF26U
      
      From b5e9a771c43ab22146a76887d5a0a1cc23d1854e Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Wed, 21 Dec 2016 08:30:12 +0800
      Subject: [PATCH 396/502] build: envsetup: Ensure that we can always run
       roomservice
      
      Conflicts:
      	envsetup.sh
      Change-Id: I578cce73f20c86b82c0e0ae852cd0de02f0ed8a3
      ---
       envsetup.sh | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 3558f142a56..1221e3bad2e 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -705,7 +705,10 @@ function lunch()
               popd > /dev/null
               check_product $product
           else
      +        T=$(gettop)
      +        pushd $T > /dev/null
               build/tools/roomservice.py $product true
      +        popd > /dev/null
           fi
           TARGET_PRODUCT=$product \
           TARGET_BUILD_VARIANT=$variant \
      
      From 709feb08103a02340025964a87346df7a55b8e1e Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Thu, 29 Dec 2016 14:58:32 -0600
      Subject: [PATCH 397/502] core: finish using PRIVATE_RECOVERY_OUT rather than
       hard-coding "RECOVERY"
      
      * This macro was added for a reason, that reason being for devices
        without a dedicated recovery partition (marlin/sailfish for example?)
      
      * Use it
      
      Change-Id: Ieb08d498f1e201a01557b40aac8a30df26c97673
      ---
       core/Makefile | 8 ++++----
       1 file changed, 4 insertions(+), 4 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 657237064f5..3339fdc8c11 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2035,7 +2035,7 @@ ifdef INSTALLED_2NDBOOTLOADER_TARGET
       		$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second
       endif
       ifdef BOARD_KERNEL_TAGS_OFFSET
      -	$(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/RECOVERY/tags_offset
      +	$(hide) echo "$(BOARD_KERNEL_TAGS_OFFSET)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/tags_offset
       endif
       ifdef BOARD_KERNEL_CMDLINE
       	$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline
      @@ -2047,13 +2047,13 @@ ifdef BOARD_KERNEL_PAGESIZE
       	$(hide) echo "$(BOARD_KERNEL_PAGESIZE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/pagesize
       endif
       ifdef BOARD_KERNEL_TAGS_ADDR
      -	$(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/RECOVERY/tagsaddr
      +	$(hide) echo "$(BOARD_KERNEL_TAGS_ADDR)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/tagsaddr
       endif
       ifdef BOARD_RAMDISK_OFFSET
      -	$(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/RECOVERY/ramdisk_offset
      +	$(hide) echo "$(BOARD_RAMDISK_OFFSET)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/ramdisk_offset
       endif
       ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
      -	$(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/RECOVERY/dt
      +	$(hide) $(ACP) $(INSTALLED_DTIMAGE_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/dt
       endif
       endif # INSTALLED_RECOVERYIMAGE_TARGET defined or BOARD_USES_RECOVERY_AS_BOOT is true
       	@# Components of the boot image
      
      From a4c1563e72fd85e0d56903e1485cf3c3e5b3da23 Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca.stefani.ge1@gmail.com>
      Date: Sun, 1 Jan 2017 21:45:07 +0100
      Subject: [PATCH 398/502] lunch: Use cd - instead of popd
      
      * ZSH breaks a lot of things.
      
      Conflicts:
      	envsetup.sh
      Change-Id: Idee8485bee673bebf6fe5857253306b20aa92eb5
      ---
       envsetup.sh | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 1221e3bad2e..db7e859f19e 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -702,13 +702,13 @@ function lunch()
               T=$(gettop)
               pushd $T > /dev/null
               build/tools/roomservice.py $product
      -        popd > /dev/null
      +        cd - > /dev/null
               check_product $product
           else
               T=$(gettop)
               pushd $T > /dev/null
               build/tools/roomservice.py $product true
      -        popd > /dev/null
      +        cd - > /dev/null
           fi
           TARGET_PRODUCT=$product \
           TARGET_BUILD_VARIANT=$variant \
      
      From 1545d1d88775c0c2910f080039bcace8ece5320e Mon Sep 17 00:00:00 2001
      From: doc HD <doc.divxm@gmail.com>
      Date: Thu, 5 Jan 2017 10:25:18 +0300
      Subject: [PATCH 399/502] Merge tag 'android-7.1.1_r9' into n7.1
      
      Android 7.1.1 release 9
      
      Change-Id: Iaaeeefc65242dc7a765024289d60ed49c944b9fb
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index e6dba3fae60..157685667cd 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NMF26Q
      +export BUILD_ID=NMF26V
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 2c8a21f14a7..550fc70ce70 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2016-12-05
      +      PLATFORM_SECURITY_PATCH := 2017-01-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From ce760653f895750ae18ddbdc3d7aa917904029b4 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sun, 8 Jan 2017 08:21:27 +0100
      Subject: [PATCH 400/502] build: envsetup: Update CAF remote
      
      CAF recommends using https://source.codeaurora.org/quic/la now.
      
      Change-Id: Ic8d6451111f0e71bce044ffaae79f0acfc34caa1
      ---
       envsetup.sh | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index db7e859f19e..92cdf227d36 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -1829,7 +1829,7 @@ function cafremote()
           then
               PFX="platform/"
           fi
      -    git remote add caf git://codeaurora.org/$PFX$PROJECT
      +    git remote add caf https://source.codeaurora.org/quic/la/$PFX$PROJECT
           echo "Remote 'caf' created"
       }
       
      
      From 962578a3b067d92fab0ec87a4aedab43ab1e6be4 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sun, 8 Jan 2017 08:24:16 +0100
      Subject: [PATCH 401/502] build: qcom_target: Clean up QCOM_HARDWARE_VARIANT
       checks
      
      Change-Id: I97f812412f94a0638e78eaf7e45112b6924120a9
      ---
       core/qcom_target.mk | 38 ++++++++++++++++++++------------------
       1 file changed, 20 insertions(+), 18 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index a3a0965f010..186f836b26e 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -22,6 +22,10 @@ $(call project-set-path,qcom-$(2),$(strip $(path)))
       endef
       
       ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
      +    B_FAMILY := msm8226 msm8610 msm8974
      +    B64_FAMILY := msm8992 msm8994
      +    BR_FAMILY := msm8909 msm8916
      +    UM_FAMILY := msm8937 msm8953
       
           qcom_flags := -DQCOM_HARDWARE
           qcom_flags += -DQCOM_BSP
      @@ -60,24 +64,22 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           2ND_CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags)
           2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags)
       
      -    ifeq ($(QCOM_HARDWARE_VARIANT),)
      -        ifneq ($(filter msm8610 msm8226 msm8974,$(TARGET_BOARD_PLATFORM)),)
      -            QCOM_HARDWARE_VARIANT := msm8974
      -        else
      -        ifneq ($(filter msm8909 msm8916,$(TARGET_BOARD_PLATFORM)),)
      -            QCOM_HARDWARE_VARIANT := msm8916
      -        else
      -        ifneq ($(filter msm8953 msm8937,$(TARGET_BOARD_PLATFORM)),)
      -            QCOM_HARDWARE_VARIANT := msm8937
      -        else
      -        ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
      -            QCOM_HARDWARE_VARIANT := msm8994
      -        else
      -            QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM)
      -        endif
      -        endif
      -        endif
      -        endif
      +    ifeq ($(call is-board-platform-in-list, $(B_FAMILY)),true)
      +        QCOM_HARDWARE_VARIANT := msm8974
      +    else
      +    ifeq ($(call is-board-platform-in-list, $(B64_FAMILY)),true)
      +        QCOM_HARDWARE_VARIANT := msm8994
      +    else
      +    ifeq ($(call is-board-platform-in-list, $(BR_FAMILY)),true)
      +        QCOM_HARDWARE_VARIANT := msm8916
      +    else
      +    ifeq ($(call is-board-platform-in-list, $(UM_FAMILY)),true)
      +        QCOM_HARDWARE_VARIANT := msm8937
      +    else
      +        QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM)
      +    endif
      +    endif
      +    endif
           endif
       
       $(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT))
      
      From 56e483c969ce5dea586a28d798772e12dedb7f28 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sun, 8 Jan 2017 08:25:12 +0100
      Subject: [PATCH 402/502] build: qcom_target: Define MSM_VIDC_TARGET_LIST
      
      Currently, in the media HAL, we're replacing the usage
      of this variable with a check for TARGET_BOARD_PLATFORM.
      
      Instead of having to do that every time a new branch is made,
      define the variable in qcom_target.
      
      Change-Id: Idd85b6f0b167bbc64833eb03335abcaa7b9de4a9
      ---
       core/qcom_target.mk | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 186f836b26e..2d21a972b42 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -65,17 +65,22 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           2ND_CLANG_TARGET_GLOBAL_CPPFLAGS += $(qcom_flags)
       
           ifeq ($(call is-board-platform-in-list, $(B_FAMILY)),true)
      +        MSM_VIDC_TARGET_LIST := $(B_FAMILY)
               QCOM_HARDWARE_VARIANT := msm8974
           else
           ifeq ($(call is-board-platform-in-list, $(B64_FAMILY)),true)
      +        MSM_VIDC_TARGET_LIST := $(B64_FAMILY)
               QCOM_HARDWARE_VARIANT := msm8994
           else
           ifeq ($(call is-board-platform-in-list, $(BR_FAMILY)),true)
      +        MSM_VIDC_TARGET_LIST := $(BR_FAMILY)
               QCOM_HARDWARE_VARIANT := msm8916
           else
           ifeq ($(call is-board-platform-in-list, $(UM_FAMILY)),true)
      +        MSM_VIDC_TARGET_LIST := $(UM_FAMILY)
               QCOM_HARDWARE_VARIANT := msm8937
           else
      +        MSM_VIDC_TARGET_LIST := $(TARGET_BOARD_PLATFORM)
               QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM)
           endif
           endif
      
      From d15452f4f7e3c53e2d7d64fd41249a701213f1d3 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Sun, 8 Jan 2017 18:27:34 +0100
      Subject: [PATCH 403/502] build: core: include platform helper macros in target
       makefiles
      
      * These are now needed sooner than we had been importing them
        in android_build. This ensures they'll be imported before
        their macros are needed.
      
      Change-Id: Id7e31f36393414f6d51a8bc80686ceaebfe7cb28
      ---
       core/mtk_target.mk  | 3 +++
       core/qcom_target.mk | 3 +++
       2 files changed, 6 insertions(+)
      
      diff --git a/core/mtk_target.mk b/core/mtk_target.mk
      index 7c3ba1f6259..02f7a2c67dd 100644
      --- a/core/mtk_target.mk
      +++ b/core/mtk_target.mk
      @@ -1,3 +1,6 @@
      +# Bring in Mediatek helper macros too
      +include $(BUILD_SYSTEM)/mtk_utils.mk
      +
       ifeq ($(BOARD_USES_MTK_HARDWARE),true)
           mtk_flags := -DMTK_HARDWARE
       
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 2d21a972b42..d443773ddce 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -1,5 +1,8 @@
       # Target-specific configuration
       
      +# Bring in Qualcomm helper macros
      +include $(BUILD_SYSTEM)/qcom_utils.mk
      +
       # Populate the qcom hardware variants in the project pathmap.
       define ril-set-path-variant
       $(call project-set-path-variant,ril,TARGET_RIL_VARIANT,hardware/$(1))
      
      From 57b26694ff50275d8e129d7ab669de6f2ddbd7b0 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Sun, 8 Jan 2017 18:29:28 +0100
      Subject: [PATCH 404/502] core: move platform-specific helper macros to target
       makefiles
      
      * These (qcom specifically) are now needed sooner than we had
        previously been importing them. Move to vendor/cm and include
        them within their <platform>_target.mk makefiles.
      
      Change-Id: I06c6ab66446e2f0b54c245cf6c2cf665b649e0c9
      ---
       core/main.mk | 6 ------
       1 file changed, 6 deletions(-)
      
      diff --git a/core/main.mk b/core/main.mk
      index e415775924a..d6d9ff16e4d 100644
      --- a/core/main.mk
      +++ b/core/main.mk
      @@ -145,12 +145,6 @@ endif
       # be generated correctly
       include $(BUILD_SYSTEM)/cleanbuild.mk
       
      -# Bring in Qualcomm helper macros
      -include $(BUILD_SYSTEM)/qcom_utils.mk
      -
      -# Bring in Mediatek helper macros too
      -include $(BUILD_SYSTEM)/mtk_utils.mk
      -
       # Include the google-specific config
       -include vendor/google/build/config.mk
       
      
      From cf2e7d87205bedc28c2b60fd0da6c5f4a0536f92 Mon Sep 17 00:00:00 2001
      From: Ziyan <jaraidaniel@gmail.com>
      Date: Fri, 13 Jan 2017 00:37:50 +0300
      Subject: [PATCH 405/502] build: kernel: build arm kernel modules with -fno-pic
      
      With androidkernel (androideabi) toolchains, -fpic is enabled by default.
      At least on my 3.4 arm kernel, this causes an issue with kernel modules:
      "Unknown symbol _GLOBAL_OFFSET_TABLE_".
      
      On traditional armeabi toolchains, -fpic is not enabled, resulting in working
      kernel modules; let's follow that here.
      
      Change-Id: I3058b5213b34bdde9bb9d744563c7d55cd42d2a5
      ---
       core/tasks/kernel.mk | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index 0b85b19b2d2..ac9a097be47 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -115,6 +115,11 @@ TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PR
       # Clear this first to prevent accidental poisoning from env
       MAKE_FLAGS :=
       
      +ifeq ($(KERNEL_ARCH),arm)
      +  # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors
      +  MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
      +endif
      +
       ifeq ($(KERNEL_ARCH),arm64)
         # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE)
         MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
      
      From c89d4634abc80c48ffee7cf3e6caf54cf7d09494 Mon Sep 17 00:00:00 2001
      From: Matt Mower <mowerm@gmail.com>
      Date: Tue, 10 Jan 2017 13:48:56 -0600
      Subject: [PATCH 406/502] Revert "build: Enable custom ccache cache dir for
       Android"
      
      Developers can specify ccache parameters by sourcing a personal build
      environment script before envsetup. For example:
      
        CMHOME=$HOME/android/cm
        export USE_CCACHE=1
        export CCACHE_DIR=$CMHOME/.ccache
        $CMHOME/prebuilts/misc/linux-x86/ccache/ccache -M50G
        # Maybe someday, currently not supported in ccache 3.1.x
        # echo "max_size = 50G" > "$CCACHE_DIR/ccache.conf"
      
      This reverts commit d99981e6f2576d5fcce8bc5f6255407184b2de16.
      
      Change-Id: Ic7b36a6d61269647aec022a86570cfa2068f65d7
      ---
       core/ccache.mk | 6 ------
       envsetup.sh    | 4 ----
       2 files changed, 10 deletions(-)
      
      diff --git a/core/ccache.mk b/core/ccache.mk
      index 4a302749054..b682aff2aff 100644
      --- a/core/ccache.mk
      +++ b/core/ccache.mk
      @@ -55,12 +55,6 @@ ifneq ($(filter-out false,$(USE_CCACHE)),)
           ifndef CXX_WRAPPER
             CXX_WRAPPER := $(ccache)
           endif
      -    ifeq ($(ANDROID_CCACHE_DIR), $(CCACHE_DIR))
      -      ifneq ($(ANDROID_CCACHE_SIZE),)
      -        ACCSIZE_RESULT := $(shell $(ccache) -M$(ANDROID_CCACHE_SIZE))
      -      endif
      -    endif
           ccache =
      -    ACCSIZE_RESULT =
         endif
       endif
      diff --git a/envsetup.sh b/envsetup.sh
      index 92cdf227d36..0f5c8840952 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -286,10 +286,6 @@ function setpaths()
           unset ANDROID_HOST_OUT
           export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
       
      -    if [ -n "$ANDROID_CCACHE_DIR" ]; then
      -        export CCACHE_DIR=$ANDROID_CCACHE_DIR
      -    fi
      -
           # needed for building linux on MacOS
           # TODO: fix the path
           #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include
      
      From e18db368238b8d4e0e8ad85767e34f1bfedbd608 Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Thu, 12 Jan 2017 19:08:09 -0800
      Subject: [PATCH 407/502] NOF26V
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 2adfe40f36b..13ca90b4548 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NOF26U
      +export BUILD_ID=NOF26V
      
      From 72e4bc9b6e519f71b8d36c0d9c2aac709dd1ac37 Mon Sep 17 00:00:00 2001
      From: gitbuildkicker <android-build@google.com>
      Date: Fri, 13 Jan 2017 07:10:48 -0800
      Subject: [PATCH 408/502] NOF26W
      
      ---
       core/build_id.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 13ca90b4548..86ee3ab899d 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NOF26V
      +export BUILD_ID=NOF26W
      
      From bd4692b607f05e6ebf45b2a9e3e52993e3338bb4 Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sat, 14 Jan 2017 16:50:28 +0100
      Subject: [PATCH 409/502] cm: build: kernel: Remove obsolete checks
      
       * BOARD_USES_UBOOT is unused.
       * Same goes for BOARD_USES_UNCOMPRESSED_BOOT. Furthermore,
         it is superseded by TARGET_USES_UNCOMPRESSED_KERNEL.
      
      Change-Id: I9f0e2848fcd0cd212bccacf14df55ad03f821051
      ---
       core/tasks/kernel.mk | 10 ----------
       1 file changed, 10 deletions(-)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index ac9a097be47..544a3942edc 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -139,16 +139,6 @@ else
           KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null
       endif
       
      -## Do be discontinued in a future version. Notify builder about target
      -## kernel format requirement
      -ifeq ($(BOARD_KERNEL_IMAGE_NAME),)
      -ifeq ($(BOARD_USES_UBOOT),true)
      -        $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage")
      -else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true)
      -        $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image")
      -endif
      -endif
      -
       ifeq "$(wildcard $(KERNEL_SRC) )" ""
           ifneq ($(TARGET_PREBUILT_KERNEL),)
               HAS_PREBUILT_KERNEL := true
      
      From baf05d250bf23f4d2e6ef08146edb6fcc2016f1e Mon Sep 17 00:00:00 2001
      From: Sam Mortimer <sam@mortimer.me.uk>
      Date: Tue, 17 Jan 2017 12:30:20 -0800
      Subject: [PATCH 410/502] build sign_target_files_apks.py: clean tmp on exit
      
      Currently, this script creates and leaves nearly 2GB in tmp
      per run.  Clean up on exit.
      
      Change-Id: I4247dd2508e9d27de57c611c18e70800d7a47f33
      ---
       tools/releasetools/sign_target_files_apks.py | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
      index 9aa614fcb08..3c57ec075bb 100755
      --- a/tools/releasetools/sign_target_files_apks.py
      +++ b/tools/releasetools/sign_target_files_apks.py
      @@ -747,3 +747,5 @@ def option_handler(o, a):
           print("   ERROR: %s" % e)
           print()
           sys.exit(1)
      +  finally:
      +    common.Cleanup()
      
      From 830f78038091d03973bd187ed7139092490a305d Mon Sep 17 00:00:00 2001
      From: Rashed Abdel-Tawab <rashed@linux.com>
      Date: Thu, 19 Jan 2017 22:11:03 +0100
      Subject: [PATCH 411/502] build: Append -dtb to kernel image name if
       TARGET_KERNEL_APPEND_DTB is set
      
      Currently devices that have TARGET_KERNEL_APPEND_DTB set also have to set
      BOARD_KERNEL_IMAGE_NAME to Image.gz-dtb (or zImage-dtb on arm32) in order
      to properly build the image with an appended DT. Automatially append -dtb
      if TARGET_KERNEL_APPEND_DTB is set so BOARD_KERNEL_IMAGE_NAME does not need
      to be set.
      
      Change-Id: I5464c67092a7b9f86669902e5c0e4a47836f7cbd
      ---
       core/tasks/kernel.mk | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index 544a3942edc..5284b9306e6 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -108,6 +108,9 @@ else
             TARGET_PREBUILT_INT_KERNEL_TYPE := zImage
           endif
         endif
      +  ifeq ($(TARGET_KERNEL_APPEND_DTB),true)
      +    TARGET_PREBUILT_INT_KERNEL_TYPE := $(TARGET_PREBUILT_INT_KERNEL_TYPE)-dtb
      +  endif
       endif
       
       TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE)
      
      From 96d82f468c56f09bd859e29ec6d398d6beaf09ea Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Wed, 11 Jan 2017 16:11:57 +0100
      Subject: [PATCH 412/502] releasetools: Add script to sign zips
      
      Change-Id: I9cbeb6edea79a7e9bb0fc692e53497b54058d67f
      ---
       tools/releasetools/sign_zip.py | 69 ++++++++++++++++++++++++++++++++++
       1 file changed, 69 insertions(+)
       create mode 100755 tools/releasetools/sign_zip.py
      
      diff --git a/tools/releasetools/sign_zip.py b/tools/releasetools/sign_zip.py
      new file mode 100755
      index 00000000000..c40b1b42c36
      --- /dev/null
      +++ b/tools/releasetools/sign_zip.py
      @@ -0,0 +1,69 @@
      +#!/usr/bin/env python
      +#
      +# Copyright (C) 2017 The LineageOS 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.
      +
      +"""
      +Signs the given zip with the given key producing a new zip.
      +
      +Usage:  sign_release_zip [flags] input_zip output_zip
      +
      +  -k (--package_key) <key> Key to use to sign the package (default is
      +      "build/target/product/security/testkey").
      +"""
      +import sys
      +
      +import common
      +
      +OPTIONS = common.OPTIONS
      +
      +OPTIONS.package_key = "build/target/product/security/testkey"
      +
      +def SignOutput(input_zip_name, output_zip_name):
      +  key_passwords = common.GetKeyPasswords([OPTIONS.package_key])
      +  pw = key_passwords[OPTIONS.package_key]
      +
      +  common.SignFile(input_zip_name, output_zip_name, OPTIONS.package_key, pw,
      +                  whole_file=True)
      +
      +
      +def main(argv):
      +
      +  def option_handler(o, a):
      +    if o in ("-k", "--package_key"):
      +      OPTIONS.package_key = a
      +    else:
      +      return False
      +    return True
      +
      +  args = common.ParseOptions(argv, __doc__,
      +                             extra_opts="k:",
      +                             extra_long_opts=[
      +                                 "package_key=",
      +                             ], extra_option_handler=option_handler)
      +  if len(args) != 2:
      +    common.Usage(__doc__)
      +    sys.exit(1)
      +
      +  SignOutput(args[0], args[1])
      +
      +
      +if __name__ == '__main__':
      +  try:
      +    main(sys.argv[1:])
      +  except common.ExternalError as e:
      +    print()
      +    print("   ERROR: %s" % e)
      +    print()
      +    sys.exit(1)
      
      From 3ab00421334b802916d6ddfccb2d1e2cd07d7659 Mon Sep 17 00:00:00 2001
      From: Tom Powell <zifnab@zifnab06.net>
      Date: Fri, 20 Jan 2017 20:47:49 -0800
      Subject: [PATCH 413/502] releasetools: support reading release keys out of
       some sort of command
      
      key passphrases may live in some sort of secure storage, support running
      an arbitrary command to retrieve them.
      
      Change-Id: I49862cf60f1b73a2356e0c492e1038beef28a95f
      ---
       tools/releasetools/common.py | 17 ++++++++++++++++-
       1 file changed, 16 insertions(+), 1 deletion(-)
      
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 41559c4aa30..96eda756ef6 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -1032,6 +1032,7 @@ class PasswordManager(object):
         def __init__(self):
           self.editor = os.getenv("EDITOR", None)
           self.pwfile = os.getenv("ANDROID_PW_FILE", None)
      +    self.secure_storage_cmd = os.getenv("ANDROID_SECURE_STORAGE_CMD", None)
       
         def GetPasswords(self, items):
           """Get passwords corresponding to each string in 'items',
      @@ -1051,9 +1052,23 @@ def GetPasswords(self, items):
             missing = []
             for i in items:
               if i not in current or not current[i]:
      -          missing.append(i)
      +          #Attempt to load using ANDROID_SECURE_STORAGE_CMD
      +          if self.secure_storage_cmd:
      +            try:
      +              os.environ["TMP__KEY_FILE_NAME"] = str(i)
      +              ps = subprocess.Popen(self.secure_storage_cmd, shell=True, stdout=subprocess.PIPE)
      +              output = ps.communicate()[0]
      +              if ps.returncode == 0:
      +                current[i] = output
      +            except Exception as e:
      +              print(e)
      +              pass
      +          if i not in current or not current[i]:
      +            missing.append(i)
             # Are all the passwords already in the file?
             if not missing:
      +        if "ANDROID_SECURE_STORAGE_CMD" in os.environ:
      +          del os.environ["ANDROID_SECURE_STORAGE_CMD"]
               return current
       
             for i in missing:
      
      From 463724a4a1c08b42655cb957b21a0a7432bd4e7c Mon Sep 17 00:00:00 2001
      From: Tom Powell <zifnab@zifnab06.net>
      Date: Sun, 22 Jan 2017 12:32:53 -0800
      Subject: [PATCH 414/502] core: include libf2fs_fmt_host_dyn in otatools
      
      Change-Id: I4f31352139b2f38570f0370afff3901999082e48
      ---
       core/Makefile | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/core/Makefile b/core/Makefile
      index 3339fdc8c11..12475b04774 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -1886,6 +1886,7 @@ OTATOOLS += \
         $(HOST_LIBRARY_PATH)/libext2_profile-host$(HOST_SHLIB_SUFFIX) \
         $(HOST_LIBRARY_PATH)/libext2_quota-host$(HOST_SHLIB_SUFFIX) \
         $(HOST_LIBRARY_PATH)/libext2_uuid-host$(HOST_SHLIB_SUFFIX) \
      +  $(HOST_LIBRARY_PATH)/libf2fs_fmt_host_dyn$(HOST_SHLIB_SUFFIX) \
         $(HOST_LIBRARY_PATH)/libconscrypt_openjdk_jni$(HOST_SHLIB_SUFFIX) \
         $(HOST_LIBRARY_PATH)/libbrillo$(HOST_SHLIB_SUFFIX) \
         $(HOST_LIBRARY_PATH)/libbrillo-stream$(HOST_SHLIB_SUFFIX) \
      
      From 4d4ab9be53a9e54bb60a1ea198ceb493af32796d Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Tue, 10 Jan 2017 23:14:12 +0100
      Subject: [PATCH 415/502] ota_from_target_files: Remove device dependent
       arguments
      
      These device-specific arguments are defined at build time and are
      necessary to generate the zip correctly. Don't use command line
      arguments to specify them, but write all the needed information
      in misc_info.txt when the target-files zip is generated.
      ota_from_target_files will then read misc_info.txt and set
      everything automatically.
      
      Change-Id: Ibdbca575b76eb07b53fccfcea52a351c7e333f91
      ---
       core/Makefile                               | 14 +++++++-------
       tools/releasetools/ota_from_target_files.py | 18 +++++-------------
       2 files changed, 12 insertions(+), 20 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 12475b04774..28188faaa37 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2250,6 +2250,8 @@ ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
       else
       	$(hide) build/tools/getb64key.py $(DEFAULT_SYSTEM_DEV_CERTIFICATE).x509.pem > $(zip_root)/META/releasekey.txt
       endif
      +	$(hide) echo "ota_override_device=$(OTA_SCRIPT_OVERRIDE_DEVICE)" >> $(zip_root)/META/misc_info.txt
      +	$(hide) echo "ota_override_prop=$(OTA_SCRIPT_OVERRIDE_PROP)" >> $(zip_root)/META/misc_info.txt
       ifdef BOARD_PREBUILT_VENDORIMAGE
       	$(hide) mkdir -p $(zip_root)/IMAGES
       	$(hide) cp $(INSTALLED_VENDORIMAGE_TARGET) $(zip_root)/IMAGES/
      @@ -2315,15 +2317,15 @@ endif
       endif
       
       ifeq ($(TARGET_OTA_ASSERT_DEVICE),)
      -    $(INTERNAL_OTA_PACKAGE_TARGET): override_device := auto
      +    OTA_SCRIPT_OVERRIDE_DEVICE := auto
       else
      -    $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_OTA_ASSERT_DEVICE)
      +    OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_OTA_ASSERT_DEVICE)
       endif
       
       ifneq ($(TARGET_UNIFIED_DEVICE),)
      -    $(INTERNAL_OTA_PACKAGE_TARGET): override_prop := --override_prop=true
      +    OTA_SCRIPT_OVERRIDE_PROP := true
           ifeq ($(TARGET_OTA_ASSERT_DEVICE),)
      -        $(INTERNAL_OTA_PACKAGE_TARGET): override_device := $(TARGET_DEVICE)
      +        OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_OTA_ASSERT_DEVICE)
           endif
       endif
       
      @@ -2333,15 +2335,13 @@ endif
       
       $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE)
       	@echo "$(OTA_FROM_TARGET_SCRIPT)" > $(PRODUCT_OUT)/ota_script_path
      -	@echo "$(override_device)" > $(PRODUCT_OUT)/ota_override_device
      -	@echo "Package OTA:"" $@"
      +	@echo "Package OTA: $@"
       	$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
       	   $(OTA_FROM_TARGET_SCRIPT) -v \
       	   $(block_based) \
       	   -p $(HOST_OUT) \
       	   -k $(KEY_CERT_PAIR) \
       	   --backup=$(backuptool) \
      -	   --override_device=$(override_device) $(override_prop) \
       	   $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
       	   $(BUILT_TARGET_FILES_PACKAGE) $@
       
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index ca55512d640..9ce93ced666 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -118,13 +118,6 @@
             Enable or disable the execution of backuptool.sh.
             Disabled by default.
       
      -  --override_device <device>
      -      Override device-specific asserts. Can be a comma-separated list.
      -
      -  --override_prop <boolean>
      -      Override build.prop items with custom vendor init.
      -      Enabled when TARGET_UNIFIED_DEVICE is defined in BoardConfig
      -
         --payload_signer <signer>
             Specify the signer when signing the payload and metadata for A/B OTAs.
             By default (i.e. without this flag), it calls 'openssl pkeyutl' to sign
      @@ -2077,10 +2070,6 @@ def option_handler(o, a):
             OPTIONS.log_diff = a
           elif o in ("--backup",):
             OPTIONS.backuptool = bool(a.lower() == 'true')
      -    elif o in ("--override_device",):
      -      OPTIONS.override_device = a
      -    elif o in ("--override_prop",):
      -      OPTIONS.override_prop = bool(a.lower() == 'true')
           elif o == "--payload_signer":
             OPTIONS.payload_signer = a
           elif o == "--payload_signer_args":
      @@ -2115,8 +2104,6 @@ def option_handler(o, a):
                                        "gen_verify",
                                        "log_diff=",
                                        "backup=",
      -                                 "override_device=",
      -                                 "override_prop=",
                                        "payload_signer=",
                                        "payload_signer_args=",
                                    ], extra_option_handler=option_handler)
      @@ -2143,6 +2130,11 @@ def option_handler(o, a):
         OPTIONS.info_dict = common.LoadInfoDict(input_zip)
         common.ZipClose(input_zip)
       
      +  if "ota_override_device" in OPTIONS.info_dict:
      +    OPTIONS.override_device = OPTIONS.info_dict.get("ota_override_device")
      +  if "ota_override_prop" in OPTIONS.info_dict:
      +    OPTIONS.override_prop = OPTIONS.info_dict.get("ota_override_prop") == "true"
      +
         ab_update = OPTIONS.info_dict.get("ab_update") == "true"
       
         if ab_update:
      
      From a9b27acc1e16d32d60c154dafe3d7bbce610b87b Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Sun, 22 Jan 2017 20:51:01 +0100
      Subject: [PATCH 416/502] core: Fix unified trees with no
       TARGET_OTA_ASSERT_DEVICE
      
      If TARGET_OTA_ASSERT_DEVICE is not set, TARGET_DEVICE should be
      used for OTA_SCRIPT_OVERRIDE_DEVICE.
      
      Change-Id: If382dfa29dddb39498dec5f5eadc9895b7c47d88
      ---
       core/Makefile | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 28188faaa37..5188e9bcd35 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2325,7 +2325,7 @@ endif
       ifneq ($(TARGET_UNIFIED_DEVICE),)
           OTA_SCRIPT_OVERRIDE_PROP := true
           ifeq ($(TARGET_OTA_ASSERT_DEVICE),)
      -        OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_OTA_ASSERT_DEVICE)
      +        OTA_SCRIPT_OVERRIDE_DEVICE := $(TARGET_DEVICE)
           endif
       endif
       
      
      From 9752213280bdaeb0cb0cf28c4bffc0a69bb44f5d Mon Sep 17 00:00:00 2001
      From: Rashed Abdel-Tawab <rashed@linux.com>
      Date: Thu, 19 Jan 2017 23:52:00 +0300
      Subject: [PATCH 417/502] envsetup: Use GNU sed commands if GNU sed is detected
      
      The current check only checks for Linux, but many of us
      use GNU sed on darwin as well, which means the non-Linux
      command will fail, so read the sed version and use the GNU
      command if GNU is found in the version string.
      
      Change-Id: I7eefd0309751b069eef5e5e2b907d3d4f38f1638
      ---
       envsetup.sh | 6 ++++--
       1 file changed, 4 insertions(+), 2 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 0f5c8840952..0b68b909c4c 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2358,8 +2358,10 @@ function dopush()
               rm -f $OUT/.log;return $ret
           fi
       
      +    is_gnu_sed=`sed --version | head -1 | grep -c GNU`
      +
           # Install: <file>
      -    if [ `uname` = "Linux" ]; then
      +    if [ $is_gnu_sed -gt 0 ]; then
               LOC="$(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//' \
                   | grep '^Install: ' | cut -d ':' -f 2)"
           else
      @@ -2368,7 +2370,7 @@ function dopush()
           fi
       
           # Copy: <file>
      -    if [ `uname` = "Linux" ]; then
      +    if [ $is_gnu_sed -gt 0 ]; then
               LOC="$LOC $(cat $OUT/.log | sed -r -e 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' -e 's/^\[ {0,2}[0-9]{1,3}% [0-9]{1,6}\/[0-9]{1,6}\] +//' \
                   | grep '^Copy: ' | cut -d ':' -f 2)"
           else
      
      From f0b5c3d76542e45ffd4ccd91f9aa34f76d2cbcd5 Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Wed, 25 Jan 2017 20:59:40 +0100
      Subject: [PATCH 418/502] Move ro.bootimage.build.fingerprint to build.prop
      
      This allows to update the property when signing the build
      content without the need of unpacking the boot images.
      
      Change-Id: I51c8ae757987fda1c34a6557a384f6c4dd428e03
      ---
       core/Makefile | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 5188e9bcd35..c2c44ede09f 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -166,7 +166,6 @@ $(INSTALLED_DEFAULT_PROP_TARGET): $(intermediate_system_build_prop)
       	        echo "#" >> $@;
       	$(hide) echo ro.bootimage.build.date=`$(DATE_FROM_FILE)`>>$@
       	$(hide) echo ro.bootimage.build.date.utc=`$(DATE_FROM_FILE) +%s`>>$@
      -	$(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
       	$(hide) build/tools/post_process_props.py $@
       
       # -----------------------------------------------------------------
      @@ -369,6 +368,7 @@ endif
       $(INSTALLED_BUILD_PROP_TARGET): $(intermediate_system_build_prop) $(INSTALLED_RECOVERYIMAGE_TARGET)
       	@echo "Target build info: $@"
       	$(hide) cat $(intermediate_system_build_prop) > $@
      +	$(hide) echo ro.bootimage.build.fingerprint="$(BUILD_FINGERPRINT_FROM_FILE)">>$@
       ifdef INSTALLED_RECOVERYIMAGE_TARGET
       	$(hide) echo ro.expect.recovery_id=`cat $(RECOVERYIMAGE_ID_FILE)` >> $@
       endif
      
      From 7e005706366403ccc05eed6fb72fa04f2247fc48 Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Wed, 25 Jan 2017 21:04:05 +0100
      Subject: [PATCH 419/502] Revert "releasetools: Don't extract BOOTABLE_IMAGES
       when signing target files"
      
      sign_target_files_apks is currently dropping the content of
      BOOTABLE_IMAGES. As consequence, the images are re-generated
      without using custom mkbootimg makefiles, which can cause
      issues on some devices with specific formats or requirements.
      
      This reverts commit 71fbe14d8d2dbd3d8f7fd38ef5bb921fe5dfe68c.
      
      Change-Id: If4c8c70ee32e21198859f594a2dc090abe2e13a1
      ---
       tools/releasetools/sign_target_files_apks.py | 3 ---
       1 file changed, 3 deletions(-)
      
      diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
      index 3c57ec075bb..945a5afd63b 100755
      --- a/tools/releasetools/sign_target_files_apks.py
      +++ b/tools/releasetools/sign_target_files_apks.py
      @@ -217,9 +217,6 @@ def write_to_temp(fn, attr, data):
           if info.filename.startswith("IMAGES/"):
             continue
       
      -    if info.filename.startswith("BOOTABLE_IMAGES/"):
      -      continue
      -
           data = input_tf_zip.read(info.filename)
           out_info = copy.copy(info)
       
      
      From 2cf8a6f248ef1a71f6fd6ea2fa98a0970a05d77f Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Wed, 25 Jan 2017 22:00:12 +0100
      Subject: [PATCH 420/502] Always copy bootable images in BOOTABLE_IMAGES/
      
      Images placed in BOOTABLE_IMAGES/ are not re-generated when signing
      the target-files zip content. As of now, images are put into
      BOOTABLE_IMAGES/ only if BOARD_CUSTOM_BOOTIMG is set to true. Remove
      the flag and copy the images unconditionally since there's no need
      to re-generate them now that ro.bootimage.build.fingerprint is inside
      the build.prop.
      
      Change-Id: Idbb5329e0598c04c39fe7f1899b6af3dbdd4f0aa
      ---
       core/Makefile | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index c2c44ede09f..56c2320ac23 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2115,10 +2115,10 @@ endif # BOARD_USES_RECOVERY_AS_BOOT
       	@# Contents of the data image
       	$(hide) $(call package_files-copy-root, \
       		$(TARGET_OUT_DATA),$(zip_root)/DATA)
      -ifdef BOARD_CUSTOM_BOOTIMG
       	@# Prebuilt boot images
       	$(hide) mkdir -p $(zip_root)/BOOTABLE_IMAGES
       	$(hide) $(ACP) $(INSTALLED_BOOTIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/
      +ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
       	$(hide) $(ACP) $(INSTALLED_RECOVERYIMAGE_TARGET) $(zip_root)/BOOTABLE_IMAGES/
       endif
       ifdef BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE
      
      From 2b25066e4ee953ee9d5c4825c1d4b6b156c450dd Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Tue, 31 Jan 2017 21:15:02 -0700
      Subject: [PATCH 421/502] Build: Switch to Magisk as the built in root [2/2]
      
      Pretty much identical to https://github.com/DirtyUnicorns/android_build/commit/2871a7b10b1ae6b6bdda049e33421ab37057f4d1
      
      Modified and updated for TWRP 3.0.3-x by @nathanchance
      
      Change-Id: Ic0cc0b6e96723a87298edb5cded9f6ef93c05b9d
      Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
      ---
       tools/releasetools/edify_generator.py       | 5 +++++
       tools/releasetools/ota_from_target_files.py | 8 ++++++++
       2 files changed, 13 insertions(+)
      
      diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py
      index a1c50cd9db8..b888258a149 100644
      --- a/tools/releasetools/edify_generator.py
      +++ b/tools/releasetools/edify_generator.py
      @@ -173,6 +173,11 @@ def ValidateSignatures(self, command):
         def RunPersist(self, command):
           self.script.append(('run_program("/tmp/install/bin/persist.sh", "%s");' % command))
       
      +  def FlashMagisk(self):
      +    self.script.append('package_extract_dir("magisk", "/tmp/magisk");')
      +    self.script.append('run_program("/sbin/busybox", "unzip", "/tmp/magisk/magisk.zip", "META-INF/com/google/android/*", "-d", "/tmp/magisk");')
      +    self.script.append('run_program("/sbin/sh", "/tmp/magisk/META-INF/com/google/android/update-binary", "dummy", "1", "/tmp/magisk/magisk.zip");')
      +
         def ShowProgress(self, frac, dur):
           """Update the progress bar, advancing it over 'frac' over the next
           'dur' seconds.  'dur' may be zero to advance it via SetProgress
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 9ce93ced666..5344d76ab12 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -800,6 +800,14 @@ def output_sink(fn, data):
         script.ShowProgress(0.05, 5)
         script.WriteRawImage("/boot", "boot.img")
       
      +  if block_based:
      +    script.Print(" ")
      +    script.Print("Flashing Magisk...")
      +    script.Print(" ")
      +    common.ZipWriteStr(output_zip, "magisk/magisk.zip",
      +                   ""+input_zip.read("SYSTEM/addon.d/magisk.zip"))
      +    script.FlashMagisk()
      +    script.Print(" ")
         script.ShowProgress(0.2, 10)
         device_specific.FullOTA_InstallEnd()
       
      
      From df89413a8cc3a5f7d944821ba491e13e92067103 Mon Sep 17 00:00:00 2001
      From: Gabriele M <moto.falcon.git@gmail.com>
      Date: Thu, 9 Feb 2017 13:59:27 +0100
      Subject: [PATCH 422/502] releasetools: Generate recovery-from-boot.p with
       bsdiff if necessary
      
      If TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK is true, we want to use bsdiff
      to create recovery-from-boot.p, otherwise there are high chances that
      imgdiff will fail. Currently this is done only when running make, but
      not when we re-create the patch from releasetools, so do it.
      
      Also, since recovery-resource.dat is used as bonus data for imgdiff,
      don't build it if we are going to use bsdiff.
      
      Change-Id: I93a662a358ee79f56b8acd4329eedd166a176c66
      ---
       core/Makefile                | 5 ++++-
       tools/releasetools/common.py | 8 ++++++--
       2 files changed, 10 insertions(+), 3 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 56c2320ac23..fb65013781f 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -1067,7 +1067,7 @@ endif
       #   b) We build a single image that contains boot and recovery both
       #      (BOARD_USES_RECOVERY_AS_BOOT = true).
       
      -ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT)))
      +ifeq (,$(filter true, $(BOARD_USES_FULL_RECOVERY_IMAGE) $(BOARD_USES_RECOVERY_AS_BOOT) $(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK)))
       # Named '.dat' so we don't attempt to use imgdiff for patching it.
       RECOVERY_RESOURCE_ZIP := $(TARGET_OUT)/etc/recovery-resource.dat
       else
      @@ -2211,6 +2211,9 @@ endif
       ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
       	$(hide) echo "full_recovery_image=true" >> $(zip_root)/META/misc_info.txt
       endif
      +ifeq ($(TARGET_NOT_USE_GZIP_RECOVERY_RAMDISK),true)
      +	$(hide) echo "no_gzip_recovery_ramdisk=true" >> $(zip_root)/META/misc_info.txt
      +endif
       ifdef TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT
       	$(hide) echo "factory_from_target_script=$(TARGET_RELEASETOOL_FACTORY_FROM_TARGET_SCRIPT)" >> $(zip_root)/META/misc_info.txt
       endif
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 96eda756ef6..15cc439c55d 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -1774,14 +1774,18 @@ def MakeRecoveryPatch(input_dir, output_sink, recovery_img, boot_img,
       
         full_recovery_image = info_dict.get("full_recovery_image", None) == "true"
         system_root_image = info_dict.get("system_root_image", None) == "true"
      +  use_bsdiff = info_dict.get("no_gzip_recovery_ramdisk", None) == "true"
       
         if full_recovery_image:
           output_sink("etc/recovery.img", recovery_img.data)
       
         else:
      -    diff_program = ["imgdiff"]
      +    if use_bsdiff:
      +      diff_program = ["bsdiff"]
      +    else:
      +      diff_program = ["imgdiff"]
           path = os.path.join(input_dir, "SYSTEM", "etc", "recovery-resource.dat")
      -    if os.path.exists(path):
      +    if os.path.exists(path) and not use_bsdiff:
             diff_program.append("-b")
             diff_program.append(path)
             bonus_args = "-b /system/etc/recovery-resource.dat"
      
      From 36fbc6b028ab44e85163841f51afbf4e2b483002 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Sat, 11 Feb 2017 14:47:01 +0100
      Subject: [PATCH 423/502] tasks: dt: add flag to optionally compress dt with
       lz4
      
      * Gotta save that space somehow. This is in the continuing
        effort to remove custom mkbootimg.mk files in device trees
      
      Change-Id: Ie8b3cedf6e37d1d11c2383dd3590f9908ad7818c
      ---
       core/tasks/dt_image.mk | 8 ++++++++
       1 file changed, 8 insertions(+)
      
      diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk
      index 0f849466b7d..161f4b8d078 100644
      --- a/core/tasks/dt_image.mk
      +++ b/core/tasks/dt_image.mk
      @@ -38,8 +38,16 @@ define build-dtimage-target
           $(hide) chmod a+r $@
       endef
       
      +ifeq ($(strip $(BOARD_KERNEL_LZ4C_DT)),true)
      +LZ4_DT_IMAGE := $(PRODUCT_OUT)/dt-lz4.img
      +endif
      +
       $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)
       	$(build-dtimage-target)
      +ifeq ($(strip $(BOARD_KERNEL_LZ4C_DT)),true)
      +	lz4 -9 < $@ > $(LZ4_DT_IMAGE) || lz4c -c1 -y $@ $(LZ4_DT_IMAGE)
      +	$(hide) $(ACP) $(LZ4_DT_IMAGE) $@
      +endif
       	@echo "Made DT image: $@"
       
       ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_DTIMAGE_TARGET)
      
      From f6c501a8d0ce16a76a95a943a450ec104c349d67 Mon Sep 17 00:00:00 2001
      From: mosimchah <mosimchah@gmail.com>
      Date: Mon, 20 Feb 2017 22:56:31 -0500
      Subject: [PATCH 424/502] fix link to our github
      
      Change-Id: I39774eb49e0f093fff20b3583a0783ef4640ae2e
      ---
       tools/roomservice.py | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/tools/roomservice.py b/tools/roomservice.py
      index 22bf9bd6298..32a5ac10f3b 100755
      --- a/tools/roomservice.py
      +++ b/tools/roomservice.py
      @@ -52,7 +52,7 @@
           device = product
       
       if not depsonly:
      -    print("Device %s not found. Attempting to retrieve device repository from AICP Github (http://github.com/AICP)." % device)
      +    print("Device %s not found. Attempting to retrieve device repository from AICP Github (https://github.com/AICP)." % device)
       
       repositories = []
       
      
      From 12d552dceef99d23ec3fd86002a465d19fe3ed12 Mon Sep 17 00:00:00 2001
      From: frk <frk@haze-productions.com>
      Date: Thu, 23 Feb 2017 20:19:24 +0100
      Subject: [PATCH 425/502] build: Pass path into grep instead of using cat
      
      grep should be given the filename directly instead of using cat
      to pass the file contents.
      
      Change-Id: Ic5275ac0f057f3d134fe57f43672a73fa7e3d7de
      Signed-off-by: frk <frk@haze-productions.com>
      ---
       envsetup.sh | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 0b68b909c4c..dbd2ab8d9d8 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -2224,7 +2224,7 @@ function mka() {
                       make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
                       ;;
                   *)
      -                mk_timer schedtool -B -n 10 -e ionice -n 7 make -C $T -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
      +                mk_timer schedtool -B -n 10 -e ionice -n 7 make -C $T -j$(grep "^processor" /proc/cpuinfo | wc -l) "$@"
                       ;;
               esac
       
      @@ -2268,7 +2268,7 @@ function mms() {
                       make -C $T -j $NUM_CPUS "$@"
                   ;;
               *)
      -            local NUM_CPUS=$(cat /proc/cpuinfo | grep "^processor" | wc -l)
      +            local NUM_CPUS=$(grep "^processor" /proc/cpuinfo | wc -l)
                   ONE_SHOT_MAKEFILE="__none__" \
                       mk_timer schedtool -B -n 1 -e ionice -n 1 \
                       make -C $T -j $NUM_CPUS "$@"
      
      From 91e57ac94d6213945c19838b80944aca1d746b74 Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Sat, 4 Mar 2017 21:00:47 +0100
      Subject: [PATCH 426/502] Add aicp web address to flash message
      
      Change-Id: I1fb2f4c15644c61dc9d49b81d51067a6e86db6e9
      ---
       tools/releasetools/ota_from_target_files.py | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 5344d76ab12..d138db2fe8e 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -681,6 +681,7 @@ def WriteFullOTAPackage(input_zip, output_zip):
         script.Print("*       ##### ####****   ########****       *")
         script.Print("*                            ****           *")
         script.Print("*                            ****           *")
      +  script.Print("* www.aicp-rom.com   -   Get your flash ON  *")
         script.Print("*********************************************");
       
       
      
      From e9da1c59d6797560ac320389f98063c387bf559b Mon Sep 17 00:00:00 2001
      From: Zhao Wei Liew <zhaoweiliew@gmail.com>
      Date: Sun, 5 Mar 2017 19:20:31 +0800
      Subject: [PATCH 427/502] build: core: Remove BUILD_TINY_ANDROID checks
      
      This flag has been obsolete for a while now.
      
      Change-Id: Ib78a1b141ddd757d2546b2eff2158e6e0cc0d673
      ---
       core/generate_extra_images.mk | 4 ----
       core/tasks/dt_image.mk        | 3 ---
       2 files changed, 7 deletions(-)
      
      diff --git a/core/generate_extra_images.mk b/core/generate_extra_images.mk
      index f7fb0c50423..664b963f13e 100644
      --- a/core/generate_extra_images.mk
      +++ b/core/generate_extra_images.mk
      @@ -18,10 +18,8 @@ ifeq ($(TARGET_BOOTIMG_SIGNED),true)
       INSTALLED_SEC_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img.secure
       INSTALLED_SEC_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img.secure
       
      -ifneq ($(BUILD_TINY_ANDROID),true)
       intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch)
       RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p
      -endif
       
       ifndef TARGET_SHA_TYPE
         TARGET_SHA_TYPE := sha256
      @@ -47,10 +45,8 @@ ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_BOOTIMAGE_TARGET)
       $(INSTALLED_SEC_RECOVERYIMAGE_TARGET): $(INSTALLED_RECOVERYIMAGE_TARGET) $(RECOVERY_FROM_BOOT_PATCH)
       	$(hide) $(call build-sec-image,$(INSTALLED_RECOVERYIMAGE_TARGET))
       
      -ifneq ($(BUILD_TINY_ANDROID),true)
       ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET)
       ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_SEC_RECOVERYIMAGE_TARGET)
      -endif # !BUILD_TINY_ANDROID
       endif # TARGET_BOOTIMG_SIGNED
       
       #----------------------------------------------------------------------
      diff --git a/core/tasks/dt_image.mk b/core/tasks/dt_image.mk
      index 161f4b8d078..1e7adb6f96f 100644
      --- a/core/tasks/dt_image.mk
      +++ b/core/tasks/dt_image.mk
      @@ -4,9 +4,6 @@
       ifeq ($(strip $(BOARD_CUSTOM_BOOTIMG_MK)),)
       ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
       ifneq ($(strip $(BOARD_KERNEL_PREBUILT_DT)),true)
      -ifeq ($(strip $(BUILD_TINY_ANDROID)),true)
      -include device/qcom/common/dtbtool/Android.mk
      -endif
       
       ifeq ($(strip $(TARGET_CUSTOM_DTBTOOL)),)
       DTBTOOL_NAME := dtbToolCM
      
      From a248451d571e6b75e3b6bce5201c614f39722251 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Mon, 6 Mar 2017 15:34:12 -0600
      Subject: [PATCH 428/502] build: Merge tag 'android-7.1.1_r25' into cm-14.1
      
      Android 7.1.1 release 25
      
      Change-Id: I4d4a2cabff9cd0ae883e690f41bd2e14f8888236
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 86ee3ab899d..8cce0d912aa 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NOF26W
      +export BUILD_ID=NOF27B
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index ffd6148a3a3..3e3814a2a26 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -114,7 +114,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-02-05
      +      PLATFORM_SECURITY_PATCH := 2017-03-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 4265275184e96e561cd7e0fc8ca02de315a6af33 Mon Sep 17 00:00:00 2001
      From: Rashed Abdel-Tawab <rashed@linux.com>
      Date: Wed, 8 Mar 2017 14:10:07 +0300
      Subject: [PATCH 429/502] qcom: Automatically set TARGET_USES_COLOR_METADATA
       for msm8996/8
      
      Change-Id: I47d71f6f9f5f5c656b89b0ae9f4ec6ec2ff30915
      ---
       core/qcom_target.mk | 5 +++++
       1 file changed, 5 insertions(+)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index d443773ddce..a40156c315c 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -56,6 +56,11 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
               qcom_flags += -DHAS_EXTRA_FLAC_METADATA
           endif
       
      +    # Enable color metadata for 8xx UM targets
      +    ifneq ($(filter msm8996 msm8998,$(TARGET_BOARD_PLATFORM)),)
      +        TARGET_USES_COLOR_METADATA := true
      +    endif
      +
           TARGET_GLOBAL_CFLAGS += $(qcom_flags)
           TARGET_GLOBAL_CPPFLAGS += $(qcom_flags)
           CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags)
      
      From 458ff62ca0b56a624a7076d44c2fca2dc905b709 Mon Sep 17 00:00:00 2001
      From: "Christopher R. Palmer" <crpalmer@gmail.com>
      Date: Tue, 31 Jan 2017 16:15:24 -0500
      Subject: [PATCH 430/502] Avoid adding an extra slash if OUT_DIR_COMMON_BASE
       ends in a slash
      
      The extra slash can create all kinds of problems throughout the
      makefiles.  In particular, it caused a device to become unbootable
      because the ramdisk was incomplete due to mismatched filenames
      (some containing / and some containing //).
      
      Change-Id: I9dbb425aaf51e7ed2697dba0034f2ee92ab3c82b
      ---
       core/envsetup.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/envsetup.mk b/core/envsetup.mk
      index 1e07d8ac9a5..69ee0e3d66f 100644
      --- a/core/envsetup.mk
      +++ b/core/envsetup.mk
      @@ -217,7 +217,7 @@ else
       OUT_DIR := $(CURDIR)/out
       endif
       else
      -OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD))
      +OUT_DIR := $(OUT_DIR_COMMON_BASE:/=)/$(notdir $(PWD))
       endif
       endif
       
      
      From 995d03444062bcdb5405987466f047bc04b8a925 Mon Sep 17 00:00:00 2001
      From: deadman96385 <seanhoyt963@gmail.com>
      Date: Wed, 31 Dec 2014 19:44:19 -0500
      Subject: [PATCH 431/502] Kill some log spam
      
      Thanks to @Cl3Kener for taking lots of his precious time to help me find these things that were driving me up the wall.  I should have authored this commit as him but I didn't.  Sorry buddy maybe next time....
      
      Change-Id: I8d6cd504afe83954964f71eb7d8f802624d2e595
      Signed-off-by: Chet Kener <Cl3Kener@gmail.com>
      ---
       core/pdk_config.mk | 2 +-
       tools/warn.py      | 8 ++++----
       2 files changed, 5 insertions(+), 5 deletions(-)
      
      diff --git a/core/pdk_config.mk b/core/pdk_config.mk
      index daf02c8e49e..33a64b4fd76 100644
      --- a/core/pdk_config.mk
      +++ b/core/pdk_config.mk
      @@ -87,7 +87,7 @@ $(_pdk_fusion_files) : $(_pdk_fusion_stamp)
       # That's desired by us: we want only absent files from the platform zip package.
       # Copy with the last-modified time preserved, never follow symbolic links.
       $(PRODUCT_OUT)/% : $(_pdk_fusion_intermediates)/% $(_pdk_fusion_stamp)
      -	@mkdir -p $(dir $@)
      +	$(hide) mkdir -p $(dir $@)
       	$(hide) rm -rf $@
       	$(hide) cp -fpPR $< $@
       
      diff --git a/tools/warn.py b/tools/warn.py
      index b5a49f616fc..c22b40b4816 100755
      --- a/tools/warn.py
      +++ b/tools/warn.py
      @@ -36,10 +36,10 @@ def colorforseverity(sev):
           return 'grey'
       
       warnpatterns = [
      -    { 'category':'make',    'severity':severity.MEDIUM,   'members':[], 'option':'',
      -        'description':'make: overriding commands/ignoring old commands',
      -        'patterns':[r".*: warning: overriding commands for target .+",
      -                    r".*: warning: ignoring old commands for target .+"] },
      +#    { 'category':'make',    'severity':severity.MEDIUM,   'members':[], 'option':'',
      +#        'description':'make: overriding commands/ignoring old commands',
      +#        'patterns':[r".*: warning: overriding commands for target .+",
      +#                    r".*: warning: ignoring old commands for target .+"] },
           { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wimplicit-function-declaration',
               'description':'Implicit function declaration',
               'patterns':[r".*: warning: implicit declaration of function .+"] },
      
      From 37c1b435f507532071b9f2e139bae02bebc4a8a2 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Wed, 2 Nov 2016 16:24:52 -0700
      Subject: [PATCH 432/502] Update combined build.ninja to depend on Soong's
       build.ninja
      
      For Soong's build.ninja regeneration to work
      
      Bug: 32574042
      
      Change-Id: Ie267ea33e8de88275e99330b2d0f147d1e58fa7b
      ---
       core/ninja.mk | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/core/ninja.mk b/core/ninja.mk
      index 109fe77f3c9..69cc67da681 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -135,10 +135,11 @@ endif
       ifeq ($(USE_SOONG),true)
       COMBINED_BUILD_NINJA := $(OUT_DIR)/combined$(KATI_NINJA_SUFFIX).ninja
       
      -$(COMBINED_BUILD_NINJA): $(KATI_BUILD_NINJA) $(SOONG_ANDROID_MK)
      +$(COMBINED_BUILD_NINJA): $(KATI_BUILD_NINJA) $(SOONG_ANDROID_MK) FORCE
       	$(hide) echo "builddir = $(OUT_DIR)" > $(COMBINED_BUILD_NINJA)
       	$(hide) echo "subninja $(SOONG_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA)
       	$(hide) echo "subninja $(KATI_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA)
      +	$(hide) echo "build $(COMBINED_BUILD_NINJA): phony $(SOONG_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA)
       else
       COMBINED_BUILD_NINJA := $(KATI_BUILD_NINJA)
       endif
      
      From eede34704241d377d4792bac9c0e6da4f83f6fa3 Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Mon, 3 Oct 2016 15:12:08 -0700
      Subject: [PATCH 433/502] Revert "Remove -d keepdepfile from ninja command
       line"
      
      This reverts commit 4aca5715523d1b8a85abde00d7ccc2989c90a96b.
      
      Test: builds
      Change-Id: Iddb3517a4596e84404db1738fa95eb15f435a42d
      ---
       core/ninja.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/ninja.mk b/core/ninja.mk
      index 69cc67da681..f295d9735d6 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -150,7 +150,7 @@ $(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper
       .PHONY: ninja_wrapper
       ninja_wrapper: $(COMBINED_BUILD_NINJA) $(MAKEPARALLEL)
       	@echo Starting build with ninja
      -	+$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS)
      +	+$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) -d keepdepfile $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS)
       
       # Dummy Android.mk and CleanSpec.mk files so that kati won't recurse into the
       # out directory
      
      From 645ca7f8d1cf8b4ca5c5ce0cfd0c22dbd44e4484 Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Mon, 3 Oct 2016 13:38:27 -0700
      Subject: [PATCH 434/502] exec makeparallel
      
      bash doesn't kill children when it receives SIGTERM.  Since makeparallel
      is the last command run by the shell, run it with exec to replace the
      shell with makeparallel so make can send the signal directly to
      makeparallel.
      
      Bug: 31907490
      Test: m -j & killall make; pgrep -a makeparallel
      Change-Id: If8aeb51ec224234da5f05eae3382ce77f48a57e2
      ---
       core/ninja.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/ninja.mk b/core/ninja.mk
      index f295d9735d6..3da6b1dadb7 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -150,7 +150,7 @@ $(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper
       .PHONY: ninja_wrapper
       ninja_wrapper: $(COMBINED_BUILD_NINJA) $(MAKEPARALLEL)
       	@echo Starting build with ninja
      -	+$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) -d keepdepfile $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS)
      +	+$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && exec $(NINJA_MAKEPARALLEL) $(NINJA) -d keepdepfile $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS)
       
       # Dummy Android.mk and CleanSpec.mk files so that kati won't recurse into the
       # out directory
      
      From 95f041f3336385027a3afac72f5ac09a6e4fbb93 Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Mon, 3 Oct 2016 13:40:32 -0700
      Subject: [PATCH 435/502] Propagate signals through makeparallel
      
      Set up a signal handler in makeparallel that will forward SIGHUP,
      SIGINT, SIGQUIT, and SIGTERM to the child process.
      
      Bug: 31907490
      Test: m -j & killall make; pgrep -a ninja
      Test: make makeparallel_test
      Change-Id: I306e5335ed1b2c7056804d5da377a2f283877f30
      ---
       tools/makeparallel/makeparallel.cpp | 27 +++++++++++++++++++++++++--
       1 file changed, 25 insertions(+), 2 deletions(-)
      
      diff --git a/tools/makeparallel/makeparallel.cpp b/tools/makeparallel/makeparallel.cpp
      index 3c39846ecd5..ae1a81105d8 100644
      --- a/tools/makeparallel/makeparallel.cpp
      +++ b/tools/makeparallel/makeparallel.cpp
      @@ -336,7 +336,29 @@ int main(int argc, char* argv[]) {
       
         args.push_back(nullptr);
       
      -  pid_t pid = fork();
      +  static pid_t pid;
      +
      +  // Set up signal handlers to forward SIGHUP, SIGINT, SIGQUIT, SIGTERM, and
      +  // SIGALRM to child
      +  struct sigaction action = {};
      +  action.sa_flags = SA_SIGINFO | SA_RESTART,
      +  action.sa_sigaction = [](int signal, siginfo_t*, void*) {
      +    if (pid > 0) {
      +      kill(pid, signal);
      +    }
      +  };
      +
      +  int ret = 0;
      +  if (!ret) ret = sigaction(SIGHUP, &action, NULL);
      +  if (!ret) ret = sigaction(SIGINT, &action, NULL);
      +  if (!ret) ret = sigaction(SIGQUIT, &action, NULL);
      +  if (!ret) ret = sigaction(SIGTERM, &action, NULL);
      +  if (!ret) ret = sigaction(SIGALRM, &action, NULL);
      +  if (ret < 0) {
      +    error(errno, errno, "sigaction failed");
      +  }
      +
      +  pid = fork();
         if (pid < 0) {
           error(errno, errno, "fork failed");
         } else if (pid == 0) {
      @@ -351,9 +373,10 @@ int main(int argc, char* argv[]) {
         }
       
         // parent
      +
         siginfo_t status = {};
         int exit_status = 0;
      -  int ret = waitid(P_PID, pid, &status, WEXITED);
      +  ret = waitid(P_PID, pid, &status, WEXITED);
         if (ret < 0) {
           error(errno, errno, "waitpid failed");
         } else if (status.si_code == CLD_EXITED) {
      
      From 667cdb13eebedcd887dee6993959016201f8a27a Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Tue, 4 Oct 2016 16:21:49 -0700
      Subject: [PATCH 436/502] Don't prune $(OUT_DIR) from findleaves.py
      
      Pruning $(OUT_DIR) can be overaggressive if $(OUT_DIR) matches the name
      of any directory in the source tree that contains Android.mk files.
      Pruning $(OUT_DIR) is no longer necessary, as one of the first things
      the build system does is put an empty Android.mk file in there to avoid
      recursing into it.
      
      Bug: 31941856
      Test: m -j OUT_DIR=angler
      Change-Id: I7c5e95816f35bd5906845716d56cca76de7fa1ad
      ---
       core/config.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/config.mk b/core/config.mk
      index 99744b1f2c0..f48fcd8b886 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -182,7 +182,7 @@ include $(BUILD_SYSTEM)/envsetup.mk
       
       # Pruned directory options used when using findleaves.py
       # See envsetup.mk for a description of SCAN_EXCLUDE_DIRS
      -FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git)
      +FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(SCAN_EXCLUDE_DIRS) .repo .git)
       
       # General entries for project pathmap.  Any entries listed here should
       # be device and hardware independent.
      
      From e8037b1fa588d26eeae95f6bcbfefa15992fa8fc Mon Sep 17 00:00:00 2001
      From: Mark Salyzyn <salyzyn@google.com>
      Date: Mon, 17 Oct 2016 10:20:33 -0700
      Subject: [PATCH 437/502] zipalign missing header
      
      Remove assumptions about header side effects
      
      Test: compile
      Bug: 30465923
      Change-Id: I117567b0f99814b9d9a955b39c56f43f7972cf62
      ---
       tools/zipalign/ZipAlign.cpp | 3 ++-
       tools/zipalign/ZipEntry.cpp | 5 +++--
       2 files changed, 5 insertions(+), 3 deletions(-)
      
      diff --git a/tools/zipalign/ZipAlign.cpp b/tools/zipalign/ZipAlign.cpp
      index a2dfd028911..899f852b63a 100644
      --- a/tools/zipalign/ZipAlign.cpp
      +++ b/tools/zipalign/ZipAlign.cpp
      @@ -19,8 +19,9 @@
        */
       #include "ZipFile.h"
       
      -#include <stdlib.h>
       #include <stdio.h>
      +#include <stdlib.h>
      +#include <unistd.h>
       
       using namespace android;
       
      diff --git a/tools/zipalign/ZipEntry.cpp b/tools/zipalign/ZipEntry.cpp
      index 2f33e230547..7c215f4ec8f 100644
      --- a/tools/zipalign/ZipEntry.cpp
      +++ b/tools/zipalign/ZipEntry.cpp
      @@ -23,10 +23,11 @@
       #include "ZipEntry.h"
       #include <utils/Log.h>
       
      -#include <stdio.h>
      -#include <string.h>
       #include <assert.h>
       #include <inttypes.h>
      +#include <stdio.h>
      +#include <string.h>
      +#include <time.h>
       
       using namespace android;
       
      
      From 18940805fb79fb4e0c3bbcccdb9b4ad93f8e0d46 Mon Sep 17 00:00:00 2001
      From: Jean-Baptiste Queru <jbq@google.com>
      Date: Thu, 16 Jun 2011 09:25:58 -0700
      Subject: [PATCH 438/502] Switch back to mksh as the default
      
      Change-Id: I4f39e8d8cc22520cd36f83f8675a716cc1ade1d9
      ---
       core/config.mk | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/core/config.mk b/core/config.mk
      index f48fcd8b886..a5bd99e2886 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -161,6 +161,9 @@ else
       JAVA_TMPDIR_ARG :=
       endif
       
      +# Default shell is mksh. Other possible value is ash.
      +TARGET_SHELL := mksh
      +
       # ###############################################################
       # Include sub-configuration files
       # ###############################################################
      
      From ae5f271e951360b4d49284a171a20f50e4a32dad Mon Sep 17 00:00:00 2001
      From: Nathan Chancellor <natechancellor@gmail.com>
      Date: Thu, 8 Dec 2016 19:58:24 -0700
      Subject: [PATCH 439/502] Ccache configuration improvements
      
      which throws an error if a binary is not found which breaks the build. Use command -v as it is safer.
      
      Change-Id: I2f08548e6559b9bd8ad7df19296f7bae960bad5c
      Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
      ---
       core/ccache.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/ccache.mk b/core/ccache.mk
      index b682aff2aff..f3bc288598c 100644
      --- a/core/ccache.mk
      +++ b/core/ccache.mk
      @@ -39,7 +39,7 @@ ifneq ($(filter-out false,$(USE_CCACHE)),)
         export CCACHE_CPP2 := true
       
         # Detect if the system already has ccache installed to use instead of the prebuilt
      -  ccache := $(shell which ccache)
      +  ccache := $(shell command -v ccache)
       
         ifeq ($(ccache),)
           CCACHE_HOST_TAG := $(HOST_PREBUILT_TAG)
      
      From 38b43578f831bf57ed0208a4432d3ec4ced72f48 Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Wed, 18 Jan 2017 14:38:20 -0800
      Subject: [PATCH 440/502] Convert -j to a reasonable parallelism for kati
      
      When running makeparallel in non-ninja mode, which is used when running
      kati with USE_GOMA=true, convert -j to a reasonable parallelism value
      the same way ninja does.
      
      Bug: 34392351
      Test: make -C build/make/tools/makeparallel makeparallel_test
      Change-Id: I9aee4dd2a3b0f2b1c2c10087be83f7b2b06f4368
      ---
       tools/makeparallel/Makefile         |  9 ++++-----
       tools/makeparallel/makeparallel.cpp | 18 ++++++++++++++++--
       2 files changed, 20 insertions(+), 7 deletions(-)
      
      diff --git a/tools/makeparallel/Makefile b/tools/makeparallel/Makefile
      index 4e12b10f2a8..82a4abfac2e 100644
      --- a/tools/makeparallel/Makefile
      +++ b/tools/makeparallel/Makefile
      @@ -65,8 +65,9 @@ MAKEPARALLEL_NINJA_TEST := MAKEFLAGS= MAKELEVEL= MAKEPARALLEL="$(MAKEPARALLEL) -
       makeparallel_test: $(MAKEPARALLEL)
       	@EXPECTED="-j1234" $(MAKEPARALLEL_TEST) -j1234
       	@EXPECTED="-j123"  $(MAKEPARALLEL_TEST) -j123
      -	@EXPECTED="-j1"    $(MAKEPARALLEL_TEST) -j1
      -	@EXPECTED="-j1"    $(MAKEPARALLEL_TEST)
      +	@EXPECTED=""       $(MAKEPARALLEL_TEST) -j1
      +	@EXPECTED="-j$$(($$(nproc) + 2))"   $(MAKEPARALLEL_TEST) -j
      +	@EXPECTED=""       $(MAKEPARALLEL_TEST)
       
       	@EXPECTED="-j1234" $(MAKEPARALLEL_NINJA_TEST) -j1234
       	@EXPECTED="-j123"  $(MAKEPARALLEL_NINJA_TEST) -j123
      @@ -87,8 +88,6 @@ makeparallel_test: $(MAKEPARALLEL)
       	@EXPECTED="-j1234 -k0" $(MAKEPARALLEL_NINJA_TEST) -j1234 -k
       	@EXPECTED="-j1234 -k0" $(MAKEPARALLEL_NINJA_TEST) -kt -j1234
       
      -	@EXPECTED="-j1"    $(MAKEPARALLEL_TEST) A=-j1234
      -	@EXPECTED="-j1"    $(MAKEPARALLEL_TEST) A\ -j1234=-j1234
      -	@EXPECTED="-j1234" $(MAKEPARALLEL_TEST) A\ -j1234=-j1234 -j1234
      +	@EXPECTED=""       $(MAKEPARALLEL_TEST) A=-j1234
       
       	@EXPECTED="-j1234 args" ARGS="args" $(MAKEPARALLEL_TEST) -j1234
      diff --git a/tools/makeparallel/makeparallel.cpp b/tools/makeparallel/makeparallel.cpp
      index ae1a81105d8..2a3b83214e4 100644
      --- a/tools/makeparallel/makeparallel.cpp
      +++ b/tools/makeparallel/makeparallel.cpp
      @@ -316,13 +316,27 @@ int main(int argc, char* argv[]) {
           }
         }
       
      -  std::string jarg = "-j" + std::to_string(tokens + 1);
      +  std::string jarg;
      +  if (parallel) {
      +    if (tokens == 0) {
      +      if (ninja) {
      +        // ninja is parallel by default
      +        jarg = "";
      +      } else {
      +        // make -j with no argument, guess a reasonable parallelism like ninja does
      +        jarg = "-j" + std::to_string(sysconf(_SC_NPROCESSORS_ONLN) + 2);
      +      }
      +    } else {
      +      jarg = "-j" + std::to_string(tokens + 1);
      +    }
      +  }
      +
       
         if (ninja) {
           if (!parallel) {
             // ninja is parallel by default, pass -j1 to disable parallelism if make wasn't parallel
             args.push_back(strdup("-j1"));
      -    } else if (tokens > 0) {
      +    } else {
             args.push_back(strdup(jarg.c_str()));
           }
           if (keep_going) {
      
      From 0c872d1612222be1544fbf0544d9ca8769b75dfe Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Wed, 18 Jan 2017 21:12:28 -0800
      Subject: [PATCH 441/502] Don't pass empty arguments to ninja
      
      Passing an empty argument in argv to ninja results in an error:
      ninja: error: empty path
      
      Don't add jarg to the argument list if it is empty.
      
      Bug: 34392351
      Test: m -j
      Change-Id: I39c8998c79b09835650628e1413ae7625cdbc555
      ---
       tools/makeparallel/makeparallel.cpp | 8 ++++++--
       1 file changed, 6 insertions(+), 2 deletions(-)
      
      diff --git a/tools/makeparallel/makeparallel.cpp b/tools/makeparallel/makeparallel.cpp
      index 2a3b83214e4..b910b058511 100644
      --- a/tools/makeparallel/makeparallel.cpp
      +++ b/tools/makeparallel/makeparallel.cpp
      @@ -337,13 +337,17 @@ int main(int argc, char* argv[]) {
             // ninja is parallel by default, pass -j1 to disable parallelism if make wasn't parallel
             args.push_back(strdup("-j1"));
           } else {
      -      args.push_back(strdup(jarg.c_str()));
      +      if (jarg != "") {
      +        args.push_back(strdup(jarg.c_str()));
      +      }
           }
           if (keep_going) {
             args.push_back(strdup("-k0"));
           }
         } else {
      -    args.push_back(strdup(jarg.c_str()));
      +    if (jarg != "") {
      +      args.push_back(strdup(jarg.c_str()));
      +    }
         }
       
         args.insert(args.end(), &argv[2], &argv[argc]);
      
      From f84e3f59cd2d7841115e04b15c93e9d54e628000 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Thu, 8 Sep 2016 17:08:31 -0700
      Subject: [PATCH 442/502] Prevent Kati from seeing MAKEFLAGS
      
      We never want Kati to see MAKEFLAGS, as forcefully overriding variables
      is terrible. The variables in MAKEFLAGS are still available in the
      environment, so if part of the build wants input from the user, it
      should be explicitly checking for an environment variable or using ?=
      
      This commit shouldn't actually change any behavior -- the version of
      Kati checked into our tree doesn't actually read MAKEFLAGS (the latest
      version does, which is why this change is necessary). We're also already
      clearing MAKEFLAGS during makeparallel, so the USE_GOMA case already
      doesn't pass through MAKEFLAGS.
      
      Test: Manual $(warnings $(origin MYTEST) $(MYTEST)) with old and new Kati
      Change-Id: I5e4ffa66b3539a539cc7a26da24645b11445c469
      ---
       core/ninja.mk | 8 ++++++++
       1 file changed, 8 insertions(+)
      
      diff --git a/core/ninja.mk b/core/ninja.mk
      index 3da6b1dadb7..289282ac7f7 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -130,6 +130,14 @@ NINJA_REMOTE_NUM_JOBS ?= 500
       NINJA_ARGS += -j$(NINJA_REMOTE_NUM_JOBS)
       else
       NINJA_MAKEPARALLEL := $(MAKEPARALLEL) --ninja
      +
      +# We never want Kati to see MAKEFLAGS, as forcefully overriding variables is
      +# terrible. The variables in MAKEFLAGS are still available in the environment,
      +# so if part of the build wants input from the user, it should be explicitly
      +# checking for an environment variable or using ?=
      +#
      +# makeparallel already clears MAKEFLAGS, so it's not necessary in the GOMA case
      +KATI_MAKEPARALLEL := MAKEFLAGS=
       endif
       
       ifeq ($(USE_SOONG),true)
      
      From 2679f9656fd18d6502acbd9444ccc17f7f19e809 Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Tue, 19 Apr 2016 15:32:22 -0700
      Subject: [PATCH 443/502] Update prebuilt build tools path
      
      Build tools have been moved from prebuilts/sdk/tools to
      prebuilts/build-tools.
      
      Bug: 27857138
      Change-Id: I60be42c197d420897dab77808c25818c9d2e81df
      ---
       core/config.mk | 6 ++++++
       core/ninja.mk  | 5 +----
       2 files changed, 7 insertions(+), 4 deletions(-)
      
      diff --git a/core/config.mk b/core/config.mk
      index 99744b1f2c0..a6caddf0fe8 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -492,6 +492,12 @@ BCC_COMPAT := $(HOST_OUT_EXECUTABLES)/bcc_compat
       DX := $(HOST_OUT_EXECUTABLES)/dx
       MAINDEXCLASSES := $(HOST_OUT_EXECUTABLES)/mainDexClasses
       
      +# Always use prebuilts for ckati and makeparallel
      +prebuilt_build_tools := prebuilts/build-tools
      +prebuilt_build_tools_bin := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/bin
      +CKATI := $(prebuilt_build_tools_bin)/ckati
      +MAKEPARALLEL := $(prebuilt_build_tools_bin)/makeparallel
      +
       USE_PREBUILT_SDK_TOOLS_IN_PLACE := true
       
       # Override the definitions above for unbundled and PDK builds
      diff --git a/core/ninja.mk b/core/ninja.mk
      index 109fe77f3c9..ebbb67f1028 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -1,7 +1,4 @@
      -NINJA ?= $(shell which ninja)
      -ifeq ($(NINJA),)
      -  NINJA := prebuilts/ninja/$(HOST_PREBUILT_TAG)/ninja
      -endif
      +NINJA ?= prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/ninja
       
       ifeq ($(USE_SOONG),true)
       USE_SOONG_FOR_KATI := true
      
      From a5a203d66c14d6a539beea66e4dc34dbf865acc0 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Mon, 6 Jun 2016 14:44:00 -0700
      Subject: [PATCH 444/502] Use more prebuilt build-tools
      
      For acp, we've been using an old prebuilt in prebuilts/sdk, but it's not
      part of the SDK. Instead, we'll use a prebuilt in the build-tools
      repository.
      
      For ijar, we've been using the host libstdc++ to workaround the lack of
      libc++ on some unbundled branches. Instead, use a prebuilt that can use
      libc++.
      
      For ziptime, we've been disabling it on unbundled branches, due to the
      lack of libc++. Instead, use a prebuilt version of ziptime that can use
      the prebuilt libc++.
      
      Change-Id: If80f845ea06f76e3fe6765964e77c864eaf303d0
      ---
       core/config.mk        | 15 +++------------
       core/definitions.mk   |  2 --
       tools/ijar/Android.bp | 18 ++++++++++++++++++
       3 files changed, 21 insertions(+), 14 deletions(-)
       create mode 100644 tools/ijar/Android.bp
      
      diff --git a/core/config.mk b/core/config.mk
      index a6caddf0fe8..173468326ee 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -479,7 +479,6 @@ BUILD_PLATFORM_ZIP := $(filter platform platform-java,$(MAKECMDGOALS))
       # Tools that are prebuilts for TARGET_BUILD_APPS
       #
       
      -ACP := $(HOST_OUT_EXECUTABLES)/acp
       AIDL := $(HOST_OUT_EXECUTABLES)/aidl
       AAPT := $(HOST_OUT_EXECUTABLES)/aapt
       AAPT2 := $(HOST_OUT_EXECUTABLES)/aapt2
      @@ -495,17 +494,16 @@ MAINDEXCLASSES := $(HOST_OUT_EXECUTABLES)/mainDexClasses
       # Always use prebuilts for ckati and makeparallel
       prebuilt_build_tools := prebuilts/build-tools
       prebuilt_build_tools_bin := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/bin
      +ACP := $(prebuilt_build_tools_bin)/acp
       CKATI := $(prebuilt_build_tools_bin)/ckati
      +IJAR := $(prebuilt_build_tools_bin)/ijar
       MAKEPARALLEL := $(prebuilt_build_tools_bin)/makeparallel
      +ZIPTIME := $(prebuilt_build_tools_bin)/ziptime
       
       USE_PREBUILT_SDK_TOOLS_IN_PLACE := true
       
       # Override the definitions above for unbundled and PDK builds
       ifneq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
      -prebuilt_sdk_tools := prebuilts/sdk/tools
      -prebuilt_sdk_tools_bin := $(prebuilt_sdk_tools)/$(HOST_OS)/bin
      -
      -ACP := $(prebuilt_sdk_tools_bin)/acp
       AIDL := $(prebuilt_sdk_tools_bin)/aidl
       AAPT := $(prebuilt_sdk_tools_bin)/aapt
       AAPT2 := $(prebuilt_sdk_tools_bin)/aapt2
      @@ -606,13 +604,6 @@ FUTILITY := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/futility/futility
       VBOOT_SIGNER := prebuilts/misc/scripts/vboot_signer/vboot_signer.sh
       FEC := $(HOST_OUT_EXECUTABLES)/fec
       
      -ifndef TARGET_BUILD_APPS
      -ZIPTIME := $(HOST_OUT_EXECUTABLES)/ziptime$(HOST_EXECUTABLE_SUFFIX)
      -endif
      -
      -# ijar converts a .jar file to a smaller .jar file which only has its
      -# interfaces.
      -IJAR := $(HOST_OUT_EXECUTABLES)/ijar$(BUILD_EXECUTABLE_SUFFIX)
       DEXDUMP := $(HOST_OUT_EXECUTABLES)/dexdump2$(BUILD_EXECUTABLE_SUFFIX)
       
       # relocation packer
      diff --git a/core/definitions.mk b/core/definitions.mk
      index 62cfe93a34b..77d3eb55859 100644
      --- a/core/definitions.mk
      +++ b/core/definitions.mk
      @@ -2505,11 +2505,9 @@ endef
       
       # Remove dynamic timestamps from packages
       #
      -ifndef TARGET_BUILD_APPS
       define remove-timestamps-from-package
       $(hide) $(ZIPTIME) $@
       endef
      -endif
       
       # Uncompress shared libraries embedded in an apk.
       #
      diff --git a/tools/ijar/Android.bp b/tools/ijar/Android.bp
      new file mode 100644
      index 00000000000..a244a2ddbbf
      --- /dev/null
      +++ b/tools/ijar/Android.bp
      @@ -0,0 +1,18 @@
      +// Copyright 2015 The Android Open Source Project
      +//
      +// The rest of files in this directory comes from
      +// https://github.com/bazelbuild/bazel/tree/master/third_party/ijar
      +
      +cc_binary_host {
      +    srcs: [
      +        "classfile.cc",
      +        "ijar.cc",
      +        "zip.cc",
      +    ],
      +    cflags: [
      +        "-Wall",
      +        "-Werror",
      +    ],
      +    host_ldlibs: ["-lz"],
      +    name: "ijar",
      +}
      
      From 5747e224699b053666d2784c438c3b705b62099f Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Wed, 5 Oct 2016 23:26:24 -0700
      Subject: [PATCH 445/502] Use ASAN prebuilts if SANITIZE_HOST includes address
      
      Test: SANITIZE_HOST=address m -j showcommands
      Change-Id: Ifdca98d5fa32867005ace99e1eb5188e22923ac6
      ---
       core/config.mk | 4 ++++
       core/ninja.mk  | 4 ++++
       2 files changed, 8 insertions(+)
      
      diff --git a/core/config.mk b/core/config.mk
      index 173468326ee..0219ea3e253 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -493,7 +493,11 @@ MAINDEXCLASSES := $(HOST_OUT_EXECUTABLES)/mainDexClasses
       
       # Always use prebuilts for ckati and makeparallel
       prebuilt_build_tools := prebuilts/build-tools
      +ifeq ($(filter address,$(SANITIZE_HOST)),)
       prebuilt_build_tools_bin := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/bin
      +else
      +prebuilt_build_tools_bin := $(prebuilt_build_tools)/$(HOST_PREBUILT_TAG)/asan/bin
      +endif
       ACP := $(prebuilt_build_tools_bin)/acp
       CKATI := $(prebuilt_build_tools_bin)/ckati
       IJAR := $(prebuilt_build_tools_bin)/ijar
      diff --git a/core/ninja.mk b/core/ninja.mk
      index ebbb67f1028..3acc3666adb 100644
      --- a/core/ninja.mk
      +++ b/core/ninja.mk
      @@ -1,4 +1,8 @@
      +ifeq ($(filter address,$(SANITIZE_HOST)),)
       NINJA ?= prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/ninja
      +else
      +NINJA ?= prebuilts/build-tools/$(HOST_PREBUILT_TAG)/asan/bin/ninja
      +endif
       
       ifeq ($(USE_SOONG),true)
       USE_SOONG_FOR_KATI := true
      
      From 1083dfc3876532883af309fcd57cede14bf0c603 Mon Sep 17 00:00:00 2001
      From: Yohann Roussel <yroussel@google.com>
      Date: Thu, 21 Apr 2016 16:30:18 +0200
      Subject: [PATCH 446/502] Remove static libraries from Jack classpath
      
      Those libraries are already imported (or added to the classpath in the
      case of the check command) meaning that they were all duplicated.
      In addition to complicating the build this was also slowing down the
      compilation.
      
      Bug: 28307907
      Change-Id: Ia8665e7c5ad8b567bd02de7839fa62e67a5668f7
      ---
       core/definitions.mk | 6 +++---
       core/java_common.mk | 9 ++++-----
       2 files changed, 7 insertions(+), 8 deletions(-)
      
      diff --git a/core/definitions.mk b/core/definitions.mk
      index 77d3eb55859..a0889c4680a 100644
      --- a/core/definitions.mk
      +++ b/core/definitions.mk
      @@ -2139,7 +2139,7 @@ $(call call-jack) \
           $(if $(PRIVATE_RMTYPEDEFS), \
               -D jack.android.remove-typedef="true") \
           $(addprefix --classpath ,$(strip \
      -        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \
      +        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
           $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
           $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
           -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
      @@ -2184,7 +2184,7 @@ $(hide) if [ -s $@.java-source-list-uniq ] ; then \
       	    $(strip $(PRIVATE_JACK_FLAGS)) \
       	    $(strip $(PRIVATE_JACK_DEBUG_FLAGS)) \
       	    $(addprefix --classpath ,$(strip \
      -	        $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \
      +	        $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
       	    -D jack.import.resource.policy=keep-first \
       	    -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
       	    -D jack.import.type.policy=keep-first \
      @@ -2314,7 +2314,7 @@ $(call call-jack) \
           $(if $(NO_OPTIMIZE_DX), \
               -D jack.dex.optimize="false") \
           $(addprefix --classpath ,$(strip \
      -        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_ALL_JACK_LIBRARIES)))) \
      +        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
           $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
           $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
           -D jack.import.resource.policy=keep-first \
      diff --git a/core/java_common.mk b/core/java_common.mk
      index 9b7d10fba2c..db6a30167c3 100644
      --- a/core/java_common.mk
      +++ b/core/java_common.mk
      @@ -364,7 +364,7 @@ full_shared_jack_libs := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS
       full_jack_deps := $(full_shared_jack_libs)
       endif # USE_CORE_LIB_BOOTCLASSPATH
       endif # !LOCAL_IS_HOST_MODULE
      -full_jack_libs := $(full_shared_jack_libs) $(full_static_jack_libs) $(LOCAL_JACK_CLASSPATH)
      +full_shared_jack_libs += $(LOCAL_JACK_CLASSPATH)
       full_jack_deps += $(full_static_jack_libs) $(LOCAL_JACK_CLASSPATH)
       
       ifndef LOCAL_IS_HOST_MODULE
      @@ -378,7 +378,6 @@ ifneq ($(apk_libraries),)
       
         # link against the jar with full original names (before proguard processing).
         full_shared_jack_libs += $(link_apk_jack_libraries)
      -  full_jack_libs += $(link_apk_jack_libraries)
         full_jack_deps += $(link_apk_jack_libraries)
       endif
       
      @@ -388,14 +387,14 @@ endif
       ifdef LOCAL_INSTRUMENTATION_FOR
          # link against the jar with full original names (before proguard processing).
          link_instr_classes_jack := $(link_instr_intermediates_dir.COMMON)/classes.noshrob.jack
      -   full_jack_libs += $(link_instr_classes_jack)
      +   full_shared_jack_libs += $(link_instr_classes_jack)
          full_jack_deps += $(link_instr_classes_jack)
       endif  # LOCAL_INSTRUMENTATION_FOR
       endif  # !LOCAL_IS_HOST_MODULE
       
       # Propagate local configuration options to this target.
      -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_JACK_LIBRARIES:= $(full_jack_libs)
      -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES)
      +$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JACK_SHARED_LIBRARIES:= $(full_shared_jack_libs)
      +$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES)
       
       endif  # need_compile_java
       endif # LOCAL_JACK_ENABLED
      
      From 7b9f597dacd7800df915af06787365177944c5f7 Mon Sep 17 00:00:00 2001
      From: Yohann Roussel <yroussel@google.com>
      Date: Thu, 21 Apr 2016 16:49:10 +0200
      Subject: [PATCH 447/502] Remove bootclasspath handling for Jack
      
      Bootclasspath libraries are already added in LOCAL_JAVA_LIBRARIES by
      java.mk and host_dalvik_java_library.mk meaning that bootclasspath
      handling was just doing a duplicate work and adding duplicated entries
      to the classpath.
      
      Also fix order of bootclasspath libraries for host.
      
      Bug: 28307907
      Change-Id: I6e98fc651a127435c029de65285dbf2cb04844af
      ---
       core/definitions.mk                     | 12 ++-----
       core/host_dalvik_java_library.mk        |  2 +-
       core/host_dalvik_static_java_library.mk |  1 -
       core/java_common.mk                     | 44 ++-----------------------
       4 files changed, 7 insertions(+), 52 deletions(-)
      
      diff --git a/core/definitions.mk b/core/definitions.mk
      index a0889c4680a..313a9b227bd 100644
      --- a/core/definitions.mk
      +++ b/core/definitions.mk
      @@ -727,12 +727,6 @@ define jack-lib-files
       $(foreach lib,$(1),$(call _jack-lib-full-classes,$(lib),$(2)))
       endef
       
      -# $(1): library name list
      -# $(2): Non-empty if IS_HOST_MODULE
      -define jack-lib-deps
      -$(call jack-lib-files,$(1),$(2))
      -endef
      -
       ###########################################################
       ## Run rot13 on a string
       ## $(1): the string.  Must be one line.
      @@ -2139,7 +2133,7 @@ $(call call-jack) \
           $(if $(PRIVATE_RMTYPEDEFS), \
               -D jack.android.remove-typedef="true") \
           $(addprefix --classpath ,$(strip \
      -        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
      +        $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
           $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
           $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
           -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
      @@ -2184,7 +2178,7 @@ $(hide) if [ -s $@.java-source-list-uniq ] ; then \
       	    $(strip $(PRIVATE_JACK_FLAGS)) \
       	    $(strip $(PRIVATE_JACK_DEBUG_FLAGS)) \
       	    $(addprefix --classpath ,$(strip \
      -	        $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
      +	        $(call normalize-path-list,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES)) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
       	    -D jack.import.resource.policy=keep-first \
       	    -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
       	    -D jack.import.type.policy=keep-first \
      @@ -2314,7 +2308,7 @@ $(call call-jack) \
           $(if $(NO_OPTIMIZE_DX), \
               -D jack.dex.optimize="false") \
           $(addprefix --classpath ,$(strip \
      -        $(call normalize-path-list,$(PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES) $(PRIVATE_JACK_SHARED_LIBRARIES)))) \
      +        $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
           $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
           $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
           -D jack.import.resource.policy=keep-first \
      diff --git a/core/host_dalvik_java_library.mk b/core/host_dalvik_java_library.mk
      index 83047d4c3f2..2a55c056c47 100644
      --- a/core/host_dalvik_java_library.mk
      +++ b/core/host_dalvik_java_library.mk
      @@ -28,7 +28,7 @@ include $(BUILD_SYSTEM)/host_java_library_common.mk
       #######################################
       
       ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
      -  LOCAL_JAVA_LIBRARIES += core-oj-hostdex core-libart-hostdex
      +  LOCAL_JAVA_LIBRARIES :=  core-oj-hostdex core-libart-hostdex $(LOCAL_JAVA_LIBRARIES)
       endif
       
       full_classes_compiled_jar := $(intermediates.COMMON)/classes-full-debug.jar
      diff --git a/core/host_dalvik_static_java_library.mk b/core/host_dalvik_static_java_library.mk
      index c296be359e6..1783d6fc267 100644
      --- a/core/host_dalvik_static_java_library.mk
      +++ b/core/host_dalvik_static_java_library.mk
      @@ -55,6 +55,5 @@ $(full_classes_jack): $(java_sources) $(java_resource_sources) $(full_jack_deps)
       	@echo Building with Jack: $@
       	$(java-to-jack)
       
      -USE_CORE_LIB_BOOTCLASSPATH :=
       LOCAL_IS_STATIC_JAVA_LIBRARY :=
       endif
      diff --git a/core/java_common.mk b/core/java_common.mk
      index db6a30167c3..efa7038c6f1 100644
      --- a/core/java_common.mk
      +++ b/core/java_common.mk
      @@ -317,52 +317,14 @@ full_static_jack_libs := \
       
       $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_STATIC_JACK_LIBRARIES := $(full_static_jack_libs)
       
      -ifndef LOCAL_IS_HOST_MODULE
      -ifeq ($(LOCAL_SDK_VERSION),)
      -ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
      -my_bootclasspath :=
      -else
      -my_bootclasspath := $(call jack-lib-files,core-oj core-libart)
      -endif
      -else  # LOCAL_SDK_VERSION
      -ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current)
      -# LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS.
      -my_bootclasspath := $(call jack-lib-files,android_stubs_current)
      -else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current)
      -my_bootclasspath := $(call jack-lib-files,android_system_stubs_current)
      -else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current)
      -my_bootclasspath := $(call jack-lib-files,android_test_stubs_current)
      -else
      -my_bootclasspath :=$(call jack-lib-files,sdk_v$(LOCAL_SDK_VERSION))
      -endif # current, system_current, or test_current
      -endif # LOCAL_SDK_VERSION
      -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES := $(my_bootclasspath)
      -
       full_shared_jack_libs := $(call jack-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE))
      -full_jack_deps := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE))
      +full_jack_deps := $(full_shared_jack_libs)
      +
      +ifndef LOCAL_IS_HOST_MODULE
       # Turn off .toc optimization for apps build as we cannot build dexdump.
       ifeq (,$(TARGET_BUILD_APPS))
       full_jack_deps := $(patsubst %.jack, %.dex.toc, $(full_jack_deps))
       endif
      -
      -else # LOCAL_IS_HOST_MODULE
      -
      -ifeq ($(USE_CORE_LIB_BOOTCLASSPATH),true)
      -ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
      -my_bootclasspath :=
      -else
      -my_bootclasspath := $(call jack-lib-files,core-oj-hostdex core-libart-hostdex,$(LOCAL_IS_HOST_MODULE))
      -endif
      -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES := $(my_bootclasspath)
      -# Compiling against the final jack library. If we want to add support for obfuscated library
      -# we'll need to change that to compile against the not obfuscated jack library.
      -full_shared_jack_libs := $(call jack-lib-files,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE))
      -full_jack_deps := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE))
      -else
      -$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH_JAVA_LIBRARIES :=
      -full_shared_jack_libs := $(call jack-lib-deps,$(LOCAL_JAVA_LIBRARIES),$(LOCAL_IS_HOST_MODULE))
      -full_jack_deps := $(full_shared_jack_libs)
      -endif # USE_CORE_LIB_BOOTCLASSPATH
       endif # !LOCAL_IS_HOST_MODULE
       full_shared_jack_libs += $(LOCAL_JACK_CLASSPATH)
       full_jack_deps += $(full_static_jack_libs) $(LOCAL_JACK_CLASSPATH)
      
      From b890cb92ae50a6fca7fe094f81a5bdc0877dddba Mon Sep 17 00:00:00 2001
      From: kantjer <kantjer@gmail.com>
      Date: Sun, 5 Mar 2017 12:22:34 +0100
      Subject: [PATCH 448/502] Add root support for Tasker when using Magisk SU
      
      Change-Id: I51c3393dd359adc2834be1ef336da8ffedfff7a2
      ---
       core/Makefile | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index fb65013781f..52f7ad2b885 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -351,7 +351,8 @@ endif
       		$(hide) echo >> $@; \
       		        echo "#" >> $@; \
       		        echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \
      -		        echo "#" >> $@; )
      +		        echo "#" >> $@; \
      +		        echo "# modversion this line enables Tasker root support" >> $@; )
       	$(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \
       		echo "$(line)" >> $@;)
       	$(hide) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@
      
      From a4c1d2f20730cfb3c2c4a9d593cffce8230e453f Mon Sep 17 00:00:00 2001
      From: Rashed Abdel-Tawab <rashed@linux.com>
      Date: Sun, 9 Apr 2017 14:56:21 +0200
      Subject: [PATCH 449/502] kernel: Include openssl headers and dylibs on darwin
      
      The easiest and best way to get openssl on darwin is using homebrew,
      however homebrew refuses to link openssl (and for good reason) in
      order to prevent conflicts with Apple's homegrown version. Include
      the openssl headers and dylibs from the dir that homebrew installs
      openssl to let 4.4 kernels compile.
      
      Change-Id: I06b66768fbdd4855fd57b88100d646ed6e311a59
      ---
       core/tasks/kernel.mk | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index 5284b9306e6..3dd47e83c0b 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -261,6 +261,8 @@ endef
       
       ifeq ($(HOST_OS),darwin)
         MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf/
      +  MAKE_FLAGS += C_INCLUDE_PATH=/usr/local/opt/openssl/include
      +  MAKE_FLAGS += LIBRARY_PATH=/usr/local/opt/openssl/lib
       endif
       
       ifeq ($(TARGET_KERNEL_MODULES),)
      
      From 16258a0f46e16022bd61d57c44196221377272a1 Mon Sep 17 00:00:00 2001
      From: "Christopher N. Hesse" <raymanfx@gmail.com>
      Date: Wed, 12 Apr 2017 15:46:51 +0200
      Subject: [PATCH 450/502] kernel: Fix broken C_INCLUDE_PATH for Darwin
      
      Commit 7fb9251dfcc7a0876c8fb906338452204942144a modified
      the expansion in an illegal way.
      
      Fix the broken env variable.
      
      Change-Id: Ib3029fa995d6a4b0416887a2ef2e4792c9e6bb27
      ---
       core/tasks/kernel.mk | 3 +--
       1 file changed, 1 insertion(+), 2 deletions(-)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index 3dd47e83c0b..92ba8d2e7c8 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -260,8 +260,7 @@ define clean-module-folder
       endef
       
       ifeq ($(HOST_OS),darwin)
      -  MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf/
      -  MAKE_FLAGS += C_INCLUDE_PATH=/usr/local/opt/openssl/include
      +  MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf:/usr/local/opt/openssl/include
         MAKE_FLAGS += LIBRARY_PATH=/usr/local/opt/openssl/lib
       endif
       
      
      From 3b8156a9db5c73913363868504e9f91c8035cc95 Mon Sep 17 00:00:00 2001
      From: Park Ju Hyung <qkrwngud825@gmail.com>
      Date: Fri, 31 Mar 2017 15:23:11 +0900
      Subject: [PATCH 451/502] core: use 0 compression when creating the
       target_files package
      
      The zip file under $OUT/obj/PACKAGING/target_files_intermediate
      is used for final package creation,
      and it's being unzipped multiple times by releasetools.
      
      (Not to mention that it also takes an awful lot of time
      just to zip it initially.)
      
      Using 0 compression on it reduces the build time by several minutes.
      
      The final zip package is untouched by this change(remains compressed).
      
      Change-Id: Ic38b470f97f1e0ebb80da9d4f7750e4ccf53e05c
      Signed-off-by: Park Ju Hyung <qkrwngud825@gmail.com>
      Signed-off-by: Alex Naidis <alex.naidis@linux.com>
      ---
       core/Makefile | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 52f7ad2b885..0d61b38bb5d 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2263,8 +2263,8 @@ endif
       	@# Zip everything up, preserving symlinks and placing META/ files first to
       	@# help early validation of the .zip file while uploading it.
       	$(hide) (cd $(zip_root) && \
      -	        zip -qryX ../$(notdir $@) ./META && \
      -	        zip -qryXu ../$(notdir $@) .)
      +	        zip -0qryX ../$(notdir $@) ./META && \
      +	        zip -0qryXu ../$(notdir $@) .)
       	@# Run fs_config on all the system, vendor, boot ramdisk,
       	@# and recovery ramdisk files in the zip, and save the output
       	$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt
      
      From 83e8e73c90990437b4b30695a18fb10181d12aa4 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Wed, 5 Apr 2017 07:30:28 -0500
      Subject: [PATCH 452/502] Merge tag 'android-7.1.2_r2' into n7.1
      
      Android 7.1.2 Release 2 (N2G47E)
      
      Change-Id: Ie3d3e9ea5c8dd67f44e43b2ed5a97e844c19888d
      ---
       core/Makefile                                 | 10 ++-
       core/base_rules.mk                            |  6 +-
       core/build_id.mk                              |  2 +-
       core/build_rro_package.mk                     | 25 ++++++
       core/clear_vars.mk                            |  2 +
       core/config.mk                                |  1 +
       core/version_defaults.mk                      | 21 ++++-
       target/product/emulator.mk                    |  1 +
       tools/fileslist.py                            | 29 +++++--
       tools/fileslist_util.py                       | 68 ++++++++++++++++
       tools/releasetools/add_img_to_target_files.py | 51 ++++++++++--
       tools/releasetools/blockimgdiff.py            | 44 ++++++-----
       tools/releasetools/build_image.py             | 66 ++++++++++------
       tools/releasetools/common.py                  | 36 +++++----
       tools/releasetools/img_from_target_files.py   |  2 +
       tools/releasetools/ota_from_target_files.py   | 71 ++++++++++++++++-
       tools/releasetools/sign_target_files_apks.py  | 14 ++--
       tools/releasetools/test_blockimgdiff.py       | 77 +++++++++++++++++++
       18 files changed, 439 insertions(+), 87 deletions(-)
       create mode 100644 core/build_rro_package.mk
       create mode 100755 tools/fileslist_util.py
       create mode 100644 tools/releasetools/test_blockimgdiff.py
      
      diff --git a/core/Makefile b/core/Makefile
      index 52f7ad2b885..87a65bd02bb 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -930,6 +930,7 @@ define generate-userimage-prop-dictionary
       $(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))
       $(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1))
       $(if $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "system_fs_type=$(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
      +$(if $(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "system_extfs_inode_count=$(BOARD_SYSTEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
       $(if $(BOARD_SYSTEMIMAGE_JOURNAL_SIZE),$(hide) echo "system_journal_size=$(BOARD_SYSTEMIMAGE_JOURNAL_SIZE)" >> $(1))
       $(if $(BOARD_HAS_EXT4_RESERVED_BLOCKS),$(hide) echo "has_ext4_reserved_blocks=$(BOARD_HAS_EXT4_RESERVED_BLOCKS)" >> $(1))
       $(if $(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "system_squashfs_compressor=$(BOARD_SYSTEMIMAGE_SQUASHFS_COMPRESSOR)" >> $(1))
      @@ -944,6 +945,7 @@ $(if $(BOARD_USERDATAEXTRAIMAGE_PARTITION_NAME),$(hide) echo "userdataextra_name
       $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
       $(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1))
       $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
      +$(if $(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT),$(hide) echo "vendor_extfs_inode_count=$(BOARD_VENDORIMAGE_EXTFS_INODE_COUNT)" >> $(1))
       $(if $(BOARD_VENDORIMAGE_PARTITION_SIZE),$(hide) echo "vendor_size=$(BOARD_VENDORIMAGE_PARTITION_SIZE)" >> $(1))
       $(if $(BOARD_VENDORIMAGE_JOURNAL_SIZE),$(hide) echo "vendor_journal_size=$(BOARD_VENDORIMAGE_JOURNAL_SIZE)" >> $(1))
       $(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR),$(hide) echo "vendor_squashfs_compressor=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR)" >> $(1))
      @@ -953,6 +955,7 @@ $(if $(BOARD_VENDORIMAGE_SQUASHFS_DISABLE_4K_ALIGN),$(hide) echo "vendor_squashf
       $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),$(hide) echo "vendor_base_fs_file=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH)" >> $(1))
       $(if $(BOARD_OEMIMAGE_PARTITION_SIZE),$(hide) echo "oem_size=$(BOARD_OEMIMAGE_PARTITION_SIZE)" >> $(1))
       $(if $(BOARD_OEMIMAGE_JOURNAL_SIZE),$(hide) echo "oem_journal_size=$(BOARD_OEMIMAGE_JOURNAL_SIZE)" >> $(1))
      +$(if $(BOARD_OEMIMAGE_EXTFS_INODE_COUNT),$(hide) echo "oem_extfs_inode_count=$(BOARD_OEMIMAGE_EXTFS_INODE_COUNT)" >> $(1))
       $(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1))
       $(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1))
       $(if $(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG),$(hide) echo "squashfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG)" >> $(1))
      @@ -1372,7 +1375,8 @@ $(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS)
       	@echo Installed file list: $@
       	@mkdir -p $(dir $@)
       	@rm -f $@
      -	$(hide) build/tools/fileslist.py $(TARGET_OUT) > $@
      +	$(hide) build/tools/fileslist.py $(TARGET_OUT) > $(@:.txt=.json)
      +	$(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
       
       .PHONY: installed-file-list
       installed-file-list: $(INSTALLED_FILES_FILE)
      @@ -1774,7 +1778,8 @@ $(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES)
       	@echo Installed file list: $@
       	@mkdir -p $(dir $@)
       	@rm -f $@
      -	$(hide) build/tools/fileslist.py $(TARGET_OUT_VENDOR) > $@
      +	$(hide) build/tools/fileslist.py $(TARGET_OUT_VENDOR) > $(@:.txt=.json)
      +	$(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
       
       vendorimage_intermediates := \
           $(call intermediates-dir-for,PACKAGING,vendor)
      @@ -1862,6 +1867,7 @@ OTATOOLS :=  $(HOST_OUT_EXECUTABLES)/minigzip \
         $(HOST_OUT_EXECUTABLES)/e2fsck \
         $(HOST_OUT_EXECUTABLES)/build_verity_tree \
         $(HOST_OUT_EXECUTABLES)/verity_signer \
      +  $(HOST_OUT_EXECUTABLES)/verity_verifier \
         $(HOST_OUT_EXECUTABLES)/append2simg \
         $(HOST_OUT_EXECUTABLES)/img2simg \
         $(HOST_OUT_EXECUTABLES)/boot_signer \
      diff --git a/core/base_rules.mk b/core/base_rules.mk
      index 838f185375e..879486ab1c2 100644
      --- a/core/base_rules.mk
      +++ b/core/base_rules.mk
      @@ -210,7 +210,11 @@ ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
         # Apk and its attachments reside in its own subdir.
         ifeq ($(LOCAL_MODULE_CLASS),APPS)
         # framework-res.apk doesn't like the additional layer.
      -  ifeq ($(filter true,$(LOCAL_NO_STANDARD_LIBRARIES) $(LOCAL_IGNORE_SUBDIR)),)
      +  ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
      +  # Neither do Runtime Resource Overlay apks, which contain just the overlaid resources.
      +  else ifeq ($(LOCAL_IS_RUNTIME_RESOURCE_OVERLAY),true)
      +  else ifeq ($(LOCAL_IGNORE_SUBDIR),true)
      +  else
           my_module_path := $(my_module_path)/$(LOCAL_MODULE)
         endif
         endif
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 8cce0d912aa..05381ec1849 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NOF27B
      +export BUILD_ID=N2G47E
      diff --git a/core/build_rro_package.mk b/core/build_rro_package.mk
      new file mode 100644
      index 00000000000..9865b33fec4
      --- /dev/null
      +++ b/core/build_rro_package.mk
      @@ -0,0 +1,25 @@
      +#############################################################################
      +## Standard rules for installing runtime resouce overlay APKs.
      +##
      +## Set LOCAL_RRO_THEME to the theme name if the package should apply only to
      +## a particular theme as set by ro.boot.vendor.overlay.theme system property.
      +##
      +## If LOCAL_RRO_THEME is not set, the package will apply always, independent
      +## of themes.
      +##
      +#############################################################################
      +
      +LOCAL_IS_RUNTIME_RESOURCE_OVERLAY := true
      +
      +ifneq ($(LOCAL_SRC_FILES),)
      +  $(error runtime resource overlay package should not contain sources)
      +endif
      +
      +ifeq (S(LOCAL_RRO_THEME),)
      +  LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
      +else
      +  LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay/$(LOCAL_RRO_THEME)
      +endif
      +
      +include $(BUILD_SYSTEM)/package.mk
      +
      diff --git a/core/clear_vars.mk b/core/clear_vars.mk
      index cf6699a4b6b..09eddce0de4 100644
      --- a/core/clear_vars.mk
      +++ b/core/clear_vars.mk
      @@ -367,6 +367,8 @@ LOCAL_CLANG_64:=
       LOCAL_INIT_RC_32:=
       LOCAL_INIT_RC_64:=
       LOCAL_JAVA_LANGUAGE_VERSION:=
      +LOCAL_IS_RUNTIME_RESOURCE_OVERLAY:=
      +LOCAL_RRO_THEME:=
       
       LOCAL_PROTOC_OUTPUT:=
       
      diff --git a/core/config.mk b/core/config.mk
      index a0c8b5f9cee..064f7b394ae 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -102,6 +102,7 @@ BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
       BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
       BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
       BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
      +BUILD_RRO_PACKAGE:= $(BUILD_SYSTEM)/build_rro_package.mk
       BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
       BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
       BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 3e3814a2a26..83ac4700269 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -43,7 +43,16 @@ ifeq "" "$(PLATFORM_VERSION)"
         # which is the version that we reveal to the end user.
         # Update this value when the platform version changes (rather
         # than overriding it somewhere else).  Can be an arbitrary string.
      -  PLATFORM_VERSION := 7.1.1
      +
      +  # When you add a new PLATFORM_VERSION which will result in a new
      +  # PLATFORM_SDK_VERSION please ensure you add a corresponding isAtLeast*
      +  # method in the following java file:
      +  # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java
      +
      +  # When you change PLATFORM_VERSION for a given PLATFORM_SDK_VERSION
      +  # please add that PLATFORM_VERSION to the following text file:
      +  # cts/tests/tests/os/assets/platform_versions.txt
      +  PLATFORM_VERSION := 7.1.2
       endif
       
       ifeq "" "$(PLATFORM_SDK_VERSION)"
      @@ -55,6 +64,14 @@ ifeq "" "$(PLATFORM_SDK_VERSION)"
         # intermediate builds).  During development, this number remains at the
         # SDK version the branch is based on and PLATFORM_VERSION_CODENAME holds
         # the code-name of the new development work.
      +
      +  # When you change PLATFORM_SDK_VERSION please ensure you also update the
      +  # corresponding methods for isAtLeast* in the following java file:
      +  # frameworks/support/compat/gingerbread/android/support/v4/os/BuildCompat.java
      +
      +  # When you increment the PLATFORM_SDK_VERSION please ensure you also
      +  # clear out the following text file of all older PLATFORM_VERSION's:
      +  # cts/tests/tests/os/assets/platform_versions.txt
         PLATFORM_SDK_VERSION := 25
       endif
       
      @@ -114,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-03-05
      +      PLATFORM_SECURITY_PATCH := 2017-04-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      diff --git a/target/product/emulator.mk b/target/product/emulator.mk
      index a1217e79e98..70cd5977aec 100644
      --- a/target/product/emulator.mk
      +++ b/target/product/emulator.mk
      @@ -62,6 +62,7 @@ PRODUCT_COPY_FILES += \
           device/generic/goldfish/init.ranchu.rc:root/init.ranchu.rc \
           device/generic/goldfish/fstab.ranchu:root/fstab.ranchu \
           device/generic/goldfish/ueventd.ranchu.rc:root/ueventd.ranchu.rc \
      +    device/generic/goldfish/input/goldfish_rotary.idc:system/usr/idc/goldfish_rotary.idc \
           frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml
       
       PRODUCT_PACKAGE_OVERLAYS := device/generic/goldfish/overlay
      diff --git a/tools/fileslist.py b/tools/fileslist.py
      index 1538a3015c1..c257b40770f 100755
      --- a/tools/fileslist.py
      +++ b/tools/fileslist.py
      @@ -17,12 +17,24 @@
       
       from __future__ import print_function
       
      -import operator, os, sys
      +import json, hashlib, operator, os, sys
       
       def get_file_size(path):
         st = os.lstat(path)
         return st.st_size
       
      +def get_file_digest(path):
      +  if os.path.isfile(path) == False:
      +    return "----------------------------------------------------------------"
      +  digest = hashlib.sha256()
      +  with open(path, 'rb') as f:
      +    while True:
      +      buf = f.read(1024*1024)
      +      if not buf:
      +        break
      +      digest.update(buf)
      +  return digest.hexdigest();
      +
       def main(argv):
         output = []
         roots = argv[1:]
      @@ -32,16 +44,17 @@ def main(argv):
             relative = dir[base:]
             for f in files:
               try:
      -          row = (
      -              get_file_size(os.path.sep.join((dir, f))),
      -              os.path.sep.join((relative, f)),
      -            )
      +          path = os.path.sep.join((dir, f))
      +          row = {
      +              "Size": get_file_size(path),
      +              "Name": os.path.sep.join((relative, f)),
      +              "SHA256": get_file_digest(path),
      +            }
                 output.append(row)
               except os.error:
                 pass
      -  output.sort(key=operator.itemgetter(0), reverse=True)
      -  for row in output:
      -    print("%12d  %s" % row)
      +  output.sort(key=operator.itemgetter("Size", "Name"), reverse=True)
      +  print json.dumps(output, indent=2, separators=(',',': '))
       
       if __name__ == '__main__':
         main(sys.argv)
      diff --git a/tools/fileslist_util.py b/tools/fileslist_util.py
      new file mode 100755
      index 00000000000..ff40d51a021
      --- /dev/null
      +++ b/tools/fileslist_util.py
      @@ -0,0 +1,68 @@
      +#!/usr/bin/env python
      +#
      +# Copyright (C) 2016 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.
      +#
      +
      +import getopt, json, sys
      +
      +def PrintFileNames(path):
      +  with open(path) as jf:
      +    data = json.load(jf)
      +  for line in data:
      +    print(line["Name"])
      +
      +def PrintCanonicalList(path):
      +  with open(path) as jf:
      +    data = json.load(jf)
      +  for line in data:
      +    print "{0:12d}  {1}".format(line["Size"], line["Name"])
      +
      +def PrintUsage(name):
      +  print("""
      +Usage: %s -[nc] json_files_list
      + -n produces list of files only
      + -c produces classic installed-files.txt
      +""" % (name))
      +
      +def main(argv):
      +  try:
      +    opts, args = getopt.getopt(argv[1:], "nc", "")
      +  except getopt.GetoptError, err:
      +    print(err)
      +    PrintUsage(argv[0])
      +    sys.exit(2)
      +
      +  if len(opts) == 0:
      +    print("No conversion option specified")
      +    PrintUsage(argv[0])
      +    sys.exit(2)
      +
      +  if len(args) == 0:
      +    print("No input file specified")
      +    PrintUsage(argv[0])
      +    sys.exit(2)
      +
      +  for o, a in opts:
      +    if o == ("-n"):
      +      PrintFileNames(args[0])
      +      sys.exit()
      +    elif o == ("-c"):
      +      PrintCanonicalList(args[0])
      +      sys.exit()
      +    else:
      +      assert False, "Unsupported option"
      +
      +if __name__ == '__main__':
      +  main(sys.argv)
      diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
      index b67fa0a34ee..0140c1fa085 100755
      --- a/tools/releasetools/add_img_to_target_files.py
      +++ b/tools/releasetools/add_img_to_target_files.py
      @@ -19,7 +19,31 @@
       not have an IMAGES/ top-level subdirectory), produce the images and
       add them to the zipfile.
       
      -Usage:  add_img_to_target_files target_files
      +Usage:  add_img_to_target_files [flag] target_files
      +
      +  -a  (--add_missing)
      +      Build and add missing images to "IMAGES/". If this option is
      +      not specified, this script will simply exit when "IMAGES/"
      +      directory exists in the target file.
      +
      +  -r  (--rebuild_recovery)
      +      Rebuild the recovery patch and write it to the system image. Only
      +      meaningful when system image needs to be rebuilt.
      +
      +  --replace_verity_private_key
      +      Replace the private key used for verity signing. (same as the option
      +      in sign_target_files_apks)
      +
      +  --replace_verity_public_key
      +       Replace the certificate (public key) used for verity verification. (same
      +       as the option in sign_target_files_apks)
      +
      +  --is_signing
      +      Skip building & adding the images for "userdata" and "cache" if we
      +      are signing the target files.
      +
      +  --verity_signer_path
      +      Specify the signer path to build verity metadata.
       """
       
       from __future__ import print_function
      @@ -47,6 +71,7 @@
       OPTIONS.rebuild_recovery = False
       OPTIONS.replace_verity_public_key = False
       OPTIONS.replace_verity_private_key = False
      +OPTIONS.is_signing = False
       OPTIONS.verity_signer_path = None
       
       def GetCareMap(which, imgname):
      @@ -425,6 +450,14 @@ def banner(s):
             if recovery_image:
               recovery_image.AddToZip(output_zip)
       
      +      banner("recovery (two-step image)")
      +      # The special recovery.img for two-step package use.
      +      recovery_two_step_image = common.GetBootableImage(
      +          "IMAGES/recovery-two-step.img", "recovery-two-step.img",
      +          OPTIONS.input_tmp, "RECOVERY", two_step_image=True)
      +      if recovery_two_step_image:
      +        recovery_two_step_image.AddToZip(output_zip)
      +
         banner("system")
         system_imgname = AddSystem(output_zip, recovery_img=recovery_image,
                                    boot_img=boot_image)
      @@ -435,12 +468,13 @@ def banner(s):
         if has_system_other:
           banner("system_other")
           AddSystemOther(output_zip)
      -  banner("userdata")
      -  AddUserdata(output_zip)
      -  banner("extrauserdata")
      -  AddUserdataExtra(output_zip)
      -  banner("cache")
      -  AddCache(output_zip)
      +  if not OPTIONS.is_signing:
      +    banner("userdata")
      +    AddUserdata(output_zip)
      +    banner("extrauserdata")
      +    AddUserdataExtra(output_zip)
      +    banner("cache")
      +    AddCache(output_zip)
         if has_oem:
           banner("oem")
           AddOem(output_zip)
      @@ -491,6 +525,8 @@ def option_handler(o, a):
             OPTIONS.replace_verity_private_key = (True, a)
           elif o == "--replace_verity_public_key":
             OPTIONS.replace_verity_public_key = (True, a)
      +    elif o == "--is_signing":
      +      OPTIONS.is_signing = True
           elif o == "--verity_signer_path":
             OPTIONS.verity_signer_path = a
           else:
      @@ -502,6 +538,7 @@ def option_handler(o, a):
             extra_long_opts=["add_missing", "rebuild_recovery",
                              "replace_verity_public_key=",
                              "replace_verity_private_key=",
      +                       "is_signing",
                              "verity_signer_path="],
             extra_option_handler=option_handler)
       
      diff --git a/tools/releasetools/blockimgdiff.py b/tools/releasetools/blockimgdiff.py
      index 4de81d05d49..d26e0ebabed 100644
      --- a/tools/releasetools/blockimgdiff.py
      +++ b/tools/releasetools/blockimgdiff.py
      @@ -999,8 +999,11 @@ def FindVertexSequence(self):
             heap.append(xf.heap_item)
           heapq.heapify(heap)
       
      -    sinks = set(u for u in G if not u.outgoing)
      -    sources = set(u for u in G if not u.incoming)
      +    # Use OrderedDict() instead of set() to preserve the insertion order. Need
      +    # to use 'sinks[key] = None' to add key into the set. sinks will look like
      +    # { key1: None, key2: None, ... }.
      +    sinks = OrderedDict.fromkeys(u for u in G if not u.outgoing)
      +    sources = OrderedDict.fromkeys(u for u in G if not u.incoming)
       
           def adjust_score(iu, delta):
             iu.score += delta
      @@ -1011,26 +1014,28 @@ def adjust_score(iu, delta):
           while G:
             # Put all sinks at the end of the sequence.
             while sinks:
      -        new_sinks = set()
      +        new_sinks = OrderedDict()
               for u in sinks:
                 if u not in G: continue
                 s2.appendleft(u)
                 del G[u]
                 for iu in u.incoming:
                   adjust_score(iu, -iu.outgoing.pop(u))
      -            if not iu.outgoing: new_sinks.add(iu)
      +            if not iu.outgoing:
      +              new_sinks[iu] = None
               sinks = new_sinks
       
             # Put all the sources at the beginning of the sequence.
             while sources:
      -        new_sources = set()
      +        new_sources = OrderedDict()
               for u in sources:
                 if u not in G: continue
                 s1.append(u)
                 del G[u]
                 for iu in u.outgoing:
                   adjust_score(iu, +iu.incoming.pop(u))
      -            if not iu.incoming: new_sources.add(iu)
      +            if not iu.incoming:
      +              new_sources[iu] = None
               sources = new_sources
       
             if not G: break
      @@ -1049,11 +1054,13 @@ def adjust_score(iu, delta):
             del G[u]
             for iu in u.outgoing:
               adjust_score(iu, +iu.incoming.pop(u))
      -        if not iu.incoming: sources.add(iu)
      +        if not iu.incoming:
      +          sources[iu] = None
       
             for iu in u.incoming:
               adjust_score(iu, -iu.outgoing.pop(u))
      -        if not iu.outgoing: sinks.add(iu)
      +        if not iu.outgoing:
      +          sinks[iu] = None
       
           # Now record the sequence in the 'order' field of each transfer,
           # and by rearranging self.transfers to be in the chosen sequence.
      @@ -1072,8 +1079,7 @@ def GenerateDigraph(self):
       
           # Each item of source_ranges will be:
           #   - None, if that block is not used as a source,
      -    #   - a transfer, if one transfer uses it as a source, or
      -    #   - a set of transfers.
      +    #   - an ordered set of transfers.
           source_ranges = []
           for b in self.transfers:
             for s, e in b.src_ranges:
      @@ -1081,23 +1087,19 @@ def GenerateDigraph(self):
                 source_ranges.extend([None] * (e-len(source_ranges)))
               for i in range(s, e):
                 if source_ranges[i] is None:
      -            source_ranges[i] = b
      +            source_ranges[i] = OrderedDict.fromkeys([b])
                 else:
      -            if not isinstance(source_ranges[i], set):
      -              source_ranges[i] = set([source_ranges[i]])
      -            source_ranges[i].add(b)
      +            source_ranges[i][b] = None
       
           for a in self.transfers:
      -      intersections = set()
      +      intersections = OrderedDict()
             for s, e in a.tgt_ranges:
               for i in range(s, e):
                 if i >= len(source_ranges): break
      -          b = source_ranges[i]
      -          if b is not None:
      -            if isinstance(b, set):
      -              intersections.update(b)
      -            else:
      -              intersections.add(b)
      +          # Add all the Transfers in source_ranges[i] to the (ordered) set.
      +          if source_ranges[i] is not None:
      +            for j in source_ranges[i]:
      +              intersections[j] = None
       
             for b in intersections:
               if a is b: continue
      diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
      index 1f9536005e7..ed3a7443a3e 100755
      --- a/tools/releasetools/build_image.py
      +++ b/tools/releasetools/build_image.py
      @@ -75,7 +75,7 @@ def GetVerityTreeSize(partition_size):
         return True, int(output)
       
       def GetVerityMetadataSize(partition_size):
      -  cmd = "system/extras/verity/build_verity_metadata.py -s %d"
      +  cmd = "system/extras/verity/build_verity_metadata.py size %d"
         cmd %= partition_size
       
         status, output = getstatusoutput(cmd)
      @@ -116,7 +116,8 @@ def AdjustPartitionSizeForVerity(partition_size, fec_supported):
         Args:
           partition_size: the size of the partition to be verified.
         Returns:
      -    The size of the partition adjusted for verity metadata.
      +    A tuple of the size of the partition adjusted for verity metadata, and
      +    the size of verity metadata.
         """
         key = "%d %d" % (partition_size, fec_supported)
         if key in AdjustPartitionSizeForVerity.results:
      @@ -128,29 +129,33 @@ def AdjustPartitionSizeForVerity(partition_size, fec_supported):
       
         # verity tree and fec sizes depend on the partition size, which
         # means this estimate is always going to be unnecessarily small
      -  lo = partition_size - GetVeritySize(hi, fec_supported)
      +  verity_size = GetVeritySize(hi, fec_supported)
      +  lo = partition_size - verity_size
         result = lo
       
         # do a binary search for the optimal size
         while lo < hi:
           i = ((lo + hi) // (2 * BLOCK_SIZE)) * BLOCK_SIZE
      -    size = i + GetVeritySize(i, fec_supported)
      -    if size <= partition_size:
      +    v = GetVeritySize(i, fec_supported)
      +    if i + v <= partition_size:
             if result < i:
               result = i
      +        verity_size = v
             lo = i + BLOCK_SIZE
           else:
             hi = i
       
      -  AdjustPartitionSizeForVerity.results[key] = result
      -  return result
      +  AdjustPartitionSizeForVerity.results[key] = (result, verity_size)
      +  return (result, verity_size)
       
       AdjustPartitionSizeForVerity.results = {}
       
      -def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path):
      -  cmd = "fec -e %s %s %s" % (sparse_image_path, verity_path, verity_fec_path)
      -  print(cmd)
      -  status, output = getstatusoutput(cmd)
      +def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path,
      +                   padding_size):
      +  cmd = "fec -e -p %d %s %s %s" % (padding_size, sparse_image_path,
      +                                   verity_path, verity_fec_path)
      +  print cmd
      +  status, output = commands.getstatusoutput(cmd)
         if status:
           print("Could not build FEC data! Error: %s" % output)
           return False
      @@ -170,7 +175,7 @@ def BuildVerityTree(sparse_image_path, verity_image_path, prop_dict):
         return True
       
       def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt,
      -                        block_device, signer_path, key):
      +                        block_device, signer_path, key, signer_args):
         verity_key = os.getenv("PRODUCT_VERITY_KEY", None)
         verity_key_password = None
       
      @@ -180,10 +185,13 @@ def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt,
           verity_key_password = verity_key_passwords[verity_key]
       
         cmd_template = (
      -      "system/extras/verity/build_verity_metadata.py %s %s %s %s %s %s %s")
      +      "system/extras/verity/build_verity_metadata.py build " +
      +      "%s %s %s %s %s %s %s")
         cmd = cmd_template % (image_size, verity_metadata_path, root_hash, salt,
                               block_device, signer_path, key)
      -  print(cmd)
      +  if signer_args:
      +    cmd += " --signer_args=\"%s\"" % (' '.join(signer_args),)
      +  print cmd
         runcmd = ["system/extras/verity/build_verity_metadata.py", image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key];
         if verity_key_password is not None:
           sp = subprocess.Popen(runcmd, stdin=subprocess.PIPE)
      @@ -228,7 +236,7 @@ def Append(target, file_to_append, error_message):
       
       def BuildVerifiedImage(data_image_path, verity_image_path,
                              verity_metadata_path, verity_fec_path,
      -                       fec_supported):
      +                       padding_size, fec_supported):
         if not Append(verity_image_path, verity_metadata_path,
                       "Could not append verity metadata!"):
           return False
      @@ -236,7 +244,7 @@ def BuildVerifiedImage(data_image_path, verity_image_path,
         if fec_supported:
           # build FEC for the entire partition, including metadata
           if not BuildVerityFEC(data_image_path, verity_image_path,
      -                          verity_fec_path):
      +                          verity_fec_path, padding_size):
             return False
       
           if not Append(verity_image_path, verity_fec_path, "Could not append FEC!"):
      @@ -274,14 +282,14 @@ def MakeVerityEnabledImage(out_file, fec_supported, prop_dict):
           True on success, False otherwise.
         """
         # get properties
      -  image_size = prop_dict["partition_size"]
      +  image_size = int(prop_dict["partition_size"])
         block_dev = prop_dict["verity_block_device"]
         signer_key = prop_dict["verity_key"] + ".pk8"
         if OPTIONS.verity_signer_path is not None:
      -    signer_path = OPTIONS.verity_signer_path + ' '
      -    signer_path += ' '.join(OPTIONS.verity_signer_args)
      +    signer_path = OPTIONS.verity_signer_path
         else:
           signer_path = prop_dict["verity_signer_cmd"]
      +  signer_args = OPTIONS.verity_signer_args
       
         # make a tempdir
         tempdir_name = tempfile.mkdtemp(suffix="_verity_images")
      @@ -300,15 +308,22 @@ def MakeVerityEnabledImage(out_file, fec_supported, prop_dict):
         root_hash = prop_dict["verity_root_hash"]
         salt = prop_dict["verity_salt"]
         if not BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt,
      -                             block_dev, signer_path, signer_key):
      +                             block_dev, signer_path, signer_key, signer_args):
           shutil.rmtree(tempdir_name, ignore_errors=True)
           return False
       
         # build the full verified image
      +  target_size = int(prop_dict["original_partition_size"])
      +  verity_size = int(prop_dict["verity_size"])
      +
      +  padding_size = target_size - image_size - verity_size
      +  assert padding_size >= 0
      +
         if not BuildVerifiedImage(out_file,
                                   verity_image_path,
                                   verity_metadata_path,
                                   verity_fec_path,
      +                            padding_size,
                                   fec_supported):
           shutil.rmtree(tempdir_name, ignore_errors=True)
           return False
      @@ -379,13 +394,14 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
         # verified.
         if verity_supported and is_verity_partition:
           partition_size = int(prop_dict.get("partition_size"))
      -    adjusted_size = AdjustPartitionSizeForVerity(partition_size,
      -                                                 verity_fec_supported)
      +    (adjusted_size, verity_size) = AdjustPartitionSizeForVerity(partition_size,
      +                                                                verity_fec_supported)
           if not adjusted_size:
             print("Error: adjusting partition size for verity failed, partition_size = %d" % partition_size)
             return False
           prop_dict["partition_size"] = str(adjusted_size)
           prop_dict["original_partition_size"] = str(partition_size)
      +    prop_dict["verity_size"] = str(verity_size)
       
         if fs_type.startswith("ext"):
           build_command = ["mkuserimg.sh"]
      @@ -416,6 +432,8 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
               return False
             build_command.extend(["-d", base_fs_file])
           build_command.extend(["-L", prop_dict["mount_point"]])
      +    if "extfs_inode_count" in prop_dict:
      +      build_command.extend(["-i", prop_dict["extfs_inode_count"]])
           if "selinux_fc" in prop_dict:
             build_command.append(prop_dict["selinux_fc"])
         elif fs_type.startswith("squash"):
      @@ -591,6 +609,7 @@ def copy_prop(src_p, dest_p):
           copy_prop("system_squashfs_block_size", "squashfs_block_size")
           copy_prop("system_squashfs_disable_4k_align", "squashfs_disable_4k_align")
           copy_prop("system_base_fs_file", "base_fs_file")
      +    copy_prop("system_extfs_inode_count", "extfs_inode_count")
         elif mount_point == "system_other":
           # We inherit the selinux policies of /system since we contain some of its files.
           d["mount_point"] = "system"
      @@ -604,6 +623,7 @@ def copy_prop(src_p, dest_p):
           copy_prop("system_squashfs_compressor_opt", "squashfs_compressor_opt")
           copy_prop("system_squashfs_block_size", "squashfs_block_size")
           copy_prop("system_base_fs_file", "base_fs_file")
      +    copy_prop("system_extfs_inode_count", "extfs_inode_count")
         elif mount_point == "data":
           # Copy the generic fs type first, override with specific one if available.
           copy_prop("fs_type", "fs_type")
      @@ -628,11 +648,13 @@ def copy_prop(src_p, dest_p):
           copy_prop("vendor_squashfs_block_size", "squashfs_block_size")
           copy_prop("vendor_squashfs_disable_4k_align", "squashfs_disable_4k_align")
           copy_prop("vendor_base_fs_file", "base_fs_file")
      +    copy_prop("vendor_extfs_inode_count", "extfs_inode_count")
         elif mount_point == "oem":
           copy_prop("fs_type", "fs_type")
           copy_prop("oem_size", "partition_size")
           copy_prop("oem_journal_size", "journal_size")
           copy_prop("has_ext4_reserved_blocks", "has_ext4_reserved_blocks")
      +    copy_prop("oem_extfs_inode_count", "extfs_inode_count")
       
         return d
       
      diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
      index 15cc439c55d..59e3f30cb2b 100755
      --- a/tools/releasetools/common.py
      +++ b/tools/releasetools/common.py
      @@ -59,7 +59,7 @@ def __init__(self):
           self.signapk_shared_library_path = "lib64"   # Relative to search_path
           self.extra_signapk_args = []
           self.java_path = "java"  # Use the one on the path by default.
      -    self.java_args = "-Xmx2048m" # JVM Args
      +    self.java_args = ["-Xmx2048m"]  # The default JVM args.
           self.public_key_suffix = ".x509.pem"
           self.private_key_suffix = ".pk8"
           # use otatools built boot_signer by default
      @@ -419,13 +419,17 @@ def DumpInfoDict(d):
       
       
       def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
      -                        has_ramdisk=False):
      +                        has_ramdisk=False, two_step_image=False):
         """Build a bootable image from the specified sourcedir.
       
         Take a kernel, cmdline, and optionally a ramdisk directory from the input (in
      -  'sourcedir'), and turn them into a boot image.  Return the image data, or
      -  None if sourcedir does not appear to contains files for building the
      -  requested image."""
      +  'sourcedir'), and turn them into a boot image. 'two_step_image' indicates if
      +  we are building a two-step special image (i.e. building a recovery image to
      +  be loaded into /boot in two-step OTAs).
      +
      +  Return the image data, or None if sourcedir does not appear to contains files
      +  for building the requested image.
      +  """
       
         def make_ramdisk():
           ramdisk_img = tempfile.NamedTemporaryFile()
      @@ -587,7 +591,12 @@ def make_ramdisk():
       
         if (info_dict.get("boot_signer", None) == "true" and
             info_dict.get("verity_key", None)):
      -    path = "/" + os.path.basename(sourcedir).lower()
      +    # Hard-code the path as "/boot" for two-step special recovery image (which
      +    # will be loaded into /boot during the two-step OTA).
      +    if two_step_image:
      +      path = "/boot"
      +    else:
      +      path = "/" + os.path.basename(sourcedir).lower()
           cmd = [OPTIONS.boot_signer_path]
           cmd.extend(OPTIONS.boot_signer_args)
           cmd.extend([path, img.name,
      @@ -639,7 +648,7 @@ def make_ramdisk():
       
       
       def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
      -                     info_dict=None):
      +                     info_dict=None, two_step_image=False):
         """Return a File object with the desired bootable image.
       
         Look for it in 'unpack_dir'/BOOTABLE_IMAGES under the name 'prebuilt_name',
      @@ -671,7 +680,7 @@ def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
         fs_config = "META/" + tree_subdir.lower() + "_filesystem_config.txt"
         data = _BuildBootableImage(os.path.join(unpack_dir, tree_subdir),
                                    os.path.join(unpack_dir, fs_config),
      -                             info_dict, has_ramdisk)
      +                             info_dict, has_ramdisk, two_step_image)
         if data:
           return File(name, data)
         return None
      @@ -820,11 +829,10 @@ def SignFile(input_name, output_name, key, password, min_api_level=None,
         java_library_path = os.path.join(
             OPTIONS.search_path, OPTIONS.signapk_shared_library_path)
       
      -  cmd = [OPTIONS.java_path, OPTIONS.java_args,
      -         "-Djava.library.path=" + java_library_path,
      -         "-jar",
      -         os.path.join(OPTIONS.search_path, OPTIONS.signapk_path)]
      -  cmd.extend(OPTIONS.extra_signapk_args)
      +  cmd = ([OPTIONS.java_path] + OPTIONS.java_args +
      +         ["-Djava.library.path=" + java_library_path,
      +          "-jar", os.path.join(OPTIONS.search_path, OPTIONS.signapk_path)] +
      +         OPTIONS.extra_signapk_args)
         if whole_file:
           cmd.append("-w")
       
      @@ -982,7 +990,7 @@ def ParseOptions(argv,
           elif o in ("--java_path",):
             OPTIONS.java_path = a
           elif o in ("--java_args",):
      -      OPTIONS.java_args = a
      +      OPTIONS.java_args = shlex.split(a)
           elif o in ("--public_key_suffix",):
             OPTIONS.public_key_suffix = a
           elif o in ("--private_key_suffix",):
      diff --git a/tools/releasetools/img_from_target_files.py b/tools/releasetools/img_from_target_files.py
      index b34d44e5241..da66a7f40b9 100755
      --- a/tools/releasetools/img_from_target_files.py
      +++ b/tools/releasetools/img_from_target_files.py
      @@ -121,6 +121,8 @@ def option_handler(o, _):
                   continue
                 if image == "oem.img":
                   continue
      +          if image == "recovery-two-step.img":
      +            continue
                 common.ZipWrite(
                     output_zip, os.path.join(images_path, image), image)
               done = True
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index d138db2fe8e..bdda1fb0fb8 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -479,6 +479,39 @@ def AppendAssertions(script, info_dict, oem_dict=None):
             script.AssertOemProperty(prop, oem_dict.get(prop))
       
       
      +def _WriteRecoveryImageToBoot(script, output_zip):
      +  """Find and write recovery image to /boot in two-step OTA.
      +
      +  In two-step OTAs, we write recovery image to /boot as the first step so that
      +  we can reboot to there and install a new recovery image to /recovery.
      +  A special "recovery-two-step.img" will be preferred, which encodes the correct
      +  path of "/boot". Otherwise the device may show "device is corrupt" message
      +  when booting into /boot.
      +
      +  Fall back to using the regular recovery.img if the two-step recovery image
      +  doesn't exist. Note that rebuilding the special image at this point may be
      +  infeasible, because we don't have the desired boot signer and keys when
      +  calling ota_from_target_files.py.
      +  """
      +
      +  recovery_two_step_img_name = "recovery-two-step.img"
      +  recovery_two_step_img_path = os.path.join(
      +      OPTIONS.input_tmp, "IMAGES", recovery_two_step_img_name)
      +  if os.path.exists(recovery_two_step_img_path):
      +    recovery_two_step_img = common.GetBootableImage(
      +        recovery_two_step_img_name, recovery_two_step_img_name,
      +        OPTIONS.input_tmp, "RECOVERY")
      +    common.ZipWriteStr(
      +        output_zip, recovery_two_step_img_name, recovery_two_step_img.data)
      +    print "two-step package: using %s in stage 1/3" % (
      +        recovery_two_step_img_name,)
      +    script.WriteRawImage("/boot", recovery_two_step_img_name)
      +  else:
      +    print "two-step package: using recovery.img in stage 1/3"
      +    # The "recovery.img" entry has been written into package earlier.
      +    script.WriteRawImage("/boot", "recovery.img")
      +
      +
       def HasRecoveryPatch(target_files_zip):
         namelist = [name for name in target_files_zip.namelist()]
         return ("SYSTEM/recovery-from-boot.p" in namelist or
      @@ -643,6 +676,9 @@ def WriteFullOTAPackage(input_zip, output_zip):
           script.AppendExtra("""
       if get_stage("%(bcb_dev)s") == "2/3" then
       """ % bcb_dev)
      +
      +    # Stage 2/3: Write recovery image to /recovery (currently running /boot).
      +    script.Comment("Stage 2/3")
           script.WriteRawImage("/recovery", "recovery.img")
           script.AppendExtra("""
       set_stage("%(bcb_dev)s", "3/3");
      @@ -650,6 +686,9 @@ def WriteFullOTAPackage(input_zip, output_zip):
       else if get_stage("%(bcb_dev)s") == "3/3" then
       """ % bcb_dev)
       
      +    # Stage 3/3: Make changes.
      +    script.Comment("Stage 3/3")
      +
         # Dump fingerprints
         script.Print("Target: %s" % CalculateFingerprint(
             oem_props, oem_dict, OPTIONS.info_dict))
      @@ -826,7 +865,11 @@ def output_sink(fn, data):
       set_stage("%(bcb_dev)s", "");
       """ % bcb_dev)
           script.AppendExtra("else\n")
      -    script.WriteRawImage("/boot", "recovery.img")
      +
      +    # Stage 1/3: Nothing to verify for full OTA. Write recovery image to /boot.
      +    script.Comment("Stage 1/3")
      +    _WriteRecoveryImageToBoot(script, output_zip)
      +
           script.AppendExtra("""
       set_stage("%(bcb_dev)s", "2/3");
       reboot_now("%(bcb_dev)s", "");
      @@ -1062,6 +1105,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
           script.AppendExtra("""
       if get_stage("%(bcb_dev)s") == "2/3" then
       """ % bcb_dev)
      +
      +    # Stage 2/3: Write recovery image to /recovery (currently running /boot).
      +    script.Comment("Stage 2/3")
           script.AppendExtra("sleep(20);\n")
           script.WriteRawImage("/recovery", "recovery.img")
           script.AppendExtra("""
      @@ -1070,6 +1116,9 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
       else if get_stage("%(bcb_dev)s") != "3/3" then
       """ % bcb_dev)
       
      +    # Stage 1/3: (a) Verify the current system.
      +    script.Comment("Stage 1/3")
      +
         # Dump fingerprints
         script.Print("Source: %s" % CalculateFingerprint(
             oem_props, oem_dict, OPTIONS.source_info_dict))
      @@ -1133,13 +1182,18 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
         device_specific.IncrementalOTA_VerifyEnd()
       
         if OPTIONS.two_step:
      -    script.WriteRawImage("/boot", "recovery.img")
      +    # Stage 1/3: (b) Write recovery image to /boot.
      +    _WriteRecoveryImageToBoot(script, output_zip)
      +
           script.AppendExtra("""
       set_stage("%(bcb_dev)s", "2/3");
       reboot_now("%(bcb_dev)s", "");
       else
       """ % bcb_dev)
       
      +    # Stage 3/3: Make changes.
      +    script.Comment("Stage 3/3")
      +
         # Verify the existing partitions.
         system_diff.WriteVerifyScript(script, touched_blocks_only=True)
         if vendor_diff:
      @@ -1741,6 +1795,9 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
           script.AppendExtra("""
       if get_stage("%(bcb_dev)s") == "2/3" then
       """ % bcb_dev)
      +
      +    # Stage 2/3: Write recovery image to /recovery (currently running /boot).
      +    script.Comment("Stage 2/3")
           script.AppendExtra("sleep(20);\n")
           script.WriteRawImage("/recovery", "recovery.img")
           script.AppendExtra("""
      @@ -1749,6 +1806,9 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
       else if get_stage("%(bcb_dev)s") != "3/3" then
       """ % bcb_dev)
       
      +    # Stage 1/3: (a) Verify the current system.
      +    script.Comment("Stage 1/3")
      +
         # Dump fingerprints
         script.Print("Source: %s" % source_fp)
         script.Print("Target: %s" % target_fp)
      @@ -1797,13 +1857,18 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
         device_specific.IncrementalOTA_VerifyEnd()
       
         if OPTIONS.two_step:
      -    script.WriteRawImage("/boot", "recovery.img")
      +    # Stage 1/3: (b) Write recovery image to /boot.
      +    _WriteRecoveryImageToBoot(script, output_zip)
      +
           script.AppendExtra("""
       set_stage("%(bcb_dev)s", "2/3");
       reboot_now("%(bcb_dev)s", "");
       else
       """ % bcb_dev)
       
      +    # Stage 3/3: Make changes.
      +    script.Comment("Stage 3/3")
      +
         script.Comment("---- start making changes here ----")
       
         device_specific.IncrementalOTA_InstallBegin()
      diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
      index 945a5afd63b..59d486ba729 100755
      --- a/tools/releasetools/sign_target_files_apks.py
      +++ b/tools/releasetools/sign_target_files_apks.py
      @@ -482,11 +482,11 @@ def ReplaceOtaKeys(input_tf_zip, output_tf_zip, misc_info):
         # recovery uses a version of the key that has been slightly
         # predigested (by DumpPublicKey.java) and put in res/keys.
         # extra_recovery_keys are used only in recovery.
      -
      -  p = common.Run(["java", "-jar",
      -                  os.path.join(OPTIONS.search_path, "framework", "dumpkey.jar")]
      -                 + mapped_keys + extra_recovery_keys,
      -                 stdout=subprocess.PIPE)
      +  cmd = ([OPTIONS.java_path] + OPTIONS.java_args +
      +         ["-jar",
      +          os.path.join(OPTIONS.search_path, "framework", "dumpkey.jar")] +
      +         mapped_keys + extra_recovery_keys)
      +  p = common.Run(cmd, stdout=subprocess.PIPE)
         new_recovery_keys, _ = p.communicate()
         if p.returncode != 0:
           raise common.ExternalError("failed to run dumpkeys")
      @@ -731,7 +731,9 @@ def option_handler(o, a):
         common.ZipClose(input_zip)
         common.ZipClose(output_zip)
       
      -  add_img_to_target_files.AddImagesToTargetFiles(args[1])
      +  # Skip building userdata.img and cache.img when signing the target files.
      +  new_args = ["--is_signing", args[1]]
      +  add_img_to_target_files.main(new_args)
       
         print("done.")
       
      diff --git a/tools/releasetools/test_blockimgdiff.py b/tools/releasetools/test_blockimgdiff.py
      new file mode 100644
      index 00000000000..03e8c8beeab
      --- /dev/null
      +++ b/tools/releasetools/test_blockimgdiff.py
      @@ -0,0 +1,77 @@
      +#
      +# Copyright (C) 2016 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.
      +#
      +
      +from __future__ import print_function
      +
      +import common
      +import unittest
      +
      +from collections import OrderedDict
      +from blockimgdiff import BlockImageDiff, EmptyImage, DataImage, Transfer
      +from rangelib import RangeSet
      +
      +class BlockImageDiffTest(unittest.TestCase):
      +
      +  def test_GenerateDigraphOrder(self):
      +    """Make sure GenerateDigraph preserves the order.
      +
      +    t0: <0-5> => <...>
      +    t1: <0-7> => <...>
      +    t2: <0-4> => <...>
      +    t3: <...> => <0-10>
      +
      +    t0, t1 and t2 must go before t3, i.e. t3.goes_after =
      +    { t0:..., t1:..., t2:... }. But the order of t0-t2 must be preserved.
      +    """
      +
      +    src = EmptyImage()
      +    tgt = EmptyImage()
      +    block_image_diff = BlockImageDiff(tgt, src)
      +
      +    transfers = block_image_diff.transfers
      +    t0 = Transfer(
      +        "t1", "t1", RangeSet("10-15"), RangeSet("0-5"), "move", transfers)
      +    t1 = Transfer(
      +        "t2", "t2", RangeSet("20-25"), RangeSet("0-7"), "move", transfers)
      +    t2 = Transfer(
      +        "t3", "t3", RangeSet("30-35"), RangeSet("0-4"), "move", transfers)
      +    t3 = Transfer(
      +        "t4", "t4", RangeSet("0-10"), RangeSet("40-50"), "move", transfers)
      +
      +    block_image_diff.GenerateDigraph()
      +    t3_goes_after_copy = t3.goes_after.copy()
      +
      +    # Elements in the set must be in the transfer evaluation order.
      +    elements = list(t3_goes_after_copy)
      +    self.assertEqual(t0, elements[0])
      +    self.assertEqual(t1, elements[1])
      +    self.assertEqual(t2, elements[2])
      +
      +    # Now switch the order of t0, t1 and t2.
      +    transfers[0], transfers[1], transfers[2] = (
      +        transfers[2], transfers[0], transfers[1])
      +    t3.goes_after.clear()
      +    t3.goes_before.clear()
      +    block_image_diff.GenerateDigraph()
      +
      +    # The goes_after must be different from last run.
      +    self.assertNotEqual(t3_goes_after_copy, t3.goes_after)
      +
      +    # Assert that each element must agree with the transfer order.
      +    elements = list(t3.goes_after)
      +    self.assertEqual(t2, elements[0])
      +    self.assertEqual(t0, elements[1])
      +    self.assertEqual(t1, elements[2])
      
      From f3d5525001e53a6f2d80a06e176d91dc9767937e Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Sat, 15 Apr 2017 22:10:04 +0200
      Subject: [PATCH 453/502] Fix build the fuck up!
      
      Change-Id: Ib433b258f95b00a423affb7e892d387b7254b371
      ---
       tools/fileslist.py                          |   4 +-
       tools/releasetools/build_image.py           |  73 +++++-----
       tools/releasetools/ota_from_target_files.py | 141 ++++++++++----------
       3 files changed, 104 insertions(+), 114 deletions(-)
      
      diff --git a/tools/fileslist.py b/tools/fileslist.py
      index c257b40770f..b9e73503e20 100755
      --- a/tools/fileslist.py
      +++ b/tools/fileslist.py
      @@ -15,13 +15,11 @@
       # limitations under the License.
       #
       
      -from __future__ import print_function
      -
       import json, hashlib, operator, os, sys
       
       def get_file_size(path):
         st = os.lstat(path)
      -  return st.st_size
      +  return st.st_size;
       
       def get_file_digest(path):
         if os.path.isfile(path) == False:
      diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
      index ed3a7443a3e..d780461eed7 100755
      --- a/tools/releasetools/build_image.py
      +++ b/tools/releasetools/build_image.py
      @@ -20,24 +20,17 @@
       Usage:  build_image input_directory properties_file output_image_file
       
       """
      -
      -from __future__ import print_function
      -
       import os
       import os.path
       import re
       import subprocess
       import sys
      +import commands
       import common
       import shutil
       import sparse_img
       import tempfile
       
      -try:
      -  from commands import getstatusoutput
      -except ImportError:
      -  from subprocess import getstatusoutput
      -
       OPTIONS = common.OPTIONS
       
       FIXED_SALT = "aee087a5be3b982978c923f566a94613496b417f2af592639bc80d141e34dfe7"
      @@ -51,26 +44,26 @@ def RunCommand(cmd):
         Returns:
           A tuple of the output and the exit code.
         """
      -  print("Running: %s" % " ".join(cmd))
      +  print "Running: ", " ".join(cmd)
         p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
         output, _ = p.communicate()
      -  print("%s" % output.rstrip())
      +  print "%s" % (output.rstrip(),)
         return (output, p.returncode)
       
       def GetVerityFECSize(partition_size):
         cmd = "fec -s %d" % partition_size
      -  status, output = getstatusoutput(cmd)
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print(output)
      +    print output
           return False, 0
         return True, int(output)
       
       def GetVerityTreeSize(partition_size):
         cmd = "build_verity_tree -s %d"
         cmd %= partition_size
      -  status, output = getstatusoutput(cmd)
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print(output)
      +    print output
           return False, 0
         return True, int(output)
       
      @@ -78,9 +71,9 @@ def GetVerityMetadataSize(partition_size):
         cmd = "system/extras/verity/build_verity_metadata.py size %d"
         cmd %= partition_size
       
      -  status, output = getstatusoutput(cmd)
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print(output)
      +    print output
           return False, 0
         return True, int(output)
       
      @@ -157,17 +150,17 @@ def BuildVerityFEC(sparse_image_path, verity_path, verity_fec_path,
         print cmd
         status, output = commands.getstatusoutput(cmd)
         if status:
      -    print("Could not build FEC data! Error: %s" % output)
      +    print "Could not build FEC data! Error: %s" % output
           return False
         return True
       
       def BuildVerityTree(sparse_image_path, verity_image_path, prop_dict):
         cmd = "build_verity_tree -A %s %s %s" % (
             FIXED_SALT, sparse_image_path, verity_image_path)
      -  print(cmd)
      -  status, output = getstatusoutput(cmd)
      +  print cmd
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print("Could not build verity tree! Error: %s" % output)
      +    print "Could not build verity tree! Error: %s" % output
           return False
         root, salt = output.split()
         prop_dict["verity_root_hash"] = root
      @@ -218,19 +211,19 @@ def Append2Simg(sparse_image_path, unsparse_image_path, error_message):
         """
         cmd = "append2simg %s %s"
         cmd %= (sparse_image_path, unsparse_image_path)
      -  print(cmd)
      -  status, output = getstatusoutput(cmd)
      +  print cmd
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print("%s: %s" % (error_message, output))
      +    print "%s: %s" % (error_message, output)
           return False
         return True
       
       def Append(target, file_to_append, error_message):
         cmd = 'cat %s >> %s' % (file_to_append, target)
      -  print(cmd)
      -  status, output = getstatusoutput(cmd)
      +  print cmd
      +  status, output = commands.getstatusoutput(cmd)
         if status:
      -    print("%s: %s" % (error_message, output))
      +    print "%s: %s" % (error_message, output)
           return False
         return True
       
      @@ -355,6 +348,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
         Returns:
           True iff the image is built successfully.
         """
      +  print("BuildImage: in_dir = %s, out_file = %s" % (in_dir, out_file))
         # system_root_image=true: build a system.img that combines the contents of
         # /system and the ramdisk, and can be mounted at the root of the file system.
         origin_in = in_dir
      @@ -397,7 +391,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
           (adjusted_size, verity_size) = AdjustPartitionSizeForVerity(partition_size,
                                                                       verity_fec_supported)
           if not adjusted_size:
      -      print("Error: adjusting partition size for verity failed, partition_size = %d" % partition_size)
      +      print "Error: adjusting partition size for verity failed, partition_size = %d" % partition_size
             return False
           prop_dict["partition_size"] = str(adjusted_size)
           prop_dict["original_partition_size"] = str(partition_size)
      @@ -428,7 +422,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
           if "base_fs_file" in prop_dict:
             base_fs_file = ConvertBlockMapToBaseFs(prop_dict["base_fs_file"])
             if base_fs_file is None:
      -        print("Error: no base fs file found")
      +        print "Error: no base fs file found"
               return False
             build_command.extend(["-d", base_fs_file])
           build_command.extend(["-L", prop_dict["mount_point"]])
      @@ -486,11 +480,12 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
       
         try:
           if reserved_blocks and fs_type.startswith("ext4"):
      -      print("fs type is ext4")
      +      print "fs type is ext4"
             (ext4fs_output, exit_code) = RunCommand(build_command)
           else:
      -      print("fs type is not ext4")
      +      print "fs type is not ext4"
             (_, exit_code) = RunCommand(build_command)
      +    print("Running %s command, exit code = %d" % (build_command, exit_code))
         finally:
           if in_dir != origin_in:
             # Clean up temporary directories and files.
      @@ -500,7 +495,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
           if base_fs_file is not None:
             os.remove(base_fs_file)
         if exit_code != 0:
      -    print("Error: %s command unsuccessful" % build_command)
      +    print "Error: %s command unsuccessful" % build_command
           return False
       
         # Bug: 21522719, 22023465
      @@ -514,7 +509,7 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
           ext4fs_stats = re.compile(
               r'Created filesystem with .* (?P<used_blocks>[0-9]+)/'
               r'(?P<total_blocks>[0-9]+) blocks')
      -    m = ext4fs_stats.match(ext4fs_output.strip().split(b'\n')[-1])
      +    m = ext4fs_stats.match(ext4fs_output.strip().split('\n')[-1])
           used_blocks = int(m.groupdict().get('used_blocks'))
           total_blocks = int(m.groupdict().get('total_blocks'))
           reserved_blocks = min(4096, int(total_blocks * 0.02))
      @@ -541,19 +536,19 @@ def BuildImage(in_dir, prop_dict, out_file, target_out=None):
         # create the verified image if this is to be verified
         if verity_supported and is_verity_partition:
           if not MakeVerityEnabledImage(out_file, verity_fec_supported, prop_dict):
      -      print("Error: making verity enabled image failed")
      +      print "Error: making verity enabled image failed"
             return False
       
         if run_fsck and prop_dict.get("skip_fsck") != "true":
           success, unsparse_image = UnsparseImage(out_file, replace=False)
           if not success:
      -      print("Error: unparsing of image failed")
      +      print "Error: unparsing of image failed"
             return False
       
           # Run e2fsck on the inflated image file
           e2fsck_command = ["e2fsck", "-f", "-n", unsparse_image]
           (_, exit_code) = RunCommand(e2fsck_command)
      -
      +    print("Running %s command, exit code = %d" % (e2fsck_command, exit_code))
           os.remove(unsparse_image)
       
         return exit_code == 0
      @@ -675,7 +670,7 @@ def LoadGlobalDict(filename):
       
       def main(argv):
         if len(argv) != 4:
      -    print(__doc__)
      +    print __doc__
           sys.exit(1)
       
         in_dir = argv[0]
      @@ -704,14 +699,14 @@ def main(argv):
           elif image_filename == "oem.img":
             mount_point = "oem"
           else:
      -      print("error: unknown image file name ", image_filename, file=sys.stderr)
      +      print >> sys.stderr, "error: unknown image file name ", image_filename
             exit(1)
       
           image_properties = ImagePropFromGlobalDict(glob_dict, mount_point)
       
         if not BuildImage(in_dir, image_properties, out_file, target_out):
      -    print("error: failed to build %s from %s" % (out_file, in_dir),
      -          file=sys.stderr)
      +    print >> sys.stderr, "error: failed to build %s from %s" % (out_file,
      +                                                                in_dir)
           exit(1)
       
       
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index bdda1fb0fb8..15e99c44c34 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -114,10 +114,6 @@
             builds for an incremental package. This option is only meaningful when
             -i is specified.
       
      -  --backup <boolean>
      -      Enable or disable the execution of backuptool.sh.
      -      Disabled by default.
      -
         --payload_signer <signer>
             Specify the signer when signing the payload and metadata for A/B OTAs.
             By default (i.e. without this flag), it calls 'openssl pkeyutl' to sign
      @@ -128,14 +124,16 @@
       
         --payload_signer_args <args>
             Specify the arguments needed for payload signer.
      -"""
       
      -from __future__ import print_function
      +  --backup <boolean>
      +      Enable or disable the execution of backuptool.sh.
      +      Disabled by default.
      +"""
       
       import sys
       
       if sys.hexversion < 0x02070000:
      -  print("Python 2.7 or newer is required.", file=sys.stderr)
      +  print >> sys.stderr, "Python 2.7 or newer is required."
         sys.exit(1)
       
       import multiprocessing
      @@ -178,16 +176,16 @@
       OPTIONS.stash_threshold = 0.8
       OPTIONS.gen_verify = False
       OPTIONS.log_diff = None
      +OPTIONS.payload_signer = None
      +OPTIONS.payload_signer_args = []
       OPTIONS.backuptool = False
       OPTIONS.override_device = 'auto'
       OPTIONS.override_prop = False
      -OPTIONS.payload_signer = None
      -OPTIONS.payload_signer_args = []
       
       def MostPopularKey(d, default):
         """Given a dict, return the key corresponding to the largest
         value.  Returns 'default' if the dict is empty."""
      -  x = [(v, k) for (k, v) in d.items()]
      +  x = [(v, k) for (k, v) in d.iteritems()]
         if not x:
           return default
         x.sort()
      @@ -307,14 +305,14 @@ def __init__(self, itemset, name, is_dir=False):
       
         def Dump(self, indent=0):
           if self.uid is not None:
      -      print("%s%s %d %d %o" % (
      -          "  " * indent, self.name, self.uid, self.gid, self.mode))
      +      print "%s%s %d %d %o" % (
      +          "  " * indent, self.name, self.uid, self.gid, self.mode)
           else:
      -      print("%s%s %s %s %s" % (
      -          "  " * indent, self.name, self.uid, self.gid, self.mode))
      +      print "%s%s %s %s %s" % (
      +          "  " * indent, self.name, self.uid, self.gid, self.mode)
           if self.is_dir:
      -      print("%s%s" % ("  "*indent, self.descendants))
      -      print("%s%s" % ("  "*indent, self.best_subtree))
      +      print "%s%s" % ("  "*indent, self.descendants)
      +      print "%s%s" % ("  "*indent, self.best_subtree)
             for i in self.children:
               i.Dump(indent=indent+1)
       
      @@ -338,7 +336,7 @@ def CountChildMetadata(self):
           d = self.descendants
           for i in self.children:
             if i.is_dir:
      -        for k, v in i.CountChildMetadata().items():
      +        for k, v in i.CountChildMetadata().iteritems():
                 d[k] = d.get(k, 0) + v
             else:
               k = (i.uid, i.gid, None, i.mode, i.selabel, i.capabilities)
      @@ -350,7 +348,7 @@ def CountChildMetadata(self):
           # First, find the (uid, gid) pair that matches the most
           # descendants.
           ug = {}
      -    for (uid, gid, _, _, _, _), count in d.items():
      +    for (uid, gid, _, _, _, _), count in d.iteritems():
             ug[(uid, gid)] = ug.get((uid, gid), 0) + count
           ug = MostPopularKey(ug, (0, 0))
       
      @@ -360,7 +358,7 @@ def CountChildMetadata(self):
           best_fmode = (0, 0o644)
           best_selabel = (0, None)
           best_capabilities = (0, None)
      -    for k, count in d.items():
      +    for k, count in d.iteritems():
             if k[:2] != ug:
               continue
             if k[2] is not None and count >= best_dmode[0]:
      @@ -553,11 +551,11 @@ def GetImage(which, tmpdir, info_dict):
         path = os.path.join(tmpdir, "IMAGES", which + ".img")
         mappath = os.path.join(tmpdir, "IMAGES", which + ".map")
         if os.path.exists(path) and os.path.exists(mappath):
      -    print("using %s.img from target-files" % which)
      +    print "using %s.img from target-files" % (which,)
           # This is a 'new' target-files, which already has the image in it.
       
         else:
      -    print("building %s.img from target-files" % which)
      +    print "building %s.img from target-files" % (which,)
       
           # This is an 'old' target-files, which does not contain images
           # already built.  Build them.
      @@ -590,6 +588,7 @@ def CopyInstallTools(output_zip):
             install_target = os.path.join("install", os.path.relpath(root, install_path), f)
             output_zip.write(install_source, install_target)
       
      +
       def WriteFullOTAPackage(input_zip, output_zip):
         # TODO: how to determine this?  We don't know what version it will
         # be installed on top of. For now, we expect the API just won't
      @@ -698,8 +697,8 @@ def WriteFullOTAPackage(input_zip, output_zip):
       
         CopyInstallTools(output_zip)
         script.UnpackPackageDir("install", "/tmp/install")
      -  script.SetPermissionsRecursive("/tmp/install", 0, 0, 0o755, 0o644, None, None)
      -  script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0o755, 0o755, None, None)
      +  script.SetPermissionsRecursive("/tmp/install", 0, 0, 0755, 0644, None, None)
      +  script.SetPermissionsRecursive("/tmp/install/bin", 0, 0, 0755, 0755, None, None)
       
         if OPTIONS.backuptool:
           script.Mount("/system")
      @@ -760,8 +759,6 @@ def WriteFullOTAPackage(input_zip, output_zip):
           script.Unmount("/data")
           script.AppendExtra("endif;")
       
      -  # Place a copy of file_contexts.bin into the OTA package which will be used
      -  # by the recovery program.
         if "selinux_fc" in OPTIONS.info_dict:
           WritePolicyConfig(OPTIONS.info_dict["selinux_fc"], output_zip)
       
      @@ -833,7 +830,6 @@ def output_sink(fn, data):
           if block_based:
             script.Mount("/system")
           script.RunBackup("restore")
      -    script.RunPersist("restore")
           if block_based:
             script.Unmount("/system")
       
      @@ -885,7 +881,7 @@ def output_sink(fn, data):
         common.ZipWriteStr(output_zip, "system/build.prop",
                            ""+input_zip.read("SYSTEM/build.prop"))
       
      -  common.ZipWriteStr(output_zip, "META-INF/org/aicp/releasekey",
      +  common.ZipWriteStr(output_zip, "META-INF/org/lineageos/releasekey",
                            ""+input_zip.read("META/releasekey.txt"))
       
       def WritePolicyConfig(file_name, output_zip):
      @@ -895,7 +891,7 @@ def WritePolicyConfig(file_name, output_zip):
       def WriteMetadata(metadata, output_zip):
         common.ZipWriteStr(output_zip, "META-INF/com/android/metadata",
                            "".join(["%s=%s\n" % kv
      -                              for kv in sorted(metadata.items())]))
      +                              for kv in sorted(metadata.iteritems())]))
       
       
       def LoadPartitionFiles(z, partition):
      @@ -917,8 +913,7 @@ def GetBuildProp(prop, info_dict):
         try:
           return info_dict.get("build.prop", {})[prop]
         except KeyError:
      -    print ("WARNING: could not find %s in build.prop" % (prop,))
      -    return None
      +    raise common.ExternalError("couldn't find %s in build.prop" % (prop,))
       
       
       def AddToKnownPaths(filename, known_paths):
      @@ -1165,8 +1160,8 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
           else:
             include_full_boot = False
       
      -      print("boot      target: %d  source: %d  diff: %d" % (
      -          target_boot.size, source_boot.size, len(d)))
      +      print "boot      target: %d  source: %d  diff: %d" % (
      +          target_boot.size, source_boot.size, len(d))
       
             common.ZipWriteStr(output_zip, "patch/boot.img.p", d)
       
      @@ -1212,19 +1207,19 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
         if OPTIONS.two_step:
           common.ZipWriteStr(output_zip, "boot.img", target_boot.data)
           script.WriteRawImage("/boot", "boot.img")
      -    print("writing full boot image (forced by two-step mode)")
      +    print "writing full boot image (forced by two-step mode)"
       
         if not OPTIONS.two_step:
           if updating_boot:
             if include_full_boot:
      -        print("boot image changed; including full.")
      +        print "boot image changed; including full."
               script.Print("Installing boot image...")
               script.WriteRawImage("/boot", "boot.img")
             else:
               # Produce the boot image by applying a patch to the current
               # contents of the boot partition, and write it back to the
               # partition.
      -        print("boot image changed; including patch.")
      +        print "boot image changed; including patch."
               script.Print("Patching boot image...")
               script.ShowProgress(0.1, 10)
               script.ApplyPatch("%s:%s:%d:%s:%d:%s"
      @@ -1235,7 +1230,7 @@ def WriteBlockIncrementalOTAPackage(target_zip, source_zip, output_zip):
                                 target_boot.size, target_boot.sha1,
                                 source_boot.sha1, "patch/boot.img.p")
           else:
      -      print("boot image unchanged; skipping.")
      +      print "boot image unchanged; skipping."
       
         # Do device-specific installation (eg, write radio image).
         device_specific.IncrementalOTA_InstallEnd()
      @@ -1495,7 +1490,7 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
             care_map_data = target_zip.read(care_map_path)
             common.ZipWriteStr(output_zip, "care_map.txt", care_map_data)
           else:
      -      print("Warning: cannot find care map file in target_file package")
      +      print "Warning: cannot find care map file in target_file package"
           common.ZipClose(target_zip)
       
         # Sign the whole package to comply with the Android OTA package format.
      @@ -1507,9 +1502,9 @@ def WriteABOTAPackageWithBrilloScript(target_file, output_file,
       class FileDifference(object):
         def __init__(self, partition, source_zip, target_zip, output_zip):
           self.deferred_patch_list = None
      -    print("Loading target...")
      +    print "Loading target..."
           self.target_data = target_data = LoadPartitionFiles(target_zip, partition)
      -    print("Loading source...")
      +    print "Loading source..."
           self.source_data = source_data = LoadPartitionFiles(source_zip, partition)
       
           self.verbatim_targets = verbatim_targets = []
      @@ -1536,14 +1531,14 @@ def __init__(self, partition, source_zip, target_zip, output_zip):
             assert fn == tf.name
             sf = ClosestFileMatch(tf, matching_file_cache, renames)
             if sf is not None and sf.name != tf.name:
      -        print("File has moved from " + sf.name + " to " + tf.name)
      +        print "File has moved from " + sf.name + " to " + tf.name
               renames[sf.name] = tf
       
             if sf is None or fn in OPTIONS.require_verbatim:
               # This file should be included verbatim
               if fn in OPTIONS.prohibit_verbatim:
                 raise common.ExternalError("\"%s\" must be sent verbatim" % (fn,))
      -        print("send", fn, "verbatim")
      +        print "send", fn, "verbatim"
               tf.AddToZip(output_zip)
               verbatim_targets.append((fn, tf.size, tf.sha1))
               if fn in target_data.keys():
      @@ -1630,8 +1625,8 @@ def EmitDeferredPatches(self, script):
         def EmitRenames(self, script):
           if len(self.renames) > 0:
             script.Print("Renaming files...")
      -      for src, tgt in self.renames.items():
      -        print("Renaming " + src + " to " + tgt.name)
      +      for src, tgt in self.renames.iteritems():
      +        print "Renaming " + src + " to " + tgt.name
               script.RenameFile(src, tgt.name)
       
       
      @@ -1810,8 +1805,10 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
           script.Comment("Stage 1/3")
       
         # Dump fingerprints
      -  script.Print("Source: %s" % source_fp)
      -  script.Print("Target: %s" % target_fp)
      +  script.Print("Source: %s" % CalculateFingerprint(
      +      oem_props, oem_dict, OPTIONS.source_info_dict))
      +  script.Print("Target: %s" % CalculateFingerprint(
      +      oem_props, oem_dict, OPTIONS.target_info_dict))
       
         script.Print("Verifying current system...")
       
      @@ -1839,7 +1836,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
           else:
             include_full_boot = False
       
      -      print( "boot      target: %d  source: %d  diff: %d" %
      +      print "boot      target: %d  source: %d  diff: %d" % (
               target_boot.size, source_boot.size, len(d))
       
             common.ZipWriteStr(output_zip, "patch/boot.img.p", d)
      @@ -1876,7 +1873,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
         if OPTIONS.two_step:
           common.ZipWriteStr(output_zip, "boot.img", target_boot.data)
           script.WriteRawImage("/boot", "boot.img")
      -    print("writing full boot image (forced by two-step mode)")
      +    print "writing full boot image (forced by two-step mode)"
       
         script.Print("Removing unneeded files...")
         system_diff.RemoveUnneededFiles(script, ("/system/recovery.img",))
      @@ -1899,14 +1896,14 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
         if not OPTIONS.two_step:
           if updating_boot:
             if include_full_boot:
      -        print("boot image changed; including full.")
      +        print "boot image changed; including full."
               script.Print("Installing boot image...")
               script.WriteRawImage("/boot", "boot.img")
             else:
               # Produce the boot image by applying a patch to the current
               # contents of the boot partition, and write it back to the
               # partition.
      -        print("boot image changed; including patch.")
      +        print "boot image changed; including patch."
               script.Print("Patching boot image...")
               script.ApplyPatch("%s:%s:%d:%s:%d:%s"
                                 % (boot_type, boot_device,
      @@ -1916,7 +1913,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
                                 target_boot.size, target_boot.sha1,
                                 source_boot.sha1, "patch/boot.img.p")
           else:
      -      print("boot image unchanged; skipping.")
      +      print "boot image unchanged; skipping."
       
         system_items = ItemSet("system", "META/filesystem_config.txt")
         if vendor_diff:
      @@ -1942,9 +1939,9 @@ def output_sink(fn, data):
             script.DeleteFiles(["/system/recovery-from-boot.p",
                                 "/system/etc/recovery.img",
                                 "/system/etc/install-recovery.sh"])
      -    print("recovery image changed; including as patch from boot.")
      +    print "recovery image changed; including as patch from boot."
         else:
      -    print("recovery image unchanged; skipping.")
      +    print "recovery image unchanged; skipping."
       
         script.ShowProgress(0.1, 10)
       
      @@ -2128,7 +2125,7 @@ def option_handler(o, a):
             OPTIONS.verify = True
           elif o == "--block":
             OPTIONS.block_based = True
      -    elif o in ("-b", "--binary",):
      +    elif o in ("-b", "--binary"):
             OPTIONS.updater_binary = a
           elif o in ("--no_fallback_to_full",):
             OPTIONS.fallback_to_full = False
      @@ -2138,16 +2135,16 @@ def option_handler(o, a):
             except ValueError:
               raise ValueError("Cannot parse value %r for option %r - expecting "
                                "a float" % (a, o))
      -    elif o == ("--gen_verify",):
      +    elif o == "--gen_verify":
             OPTIONS.gen_verify = True
      -    elif o == ("--log_diff",):
      +    elif o == "--log_diff":
             OPTIONS.log_diff = a
      -    elif o in ("--backup",):
      -      OPTIONS.backuptool = bool(a.lower() == 'true')
           elif o == "--payload_signer":
             OPTIONS.payload_signer = a
           elif o == "--payload_signer_args":
             OPTIONS.payload_signer_args = shlex.split(a)
      +    elif o in ("--backup"):
      +      OPTIONS.backuptool = bool(a.lower() == 'true')
           else:
             return False
           return True
      @@ -2177,9 +2174,9 @@ def option_handler(o, a):
                                        "stash_threshold=",
                                        "gen_verify",
                                        "log_diff=",
      -                                 "backup=",
                                        "payload_signer=",
                                        "payload_signer_args=",
      +                                 "backup="
                                    ], extra_option_handler=option_handler)
       
         if len(args) != 2:
      @@ -2219,11 +2216,11 @@ def option_handler(o, a):
             common.ZipClose(source_zip)
       
           if OPTIONS.verbose:
      -      print("--- target info ---")
      +      print "--- target info ---"
             common.DumpInfoDict(OPTIONS.info_dict)
       
             if OPTIONS.incremental_source is not None:
      -        print("--- source info ---")
      +        print "--- source info ---"
               common.DumpInfoDict(OPTIONS.source_info_dict)
       
           WriteABOTAPackageWithBrilloScript(
      @@ -2231,20 +2228,20 @@ def option_handler(o, a):
               output_file=args[1],
               source_file=OPTIONS.incremental_source)
       
      -    print("done.")
      +    print "done."
           return
       
         if OPTIONS.extra_script is not None:
           OPTIONS.extra_script = open(OPTIONS.extra_script).read()
       
      -  print("unzipping target target-files...")
      +  print "unzipping target target-files..."
         OPTIONS.input_tmp, input_zip = common.UnzipTemp(args[0])
       
         OPTIONS.target_tmp = OPTIONS.input_tmp
         OPTIONS.info_dict = common.LoadInfoDict(input_zip, OPTIONS.target_tmp)
       
         if OPTIONS.verbose:
      -    print("--- target info ---")
      +    print "--- target info ---"
           common.DumpInfoDict(OPTIONS.info_dict)
       
         # If the caller explicitly specified the device-specific extensions
      @@ -2257,7 +2254,7 @@ def option_handler(o, a):
         if OPTIONS.device_specific is None:
           from_input = os.path.join(OPTIONS.input_tmp, "META", "releasetools.py")
           if os.path.exists(from_input):
      -      print("(using device-specific extensions from target_files)")
      +      print "(using device-specific extensions from target_files)"
             OPTIONS.device_specific = from_input
           else:
             OPTIONS.device_specific = OPTIONS.info_dict.get("tool_extensions", None)
      @@ -2290,7 +2287,7 @@ def option_handler(o, a):
         # Non A/B OTAs rely on /cache partition to store temporary files.
         cache_size = OPTIONS.info_dict.get("cache_size", None)
         if cache_size is None:
      -    print("--- can't determine the cache partition size ---")
      +    print "--- can't determine the cache partition size ---"
         OPTIONS.cache_size = cache_size
       
         # Generate a verify package.
      @@ -2304,14 +2301,14 @@ def option_handler(o, a):
         # Generate an incremental OTA. It will fall back to generate a full OTA on
         # failure unless no_fallback_to_full is specified.
         else:
      -    print("unzipping source target-files...")
      +    print "unzipping source target-files..."
           OPTIONS.source_tmp, source_zip = common.UnzipTemp(
               OPTIONS.incremental_source)
           OPTIONS.target_info_dict = OPTIONS.info_dict
           OPTIONS.source_info_dict = common.LoadInfoDict(source_zip,
                                                          OPTIONS.source_tmp)
           if OPTIONS.verbose:
      -      print("--- source info ---")
      +      print "--- source info ---"
             common.DumpInfoDict(OPTIONS.source_info_dict)
           try:
             WriteIncrementalOTAPackage(input_zip, source_zip, output_zip)
      @@ -2326,7 +2323,7 @@ def option_handler(o, a):
           except ValueError:
             if not OPTIONS.fallback_to_full:
               raise
      -      print("--- failed to build incremental; falling back to full ---")
      +      print "--- failed to build incremental; falling back to full ---"
             OPTIONS.incremental_source = None
             WriteFullOTAPackage(input_zip, output_zip)
       
      @@ -2337,7 +2334,7 @@ def option_handler(o, a):
           SignOutput(temp_zip_file.name, args[1])
           temp_zip_file.close()
       
      -  print("done.")
      +  print "done."
       
       
       if __name__ == '__main__':
      @@ -2345,9 +2342,9 @@ def option_handler(o, a):
           common.CloseInheritedPipes()
           main(sys.argv[1:])
         except common.ExternalError as e:
      -    print()
      -    print("   ERROR: %s" % e)
      -    print()
      +    print
      +    print "   ERROR: %s" % (e,)
      +    print
           sys.exit(1)
         finally:
           common.Cleanup()
      
      From f29352b05bc63256fe1030607f54c7b5f2b0a70e Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Sun, 16 Apr 2017 11:42:51 -0400
      Subject: [PATCH 454/502] fix "ERROR: couldn't find ro.product.model in
       build.prop"
      
      Change-Id: Id8a7d5cb62fc8e8b17e63f219138771ed634b741
      ---
       tools/releasetools/ota_from_target_files.py | 10 +++++-----
       1 file changed, 5 insertions(+), 5 deletions(-)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 15e99c44c34..b9b9db54773 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -738,11 +738,11 @@ def WriteFullOTAPackage(input_zip, output_zip):
           script.Print("*   Compiled: %s"%(build));
       
         device = GetBuildProp("ro.product.device", OPTIONS.info_dict)
      -  if GetBuildProp("ro.product.model", OPTIONS.info_dict) is not None:
      -    model = GetBuildProp("ro.product.model", OPTIONS.info_dict)
      -    script.Print("*   Device: %s (%s)"%(model, device));
      -  else:
      -    script.Print("*   Device: %s"%(device));
      +#  if GetBuildProp("ro.product.model", OPTIONS.info_dict) is not None:
      +#    model = GetBuildProp("ro.product.model", OPTIONS.info_dict)
      +#    script.Print("*   Device: %s (%s)"%(model, device));
      +#  else:
      +#    script.Print("*   Device: %s"%(device));
         script.Print("*********************************************");
       
         if OPTIONS.wipe_user_data:
      
      From 287a48c6582bda7c39d4e4848543bc2ce2e55aca Mon Sep 17 00:00:00 2001
      From: Kousuke Nagatsuka <koron393@gmail.com>
      Date: Wed, 19 Apr 2017 00:10:18 +0900
      Subject: [PATCH 455/502] core: use 0 compression target_files package only if
       block based ota
      
      If old deprecated file based ota system,
      the zip file is too large because of 0 compression.
      
      Change-Id: Ia30aa921166ba1d6178108512aac356a37dc4ffe
      ---
       core/Makefile | 6 ++++++
       1 file changed, 6 insertions(+)
      
      diff --git a/core/Makefile b/core/Makefile
      index 4cdd571a2a4..e0498e454bd 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2268,9 +2268,15 @@ ifdef BOARD_PREBUILT_VENDORIMAGE
       endif
       	@# Zip everything up, preserving symlinks and placing META/ files first to
       	@# help early validation of the .zip file while uploading it.
      +ifneq ($(BLOCK_BASED_OTA),false)
       	$(hide) (cd $(zip_root) && \
       	        zip -0qryX ../$(notdir $@) ./META && \
       	        zip -0qryXu ../$(notdir $@) .)
      +else
      +	$(hide) (cd $(zip_root) && \
      +	        zip -qryX ../$(notdir $@) ./META && \
      +	        zip -qryXu ../$(notdir $@) .)
      +endif
       	@# Run fs_config on all the system, vendor, boot ramdisk,
       	@# and recovery ramdisk files in the zip, and save the output
       	$(hide) zipinfo -1 $@ | awk 'BEGIN { FS="SYSTEM/" } /^SYSTEM\// {print "system/" $$2}' | $(HOST_OUT_EXECUTABLES)/fs_config -C -D $(TARGET_OUT) -S $(SELINUX_FC) > $(zip_root)/META/filesystem_config.txt
      
      From 21c566876329bf0c782cfa3f1a4810cdd0456ac8 Mon Sep 17 00:00:00 2001
      From: doc HD <doc.divxm@gmail.com>
      Date: Wed, 19 Apr 2017 13:06:48 +0300
      Subject: [PATCH 456/502] Revert "fix "ERROR: couldn't find ro.product.model in
       build.prop""
      
      This reverts commit f29352b05bc63256fe1030607f54c7b5f2b0a70e.
      
      Change-Id: I7f2853e02b3408204a23b202444e5398e44cfabe
      ---
       tools/releasetools/ota_from_target_files.py | 10 +++++-----
       1 file changed, 5 insertions(+), 5 deletions(-)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index b9b9db54773..15e99c44c34 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -738,11 +738,11 @@ def WriteFullOTAPackage(input_zip, output_zip):
           script.Print("*   Compiled: %s"%(build));
       
         device = GetBuildProp("ro.product.device", OPTIONS.info_dict)
      -#  if GetBuildProp("ro.product.model", OPTIONS.info_dict) is not None:
      -#    model = GetBuildProp("ro.product.model", OPTIONS.info_dict)
      -#    script.Print("*   Device: %s (%s)"%(model, device));
      -#  else:
      -#    script.Print("*   Device: %s"%(device));
      +  if GetBuildProp("ro.product.model", OPTIONS.info_dict) is not None:
      +    model = GetBuildProp("ro.product.model", OPTIONS.info_dict)
      +    script.Print("*   Device: %s (%s)"%(model, device));
      +  else:
      +    script.Print("*   Device: %s"%(device));
         script.Print("*********************************************");
       
         if OPTIONS.wipe_user_data:
      
      From 486e6cfadff966f45e2c4cab53466cf32fe6b2fb Mon Sep 17 00:00:00 2001
      From: Hashbang173 <hashbang173@gmail.com>
      Date: Wed, 19 Apr 2017 13:29:34 +0300
      Subject: [PATCH 457/502] build: Add back missing part from fix for unified
       devices
      
      original commit: https://github.com/AICP/build/commit/df574f3e6ae115425b2c25e5b5e6772503ca0f65
      
      This part was missed during AICPfication of build repo...
      
      Change-Id: I38423e7094eb52949b9eadeea8ba388e6715713a
      ---
       tools/releasetools/ota_from_target_files.py | 3 ++-
       1 file changed, 2 insertions(+), 1 deletion(-)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 15e99c44c34..6e5e0187953 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -913,7 +913,8 @@ def GetBuildProp(prop, info_dict):
         try:
           return info_dict.get("build.prop", {})[prop]
         except KeyError:
      -    raise common.ExternalError("couldn't find %s in build.prop" % (prop,))
      +    print ("WARNING: could not find %s in build.prop" % (prop,))
      +    return None
       
       
       def AddToKnownPaths(filename, known_paths):
      
      From 64d9668ade4c8faf8397b67db34ffbbb4e45e59a Mon Sep 17 00:00:00 2001
      From: Nathan Chancellor <natechancellor@gmail.com>
      Date: Wed, 19 Apr 2017 11:03:52 +0000
      Subject: [PATCH 458/502] envsetup: Add an option to hide including messages
      
      export ENVSETUP_DEBUG=false to hide them
      
      Change-Id: I57ed1c89c6bb669597b8943aa4b290e9925b3398
      Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
      ---
       envsetup.sh | 13 ++++++++++---
       1 file changed, 10 insertions(+), 3 deletions(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index dbd2ab8d9d8..0bb2a293a1f 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -616,7 +616,9 @@ function breakfast()
           add_lunch_combo full-eng
           for f in `/bin/ls vendor/aicp/vendorsetup.sh 2> /dev/null`
               do
      -            echo "including $f"
      +            if [[ ${ENVSETUP_DEBUG} != false ]]; then
      +                echo "including $f"
      +            fi
                   . $f
               done
           unset f
      @@ -2660,7 +2662,9 @@ for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2>
                `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
                `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
       do
      -    echo "including $f"
      +    if [[ ${ENVSETUP_DEBUG} != false ]]; then
      +        echo "including $f"
      +    fi
           . $f
       done
       unset f
      @@ -2671,7 +2675,10 @@ check_bash_version && {
           for dir in $dirs; do
           if [ -d ${dir} ]; then
               for f in `/bin/ls ${dir}/[a-z]*.bash 2> /dev/null`; do
      -            echo "including $f"
      +            if [[ ${ENVSETUP_DEBUG} != false ]]; then
      +                echo "including $f"
      +            fi
      +
                   . $f
               done
           fi
      
      From ddf5a7efb5a53107fdb9dcc1e4fc55ca46627b8b Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Fri, 14 Apr 2017 12:31:07 -0500
      Subject: [PATCH 459/502] build: fix verity generation
      
      * Now build_verity_metadata.py takes an arg telling it what to do,
        in this case "build" is our intention, so update our custom runcmd
        array.
      
      * Ensure we cast all args to Popen as strings or picky python gets
        angry that we pass an int (image_size) to Popen
      
      Change-Id: I71c5e45e3155f470259f91f6f1a880e780aef369
      ---
       tools/releasetools/build_image.py | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
      index d780461eed7..6c1fab89a5b 100755
      --- a/tools/releasetools/build_image.py
      +++ b/tools/releasetools/build_image.py
      @@ -185,7 +185,7 @@ def BuildVerityMetadata(image_size, verity_metadata_path, root_hash, salt,
         if signer_args:
           cmd += " --signer_args=\"%s\"" % (' '.join(signer_args),)
         print cmd
      -  runcmd = ["system/extras/verity/build_verity_metadata.py", image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key];
      +  runcmd = [str(a) for a in ["system/extras/verity/build_verity_metadata.py", "build", image_size, verity_metadata_path, root_hash, salt, block_device, signer_path, key]];
         if verity_key_password is not None:
           sp = subprocess.Popen(runcmd, stdin=subprocess.PIPE)
           sp.communicate(verity_key_password)
      
      From 68b5d4fe3ef500fb2fed99c6e2d5a3cb2a989871 Mon Sep 17 00:00:00 2001
      From: LorDClockaN <lordclockan@gmail.com>
      Date: Tue, 25 Apr 2017 17:58:33 +0200
      Subject: [PATCH 460/502] brunchopen: fix deprecated message
      
      use gio open
      
      Change-Id: If2fb9124ae81ca4da340c932ef5867d5022934a2
      ---
       envsetup.sh | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index 0bb2a293a1f..b65157fc03d 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -599,7 +599,7 @@ function brunchopen()
       {
           breakfast $*
           if [ $? -eq 0 ]; then
      -        mka bacon && xdg-open $ANDROID_PRODUCT_OUT
      +        mka bacon && gio open $ANDROID_PRODUCT_OUT
           else
               echo "No such item in brunch menu. Try 'breakfast'"
               return 1
      
      From 904ddc2199a3cab82828f04d2e5b502b03e95c91 Mon Sep 17 00:00:00 2001
      From: Davor Bertovic <davor@losinj.com>
      Date: Fri, 28 Apr 2017 12:39:01 +0000
      Subject: [PATCH 461/502] Revert "brunchopen: fix deprecated message"
      
      This reverts commit 68b5d4fe3ef500fb2fed99c6e2d5a3cb2a989871.
      
      Change-Id: I29e57c1f9cc7f316fe8a53f759083860db6d297f
      ---
       envsetup.sh | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/envsetup.sh b/envsetup.sh
      index b65157fc03d..0bb2a293a1f 100644
      --- a/envsetup.sh
      +++ b/envsetup.sh
      @@ -599,7 +599,7 @@ function brunchopen()
       {
           breakfast $*
           if [ $? -eq 0 ]; then
      -        mka bacon && gio open $ANDROID_PRODUCT_OUT
      +        mka bacon && xdg-open $ANDROID_PRODUCT_OUT
           else
               echo "No such item in brunch menu. Try 'breakfast'"
               return 1
      
      From db47240874e849ec03de4c4d811f73f2313a1011 Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mikeioannina@gmail.com>
      Date: Fri, 28 Apr 2017 19:27:49 +0300
      Subject: [PATCH 462/502] Revert "build: releasetools: ota: Add support for
       32-64 bit upgrades"
      
      * This was only required for tomato kitkat 32bit to lollipop 64bit
        migration. This is no longer a supported upgrade case, so revert
        it to be inline with AOSP.
      * Users coming from stock should flash an updated 64bit recovery first
      
      This reverts commit b89510679f72a80e973c9809d3328067eb582885.
      
      Change-Id: Iccf37e5292c2068e9a1f8aeb370719cd9ced8c44
      ---
       core/Makefile | 7 ++-----
       1 file changed, 2 insertions(+), 5 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index e0498e454bd..96908a02e29 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -1961,11 +1961,8 @@ built_ota_tools :=
       
       # We can't build static executables when SANITIZE_TARGET=address
       ifeq ($(strip $(SANITIZE_TARGET)),)
      -ifeq ($(TARGET_ARCH),arm64)
      -	built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater,,,32)/updater
      -else
      -	built_ota_tools += $(call intermediates-dir-for,EXECUTABLES,updater)/updater
      -endif
      +built_ota_tools += \
      +    $(call intermediates-dir-for,EXECUTABLES,updater,,,$(TARGET_PREFER_32_BIT))/updater
       endif
       
       $(BUILT_TARGET_FILES_PACKAGE): PRIVATE_OTA_TOOLS := $(built_ota_tools)
      
      From bb17ac1a4d5194429fe18aa5a8c22f872849bfe0 Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mikeioannina@gmail.com>
      Date: Fri, 28 Apr 2017 20:21:33 +0300
      Subject: [PATCH 463/502] Revert "We want Browser"
      
      * Aosp browser is really old and insecure, we are replacing it with Jelly
      * Jelly is a simple webview-based browser, so it relies on installed webview,
        which makes it secure as long as webview is updated
      * Gello is still alive, it overrides Jelly instead of Browser target
      
      This reverts commit cf571f4fedb354dd5e2a774117dd710689c97de6.
      
      Change-Id: Ie5649cc213b3a5409d137d07bd6d1bfcdc789798
      ---
       target/product/core.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/target/product/core.mk b/target/product/core.mk
      index db65defbe7c..d4adb8927d3 100644
      --- a/target/product/core.mk
      +++ b/target/product/core.mk
      @@ -24,7 +24,7 @@ PRODUCT_PACKAGES += \
           BasicDreams \
           BlockedNumberProvider \
           BookmarkProvider \
      -    Browser \
      +    Browser2 \
           Calendar \
           CalendarProvider \
           CaptivePortalLogin \
      
      From a9b9140d4730a09c39773a252a16d8e2f947ad7d Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Mon, 1 May 2017 18:24:41 -0500
      Subject: [PATCH 464/502] Merge tag 'android-7.1.2_r8' into n7.1
      
      Android 7.1.2 release 8
      
      Change-Id: Ied14553ee912d78e48ef7d427a307d4cea947703
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 05381ec1849..3fc513ce14b 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=N2G47E
      +export BUILD_ID=N2G47O
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 83ac4700269..a93dc3123c5 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-04-05
      +      PLATFORM_SECURITY_PATCH := 2017-05-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 30b52cced7908d26a63ab56a00dddcf29fb9e845 Mon Sep 17 00:00:00 2001
      From: Nicolas Geoffray <ngeoffray@google.com>
      Date: Wed, 22 Mar 2017 12:36:05 +0000
      Subject: [PATCH 465/502] Introduce a whitelist for core apps used by system
       server.
      
      And by default 'speed' compile those apps at build time.
      
      bug:33799337
      Test: m -j32
      
      (cherry picked from commit 9af483488a5d0fab89db626fc4d73c993b6d7d2a)
      
      Change-Id: I66f1c675369fccc03b6529c08cb030264d15ba1c
      ---
       core/dex_preopt_odex_install.mk | 6 ++++++
       core/product.mk                 | 1 +
       target/product/core.mk          | 7 +++++++
       target/product/core_minimal.mk  | 5 +++++
       target/product/core_tiny.mk     | 7 +++++++
       5 files changed, 26 insertions(+)
      
      diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk
      index b05d4da3d77..2a3df7f3831 100644
      --- a/core/dex_preopt_odex_install.mk
      +++ b/core/dex_preopt_odex_install.mk
      @@ -107,6 +107,12 @@ LOCAL_DEX_PREOPT_FLAGS := $(PRODUCT_DEX_PREOPT_DEFAULT_FLAGS)
       endif
       endif
       
      +# Jars of system server, and apps loaded into system server should be
      +# compiled with the 'speed' compiler filter.
      +ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(PRODUCT_SYSTEM_SERVER_APPS),$(LOCAL_MODULE)))
      +  LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed
      +endif
      +
       $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
       endif
       
      diff --git a/core/product.mk b/core/product.mk
      index 82214141ba1..c3af3b20484 100644
      --- a/core/product.mk
      +++ b/core/product.mk
      @@ -114,6 +114,7 @@ _product_var_list := \
           PRODUCT_SUPPORTS_VERITY_FEC \
           PRODUCT_OEM_PROPERTIES \
           PRODUCT_SYSTEM_PROPERTY_BLACKLIST \
      +    PRODUCT_SYSTEM_SERVER_APPS \
           PRODUCT_SYSTEM_SERVER_JARS \
           PRODUCT_VBOOT_SIGNING_KEY \
           PRODUCT_VBOOT_SIGNING_SUBKEY \
      diff --git a/target/product/core.mk b/target/product/core.mk
      index d4adb8927d3..86668bba765 100644
      --- a/target/product/core.mk
      +++ b/target/product/core.mk
      @@ -58,4 +58,11 @@ PRODUCT_PACKAGES += \
           VpnDialogs \
           MmsService
       
      +# The set of packages whose code can be loaded by the system server.
      +PRODUCT_SYSTEM_SERVER_APPS += \
      +    FusedLocation \
      +    InputDevices \
      +    KeyChain \
      +    Telecom \
      +
       $(call inherit-product, $(SRC_TARGET_DIR)/product/core_base.mk)
      diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk
      index 0e60013f57e..82a8d493184 100644
      --- a/target/product/core_minimal.mk
      +++ b/target/product/core_minimal.mk
      @@ -112,6 +112,11 @@ PRODUCT_SYSTEM_SERVER_JARS += \
           ethernet-service \
           wifi-service
       
      +# The set of packages whose code can be loaded by the system server.
      +PRODUCT_SYSTEM_SERVER_APPS += \
      +    SettingsProvider \
      +    WallpaperBackup
      +
       # Adoptable external storage f2fs support
       PRODUCT_PACKAGES += \
           fsck.f2fs \
      diff --git a/target/product/core_tiny.mk b/target/product/core_tiny.mk
      index ec2fa41d11c..a124b9ca4d5 100644
      --- a/target/product/core_tiny.mk
      +++ b/target/product/core_tiny.mk
      @@ -104,6 +104,13 @@ PRODUCT_SYSTEM_SERVER_JARS := \
           services \
           wifi-service
       
      +# The set of packages whose code can be loaded by the system server.
      +PRODUCT_SYSTEM_SERVER_APPS += \
      +    FusedLocation \
      +    InputDevices \
      +    SettingsProvider \
      +    WallpaperBackup \
      +
       PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
           ro.zygote=zygote32
       PRODUCT_COPY_FILES += \
      
      From c082f80fdb1038d3190b562f98058103bc352d35 Mon Sep 17 00:00:00 2001
      From: Nicolas Geoffray <ngeoffray@google.com>
      Date: Fri, 24 Mar 2017 14:45:59 +0000
      Subject: [PATCH 466/502] Don't preopt system server apps in system_other.
      
      bug:36532541
      bug:33799337
      
      Test: m -j32 && find out/target -name \*.odex
      
      (cherry picked from commit a2c6c0b11e49d94afbde3ab34c1521ad91befb8a)
      
      Change-Id: Ic4396bb6c543af1c05f56030495caafb245ea304
      ---
       core/dex_preopt.mk              | 3 +++
       core/dex_preopt_libart.mk       | 2 +-
       core/dex_preopt_odex_install.mk | 2 +-
       core/product_config.mk          | 1 +
       4 files changed, 6 insertions(+), 2 deletions(-)
      
      diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk
      index 1150350f0a8..d86f1d2ffed 100644
      --- a/core/dex_preopt.mk
      +++ b/core/dex_preopt.mk
      @@ -23,6 +23,9 @@ DEX_PREOPT_DEFAULT ?= true
       # being used). To bundle everything one should set this to '%'
       SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
       
      +# Method returning whether the install path $(1) should be for system_other.
      +install-on-system-other = $(filter-out $(PRODUCT_SYSTEM_SERVER_APPS),$(basename $(notdir $(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(1)))))
      +
       # The default values for pre-opting: always preopt PIC.
       # Conditional to building on linux, as dex2oat currently does not work on darwin.
       #ifeq ($(HOST_OS),linux)
      diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk
      index 1275e486191..944f800635e 100644
      --- a/core/dex_preopt_libart.mk
      +++ b/core/dex_preopt_libart.mk
      @@ -71,7 +71,7 @@ endef
       # $(2): the full install path (including file name) of the corresponding .apk.
       ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
       define get-odex-installed-file-path
      -$(if $(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(2)),
      +$(if $(call install-on-system-other, $(2)),
         $(call get-odex-file-path,$(1),$(patsubst $(TARGET_OUT)/%,$(TARGET_OUT_SYSTEM_OTHER)/%,$(2))),
         $(call get-odex-file-path,$(1),$(2)))
       endef
      diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk
      index 2a3df7f3831..de5a3e4721f 100644
      --- a/core/dex_preopt_odex_install.mk
      +++ b/core/dex_preopt_odex_install.mk
      @@ -42,7 +42,7 @@ endif
       # if installing into system, and odex are being installed into system_other, don't strip
       ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
       ifeq ($(LOCAL_DEX_PREOPT),true)
      -ifneq ($(filter $(foreach f,$(SYSTEM_OTHER_ODEX_FILTER),$(TARGET_OUT)/$(f)),$(my_module_path)),)
      +ifneq ($(call install-on-system-other, $(my_module_path)),)
       LOCAL_DEX_PREOPT := nostripping
       endif
       endif
      diff --git a/core/product_config.mk b/core/product_config.mk
      index 954eb4108df..f66ab84db5a 100644
      --- a/core/product_config.mk
      +++ b/core/product_config.mk
      @@ -279,6 +279,7 @@ all_product_configs :=
       # A list of module names of BOOTCLASSPATH (jar files)
       PRODUCT_BOOT_JARS := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BOOT_JARS))
       PRODUCT_SYSTEM_SERVER_JARS := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_SERVER_JARS))
      +PRODUCT_SYSTEM_SERVER_APPS := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_SERVER_APPS))
       
       # Find the device that this product maps to.
       TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)
      
      From 8bd2cb6aaa1d61f8fd161e47606939aa72c8ace3 Mon Sep 17 00:00:00 2001
      From: Nicolas Geoffray <ngeoffray@google.com>
      Date: Thu, 30 Mar 2017 13:50:12 +0100
      Subject: [PATCH 467/502] Make the default preopt 'interpret-only'.
      
      bug:33799337
      bug:36534079
      
      Test: m -j32 bullhead/angler/marlin/sailfish
      
      (cherry picked from commit e0848c8b7f0db40ca86c13bd4f601b8c80f978ea)
      
      Change-Id: I6d71bdca1d7b7afab8150a0b19a0e2235832d5e0
      ---
       core/dex_preopt_odex_install.mk | 9 +++++++--
       1 file changed, 7 insertions(+), 2 deletions(-)
      
      diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk
      index de5a3e4721f..cbea522b4f9 100644
      --- a/core/dex_preopt_odex_install.mk
      +++ b/core/dex_preopt_odex_install.mk
      @@ -107,10 +107,15 @@ LOCAL_DEX_PREOPT_FLAGS := $(PRODUCT_DEX_PREOPT_DEFAULT_FLAGS)
       endif
       endif
       
      -# Jars of system server, and apps loaded into system server should be
      -# compiled with the 'speed' compiler filter.
       ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(PRODUCT_SYSTEM_SERVER_APPS),$(LOCAL_MODULE)))
      +  # Jars of system server, and apps loaded into system server should be
      +  # compiled with the 'speed' compiler filter.
         LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed
      +else
      +  # If no compiler filter is specified, default to 'interpret-only' to save on storage.
      +  ifeq (,$(filter --compiler-filter=%, $(LOCAL_DEX_PREOPT_FLAGS)))
      +    LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=interpret-only
      +  endif
       endif
       
       $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
      
      From 1559af5549807f79223133d80d0e96909a0c7f4d Mon Sep 17 00:00:00 2001
      From: qjohn <townex22@gmail.com>
      Date: Tue, 16 May 2017 16:06:15 +0700
      Subject: [PATCH 468/502] apicheck_msg_current: Don't do this in LineageOS
      
      Change-Id: I9396d94f6fd37ce082b75259b5bf8a78b3591350
      ---
       core/apicheck_msg_current.txt | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/apicheck_msg_current.txt b/core/apicheck_msg_current.txt
      index 5ca7fa025d1..df0124bef0c 100644
      --- a/core/apicheck_msg_current.txt
      +++ b/core/apicheck_msg_current.txt
      @@ -78,7 +78,7 @@ MMM+++++++++++++++~MM~~M $O,NM88MOMMZ$$MM$$$+++++++++MM777777777MMMM
       
       
             NO. NO. STOP BEING LAZY. SERIOUSLY.
      -      DO NOT DO THIS in CM. THIS IS A LIE. IT WILL BREAK THINGS.
      +      DO NOT DO THIS in LineageOS. THIS IS A LIE. IT WILL BREAK THINGS.
       
             To submit the revised current.txt to the main Android repository,
             you will need approval.
      
      From 75ff25d4fc8b936768ebd0e9a6da14d0c4242dbf Mon Sep 17 00:00:00 2001
      From: Daniel Sikorski <dadi.sikorski@gmail.com>
      Date: Fri, 19 May 2017 15:48:52 +0000
      Subject: [PATCH 469/502] build: Remove slash in the end
      
      Thanks to @dadi11 for this find
      
      Change-Id: I03a0ba430c843893c26dc66a8f6e63616e306cba
      ---
       target/product/core.mk      | 2 +-
       target/product/core_tiny.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/target/product/core.mk b/target/product/core.mk
      index 86668bba765..dfeacc5a0c4 100644
      --- a/target/product/core.mk
      +++ b/target/product/core.mk
      @@ -63,6 +63,6 @@ PRODUCT_SYSTEM_SERVER_APPS += \
           FusedLocation \
           InputDevices \
           KeyChain \
      -    Telecom \
      +    Telecom
       
       $(call inherit-product, $(SRC_TARGET_DIR)/product/core_base.mk)
      diff --git a/target/product/core_tiny.mk b/target/product/core_tiny.mk
      index a124b9ca4d5..5b03057784b 100644
      --- a/target/product/core_tiny.mk
      +++ b/target/product/core_tiny.mk
      @@ -109,7 +109,7 @@ PRODUCT_SYSTEM_SERVER_APPS += \
           FusedLocation \
           InputDevices \
           SettingsProvider \
      -    WallpaperBackup \
      +    WallpaperBackup
       
       PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
           ro.zygote=zygote32
      
      From 8f5f07a4c8c1f0281683531ab5c65dba35328365 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Mon, 5 Jun 2017 18:24:53 -0500
      Subject: [PATCH 470/502] Merge tag 'android-7.1.2_r17' into n7.1
      
      Android 7.1.2 Release 17 (NJH47B)
      
      Change-Id: I1b66af6cb1b32284c9128b6d99cb70a7d6654ce9
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 3fc513ce14b..379f3ffb0ae 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=N2G47O
      +export BUILD_ID=NJH47B
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index a93dc3123c5..2fb4556793f 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-05-05
      +      PLATFORM_SECURITY_PATCH := 2017-06-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 8110382e8f630d9307247fa474195764d9535598 Mon Sep 17 00:00:00 2001
      From: Moshe Barash <mosimchah@gmail.com>
      Date: Mon, 15 May 2017 20:55:16 +0000
      Subject: [PATCH 471/502] Revert "Build: Switch to Magisk as the built in root
       [2/2]"
      
      This reverts commit 2b25066e4ee953ee9d5c4825c1d4b6b156c450dd.
      
      Change-Id: I30f339cfe52ebe646a0b39a200140f538f6dafca
      ---
       tools/releasetools/edify_generator.py       | 5 -----
       tools/releasetools/ota_from_target_files.py | 8 --------
       2 files changed, 13 deletions(-)
      
      diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py
      index b888258a149..a1c50cd9db8 100644
      --- a/tools/releasetools/edify_generator.py
      +++ b/tools/releasetools/edify_generator.py
      @@ -173,11 +173,6 @@ def ValidateSignatures(self, command):
         def RunPersist(self, command):
           self.script.append(('run_program("/tmp/install/bin/persist.sh", "%s");' % command))
       
      -  def FlashMagisk(self):
      -    self.script.append('package_extract_dir("magisk", "/tmp/magisk");')
      -    self.script.append('run_program("/sbin/busybox", "unzip", "/tmp/magisk/magisk.zip", "META-INF/com/google/android/*", "-d", "/tmp/magisk");')
      -    self.script.append('run_program("/sbin/sh", "/tmp/magisk/META-INF/com/google/android/update-binary", "dummy", "1", "/tmp/magisk/magisk.zip");')
      -
         def ShowProgress(self, frac, dur):
           """Update the progress bar, advancing it over 'frac' over the next
           'dur' seconds.  'dur' may be zero to advance it via SetProgress
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 6e5e0187953..0ba2a5c9d97 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -836,14 +836,6 @@ def output_sink(fn, data):
         script.ShowProgress(0.05, 5)
         script.WriteRawImage("/boot", "boot.img")
       
      -  if block_based:
      -    script.Print(" ")
      -    script.Print("Flashing Magisk...")
      -    script.Print(" ")
      -    common.ZipWriteStr(output_zip, "magisk/magisk.zip",
      -                   ""+input_zip.read("SYSTEM/addon.d/magisk.zip"))
      -    script.FlashMagisk()
      -    script.Print(" ")
         script.ShowProgress(0.2, 10)
         device_specific.FullOTA_InstallEnd()
       
      
      From 357c26dad54aac76a3ac3f399fb5f0437e6a59d6 Mon Sep 17 00:00:00 2001
      From: Abhisek Devkota <ciwrl@lineageos.org>
      Date: Wed, 8 Feb 2017 12:06:13 -0800
      Subject: [PATCH 472/502] Add dumpvar for WITH_SU
      
       -Allow folks to see easily if the term session they are in has
         WITH_SU set to true
       -Also add a dumpvar rule for WITH_GMS for those that have it
       -Remove unused CYNGN dumpvar rules
      
      Change-Id: I9b3f7f729e31dee90caa366fe4798bbcea9e566f
      ---
       core/dumpvar.mk | 10 ++++++----
       1 file changed, 6 insertions(+), 4 deletions(-)
      
      diff --git a/core/dumpvar.mk b/core/dumpvar.mk
      index d887ed0ad95..b667c8665bb 100644
      --- a/core/dumpvar.mk
      +++ b/core/dumpvar.mk
      @@ -25,12 +25,14 @@ print_build_config_vars := \
         BUILD_ID \
         OUT_DIR
       
      -ifneq (,$(filter true, $(CYNGN_TARGET) $(EXTERNAL_CLEAN_TARGET)))
      -ifeq ($(CYNGN_TARGET),true)
      +ifeq ($(WITH_SU),true)
       print_build_config_vars += \
      -  CYNGN_TARGET \
      -  CYNGN_FEATURES
      +  WITH_SU
       endif
      +
      +ifeq ($(WITH_GMS),true)
      +print_build_config_vars += \
      +  WITH_GMS
       endif
       
       ifeq ($(TARGET_BUILD_PDK),true)
      
      From ad0c34aa67be6c4ce569a4853e5672a12d6debb9 Mon Sep 17 00:00:00 2001
      From: Carlos Solano <csolano@gmail.com>
      Date: Fri, 26 May 2017 14:36:27 +0200
      Subject: [PATCH 473/502] build: Fix Version in releasetools
      
      Version string isn't shown while flashing.
      We are using prop ro.aicp.version to get version name
      and its value is 12.1-NIGHTLY
      So no sense to split the string
      
      Change-Id: I5509dafce302f9082007ebc543e048293854ee27
      ---
       tools/releasetools/ota_from_target_files.py | 4 +---
       1 file changed, 1 insertion(+), 3 deletions(-)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 6e5e0187953..d6a95476988 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -723,12 +723,10 @@ def WriteFullOTAPackage(input_zip, output_zip):
         script.Print("*********************************************");
       
       
      -  aicpv = GetBuildProp("ro.aicp.version", OPTIONS.info_dict)
      +  build = GetBuildProp("ro.aicp.version", OPTIONS.info_dict)
         if os.getenv("AICP_BUILDTYPE") is not None:
      -    build = ' '.join(aicpv.split('_')[3].split('-')).title()
           script.Print("*   Version: %s"%(build));
         elif os.getenv("AICP_NIGHTLY") is not None:
      -    build = ' '.join(aicpv.split('_')[2:]).title()
           script.Print("*   Version: %s"%(build));
         else:
           build = GetBuildProp("ro.build.date", OPTIONS.info_dict)
      
      From 3f58dd08c2f616d0c5f18af0ef454f4c0972f566 Mon Sep 17 00:00:00 2001
      From: Sean hoyt <seanhoyt963@gmail.com>
      Date: Sun, 16 Apr 2017 04:23:13 +0000
      Subject: [PATCH 474/502] Disable recovery resource warning
      
      Change-Id: I773a092f44823b095cb4176a8647acef9519b870
      ---
       core/Makefile | 4 ----
       1 file changed, 4 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index 96908a02e29..a6ef3bddda0 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -1078,10 +1078,6 @@ else
       RECOVERY_RESOURCE_ZIP :=
       endif
       
      -ifeq ($(TARGET_PRIVATE_RES_DIRS),)
      -  $(info No private recovery resources for TARGET_DEVICE $(TARGET_DEVICE))
      -endif
      -
       ifeq ($(recovery_fstab),)
         $(info No recovery.fstab for TARGET_DEVICE $(TARGET_DEVICE))
       endif
      
      From 06b69f25956ce6220538e62a1eeb621a86a0d50f Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mkbestas@lineageos.org>
      Date: Fri, 30 Jun 2017 15:52:23 +0200
      Subject: [PATCH 475/502] build: qcom_target: Define MASTER_SIDE_CP_TARGET_LIST
      
      Currently, in the display HAL, we're replacing the usage
      of this variable with a check for TARGET_BOARD_PLATFORM.
      
      Instead of having to do that every time a new branch is made,
      define the variable in qcom_target.
      
      Change-Id: Iddcc38c70adc52267e70c985b7a0ad3d8c4c8929
      ---
       core/qcom_target.mk | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index a40156c315c..64b77d4a591 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -61,6 +61,9 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
               TARGET_USES_COLOR_METADATA := true
           endif
       
      +	# List of targets that use master side content protection
      +    MASTER_SIDE_CP_TARGET_LIST := msm8996 msm8998
      +
           TARGET_GLOBAL_CFLAGS += $(qcom_flags)
           TARGET_GLOBAL_CPPFLAGS += $(qcom_flags)
           CLANG_TARGET_GLOBAL_CFLAGS += $(qcom_flags)
      
      From a13c8b1e249807745da8e226ac0d37664de2c3f3 Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mkbestas@lineageos.org>
      Date: Fri, 30 Jun 2017 15:53:50 +0200
      Subject: [PATCH 476/502] qcom_utils: Cleanup supported QCOM_BOARD_PLATFORMS
      
      * Organize per family
      * Remove unsupported mpq8092 and msm_bronze
      * Add msm8998
      
      Change-Id: I662a8e403045affa2a9b40511414ac6e8057f967
      ---
       core/qcom_utils.mk | 30 +++++++++++++++++++++---------
       1 file changed, 21 insertions(+), 9 deletions(-)
      
      diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk
      index 50e0b4e04b7..b6d8f43cd07 100755
      --- a/core/qcom_utils.mk
      +++ b/core/qcom_utils.mk
      @@ -1,23 +1,35 @@
       # Board platforms lists to be used for
       # TARGET_BOARD_PLATFORM specific featurization
      +
      +# A Family
       QCOM_BOARD_PLATFORMS += msm7x27a
       QCOM_BOARD_PLATFORMS += msm7x30
      +QCOM_BOARD_PLATFORMS += msm8660
      +
      +QCOM_BOARD_PLATFORMS += msm8960
      +
      +# B Family
       QCOM_BOARD_PLATFORMS += msm8226
       QCOM_BOARD_PLATFORMS += msm8610
      -QCOM_BOARD_PLATFORMS += msm8660
      +QCOM_BOARD_PLATFORMS += msm8974
      +
      +QCOM_BOARD_PLATFORMS += apq8084
      +
      +# B64 Family
      +QCOM_BOARD_PLATFORMS += msm8992
      +QCOM_BOARD_PLATFORMS += msm8994
      +
      +# BR Family
       QCOM_BOARD_PLATFORMS += msm8909
       QCOM_BOARD_PLATFORMS += msm8916
      -QCOM_BOARD_PLATFORMS += msm8960
      -QCOM_BOARD_PLATFORMS += msm8974
      -QCOM_BOARD_PLATFORMS += mpq8092
      -QCOM_BOARD_PLATFORMS += msm8937
      +
       QCOM_BOARD_PLATFORMS += msm8952
      +
      +# UM Family
      +QCOM_BOARD_PLATFORMS += msm8937
       QCOM_BOARD_PLATFORMS += msm8953
      -QCOM_BOARD_PLATFORMS += msm8992
      -QCOM_BOARD_PLATFORMS += msm8994
       QCOM_BOARD_PLATFORMS += msm8996
      -QCOM_BOARD_PLATFORMS += msm_bronze
      -QCOM_BOARD_PLATFORMS += apq8084
      +QCOM_BOARD_PLATFORMS += msm8998
       
       MSM7K_BOARD_PLATFORMS := msm7x30
       MSM7K_BOARD_PLATFORMS += msm7x27
      
      From a3f0a4db43294cd3621cf9b1e6c50b66b0bd2089 Mon Sep 17 00:00:00 2001
      From: Robin Broda <robin@broda.me>
      Date: Sun, 2 Jul 2017 22:02:55 +0200
      Subject: [PATCH 477/502] enable PERMISSIONS_REVIEW_REQUIRED feature
      
      This flag enables user review of dangerous permissions
      pre-launch for apps targeting API < 23.
      Screenshot: https://i.imgur.com/o5HpaVu.jpg
      
      Change-Id: I98a68b3a20261cb7bded1ce5ca2fc9720cd4361c
      ---
       core/main.mk | 2 ++
       1 file changed, 2 insertions(+)
      
      diff --git a/core/main.mk b/core/main.mk
      index d6d9ff16e4d..a6e706432a9 100644
      --- a/core/main.mk
      +++ b/core/main.mk
      @@ -384,6 +384,8 @@ ifdef TARGET_2ND_ARCH
         endif
       endif
       
      +ADDITIONAL_BUILD_PROPERTIES += ro.permission_review_required=1
      +
       ## user/userdebug ##
       
       user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
      
      From 4cf9c529b7f14bf2f782f1d9c70ccdcb03a6e040 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Wed, 5 Jul 2017 17:29:01 -0500
      Subject: [PATCH 478/502] Merge tag 'android-7.1.2_r24' into n7.1
      
      Android 7.1.2 release 24
      
      Change-Id: If7263d921e346390e33d8dc1558168554f1788f1
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 379f3ffb0ae..131d235aca3 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NJH47B
      +export BUILD_ID=NJH47D
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 2fb4556793f..369ca90ee99 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-06-05
      +      PLATFORM_SECURITY_PATCH := 2017-07-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 952eef42f6ba9059e4d5738dd1c824677bf30870 Mon Sep 17 00:00:00 2001
      From: Ali B <abittin@gmail.com>
      Date: Fri, 7 Jul 2017 21:14:29 +0000
      Subject: [PATCH 479/502] Revert "enable PERMISSIONS_REVIEW_REQUIRED feature"
      
      This reverts commit a3f0a4db43294cd3621cf9b1e6c50b66b0bd2089.
      
      Causes disabling of custom WP setting, Wifi, Cellular qs tiles,
      BT keeps asking the same Permissions dialog everytime it's turned on.
      So, this is not ready to be merged.
      
      Change-Id: Ibdefd48d53fb0798bb1b96087255697f2bfb76e4
      ---
       core/main.mk | 2 --
       1 file changed, 2 deletions(-)
      
      diff --git a/core/main.mk b/core/main.mk
      index a6e706432a9..d6d9ff16e4d 100644
      --- a/core/main.mk
      +++ b/core/main.mk
      @@ -384,8 +384,6 @@ ifdef TARGET_2ND_ARCH
         endif
       endif
       
      -ADDITIONAL_BUILD_PROPERTIES += ro.permission_review_required=1
      -
       ## user/userdebug ##
       
       user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
      
      From 8e35bea7d584dda67c829af65d2ab72ceee9f106 Mon Sep 17 00:00:00 2001
      From: Luca Stefani <luca020400@lineageos.org>
      Date: Wed, 12 Jul 2017 12:42:05 +0200
      Subject: [PATCH 480/502] qcom: Enable TARGET_USES_QCOM_MM_AUDIO
      
      Change-Id: Iff693650db4b9423bc4bb16c12f592c2a74248af
      ---
       core/qcom_target.mk | 3 +++
       1 file changed, 3 insertions(+)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 64b77d4a591..b4840f32fe2 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -51,6 +51,9 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
               endif
           endif
       
      +	# Allow building audio encoders
      +    TARGET_USES_QCOM_MM_AUDIO := true
      +
           # Enable extra offloading for post-805 targets
           ifneq ($(filter msm8992 msm8994,$(TARGET_BOARD_PLATFORM)),)
               qcom_flags += -DHAS_EXTRA_FLAC_METADATA
      
      From 16431262e8542cb5b5419aa31f7d4923766f4258 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Sun, 9 Jul 2017 09:41:33 -0500
      Subject: [PATCH 481/502] repopick: don't bail on drafts
      
      * When using an ssh gerrit instance (-g) it is perfectly
        reasonable to pick a draft commit. Don't require force
        picking (-f) in order to do so.
      
      Change-Id: I420f566ee1bb1f0b0d2a2ef29d95e0545db70b89
      ---
       tools/repopick.py | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/tools/repopick.py b/tools/repopick.py
      index ca0330ce629..f51ee77e469 100755
      --- a/tools/repopick.py
      +++ b/tools/repopick.py
      @@ -293,7 +293,7 @@ def fetch_query(remote_url, query):
           for item in mergables:
               args.quiet or print('Applying change number {0}...'.format(item['id']))
               # Check if change is open and exit if it's not, unless -f is specified
      -        if (item['status'] != 'OPEN' and item['status'] != 'NEW') and not args.query:
      +        if (item['status'] != 'OPEN' and item['status'] != 'NEW' and item['status'] != 'DRAFT') and not args.query:
                   if args.force:
                       print('!! Force-picking a closed change !!\n')
                   else:
      
      From 084160d1a28d40238613b4aa75ed228bc6c836cc Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mkbestas@lineageos.org>
      Date: Wed, 12 Jul 2017 20:56:35 +0300
      Subject: [PATCH 482/502] kernel: Add savedefconfig target
      
      * Add a build target to simply regenerate the kernel
        minimal defconfig and copy it to the kernel source
      
      Change-Id: I04be945eb6dae3042c236785328c7c9995d42e49
      ---
       core/tasks/kernel.mk | 6 ++++++
       1 file changed, 6 insertions(+)
      
      diff --git a/core/tasks/kernel.mk b/core/tasks/kernel.mk
      index 92ba8d2e7c8..25e769d7af0 100644
      --- a/core/tasks/kernel.mk
      +++ b/core/tasks/kernel.mk
      @@ -356,6 +356,12 @@ kernelxconfig kernelconfig: $(KERNEL_OUT_STAMP)
       		 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig
       	cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC)
       
      +kernelsavedefconfig: $(KERNEL_OUT_STAMP)
      +	$(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG)
      +	env KCONFIG_NOTIMESTAMP=true \
      +		 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig
      +	cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC)
      +
       alldefconfig: $(KERNEL_OUT_STAMP)
       	env KCONFIG_NOTIMESTAMP=true \
       		 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) alldefconfig
      
      From a0e05b3c76842ece5f3779e39f82e78918030183 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Wed, 26 Jul 2017 23:45:27 +0000
      Subject: [PATCH 483/502] Stop calling , remove HOST_JDK_IS_64BIT_VERSION
      
      Stop calling `java -version`, remove HOST_JDK_IS_64BIT_VERSION
      
      All users of this variable have been removed. This command was adding
      50-175ms to `lunch` (~15-30%), and was running at least twice (serially)
      in every build too.
      
      Test: cs/HOST_JDK_IS_64BIT_VERSION
      Test: prebuilts/jdk/jdk8/linux-x86/bin/java -version, is 64-bit.
      
      Change-Id: I0c0fe9f0c275ba64dfae4f9511318ea34edea963
      ---
       core/config.mk | 6 ------
       1 file changed, 6 deletions(-)
      
      diff --git a/core/config.mk b/core/config.mk
      index 064f7b394ae..f394b80ed72 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -635,12 +635,6 @@ ifeq ($(wildcard $(HOST_JDK_TOOLS_JAR)),)
       $(error Error: could not find jdk tools.jar at $(HOST_JDK_TOOLS_JAR), please check if your JDK was installed correctly)
       endif
       endif
      -
      -# Is the host JDK 64-bit version?
      -HOST_JDK_IS_64BIT_VERSION :=
      -ifneq ($(filter 64-Bit, $(shell java -version 2>&1)),)
      -HOST_JDK_IS_64BIT_VERSION := true
      -endif
       endif  # CALLED_FROM_SETUP not true
       
       # It's called md5 on Mac OS and md5sum on Linux
      
      From 54f1cdd9389af7ce3d613a312b250adfa615c679 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Mon, 24 Jul 2017 21:16:38 -0700
      Subject: [PATCH 484/502] Only run Kati twice on a clean build due to
       clean_steps.mk
      
      Write into a temp file, then use `cmp` to determine whether to update
      the actual file. This means that we'll only run Kati twice on a clean
      build, since we'll omit the redundant write during the regeneration
      check.
      
      Simplify writing using $(file >) instead of $(shell), which doesn't have
      character count limitations.
      
      Bug: 35970961
      Test: m clean; m -j nothing; m -j nothing; m -j nothing
      Test: Ensure clean_steps.mk is equivalent before/after
      Change-Id: Id574f416647434ab8d11ed3481da21b55e8797b7
      ---
       core/cleanbuild.mk | 37 +++++++++++--------------------------
       1 file changed, 11 insertions(+), 26 deletions(-)
      
      diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk
      index 5c3369a1fdb..db4f4794eb8 100644
      --- a/core/cleanbuild.mk
      +++ b/core/cleanbuild.mk
      @@ -58,7 +58,7 @@ INTERNAL_CLEAN_STEPS := $(strip $(INTERNAL_CLEAN_STEPS))
       
       # If the clean_steps.mk file is missing (usually after a clean build)
       # then we won't do anything.
      -CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)
      +CURRENT_CLEAN_BUILD_VERSION := MISSING
       CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)
       
       # Read the current state from the file, if present.
      @@ -67,7 +67,9 @@ CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)
       clean_steps_file := $(PRODUCT_OUT)/clean_steps.mk
       -include $(clean_steps_file)
       
      -ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION))
      +ifeq ($(CURRENT_CLEAN_BUILD_VERSION),MISSING)
      +  # Do nothing
      +else ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION))
         # The major clean version is out-of-date.  Do a full clean, and
         # don't even bother with the clean steps.
         $(info *** A clean build is required because of a recent change.)
      @@ -109,36 +111,19 @@ endif
       
       # Write the new state to the file.
       #
      -rewrite_clean_steps_file :=
       ifneq ($(CURRENT_CLEAN_BUILD_VERSION)-$(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_BUILD_VERSION)-$(INTERNAL_CLEAN_STEPS))
      -rewrite_clean_steps_file := true
      -endif
      -ifeq ($(wildcard $(clean_steps_file)),)
      -# This is the first build.
      -rewrite_clean_steps_file := true
      -endif
      -ifeq ($(rewrite_clean_steps_file),true)
      -$(shell \
      -  mkdir -p $(dir $(clean_steps_file)) && \
      -  echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \
      -      $(clean_steps_file) ;\
      -  echo "CURRENT_CLEAN_STEPS := $(wordlist 1,500,$(INTERNAL_CLEAN_STEPS))" >> $(clean_steps_file) \
      - )
      -define -cs-write-clean-steps-if-arg1-not-empty
      -$(if $(1),$(shell echo "CURRENT_CLEAN_STEPS += $(1)" >> $(clean_steps_file)))
      -endef
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 501,1000,$(INTERNAL_CLEAN_STEPS)))
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1001,1500,$(INTERNAL_CLEAN_STEPS)))
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1501,2000,$(INTERNAL_CLEAN_STEPS)))
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2001,2500,$(INTERNAL_CLEAN_STEPS)))
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2501,3000,$(INTERNAL_CLEAN_STEPS)))
      -$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 3001,99999,$(INTERNAL_CLEAN_STEPS)))
      +$(shell mkdir -p $(dir $(clean_steps_file)))
      +$(file >$(clean_steps_file).tmp,CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)$(newline)CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)$(newline))
      +$(shell if ! cmp -s $(clean_steps_file).tmp $(clean_steps_file); then \
      +          mv $(clean_steps_file).tmp $(clean_steps_file); \
      +        else \
      +          rm $(clean_steps_file).tmp; \
      +        fi)
       endif
       
       CURRENT_CLEAN_BUILD_VERSION :=
       CURRENT_CLEAN_STEPS :=
       clean_steps_file :=
      -rewrite_clean_steps_file :=
       INTERNAL_CLEAN_STEPS :=
       INTERNAL_CLEAN_BUILD_VERSION :=
       
      
      From 41740a7de9fc8b1f3318dae6e56807118917a879 Mon Sep 17 00:00:00 2001
      From: Dan Willemsen <dwillemsen@google.com>
      Date: Wed, 26 Jul 2017 23:54:52 +0000
      Subject: [PATCH 485/502] Run Linux x86_64 once, don't use python for
       HOST_OS_EXTRA
      
      This saves 20-50ms for `lunch` (~7-10%), and double that for every build
      execution.
      
      Test: Check HOST_OS_EXTRA on Linux & Mac
      
      Change-Id: Ifcd7dbdd0485ee2fcba9e81d8ae492be775c5fef
      ---
       core/config.mk           |  2 ++
       core/envsetup.mk         | 10 +++++++++-
       core/version_defaults.mk |  2 +-
       3 files changed, 12 insertions(+), 2 deletions(-)
      
      diff --git a/core/config.mk b/core/config.mk
      index f394b80ed72..628312b7505 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -58,6 +58,8 @@ $(warning The build system needs unmodified output of grep.)
       $(error Please remove --color=always from your  $$GREP_OPTIONS)
       endif
       
      +UNAME := $(shell uname -sm)
      +
       # Standard source directories.
       SRC_DOCS:= $(TOPDIR)docs
       # TODO: Enforce some kind of layering; only add include paths
      diff --git a/core/envsetup.mk b/core/envsetup.mk
      index 69ee0e3d66f..2a4d0641fcf 100644
      --- a/core/envsetup.mk
      +++ b/core/envsetup.mk
      @@ -54,7 +54,15 @@ ifneq (,$(findstring Macintosh,$(UNAME)))
         HOST_OS := darwin
       endif
       
      -HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())")
      +HOST_OS_EXTRA := $(shell uname -rsm)
      +ifeq ($(HOST_OS),linux)
      +  ifneq ($(wildcard /etc/os-release),)
      +    HOST_OS_EXTRA += $(shell source /etc/os-release; echo $$PRETTY_NAME)
      +  endif
      +else ifeq ($(HOST_OS),darwin)
      +  HOST_OS_EXTRA += $(shell sw_vers -productVersion)
      +endif
      +HOST_OS_EXTRA := $(subst $(space),-,$(HOST_OS_EXTRA))
       
       # BUILD_OS is the real host doing the build.
       BUILD_OS := $(HOST_OS)
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 369ca90ee99..813324fdfc4 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -157,7 +157,7 @@ ifeq "" "$(BUILD_DATETIME)"
         BUILD_DATETIME := $(shell date +%s)
       endif
       
      -ifneq (,$(findstring Darwin,$(shell uname -sm)))
      +ifneq (,$(findstring Darwin,$(UNAME)))
       DATE := date -r $(BUILD_DATETIME)
       else
       DATE := date -d @$(BUILD_DATETIME)
      
      From b9ac3e57912ca8db51e79a65158f7d3bba90b3ad Mon Sep 17 00:00:00 2001
      From: Rashed Abdel-Tawab <rashed@linux.com>
      Date: Tue, 1 Aug 2017 20:51:02 +0200
      Subject: [PATCH 486/502] qcom: Allow setting custom audio, display, and media
       HALs
      
      Currently, using project-set-path is blocking us from overriding the pathmap
      for the audio, display, and media HALs, so set them with set-device-specific-path
      to allow overriding the HALs with USE_DEVICE_SPECIFIC_* and DEVICE_SPECIFIC_*_PATH
      
      Change-Id: Iee3723cf251d0f485a77a17fd61cb62178833582
      ---
       core/qcom_target.mk | 6 +++---
       1 file changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index b4840f32fe2..cc4ed54e4ce 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -101,9 +101,9 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           endif
           endif
       
      -$(call project-set-path,qcom-audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT))
      -$(call project-set-path,qcom-display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT))
      -$(call project-set-path,qcom-media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT))
      +$(call set-device-specific-path,AUDIO,audio,hardware/qcom/audio-caf/$(QCOM_HARDWARE_VARIANT))
      +$(call set-device-specific-path,DISPLAY,display,hardware/qcom/display-caf/$(QCOM_HARDWARE_VARIANT))
      +$(call set-device-specific-path,MEDIA,media,hardware/qcom/media-caf/$(QCOM_HARDWARE_VARIANT))
       
       $(call set-device-specific-path,CAMERA,camera,hardware/qcom/camera)
       $(call set-device-specific-path,GPS,gps,hardware/qcom/gps)
      
      From 9d0078de3b9c560ff8cd24ff333800b549462526 Mon Sep 17 00:00:00 2001
      From: Dan Pasanen <dan.pasanen@gmail.com>
      Date: Mon, 7 Aug 2017 16:11:59 -0500
      Subject: [PATCH 487/502] Merge tag 'android-7.1.2_r29' into n7.1
      
      Android 7.1.2 Release 29 (NJH47F)
      
      Change-Id: I2249c6be18a8beb25e68c9205188d9aadb3e65cf
      ---
       core/build_id.mk         | 2 +-
       core/version_defaults.mk | 2 +-
       2 files changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/build_id.mk b/core/build_id.mk
      index 131d235aca3..35b5a1b6f8f 100644
      --- a/core/build_id.mk
      +++ b/core/build_id.mk
      @@ -18,4 +18,4 @@
       # (like "CRB01").  It must be a single word, and is
       # capitalized by convention.
       
      -export BUILD_ID=NJH47D
      +export BUILD_ID=NJH47F
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 813324fdfc4..b826432fa53 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -      PLATFORM_SECURITY_PATCH := 2017-07-05
      +    PLATFORM_SECURITY_PATCH := 2017-08-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 8f7fc91d91deeee38a63a6d5e07245432c08e4d4 Mon Sep 17 00:00:00 2001
      From: Harry Youd <harry@harryyoud.co.uk>
      Date: Tue, 18 Jul 2017 18:52:42 +0100
      Subject: [PATCH 488/502] repopick: Add 'reset' option
      
      In case of conflict, reset to initial state by aborting the cherry-pick,
      leaving the working directory clean
      
      Change-Id: I2353b92254b67ea49835bc88b6fc9bc3910b5107
      ---
       tools/repopick.py | 8 +++++++-
       1 file changed, 7 insertions(+), 1 deletion(-)
      
      diff --git a/tools/repopick.py b/tools/repopick.py
      index f51ee77e469..38b20afb971 100755
      --- a/tools/repopick.py
      +++ b/tools/repopick.py
      @@ -142,6 +142,7 @@ def fetch_query(remote_url, query):
           parser.add_argument('change_number', nargs='*', help='change number to cherry pick.  Use {change number}/{patchset number} to get a specific revision.')
           parser.add_argument('-i', '--ignore-missing', action='store_true', help='do not error out if a patch applies to a missing directory')
           parser.add_argument('-s', '--start-branch', nargs=1, help='start the specified branch before cherry picking')
      +    parser.add_argument('-r', '--reset', action='store_true', help='reset to initial state (abort cherry-pick) if there is a conflict')
           parser.add_argument('-a', '--abandon-first', action='store_true', help='before cherry picking, abandon the branch specified in --start-branch')
           parser.add_argument('-b', '--auto-branch', action='store_true', help='shortcut to "--start-branch auto --abandon-first --ignore-missing"')
           parser.add_argument('-q', '--quiet', action='store_true', help='print as little as possible')
      @@ -403,7 +404,12 @@ def fetch_query(remote_url, query):
                       cmd_out = None
                   result = subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out)
                   if result != 0:
      -                print('ERROR: git command failed')
      +                if args.reset:
      +                    print('ERROR: git command failed, aborting cherry-pick')
      +                    cmd = ['git cherry-pick --abort']
      +                    subprocess.call(cmd, cwd=project_path, shell=True, stdout=cmd_out, stderr=cmd_out)
      +                else:
      +                    print('ERROR: git command failed')
                       sys.exit(result)
               if not args.quiet:
                   print('')
      
      From 95db7380f6bf87d836055e9d659049f7af07f360 Mon Sep 17 00:00:00 2001
      From: dianlujitao <dianlujitao@lineageos.org>
      Date: Thu, 17 Aug 2017 19:05:19 +0200
      Subject: [PATCH 489/502] build: qcom_target: Add sdm660
      
      Change-Id: I90a44e040280bd43c40b06e14f658a5cf7e30297
      ---
       core/qcom_target.mk | 8 ++++----
       core/qcom_utils.mk  | 2 ++
       2 files changed, 6 insertions(+), 4 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index cc4ed54e4ce..19085a6366a 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -59,13 +59,13 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
               qcom_flags += -DHAS_EXTRA_FLAC_METADATA
           endif
       
      -    # Enable color metadata for 8xx UM targets
      -    ifneq ($(filter msm8996 msm8998,$(TARGET_BOARD_PLATFORM)),)
      +    # Enable color metadata for modern UM targets
      +    ifneq ($(filter msm8996 msm8998 sdm660,$(TARGET_BOARD_PLATFORM)),)
               TARGET_USES_COLOR_METADATA := true
           endif
       
      -	# List of targets that use master side content protection
      -    MASTER_SIDE_CP_TARGET_LIST := msm8996 msm8998
      +    # List of targets that use master side content protection
      +    MASTER_SIDE_CP_TARGET_LIST := msm8996 msm8998 sdm660
       
           TARGET_GLOBAL_CFLAGS += $(qcom_flags)
           TARGET_GLOBAL_CPPFLAGS += $(qcom_flags)
      diff --git a/core/qcom_utils.mk b/core/qcom_utils.mk
      index b6d8f43cd07..6da6f614738 100755
      --- a/core/qcom_utils.mk
      +++ b/core/qcom_utils.mk
      @@ -31,6 +31,8 @@ QCOM_BOARD_PLATFORMS += msm8953
       QCOM_BOARD_PLATFORMS += msm8996
       QCOM_BOARD_PLATFORMS += msm8998
       
      +QCOM_BOARD_PLATFORMS += sdm660
      +
       MSM7K_BOARD_PLATFORMS := msm7x30
       MSM7K_BOARD_PLATFORMS += msm7x27
       MSM7K_BOARD_PLATFORMS += msm7x27a
      
      From 64081a68a5098b3e048303883cd65cc3ae7a9f13 Mon Sep 17 00:00:00 2001
      From: SpiritCroc <spiritcroc@gmail.com>
      Date: Sat, 26 Aug 2017 10:14:58 +0200
      Subject: [PATCH 490/502] Fix hosts/... persistence across flashes
      
      Restore line that got accidentally deleted in https://github.com/AICP/build/commit/f3d5525001e53a6f2d80a06e176d91dc9767937e
      
      Change-Id: Ied25f7670f11cddd5352148a043ecca8eb8cae09
      ---
       tools/releasetools/ota_from_target_files.py | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index 9c77cc25172..c4aad83db3e 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -828,6 +828,7 @@ def output_sink(fn, data):
           if block_based:
             script.Mount("/system")
           script.RunBackup("restore")
      +    script.RunPersist("restore")
           if block_based:
             script.Unmount("/system")
       
      
      From 31d3a113d8b897576bd14e4e35cb3d5144cfbb5e Mon Sep 17 00:00:00 2001
      From: Michael Bestas <mkbestas@lineageos.org>
      Date: Wed, 13 Sep 2017 20:06:58 +0200
      Subject: [PATCH 491/502] qcom_target: Commonize UM target HALs
      
      * Use msm8996 HAL for 8953 & 8937 since they share the exact same
        git history sha1 in all 7.0+ released tags.
      
      Change-Id: I764a9a092b6d530de8a9b9e6e54f41c0b5d8a593
      ---
       core/qcom_target.mk | 4 ++--
       1 file changed, 2 insertions(+), 2 deletions(-)
      
      diff --git a/core/qcom_target.mk b/core/qcom_target.mk
      index 19085a6366a..94492281fb2 100644
      --- a/core/qcom_target.mk
      +++ b/core/qcom_target.mk
      @@ -28,7 +28,7 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           B_FAMILY := msm8226 msm8610 msm8974
           B64_FAMILY := msm8992 msm8994
           BR_FAMILY := msm8909 msm8916
      -    UM_FAMILY := msm8937 msm8953
      +    UM_FAMILY := msm8937 msm8953 msm8996
       
           qcom_flags := -DQCOM_HARDWARE
           qcom_flags += -DQCOM_BSP
      @@ -92,7 +92,7 @@ ifeq ($(BOARD_USES_QCOM_HARDWARE),true)
           else
           ifeq ($(call is-board-platform-in-list, $(UM_FAMILY)),true)
               MSM_VIDC_TARGET_LIST := $(UM_FAMILY)
      -        QCOM_HARDWARE_VARIANT := msm8937
      +        QCOM_HARDWARE_VARIANT := msm8996
           else
               MSM_VIDC_TARGET_LIST := $(TARGET_BOARD_PLATFORM)
               QCOM_HARDWARE_VARIANT := $(TARGET_BOARD_PLATFORM)
      
      From 279ecf11ade4266528e15be55dc9dcc194284544 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 19 Jul 2017 10:37:42 -0700
      Subject: [PATCH 492/502] Updating Security String to 2017-09-05 Bug:63846344
      
      (cherry picked from commit 18be90844245f3873261e4aa1072e8d83fdb33aa)
      
      Change-Id: Ide74c0655eff5d24fcd7bf708b7e5ae5fe660d83
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index b826432fa53..b7b873b3487 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-08-05
      +    PLATFORM_SECURITY_PATCH := 2017-09-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 108383b133a3699400cd2aa44fecffccf007a68f Mon Sep 17 00:00:00 2001
      From: Colin Cross <ccross@android.com>
      Date: Tue, 29 Nov 2016 11:12:56 -0800
      Subject: [PATCH 493/502] Fix warning with AAPT2 and
       LOCAL_STATIC_ANDROID_LIBRARIES
      
      Building with LOCAL_STATIC_ANDROID_LIBARIES and LOCAL_USE_APPT2
      causes a warning:
      build/core/package_internal.mk:143: Empty argument supplied to find-subdir-assets
      
      Only call find-subdir-assets if my_res_dir is not empty.
      
      Also improve the warning message to make it easier to find the module
      that caused it.
      
      Test: m -j
      Change-Id: I9a71162c7e2ed82f64d6844baca256968ac77317
      ---
       core/definitions.mk      | 2 +-
       core/package_internal.mk | 4 ++--
       2 files changed, 3 insertions(+), 3 deletions(-)
      
      diff --git a/core/definitions.mk b/core/definitions.mk
      index 313a9b227bd..cb4b7dddc10 100644
      --- a/core/definitions.mk
      +++ b/core/definitions.mk
      @@ -426,7 +426,7 @@ endef
       define find-subdir-assets
       $(sort $(if $(1),$(patsubst ./%,%, \
       	$(shell if [ -d $(1) ] ; then cd $(1) ; find -L ./ -not -name '.*' -and -type f -and -not -type l ; fi)), \
      -	$(warning Empty argument supplied to find-subdir-assets) \
      +	$(warning Empty argument supplied to find-subdir-assets in $(LOCAL_PATH)) \
       ))
       endef
       
      diff --git a/core/package_internal.mk b/core/package_internal.mk
      index 5940d6372eb..70acd301f45 100644
      --- a/core/package_internal.mk
      +++ b/core/package_internal.mk
      @@ -140,9 +140,9 @@ my_overlay_resources := $(strip \
           $(addprefix $(d)/, \
               $(call find-subdir-assets,$(d)))))
       
      -my_res_resources := $(strip \
      +my_res_resources := $(if $(my_res_dir),$(strip \
           $(addprefix $(my_res_dir)/, \
      -        $(call find-subdir-assets,$(my_res_dir))))
      +        $(call find-subdir-assets,$(my_res_dir)))))
       
       all_resources := $(strip $(my_res_resources) $(my_overlay_resources))
       
      
      From 866f84bbd1e54790008c9c015225a889df495099 Mon Sep 17 00:00:00 2001
      From: Ralf Luther <luther.ralf@gmail.com>
      Date: Sun, 24 Sep 2017 17:29:26 +0200
      Subject: [PATCH 494/502] build: logo adjustments
      
      Change-Id: Idc4602ad8c3067c9aeecc035783f52148bff2957
      Signed-off-by: Ralf Luther <luther.ralf@gmail.com>
      ---
       core/Makefile | 24 ++++++++++--------------
       1 file changed, 10 insertions(+), 14 deletions(-)
      
      diff --git a/core/Makefile b/core/Makefile
      index a6ef3bddda0..c5ce072079a 100644
      --- a/core/Makefile
      +++ b/core/Makefile
      @@ -2363,20 +2363,16 @@ bacon: otapackage
       	$(hide) $(MD5SUM) $(AICP_TARGET_PACKAGE) > $(AICP_TARGET_PACKAGE).md5sum
       	@echo  ""
       	@echo  ""
      -	@echo -e $(CL_CHAR3)"        ██████  █████▒▒▒▒▒        ███████▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"      ███████████████▒▒▒▒▒     ██████████▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"   ██████████████████▒▒▒▒▒  █████████████▒▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"  ███████     ███████▒▒▒▒▒ ████████ ▒▒▒▒▒  ▒▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"  ██████       ██████▒▒▒▒▒ ██████   ▒▒▒▒▒   ▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)" ██████         █████▒▒▒▒▒██████    ▒▒▒▒▒    ▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"  ██████       ██████▒▒▒▒▒ ██████   ▒▒▒▒▒   ▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"  ███████     ███████▒▒▒▒▒ ████████ ▒▒▒▒▒  ▒▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"   ██████████████████▒▒▒▒▒  █████████████▒▒▒▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"      ███████████████▒▒▒▒▒     ██████████▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"        ██████  █████▒▒▒▒▒        ███████▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR3)"                                    ▒▒▒▒▒"${CL_RST}
      -	@echo -e $(CL_CHAR1)"  C    U    S    T    O    M"${CL_CHAR3}"        ▒▒▒▒▒"${CL_CHAR1}"  R   O   M"${CL_RST}
      -	@echo -e $(CL_CHAR3)"                                    ▒▒▒▒▒"${CL_RST}
      +	@echo -e $(CL_BLU)"     █████ ████▒▒▒▒   ████████▒▒▒▒      "${CL_RST}
      +	@echo -e $(CL_BLU)"   ████████████▒▒▒▒ ██████████▒▒▒▒▒▒    "${CL_RST}
      +	@echo -e $(CL_BLU)"  ████     ████▒▒▒▒█████  ▒▒▒▒   ▒▒▒▒   "${CL_RST}
      +	@echo -e $(CL_BLU)"  ███       ███▒▒▒▒████   ▒▒▒▒    ▒▒▒   "${CL_RST}
      +	@echo -e $(CL_BLU)"  ████     ████▒▒▒▒████   ▒▒▒▒   ▒▒▒▒   "${CL_RST}
      +	@echo -e $(CL_BLU)"   ████████████▒▒▒▒ ██████████▒▒▒▒▒▒    "${CL_RST}
      +	@echo -e $(CL_BLU)"     █████ ████▒▒▒▒   ████████▒▒▒▒      "${CL_RST}
      +	@echo -e $(CL_BLU)"                          ▒▒▒▒          "${CL_RST}
      +	@echo -e $(CL_BLU)"                          ▒▒▒▒          "${CL_RST}
      +	@echo -e $(CL_BLU)"www.aicp-rom.com   -   Get your flash ON"${CL_RST}
       	@echo  ""
       	@echo -e ${CL_CYN}"===========-Package complete-==========="${CL_RST}
       	@echo -e ${CL_CYN}"zip: "${CL_MAG} $(AICP_TARGET_PACKAGE)${CL_RST}
      
      From daf771579b5562ce1079116216f67ebc6b5c439b Mon Sep 17 00:00:00 2001
      From: Ralf Luther <luther.ralf@gmail.com>
      Date: Sun, 24 Sep 2017 22:43:06 +0200
      Subject: [PATCH 495/502] build: minor flash logo adjustments
      
      Change-Id: I120a95fd261e09486a5293abecf4d0dea94fd234
      Signed-off-by: Ralf Luther <luther.ralf@gmail.com>
      ---
       tools/releasetools/ota_from_target_files.py | 1 -
       1 file changed, 1 deletion(-)
      
      diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
      index c4aad83db3e..6a55a4160fd 100755
      --- a/tools/releasetools/ota_from_target_files.py
      +++ b/tools/releasetools/ota_from_target_files.py
      @@ -713,7 +713,6 @@ def WriteFullOTAPackage(input_zip, output_zip):
         script.Print("*     ############**** ##########******     *")
         script.Print("*    ####     ####****#####  ****   ****    *")
         script.Print("*    ###       ###****####   ****   ****    *")
      -  script.Print("*    ###       ###****####   ****   ****    *")
         script.Print("*    ####     ####****####   ****   ****    *")
         script.Print("*     ############**** ##########******     *")
         script.Print("*       ##### ####****   ########****       *")
      
      From 2da30652bc0139ca51a338b554acbf0b0f81dc17 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Mon, 21 Aug 2017 11:26:14 -0700
      Subject: [PATCH 496/502] [DO NOT MERGE] Update platform security string to
       2017-10-01 in nyc-dev Bug:64896113 (cherry picked from commit
       73ab80dec9df8966bf660725dc1a942d9c1f324e)
      
      Change-Id: I79c8696abc375a2c2cd77a2b12fec1558be70818
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index b7b873b3487..ba50a930afd 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-09-05
      +    PLATFORM_SECURITY_PATCH := 2017-10-01
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From c6cde8c773415f743aecc2ee57a249ba6e100ecb Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Mon, 21 Aug 2017 11:26:49 -0700
      Subject: [PATCH 497/502] [DO NOT MERGE] Update platform security string to
       2017-10-05 in nyc-dev Bug:64896113 (cherry picked from commit
       1517f3d2da27eae798a3ac765096251914f9b119)
      
      Change-Id: Iaf69b105d57ab33dccde1b13be5271178269f82a
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index ba50a930afd..3af9f847be8 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-10-01
      +    PLATFORM_SECURITY_PATCH := 2017-10-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 65780e281c68b204a6268e430289024af4070756 Mon Sep 17 00:00:00 2001
      From: XiNGRZ <chenxingyu92@gmail.com>
      Date: Wed, 4 Oct 2017 00:13:07 +0800
      Subject: [PATCH 498/502] core: Prefix and build bison host executable if
       needed
      
      This patch prefixed bison with HOST_OUT_EXECUTABLES to ensure using our
      `bison` built from source. It also added bison to be a depencency of %.y
      and %.yy tasks so that it will be built if needed without any manual
      `mka bison`.
      
      Conflicts:
      	core/config.mk
      Change-Id: Ic207124965c704b3f350e96b58d8e1f2683c2601
      ---
       core/binary.mk | 4 ++--
       core/config.mk | 3 +++
       2 files changed, 5 insertions(+), 2 deletions(-)
      
      diff --git a/core/binary.mk b/core/binary.mk
      index 069a3dd85d5..3257efd3a3f 100644
      --- a/core/binary.mk
      +++ b/core/binary.mk
      @@ -891,7 +891,7 @@ y_yacc_cs := $(addprefix \
       ifneq ($(y_yacc_cs),)
       $(y_yacc_cs): $(intermediates)/%.c: \
           $(TOPDIR)$(LOCAL_PATH)/%.y \
      -    $(my_additional_dependencies)
      +    $(my_additional_dependencies) | $(BISON)
       	$(call transform-y-to-c-or-cpp)
       $(call track-src-file-gen,$(y_yacc_sources),$(y_yacc_cs))
       
      @@ -904,7 +904,7 @@ yy_yacc_cpps := $(addprefix \
       ifneq ($(yy_yacc_cpps),)
       $(yy_yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
           $(TOPDIR)$(LOCAL_PATH)/%.yy \
      -    $(my_additional_dependencies)
      +    $(my_additional_dependencies) | $(BISON)
       	$(call transform-y-to-c-or-cpp)
       $(call track-src-file-gen,$(yy_yacc_sources),$(yy_yacc_cpps))
       
      diff --git a/core/config.mk b/core/config.mk
      index 628312b7505..0a3b7da0847 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -547,6 +547,9 @@ endif
       # To run bison from elsewhere you need to set up enviromental variable
       # BISON_PKGDATADIR.
       BISON_PKGDATADIR := $(PWD)/external/bison/data
      +ifeq ($(USE_HOST_BISON),yes)
      +BISON := $(HOST_OUT_EXECUTABLES)/bison
      +else
       BISON := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/bison/bison
       YACC := $(BISON) -d
       
      
      From b933af6fd2f7eb25a44cda72da80347f127472c8 Mon Sep 17 00:00:00 2001
      From: Adam Seaton <aseaton@google.com>
      Date: Wed, 13 Sep 2017 10:51:18 -0700
      Subject: [PATCH 499/502] Update Security String to 2017-11-05
      
      Change-Id: I9fd1b7832eee415ea2a6c718df419ea12ddfe620
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 3af9f847be8..9e67c23911e 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-10-05
      +    PLATFORM_SECURITY_PATCH := 2017-11-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From 8c36a9b2b5d994cb93d93712f2b2d602f413ccc4 Mon Sep 17 00:00:00 2001
      From: Bruno Martins <bgcngm@gmail.com>
      Date: Fri, 17 Nov 2017 21:31:54 +0000
      Subject: [PATCH 500/502] Bump Security String to 2017-11-06
      
      KRACK vulnerability patches were shipped a while ago,
      so we can advertise a security patch level of 2017-11-06.
      
      Change-Id: I68300e296ae8fe10aecefd45cfa581d35d8086a8
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 9e67c23911e..863b438df8c 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-11-05
      +    PLATFORM_SECURITY_PATCH := 2017-11-06
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      
      From c1e0bdca8739be130ad3d68edc2bc8af01e95eb8 Mon Sep 17 00:00:00 2001
      From: doc HD <doc.divxm@gmail.com>
      Date: Sat, 18 Nov 2017 18:34:12 +0300
      Subject: [PATCH 501/502] build: Fix build after
       65780e281c68b204a6268e430289024af4070756
      
      Change-Id: I78682193de61e0119a634eed38277d044aa777cd
      ---
       core/config.mk | 1 +
       1 file changed, 1 insertion(+)
      
      diff --git a/core/config.mk b/core/config.mk
      index 0a3b7da0847..8a283b2471f 100644
      --- a/core/config.mk
      +++ b/core/config.mk
      @@ -551,6 +551,7 @@ ifeq ($(USE_HOST_BISON),yes)
       BISON := $(HOST_OUT_EXECUTABLES)/bison
       else
       BISON := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/bison/bison
      +endif
       YACC := $(BISON) -d
       
       YASM := prebuilts/misc/$(BUILD_OS)-$(HOST_PREBUILT_ARCH)/yasm/yasm
      
      From 73ebd9fec5563d83e964882820b52cdc7403f5e5 Mon Sep 17 00:00:00 2001
      From: Ali Al-Asadi <alasadi56@gmail.com>
      Date: Mon, 11 Dec 2017 21:13:18 +0100
      Subject: [PATCH 502/502] Bump security string to 2017-12-05
      
      Change-Id: Ib5a18e61ac99444b50538db122782c5830032396
      ---
       core/version_defaults.mk | 2 +-
       1 file changed, 1 insertion(+), 1 deletion(-)
      
      diff --git a/core/version_defaults.mk b/core/version_defaults.mk
      index 863b438df8c..b09ab6cdc2b 100644
      --- a/core/version_defaults.mk
      +++ b/core/version_defaults.mk
      @@ -131,7 +131,7 @@ ifeq "" "$(PLATFORM_SECURITY_PATCH)"
           #  It must be of the form "YYYY-MM-DD" on production devices.
           #  It must match one of the Android Security Patch Level strings of the Public Security Bulletins.
           #  If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
      -    PLATFORM_SECURITY_PATCH := 2017-11-06
      +    PLATFORM_SECURITY_PATCH := 2017-12-05
       endif
       
       ifeq "" "$(PLATFORM_BASE_OS)"
      

    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�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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/froyo-android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/froyo-android.png deleted file mode 100644 index c63f7f02c85b4b44bcfd51e7c8ff034562ae751e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17086 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 p^_NYfgZ9 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png deleted file mode 100644 index 8399d84d0f38ceff8250fc16e186e414a5102277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11690 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus-small.png deleted file mode 100644 index 5bb7d7a7de550f76bc912f55bf486bf371061654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5042 zcmZu#Wl)rX7X9d@yQM>sP7$PQQMyw~SYqi|mPS&Ll5$xZlvSkTl~Wd5dOb@%$fQO0EkpvR8;gd zRaDsZd_0|8ppF0#xR7TEGfT(N$**D@$xW2!j_b0akpL$b3N%PzUQF>0u#2XkQtXR~ zCo-X-rOX8z_r9Jc0_VkV6h3N!C?&*OBpO>uAF(Z!eGUymA0FP!-n8xH?%a;S$H^lo zsd&@2i(P@I1~JcM=Gann!M#K65!kfgHC%Rz?cr_+Uf;jfaNvPqezgj>Sf4xrY`|+; zh?{C){clvO9~cC_F@&6R0Ew4$d{@ z@qoFC^d)*=uJ}O(2uQ*L5RWvtu@%1pw#JbL0@z*MKp{$zQwX=K1}nn6NlXJfq8$$i zNH$9)SF{Bp5Xu500J}6cpu$Q$io>pjQz$akxmIE071IL70=kAXN3&l{iPN-XPB6hv zkJmOhHoBp8%69a86i$SjoVnRZE^6=&j@B3n05Dxme!G`eNZr}qT;F!ufuhg*itpWy zJvrq$PFC;R-eThd6guPR1)Hs{862+xtXlt0w+c&O!31z#y|NZxBrLQbnh3f|giGHl zvgQ}*4L)OeKtxP@$YWpBF7hi;{;&AD=UQUe<-h6uV$d<*oui1T?kb78^S1K{s4+<1 z8OBu>^}y_K-4Dcs-zD=+Zb;Nw3D72-n7wJyp z0;pKsE}bTV&%@BJup=z&L^89f06;P9OzKjjVDJO~qxCFLwR?fY5|whloj0GN-rmc2;lW z)NJ3FG4T%2Ic%9pnxsfNu$Vmwpk?mLw?l)tu@fVx4?r)YDY~JrQ&Tm}w9Hh>c@DT5 zsaip%gi+C=-48j_%XJ%hf~c-~1MOw%Qq9y+yhj|Y9QiyiACghqq=UK1hTd)J5OMIN zifIySx`7wLf~AI~@>3KpxmvvYsqRB7o1pp#6nl1Bb1HeN?z@|zp3P<&nZEc9Ey7}M zgVGGD=aP;JTeu$z#FP<*mHML<`9DFG@iGM#n(l=GdcuZr71R>`IXt6CI+fv4!IJ5T z92bZS##wmJua$5)id8LpB74ehmtb#aFX|jdLK;gNH2}7M#OTHt%vi?I%qWb|`iS=< z8!>1kGAqW6fV?Mv?`drI`0{ZGZQ6ILOqooR%&^RzN+V-mV})sWC9zSJF?rQXlhBXq z#tnMEDhPklRZUm07=Nvhsu?qY8Kmfq>)Vuc*xbFob|9^fjZrU*1(z5(H1{(manSXP zIi8p)&-j?&>5%HC@h5DRYSnLz zXh-xS}4p~r&g z!R-OjLCyjG;nPdIOP)*j%W;;G2UILGvVO85K7Rfq0Z^~D{nB-bo{HXzo;_0tGo;8j z?@W^Zs3S@&7$j_}KXm*y{T+F5lQa(VM-MBE1#do9=6hl6cpbntAkzF}=)wMQ~V zHsHA7u;C(bKM+XbCEPo~8otM3l|sMu8x8%u{V)PEs7>=5 zNPF^0O2ykRvWu=wJ^>JvE7Sn$aDZ%yXsK+842=7uc9KoyN6k%m_-3oQt=o1?Y*(#eAqK{N%PbY>6rIa+4TxrQS8ck!VJ1wWgglr)ThzN z7+tlF;-q5zy5^SW&)#k4nPgr{FUy9iTsz0=s{8kg6Y3i9!_yewec?LOHc_2fL5%`BWPPz%-cK^wnz(&(V8r2G^o)d zqtg;D=MS`GuncSgw}UNyimy7||GwfPeoYtBo?5HdQrj@s5@>$1#@VU%m5wXXkRB!^ zYHiT^D$wP4DsFpMc z^(^&_t|G#lFF^ZXIRBJPr$0)t#Jy0is2#ogwj__`C5uK!^WQME=r0HV0m&58{KC9P zawk`tuhV~(y(-Jk(@~K7iCBVTv~Ce@*80}%5S8(K1$w_Dt!5j{(AmmPiuG}u*EuJ~ zevzm7MYUXwoJN?}-8%S_rRTmQX86$bS&iSh_P*>S`bYS+YuB{z?4Ma7>jHQ?y8nQ= z*@JiaK?_go#h-x7LwXp|k=BxRP)gvZ+m401-vrm>zr!2v>m0k>*Z$ac*^c*^lcUK9 z)|~(jus+ z*rRc&L=>bHz?T}Ahrwmx2fRrYSO$`HvY7OF_?go+NFq4H*S~Tw0L-;t3`wNzwez;zQd)Ob%ff%eNF~9# z@^ezCjI;Nj+rdVfTHkFjitORwI2Bdm6N)OEV86GEmatFOBJN>NA3Z{QczmD3d?n~j za=SMX5sO8GtL;1eDp{RnI{Gp)4k(qSFQ47tm_p?5vS*85?qZy_kdQW$r>j(K3OETv z#cnyyvgew)_M*&h41I#Y@ctC8dN)d!;1+NXp^gKRZCNlDJJG&SF>~r%?ZxE)UzC*)!zW1VOOz|h?Pd-ur{+RlQxv;j= z{uC2nKqCi5ptJJz>-LyC=H3tDYwRdQNcpyu3QrMqlt_g0PdJW9>MfZ zmvr}#XeTGnV9TY+YUC_7gLL*@)I*sp6FRw5VNZw#QMV=n!3ebR!oFKSOe}aK=gFrg z@m@Bz@^Lj9<-!^B(R&JhF|>^4c{SE?SwnnLVPVnee_4`}=j0R<|0vfd$!zq8xvQp5 z1ydt&kjy)*+jju^I6QG)ghs=vqt@&-Q0_8I7CbZEP^lvS$#L+xWEIO-em6tUR)5Pz zBNn>l9a(9*xQ{H01z*myx;4_vUd}MV&Dc3^yX_HJg^wqK5>PJbX8t_pSXN|(5Y^Ax z0QQJL*IU%S$FZ1K%#bT{zR7C>SbH#kg!^Qg43N$xS?w)AcE*o6+E-Yf!tHv%w-2y` zI66oHJ!4A!42t|wxgPoUsBZEXa!S~(8gm!#QB4h#MjGjID~wDfDKpbv2ey~w9=Gxl z6krYjHFwZNE%^%xX;1gex#upiTY2DX z>qqR>aV!*m7w#ITA|KxEeOz{1IX4dsTTgzuzR3665so-6?kl=ql&r;nSr5gN=cim@UGn=@4ww-!J3f?pM)7YUJpLlKgUtTTYIx` znv5_{@@-A7wq9q7A{T_7VMx9b03~zp$+|MTdX8T%zp%K0B2 z9q!jLNNP4~lMD&7*Hn}^wN29pZrBk$mQts?kltSIg|2qG`&=em?(*c!@qISg@te3S)YH-JbI8 z2w%kyKC1#sz!7~me2XzU4BiO|yB{M16ld$WnmRfAkUI;2E(hCLs7e&iXWDEJSW?Pr!cLf27T6=UrbMD?!aw{Vy{_y1Krg z-^K48jJj$t$JDie==ns@Dq_Z_x#P?9)fYrtb+_ci7W^$@xKVKpO$!^Zf@8nO2VPK* z{B2fF8tzKOtrfw|o0!F)Z|S#IL`BysfoJJHdUB$sK$($Vu`YVSwGM$ye}QhzTq zAU5!-Z&4=+8rlX~ho+F)^Z}>dhT8BP6oBnG3)VN*KRr$Ww z7hNhaERb4HC2KS5p)W$nVrj`ZIT>dwQC>RLjz9=&?EuGlo!OFj`6)aS{DKBRfn4@W z)Hb~fCQG0hL=l-#22LxlxEQir7i-8@>AO2;N(-%XAn3R2kN4(yp+^XU=|9nys~z0> znabg68LJW+vjq6+$ttGMfZ5N}16kmrPHsp*yEaf;ThVZ_HteXwIfbvAmX>a-=+CRg zxVsnDR^%6h16(7S9pM;9voLR{(t3Y_nz?U{f;?2^l?aaNcIx=PoTbf;@&@daYpSvh z5ce{WS7?9WY)VtIthT1CVk|I`UCBbX`A{qL@W69fZ^C_71|0wQ!6FuZnyYipbolkp z7s;q0*$)#X6DKDt4>Z&-t^PT`b)DG*Kp=7@-|V0JY1s_(Av>EjOx>IGwBE_Sf|dQr zWkj$5uhX7nNiPX;L?Ila^2dCtWUt(-I}42BqCQOYfJkv)>W|Qo110wt3AeF_i&W1p z;uQAEtK`=A&!xC-tKzgpxg_m;0-P3T#cSRhp8s@#s5|ikhTITw%DN(#n*09Pvb?8o z$<$lZ>b9o#n#%&@&T`{lzOp}RbY2~7s@i?oj`V0@%QFt~Pg5#I20bG9Hk6iS@EcPp zPczT7@5zNV_GkCTa0EZT>BK3jl-NQu1?x%Y6%vnt)Y@izq%Vq;&uL{2h6+nI3c%$T z{_^Mk?=*&~>+@Ffmqmi>nKh(jusT?lZ=)zGq96<(K}AaFIU?fH*=x zs)6R(ja@!;${YB-rhnJ4P2Fm>|9?}(w4IaHeeo+bdGsivb^qip;7Khm_P A?*IS* diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus.png deleted file mode 100644 index 90871e196af99115761021ab06a249b13c5072e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21315 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 VN%RpzqrZQwYO5QlRjSyA{tq2j5D5SP diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-design.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-design.png deleted file mode 100644 index 0d31cdf83443119d722c7782bc062f050f4f7a12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5739 zcmaJ_Wmr^O+omO?a|p#DrG}YdXi;M5?hufeAqNI#gdwB^kuD{r;}DV(N=kPKD%}Ve zbc?`;=RN1V-;eKn`&xUixSsod?se~H?H@ZrS6hXWoRu68506q!RZ0K4SG~TWq$Jl* zF;Z>#bqB!0O|b^Q3h;VdL_4Py; z_-Y&4`MTIi*#qy(amwPPuL)2HtPLj){)uM2pc&C?z! zt*@l~SFY>XJ)k2Ni?el$6wO4hTf}IzkxZJ36#5@pH_Tr)T^k0%*`PsS5z*gU`a4id>;Df$ zq5g@+VD%CI)%$-EV+?)J2#`JkT(Lc=-g^I#NP$FVr*k4{kL835e2v}NF^t#>US$KGKHEK%ohPat# z3yWy(NwZ6BqoXIj+cFItJ5O4yW;426y6b;*dC}!71v3+oO2rY;C=lG`+@lFy>y_o9 zdwwJIeQ>xe5iy%oYHD8}IJ8emJA{5q+N*gXs-@`-v)!0?gaS(`f2f}N9Yg$6lFn82OX5rW?E{%} zYwy;Z759-tM;k1tpS`u8{UzK2opbJ-+Yja-0!i#^p7Oo+O6tfzsFMizMQwe-B==sh zae|`N2YgxPUe06vke`hxIEZ#XlZ#wdazIOga@5!H*txfh@rnh82lt_Q!5V~UufB@8 z63O7@>>)e;d~TIwdq$e{;(h3Gi2!=kIKbFh zLd?sj#2-qi=1Cwil^Z?lA`jITQ1Xoj1Z)5!3haS$K=ZVDP>=wA{5jvd^Q|%td{Qp_ z;>oQ%D}hHLoW#6gpZHb_RK#4K5(?2)IXm`B<7g75H0NW<0@T7|`yX452#b3TO}(R{ znJ^AxZO-YTC$wwE_W7g{Bkzsqt`YONIVJyGrK&}O6vw{eeeY|F4u*={cxoqHvEG@K@G{jv7{!;-W~+^?X0WZvL6@fGt(|FhDQDo# z#Skj}autO4s>h<^i}iwT?VPV^(h6oWFu#L`%9u2852AOJXeUXR`tSroBXjthr$^8w z4!Sqlm!E&Eq^}C+)$o@%Z8v`QRrRE@X$TWH8TtI|>`M&GjY0hVe71-ldLm2_kyXm0 z$nmd4{Hxr-!1DIJ5(4dV>|1`4gqOfxD5aHOja7&G>%AG}5HKJr9u|k9N#%2(U;#bC z;t><6U})f_dUxWzE6L_e)?06x$Sxf!`9`(}C6)S*8-scjVPQV%6bL-{sGjGoFe*!D z*I+sT*)m1j?xH~ODW$sA*Ky(yy+3}E#O4#|+2}cxws;X)C3_^)*51yKR+*;)Tte{a z4)St;68U9H9dlX*zA7u{VyA9A#lqen4CC==XAwNmmDi^0Q>ZP0v<#Iz-~C9a0hO%w zWp#)77H^q7X!zt+P=Q(TN){TP56VsGJ2;BRXCZr_PMmB=Sa;Db#bPGM30u3-ZkCm% z9@^&4P}S-|8E5#NbO1J|5s|*kpFD7tLHrm&(tZiaktr!B_4xh?F*?Ryd9 z>Vzoa#KO#XCrrWzkIwF2*zJcmgo<+!^~vco|}smoMvSjb;Tn zxeESmra7FP#8~@%?Kg*^O*}fXT;kqf@^>Lgf+U3UY5fWxebBLM*w9c>T9T}WwZ<3p zA!>9))>z9c3qxrXkS%dNIVa_Q^r z3;OslIR|R8Em5O}g6M-9A5BTrvvZk}Te)c_BY&JZ-s`Z{Pmr#H`CC>#)hR9)sbse*v{zV$ME=|Lg~1Z<=GpVP5f}-vU+4B zLfDtUOFuDr<`O@Um4>JWcV(i^F-_ItoCO@N2Prl3-^#XX&%T-j_#aVZcioorCoQws zl9Sv|&n#Zfe3P1&exr+(ozfU zT-NJ=<4epqwTc^M5Ne1S8EWz&$}=y#1FZ~dZHzb*F;&ZNpCtR_eA90eP~qC03OW=O zmkFcK4kVyIm>3hgn9Va71r$wo2FC>w9h|4o>eZRI;0bSEppbfO`KuK=A&c9 z^$478u-;c)eoq}dd_&@3gpy2%gSt1rJ)VJ7ryOeKS7r5{@9w#lZ#&()a+vL}k=2uB z3L?%G0qZT~q!fiq21;n#qHEC;%I#IC@a$&EkslJ*_D7LovquGmfrwdlpYm?c)aby? z5CovKnK^_yR(}^?L>2SO4cj><^V{98qp0o(0vvuOV* zyG)hsr1m1;P~&Jpr^mL@1J=~A(kyR#QkRH>=RAgwut8=&Wk#hsjH zS1Tlgpsh6mIj`EFY6^lA;qN}?&Wztqbd=@cH%m7Q08oonVCgcx_p@rb4sCb0=6i$5 z-S%aF%5%Fcw}OFd`$~}%IYK%}-`aq9;!Q9R-S<<0Ks!i_YWK~Xhx2=+8+{VlStLxG zJQCw(wPZ*I&UGgYmzr8FL25$^_TfTzr?*&qO*W1R^EP(u(zGA2;+blrRa6yOG5{#evmEkx2@e1r69}_BZ^G9#PG|Jdg(@ozS zV2E9@wrp#1#uBIE=D1vob^=r@Iu1P%9?`u$6$$nod7&bHSe-V^q&~(qz%0qfz3rv< zqF=D=sn>pwN>y44ZHDW~Vx2cbsA1g=(Ko#W-j+E_Q_tyBf}|o{P456YyNWCbUVD1j zn&02+RoJ2L_Y-LS+=r(xt{l1tiKoXp*9%5+AA|*+M>&MZu!ZW+o=}@855;HOD3X5) ztUoScN)3+4wl=+0Nc4evpD3L*TX3|DWr3pFjoakot;KEj`DCiHfSQ1lpYiC#P!{D9 zjvt60tsf;X`+MtZccw`32h2JpVNt(Au@%s?6d}ZG&p9EBI^kL7n|3U73}bUHx6qY< zwY=zqFoOHy0FyaXtZ2FfFXO(Se`#pGkqKLpyq4~=MZn#rhx3TUwFwM7#ZA>s?;I?r zN%rvp`|$CMT_EhNP@Y?R+>>!b<9NE{_!NEiSOCFv0Bgae79!}`) z_>ytZ+qQNp_swVB%3O6-A44jdKZV9^77lp8n|F2bAf}~6-XmPMW1rSCL3w}a2W>VP z^3{UaN^QJztn1#Eo1N%1!7`$VH0nxgj!n_M0f}DNi2IBm#o4(oO%re-hU zLN$QliH&_MyIARg8ClJA^pd+P&nbW-+k=1sB4QpznPu4&IcjLotaEVrbPvw%`r(&} zej^_3OwSMJz5~rX#Jnty!?DC5_tM)BIKY17Be(jIb@z4*gHEy0FW0&V2|wbYTc+=u zc2F~}h)gCg9Vw-EkbzgVCr`O0Ew_p`KiKmJQ03EXAd|<^Kr7qkfW`ZZ@55q9L@h>F zO>}U`CYy;Y3+%1wb4>FgOEx`3oPLS5VBi%lN}>Amx24@vB4>(&x4N$R>M#vo%hzL% zo*%Gaypq_hCDoy$VcLaXl+1Oxs~KnZMcTgKTy=`(|C&4L%Be|LY84dwT*9XVdDh%< zSg4$Vzr{Ka;%SOrdf>b7S@WZEOhem`?6X9@t}r7lf{Y+UfAXGEOYBit!Fd7ATl*&g zqX}y9b(9Outkx@!)AKD|Ufqty;=*j6GcUL-eXtGb{z6=q6Qg~j+-s7q_}C|>I}O}s zoObkSQi5&DwfFNM)gPn_F>bc(b}z?(=Pv{OIqvTmR#!eOP?=$?75t&PwDFQMq4fj) z3lEOE`WTHw3T=gI*8$(!l9O+_&N$ zE;>qu&XTRvKV0b=a_E5{_e9qmYU1oa6;i8=rxylXM6B$jXg3BHbeI7-2f6!QJ`h~4 zcQCT|o8w+vbsypwW86Xr`demPR?nhPU0+ylaX+xOc3A@Lh^!`*u#SY&s$)5%Q$$v7 z2A}sRlhy4#mE280Fl=gzeUYlqrKk`bW}?lcRedtVR7%UY#ltlFtx!_0^3i?x!Z88y zNYcy1!)5dL@;6R@X?~zuP&QY{!kmkm2-@zvl@DLD5>omMcdVn7^Bx5vPj-6!Q*GDL z(N9)cwVaCb26dNO(uuyUo^W)nOc7w4!h~Wi+tzVpj3Y}G&Y^r8k;Wkyw!5iAbaf3G zBwGulMw&PsR^G)a)m?-1sm2%X1Qu=8TOMr?llqc4_sXvN1pHPQ4!X5MO4u77XXq0b zFOWWMs0JH5-FwM9{Z(MQQb5)_H`s5xVrA11z*c`J37I*L3ut-DEK;5;6kA+b&||n~ zR#Tl0#f6O~y_Y=1Q)}iA7}G3#G^oZ!sLEqi-|PrZaX5Ajt2s6-&G5z z`@?14`pK4j6{CKpcecRdh1;7Gk@#BU(S#qBw1~K8gQZqhjt3}-$p~f0?Hm$~<%GTNa66T7v^i~;d zm_PcJ?3|Jl*AjW;YFF&i@}^*Z6c95&4dG?HOH1&O6JSCx{_o+xtwEkP&lNPAF^w)g<14*G zuFpo@S34W`4){5Duv2k0V;5bJaMjT}nO9K7H%v%-qweLp(G7$k`%10ah-o-+^Wt+o zXNgTBKK`w=-XHcHdUNZKgUjQ^OPtG6OlZW!Kdf)O`_huSVP7fUI2*7AWao*YV|3v> z6bDJKwe$$UU%B%>r=UL_U6eEK$T0xOEW~6tOvAdHRxz!_t+>Xmi$PH9<>b}A)kXua zAe`eUuxmwxIh+5OFr`QR-XX)g)FhL_;-JF93oOH|+r#MmzPWk|W5YbUx7m=oCQG6( zrAED8We6i|2z^#sX7BpvX9*;_9`vEB-E$_-SmnF5lQp`y>XP(LKL5=H?O?+fV@PSq#I;UhImaIuW9;{4c}*$ e{VFy8Ddpz&=<2&EJ*4`_w`@WxNJ?mb7cKAbWRZ=1bA}lN{Qgt;Yy_;VB<`pBryZOqQ z*}2?w^k`*c^drPmG{y=E!;-f}Si^woE>?ChJ(!iPms<}^3JVKI$3fp1ZLFmUwL!S> zTm8oHd%C#Zu(7bDWIbK2Y@A?dpf$|S0WJ;NZfFJp9c-mRMj~2ZEmuXDy@Q%J686Yj zTi?dp$wtB!Br5}y@`T<9xWLd>Ku;HEI11`14f;zLdNcmLEC2%j1wlJWgZ`70vDQPN zA_55mitr2Z*?f-Vb z8im$_{WstLQy8W19lQ50sBXjslW^WsF8L^#0tvEcoVSD%*yJ_g<)Ne|S_ceo4G8XMIM6%5VG zQiN<)I)n}m%K|7V@R=0mx!m5QBv5t5kteW<*CTp)nOL4S>FWAN1Zym9*8p;IyyOZ;p5?nXAJQ; z>S*e!TI~=l?Hf~226%PK_gYB=edolke0F`618ztaP9(ZYVW)BDm*dW>jEE9QQ;T2l-5&^pLZMAOQaDsK z6(Os+sUXVp2P9mdRp*+US2Z0z73lxWuiYOxR|Z;4UM043U`$uf@D>(aSL2m0X;7W4 z$qL|kZTQUIa?OHwQC3OGW+~BBgnZVfPW09GhgiS!`bE!Qv9uca!C0o(m(Q*|F85&R zl48Y|V<4ciuHUiNc$3>&4$I`QD~aeALZMss?3!_mL_BkiUa0+Qm$@U_Cpzr$4P?wR z7p6{58~M*I2uyB;gME(zeZ(>&geOO;+&3meMxv;A+gA4p>#NsBy6#={r`LFd2jhQl z*qAK2-Nz3UaOvY7H}IIdT>7y}w0U@Na4?Tq^dlZjm$Wk+2qn@BxK-JO(&y-x7%iXa!EMjl7lVkV)5MTl z*&Z0o@c>mq)w8Sdyy_2(ADAyzro%BF&ew#1O3dJVRH$FMy)M>^YP;J^oJ^wBWOv>s zk-e)>#T*_#+ewFM+}qk(Fro&(;$IJvlWw^!P<6lNhmWY=*W1m9C-Kcv$P3mLy`}F) z2CL-Gv;N^*a?_kJWFo1+r^M;X^LA&hx3b=shgFZOiLa+8M6QmaEI3pR_!N&>xQPWr z2Gky+nm0BzJecbUcBExD!Zk2alV|M>fArmLGmRn_f6B9_>Ev zITVxj1uIDXnpvJ-9Zk*tq}-+6eszM`pvU)6x6 zidHp4k2&Z42u_SgMqi8SVh%oC%u7yO*R8*SxxC$Q$`eGSQL}Rq#Po+xN?+^fg!(^Q zkNXv3?l?3hc6o^AsXN9OKscGz9QBbY++${H+8LV=lQpe9R)AET*AJCkfs9g+N3x5j z+lcD^Cr{|o6doURH=IBINYR73G3STqg(f8Fz^l<5o4g9=^;2fq<1QZG!n0w`JfILx z5B28DoRO0i;vwOMi3L`H1f`^&>N63iE#r#`{HvC|yu%?+D+DJjo%A@P*lFh@@KoLV zblbh{M9qzY$V~QZ<#40MsDmJ+M(ZBwJ8kHgOC7$$x0OW!eiJuF05@T2an z?Q!Y+f!x9Q;^oxYMxp@FmABtlKiKeAnZI+wI`@9nAWrAD97wO!Wnq6KbAzbDASBFs z+x^en*IiNfe510MLxtIcNLoZXRgBiz|kCojJ!zD8>PH`yE? znLZ;&Q{TH=X8kI^{Lmogmq6?wNh!XqsK>7TZr7g<7vzS=+`kmu=hyN>HE4j8q?ofV zzmMj+EB3RO4UUb<3Dn5dnThb8t3_*~6S+UZ{4Q)qd6)D_OMXq|Gc!t=ohR)r>ldy( zK~(8}>;>GMZ^+sPtuhVxPEIF^+Dq(|h#02%v{}!8()PWby&L7J_|z-nUb$Y@ z5P>yA$25#bd4B`nGZLT6suNlF-jjoyAP3 zR=rPw1inqgd-$IN?SvmPF|!_D5Y?uHwX`I)h`Y0I&HU`=RwH`a6VKJxx}PM3V- zQSQjZUd0e=Yb&Ju<5KqEMydbi1TD_{`k6<;=+k>UK$tk1MxWLG2mzG?ZmGih_3ysr4ci8wGOdcS*`DV+>i`!|*@Y z>VsSI6w z{aJiIBf*DZU3Z1plNks(f81gmkEUKiAg}^obFDoR9nC`!gwPtyh`W)H%Hlaz-pw5* zv>%yd>>6TA8$XxW`A$BL21GIi(G}wSD3#Ac;f{3x$+4`+@#*b}X>f|<4JVXoPE4Wj z4*q7LKCifosa4jlZ+ZE$G9bZh3G;J3{dyr~^W0z3GIUmy&zR637}8)u;67 zjEu#D(r*VuGuV>ay=y)hMj+M6!cPd2*SeZqS-_b@UTippYTYN(JFiQfyQ630_#9hq zGr6k<1orF7kuKK-n%d&+c;0(oMGn@Y6yd^mZdEG70|TaH8XZrK5A3xQZXwmp7nw6l+5M^Gs#jx*UWC zXHK*wjHNW@+uQ0LeRDFhF%fhojXt87SXtdz;=q3{o!t!|A0O2rwb0?z)*sNny5m~a>Zj$C;qRn;3GHg` zD$(rmSHX7;=vDk=3DEbIm*3*4Pty@(lF|EerS}8{0}ItSApP<<)DJ|!7qOG?_p>Q* z<;WyC%>naajP!)yT$U3^1`B5gL$OY)he_GzyASzif)AgQ1IKxv0j2CH&C8Gyf%WSh zUvNV>w91)~=N{HwA_V3>JPRG`MMFAILd!DOXc!!o!MOeUM{qe@?g>z)yqUIUcOc%CK^NuE#B zDt|{e`1$zlt_kuGAHlm()QQ4mch#cFI9fOzdwj$RG~Jrl$Su1W_-*ABU3zn9pAt|J zvesn=RT{CMHzL_ml;+Fvyj}LuD(o`aG$?Ylul7VcnEAl0S{mFEu1EPJew_09Bc8+zJ6oiXm^0!knS$LgtCVv~URXT2Vwc=ApP*Hh#Hf!N)dKNV|Q2FEHp8No<- z$Ye)BV7TsJYfQ0ig*|0F9wAadLh_J^UO|C3&{a+^xUv%`nxz|H@@+KtZHzg<*G)bq zISl?Gn?H8$8x^*iLIHttN-(n~)$DL(g4^1Zc=@WJDq-E!2xnjrciUldyCwc^8YnuP z1f>1G)%zj%Y#PT;{A(k9i1Z4*YPQ0L{u<;Rhq3-Mxj{4AwIBSb|UGRVv8()83)!JT%5 zkLKlGxw3BdU`2;Y<^;dz^7Px`4O%%i4uZ4OE0Q3`=%RD@XM)b!!wo8xf=Sq1vaAm? zV*&`bg1F~j)jwqc%FKUK-JXfo5RE9Ko3D-S8-%LSr5m{WLLYksvTyp696*r?0U1Zj=4TPH7}mf&rhd6QoZhuruFSA4(BM@%t~tJ|+d zb_R&>#aJ2~^w61n-j^r{H`P#eU)*>1(|(>B=M=wMUQlQnNB%O8>UBO3ylJ@}R>c^L z*3M3iS~HlnflSybuep+ zEu%@kX%j8YcHxeJ5ry3n+(5ThFGh;YHB!_dSV>n$+(TrL`#LqYVPJ`vzo_;;wud{N z#hWApt)P@k0?eS?w`4-2E>?^~dEti$1-v%9JM*rt)rdvy=3hm0KMD8W#r5*Lr5mlo zBYwTV&!pid8>+vOmohyosw zbC64Rj`e_*Olb@ru*D9+!1W=89#GTGhJ+28u$h3F7Na1mj=G9P~x%lWTDRDl6SOeKKS=Y?tBxM=H1jdA- z_Yc#ut!b%?-X|-cEA-HA=5wp0K+=yR<^(m)biXuz^QWC_=dg;`#4%1`bp(~M0}82l zi!|*9AjiFd67w5l4*5*tl-T;w%Cv4H?A@XoltrV>vFSe%PCRvDV_N#2rPCO4n<(erogO48Ud_uYq~^45ljbP2sE8@N141EcW+{t|b@b RroaC~sw-fIxr{LJuOKl!Nq04GAGgkuIVjQUw7K5u_NZNKp_4 zq>56cNR=j_w9ti6e0c8h-1p<2yT7&fD&H7m&NbFte|DU?nE@-4022TJU^Oz-vpDS) zPhV9A`qQu37C-fA$4^Ar5G`@nh=I-o3;^MVbHMc2D;73EG5a{j@-MCTwmUw_fx z3VIlSSAr*==!x?M{!(;y!37ZEpwmqMy#*}(Z&_dezic`+Od-e_uK5v*`HpWiN;d*FyT ze-9iUh_r+PB_T@k;6Kd+D}hzyvGU3gmA|}HQUI&K6d^D$__Rp@fs$xvS5MzxT&X|B z(P)^FuRqb**A-)=2M3*ollSy=gXuxl)DaLpq`E3t2?9Yubk&q}5sKr+|2Y@LKkEI(b^GUB zbpMg7aGH$5uPXR|Rq=c2wA6kL|E}@V$=|mG<9m8F2&Z>IU!aK<0642;q=&Ey8XvM{ z#9J*0|9tB`{iSg%=V6QvgAd?UEBaNw;-_5u-vA+1+WfgOVO92pt5q4$Ht9*5=u{t?Ij@fZTPoR?nUU z$mE=sALX87VDG{H<4By|YrK09yFB?7ea8Kr0rD#Vpdzb5S8i5odo z0oNctsYETsxFV20{SIF~u|2SFv0h)ze48oH21RJ?&ygc$H#od?zgGjNBvOCycW8DF zeE&LG;d4zbS7pi^1jEO>%a-yjiH8YAe7^6uVCfUs2C;{O|2mZcvr{ zbKA2Gzbv}k5(Wokql8*^wBr*JjKBJOeG6S#4<{eQj*odj(8*3FL!oonU~HrfVXMyO zI~-kE6WtC1fw*%GQib}AzQDS@dFB;g($ zKHA^a`25BiBdjfII-Mlo!P}gLLD2+8rSCUOFGe>XM!7O0z8*DKhj(ia zg?VlK2oxR*e}e$FAfWZ%EaLJcw2^|6vUeFREPpmg6UiklO1%St34)sFR~5ZqP_2UO zIw`Bo{=V#4K0@1(?*31nV_5JRDL@9)3?YQ5;6Y}&p4fC~70_8uPG1jOON?7ssy_BT zBX%D+YRG3FN}afx0u`CKuy%W_ZzpK!K}8CWOmbVjBx5BYdqyXD%xV6v&W!P_&%8am zkao;bj(YNnG)*O(t?a&-aRywZ`b8|lY;!a(EWh@o>OE;ze}h6hGl1Ys1(A>X{UQcG zTH4iVzh(I37jYmk7TM!nzs=6MIzufo+6FQ&e1gAZ$AUDG0D1T`TBaf2Z$o2m>zvoS z`>*J!8y()eD&&z#ffD|IX~|t7M>q{KmS}Xg#In*ZFL$YUyB%kwzthrguq@}(63rcW zy2|hzT^%*Cj&hW2Efk_(+w9CMbK+)T$adXPP7tr0fWK4xrj?+@3GdI|-w--#Hyu@c z{R(Pz;ssa5l+MYXec~yeT-XrSy(Y$U$m72EvGK}BJBsmMXB6YNk}NGj4xlnPWscC#ME1~GEPAOpmBRO2US61rq1uUS<}2S zgpO0=t?_!m)c)>4S$8tYw?8=xpI^uME&xi&rlFyG)GILD!b9o0af2isksy{Mzi~Yl z!LKp6sX2dyjH!?8AIekv8gp$yPWG^C*|33*CIAa`)piw4hy8BiEm{dYbIx?+^-!hxd!esj>z!>#fbn~H)Ukb$%lnFE0MD7 z4VC7d9Fb4;X5ewAEDz6t$N+{YL7$8+@ zznnaTUO3;==Hmg7)kK@_6GGF3BqRmeTxrE%9kzE2g<`k^@0T1&COmu){%nM&m}o>{ zCA1iid3O z`UXsSjnAMDvP0xh$XlG38rH6&z2d&_u{PL{jABaqj}vrRICm}(olCkX)G0*G2kd@J z1R9i}sH7EFKWm~^2N<5M@+cwSwMf2?uU(kuGGoD@B+xsPn?o;J$BZbEYX%i7zISfp2;rLrNw?pIiGZ2FGH)b07h}Lr_NgXbOpAC>~80A zy)*23hxA0^rhTWXSe*|o+5lT886`_wyAE8yvugJ3P8Yk( zi2UYQ&sqoBBd8nhCGgg_Re7Z~$n>U?M7r(dtikm?I~*OgY)&6%UR5(AlQrP%a~AoU zBPL^d7p_~R!V8=|{N4A^aSILaFC*88%(r0mvVwMTE|y=0@PN?Zi#NGTZ&!^|%Pom! z3Z(M{1dQ|W-g{vjKC-#!pF$QMeHe7BlPT%N4oBKEk~TA`Keoqk4soYV0K(nGQ2f)M z9yZ`uqStQhZeE?v?ZhL9_?qe3j)NrLWq`Dqf0Y zX&|Sa>P2ecEgO) zCAwt~%KOsT1H;8-%LItnIV31W?W@-=_}#I)$1_%Js^-lVa3xXK%rN$`Hpy96;`3_^ zEcFk{@S1LzI&b~mH^K48>AUreCBY@JNO*3D)QAGcg_&Axqj9l{r1$` zQM2{UT>zhTTt(HCJ<&*FqgA-{c4=yCG#=qtM z4z8=Ec!_-5&7jAugl#`~cD$w9)-m2TA(2E{+Sf|B+G>}S?J(v0{a8?-wqkL66nU|p zd=xk{6(s*?i? zf2eM!tg0$00^gXzJTCUj?u}A7phiT$q+hPYLqSmn`k?W_ z!8_-e)3#S~nG$`Z}+^UYe&YY z`zly_aoDOgXunz5mCz0RQJrqEugsYh`Qv)-cL9I8wogfxDyaN5ffvWST?kFBX4DBRwS;wTn{=mj@HmoNAR>OFXv&WPP%K{GhL{{O4sXb*jeTqf)k;S{Bk4|LngI;=*~Bdz SyY+tke=$Ot=~d`DMgJejDi;6% diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/ics-android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/ics-android.png deleted file mode 100644 index be62ca85865b82a013e4bd0bc6bdfa7b39608886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15002 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-large.png deleted file mode 100755 index 986053c65a9940f6988d10d2550bbe93327c31e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5522 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 UvVgzveEK4?M2tk~UR$Nu82%!>3LLww_ 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 diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-small.png deleted file mode 100644 index cc5f1fa02a882e71a0fb1a4f67d24f3a3126de2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3424 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 RK3d5bYD(JR8b!;H{{szhA#eZy diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-small.png deleted file mode 100644 index fa1201c432944b4c30b945b96354c5b3097ac661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3134 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 O0000WFvb`|2qqeZ_=g5G@$rv@m=FOC zYJ$Af;1#U$Xt6Ka>y=!4*So$%#+lvO-PuQ>E#Yo^oq-{@vk!JZ`HjWG13c2f0*=A_M30bY`XyILDFAhqJ-gUn1qm|dgzvM@U zJ6zh?YLJc1>wKX9KKJtQ^7*g+NEY`nYZsu$a%7$1le@3<9P)MdpUVe?tiejavHU}U zkK|Rw-ny>x!i`;d*-PJK(j!0{b@}h^uXnWc9Pvel{>hPtxN}2@8{)_!ZA>0T;LcnS zExqrlu0@5LcG?BDU80V46mp>LLHP z@g6KMc^Ulq_0kZ%Va=g$eN^w6bDj2}Up&{cyDBnFSfo6Vf4RPI?;cBvb8$d zpqGXQ8a+mivPEKU5b2^0tk6VbPE@u^{x=j2c#>WJNH%DHbg0dxQwjwT(o@6?KK+Aq zlEH;}ik9=UfczaC31wKM@6$@7e@fv0Me89uQynx-tJktH>y!nMFWvzt^A>;S61o;np0*!O`q*V5mcLP8gfR z2a|KOTIOzo@rJ075$7P~a~b(J>QMHfj+Gg}J4y@YZ+$(nj%zL!B7KHODkKHkKa@uNdG*j7`o01MYW7o_x43M>KP3?rmP;xWKg+Ko}$j`1~YcVX$TgOVINOO874M$ws ze*5NiExgT5OC{+rIV=6TnGP4^S5NK@W__THL;cnA#NBD$pd6vTs#oi|%YnF8;{pHyj-9v!7ioJ01 z^4rkfNAr=l%sxXYK%tb>Xl$OYWU;yT5X^S^p{(#3X@~+E7-{FEWdkgm|BAE}8ElhF zsf>>^BOkKT^PsVFAB#3*E2eF>^L}U#ABUqCw!o8B2hDeWtY?x_9<(KU`AR$bPO6|K zD`fYBTIWNhuR&ACSMW#2J~`^3F)#yEU9P_ zy@VFro0SVsPs<^ZLZvP!2u5U(6zsVc7p(HX2IYnIFnTkts>RyMPo?mVH%|(#z+Iyz zEXr|M3ub2)4X1(Q7Of)EZ3;arLmGW$5O?jfnCUFV>ze(_*J+P{FZ?HNE+I>;snHo zJ9JDn?X{>?=vZRSijk@Cue1Op;5nhKGDF(h!pERHdRDd2qZhUk3vSarszO%fQEVpvA?v2Qu^x&IPi>6xxt9HGXbjgXW7xcs#_pl-s7H(`;+W3ScxI#{64NNPwP@MJqq<6cs6O@kI4z zdOE|~Xfqn;#%P?|3yZ!BZ-{Jd&2|OdOv1L#;yHC)O5C={x9J*KzwH@VYos;%y2 z^~6{+(aue$&du{YpPwDnEkP-SR@ximXPM1r#j(nLQI=gocdx_vJ_$Rp5|BMcXn|Rb zEQWVD>As3^BxI0KBQryrh@S880S_2);+-A3#D{NC5zhE8f}5tO8_%UF z7SFAxy7l9ym&TD%7u%w(bC?#C@87WN_2Y$kT}EwO~gfp z2?biHc$O{eJKi z^$Slx;`pAUUj(Gg39)$@cfX%OQFOPcfiax(-*&mC#e7yQNL`ma+rd@xZ#;bAel%Q# W*?d-RXz>$oB~&}8Qc|v^J>3AWO*U`< diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg deleted file mode 100755 index 1aa12b6a10907d4b175d8449c3e7017b8be1b0e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1021 zcmex=i3*BJ!6k`h{6D}T z$iZO5V8qNQ$iO7X$SlbC{|JK&0|O%~12Y2>U}9lqV`pUM0LtnLFfcJPg8?f<1tSwP z0}HF5kRqF~p_1c7k-$mHP9a9diG@u-*+$iGcRCqAx|1Aa{pb<=h%z_N|3}1a20t9#7Iof7+w)aZUS`BTf z<9`nypZamx{Hn`mPq!L;wyU+Ak&}BlvZpQRj<4zZG}eGcNw;RoR4SIpgxb!Zo_g_i z-{R}5IVYFCl;mPqz{M!6yeBotSy*03gQfq3VBoCWf+|)sx%qp}KF`zpl;b;fOPk2! z{NgQTzuc|#7SDRVu-Rtzoi$%vUw>c!kT+-NA|<6o8XD>E|c{xdvVwEpDl^xZPv$K6u$*L_?o`=Rdd z?%ewdR-5LtOn&ln-Rw>Jb6#KhzT>O9P~F}jM+XtMnCs>0`ZMZY=V{to&A)Z0raD~c z?ey;K+kf_Xb@Z>>`_El+Hd@UO7N}fjzQs^6^p)U~ zFCiED795GZ@s*`4fJq_m-h#RQD?Xofw-ytrb{o*DyIAMfl&N28NOs)~!YHOycQZM{v1!#^!YF3f-QZ^Q zME5RO?2yzp*XbQLlDDQpI5xe*2DQy~(>CS;&zf6_IJt~zWK1|VXU#3sHs%74YJZnO zH3;cgI#-vB2USL%X6{)_J1bYG$ArKl29~InH4jy-ydkN)zCp!t;~nk2Z2-LfkPH7o zdw;Xeua$N3DCEKR-ZsLq5ssZSFu|lwA%STR>3Hug>f{c|A}BQ^i{SrpYo4sUz(PY3 zL^0Lz)CEy&+-zE%(nE6EAM$CuZ=Lps#sa6+Dg7n6@E;28`tzux?Lql;pTGYue2)}m zvTYd;iPs;pf9Ypp`b9MhXk$ZLjn5i-Mnk0Mf86Iy`o}#4gs$-yM7Rcc fyog*iLcse2i|72WpOvWp00000NkvXXu0mjf6^A!% diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg deleted file mode 100755 index f8c11658b139100370b1e816498a455bfff0f278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1192 zcmex=i3*BJ!6k`h{6D}T z$ibk;pv}xE$iO7X$SlbC{|JLL10w?yGb1Ad9I&&pF|%+mG65y61sE8anOK-vSUEW% z@{CN(EDWq{fSbhQU<1l&34#q~VPl3{3p82KkVQyXkyXhtkxeYHapA+DjR*hVV&Gv0x=@f=kiniI zcWUkai1qKvzH0u+*O;>S>eJ^N^B4Mi{meAn{BU`!?~VQI4urMNs{ME6?u_$#Q{5{v z^QZrLGGFn+e}=BN{(YT_SJrF&iqV>CzVYqXsclnbw_RyqYHp0`yQg0GI7a;A$y-|% zsoFZ8@k`v}dwc21l`BFj`gCb8)qk8tJ$IW#KQ22atmprcq5Lbad+`jGpA)o~ zw)BwjyWxhvbEEv7Ts^Wx$**ncZ^Q|G#Qd+PBi%Jo8tD$1MHVxC7k zU0IvicdyCM*+Arz$Bl69)7jHz{Bo}bq#Y}B zIIglh_ej*3SeG67pP{Jtp}YDn8*fjQKUwZEYqzoN=(#0*Y`e=sMa^gGyV#t|E@e%N znEBmoN6_cq$1^xRPwFjwVqvv>($dtA9&08YJ6`x}sTTi_n=jVH*X4hRU3R!II70v6 z$-{kdx0C+0Y6%~nCMFgj@KD)nikrK>R`F`zmTgn-yjT$^(azg3@z^xwZPR8+KA$9D zvb^|>sA5F;(Hjv#O4D9N1#RT{H1!pqwu+)9(^B=r1#=pHz5Ez{!)42NZ5iD!?{0qk z&oI5H&zn*9T;ocw=6_~Y+T!x9$icrLVRlrqd(FvstZjnBlq!|$DU z90mbyw{&7>LyYF~*azk~=#PXfzt7@+7c+!4#i3*BJ!6k`h{6D}T z$iX1VAj!-q$iO7X$SlbC{|JKw0|PT7BLfm(Wn<@H0?L>OFfgz(F*CFC!Xz1)m|0jE z1lfcXg+&b6Ma7iN90SFTLJEtD8z)ZMbnxOspe}Ks&r!_-YGMFN$O0{8Vq!+NijhfB z$dFmsQStvR1|FaclOVGogFS<)wY9dg*3;9|wIrSeT;n-BW$C_FjdF&tBR#oOPR#Rv zaOWY5%GJPY-xk~M?BSMRw)44TTPkjzIz?2dZPO;-7{SBkUQ0G5&uG_ddth3nm}-71 zPVs~Li+@+FF4i6MlUgk|<%XOqW5E$Ivk#pYB9C8$MoqMAX+09b3*sxdDrB_7X z_}w*MpIbRa-)EF^vrAudFUt;ft2~nBBo~>N;&S4+@QP{45{Ie_?V|(sw`TYLN|{{z!TDI`mQNu6$raabWS?tX2 zRA|3o_OtlAG8Z-^@&)~Nl6x|LmQ9to+EJ^82G2O(TFYnDU0iI-C9Sh{&V~B_Hv!9h Bzn}mB diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_guidelines_logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_guidelines_logo.png deleted file mode 100644 index 9362c8f5263af9028a601e36704bcbbc040dfaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44163 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