Merge "PRODUCT_PACKAGES: add to tune2fs."
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 19cb651..a3b5f3c 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -354,7 +354,7 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/default.prop)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/default.prop)
 
-# Change PLATFORM_VERSION from MNC to M
+# New York, New York!
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
@@ -364,16 +364,19 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
 
-# 23 is becoming more alive!!!
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
+
+# Change PLATFORM_VERSION from NYC to N
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*)
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*)
 
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop)
-
 # $(PRODUCT_OUT)/recovery/root/sdcard goes from symlink to folder.
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/sdcard)
 
+$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/previous_overlays.txt)
+$(call add-clean-step, rm -rf $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/current_packages.txt)
+
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/core/Makefile b/core/Makefile
index 1d13e7e..a1d483b 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -386,20 +386,6 @@
 endif
 
 # -----------------------------------------------------------------
-# module info file
-ifdef CREATE_MODULE_INFO_FILE
-  MODULE_INFO_FILE := $(PRODUCT_OUT)/module-info.txt
-  $(info Generating $(MODULE_INFO_FILE)...)
-  $(shell rm -f $(MODULE_INFO_FILE))
-  $(foreach m,$(ALL_MODULES), \
-    $(shell echo "NAME=\"$(m)\"" \
-	"PATH=\"$(strip $(ALL_MODULES.$(m).PATH))\"" \
-	"TAGS=\"$(strip $(filter-out _%,$(ALL_MODULES.$(m).TAGS)))\"" \
-	"BUILT=\"$(strip $(ALL_MODULES.$(m).BUILT))\"" \
-	"INSTALLED=\"$(strip $(ALL_MODULES.$(m).INSTALLED))\"" >> $(MODULE_INFO_FILE)))
-endif
-
-# -----------------------------------------------------------------
 # build system stats
 BUILD_SYSTEM_STATS := $(PRODUCT_OUT)/build_system_stats.txt
 $(BUILD_SYSTEM_STATS):
@@ -409,7 +395,22 @@
 $(call dist-for-goals,droidcore,$(BUILD_SYSTEM_STATS))
 
 # -----------------------------------------------------------------
+# Modules ready to be converted to Soong, ordered by how many
+# modules depend on them.
+SOONG_CONV := $(sort $(SOONG_CONV))
+SOONG_CONV_DATA := $(call intermediates-dir-for,PACKAGING,soong_conversion)/soong_conv_data
+$(SOONG_CONV_DATA):
+	@rm -f $@
+	@$(foreach s,$(SOONG_CONV),echo "$(s),$(sort $(SOONG_CONV.$(s).PROBLEMS)),$(sort $(filter-out $(SOONG_ALREADY_CONV),$(SOONG_CONV.$(s).DEPS)))" >>$@;)
 
+SOONG_TO_CONVERT_SCRIPT := build/tools/soong_to_convert.py
+SOONG_TO_CONVERT := $(PRODUCT_OUT)/soong_to_convert.txt
+$(SOONG_TO_CONVERT): $(SOONG_CONV_DATA) $(SOONG_TO_CONVERT_SCRIPT)
+	@rm -f $@
+	$(hide) $(SOONG_TO_CONVERT_SCRIPT) $< >$@
+$(call dist-for-goals,droidcore,$(SOONG_TO_CONVERT))
+
+# -----------------------------------------------------------------
 # The dev key is used to sign this package, and as the key required
 # for future OTA packages installed by this system.  Actual product
 # deliverables will be re-signed by hand.  We expect this file to
@@ -515,39 +516,16 @@
 	$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \
 	--kernel $(INSTALLED_KERNEL_TARGET)
 
-INTERNAL_BVBTOOL_MAKE_BOOT_IMAGE_ARGS := \
-	--kernel $(INSTALLED_KERNEL_TARGET) \
-	--rootfs_with_hashes $(PRODUCT_OUT)/system.img
-
-ifdef BOARD_BVB_ROLLBACK_INDEX
-INTERNAL_BVBTOOL_MAKE_BOOT_IMAGE_ARGS += \
-	--rollback_index $(BOARD_BVB_ROLLBACK_INDEX)
-endif
-
-ifndef BOARD_BVB_KEY_PATH
-# If key path isn't specified, use the 4096-bit test key.
-INTERNAL_BVBTOOL_SIGN_BOOT_IMAGE_ARGS := --algorithm SHA256_RSA4096 \
-	--key external/bvb/test/testkey_rsa4096.pem
-else
-INTERNAL_BVBTOOL_SIGN_BOOT_IMAGE_ARGS := \
-	--algorithm $(BOARD_BVB_ALGORITHM) --key $(BOARD_BVB_KEY_PATH)
-endif
-
-
 ifneq ($(BOARD_BUILD_SYSTEM_ROOT_IMAGE),true)
 INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET)
-INTERNAL_BVBTOOL_MAKE_BOOT_IMAGE_ARGS += --initrd $(INSTALLED_RAMDISK_TARGET)
 endif
 
-
 INTERNAL_BOOTIMAGE_FILES := $(filter-out --%,$(INTERNAL_BOOTIMAGE_ARGS))
 
-BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
 ifdef BOARD_KERNEL_BASE
   INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
 endif
 
-BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
 ifdef BOARD_KERNEL_PAGESIZE
   INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
 endif
@@ -559,9 +537,9 @@
 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)"
+INTERNAL_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID))
+ifdef INTERNAL_KERNEL_CMDLINE
+INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
 endif
 
 INTERNAL_MKBOOTIMG_VERSION_ARGS := \
@@ -577,28 +555,35 @@
 endif
 endif
 
-ifeq ($(BOARD_BVB_ENABLE),true)
-
-$(INSTALLED_BOOTIMAGE_TARGET): $(BVBTOOL) $(INTERNAL_BOOTIMAGE_FILES) $(PRODUCT_OUT)/system.img
-	$(call pretty,"Target boot image: $@")
-	$(hide) $(BVBTOOL) make_boot_image $(INTERNAL_BVBTOOL_MAKE_BOOT_IMAGE_ARGS) $(BOARD_BVB_MAKE_BOOT_IMAGE_ARGS) --output $@
-	$(hide) $(BVBTOOL) sign_boot_image $(INTERNAL_BVBTOOL_SIGN_BOOT_IMAGE_ARGS) $(BOARD_BVB_SIGN_BOOT_IMAGE_ARGS) --image $@
-	$(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE))
-
-.PHONY: bootimage-nodeps
-bootimage-nodeps: $(BVBTOOL)
-	@echo "make $@: ignoring dependencies"
-	$(hide) $(BVBTOOL) make_boot_image $(INTERNAL_BVBTOOL_MAKE_BOOT_IMAGE_ARGS) $(BOARD_BVB_MAKE_BOOT_IMAGE_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)
-	$(hide) $(BVBTOOL) sign_boot_image $(INTERNAL_BVBTOOL_SIGN_BOOT_IMAGE_ARGS) $(BOARD_BVB_SIGN_BOOT_IMAGE_ARGS) --image $(INSTALLED_BOOTIMAGE_TARGET)
-	$(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE))
-
-else # BOARD_BVB_ENABLE
-
 # We build recovery as boot image if BOARD_USES_RECOVERY_AS_BOOT is true.
 ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
 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
+
+else ifeq (true,$(BOARD_AVB_ENABLE)) # TARGET_BOOTIMAGE_USE_EXT2 != true
+
+$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(AVBTOOL) $(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))
+	$(hide) $(AVBTOOL) add_hash_footer \
+	  --image $@ \
+	  --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
+	  --partition_name boot $(INTERNAL_AVB_SIGNING_ARGS) \
+	  $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
+
+.PHONY: bootimage-nodeps
+bootimage-nodeps: $(MKBOOTIMG) $(AVBTOOL)
+	@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))
+	$(hide) $(AVBTOOL) add_hash_footer \
+	  --image $@ \
+	  --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
+	  --partition_name boot $(INTERNAL_AVB_SIGNING_ARGS) \
+	  $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)
+
+else ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER)) # BOARD_AVB_ENABLE != true
 
 $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(BOOT_SIGNER)
 	$(call pretty,"Target boot image: $@")
@@ -643,9 +628,9 @@
 
 endif # TARGET_BOOTIMAGE_USE_EXT2
 endif # BOARD_USES_RECOVERY_AS_BOOT
-endif # BOARD_BVB_ENABLE
 
 else	# TARGET_NO_KERNEL
+INTERNAL_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
 # HACK: The top-level targets depend on the bootimage.  Not all targets
 # can produce a bootimage, though, and emulator targets need the ramdisk
 # instead.  Fake it out by calling the ramdisk the bootimage.
@@ -829,7 +814,7 @@
 ifneq (true,$(TARGET_USERIMAGES_SPARSE_SQUASHFS_DISABLED))
   INTERNAL_USERIMAGES_SPARSE_SQUASHFS_FLAG := -s
 endif
-ifeq ($(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs)
+ifneq ($(filter $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE) $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),squashfs),)
 INTERNAL_USERIMAGES_DEPS += $(MAKE_SQUASHFS) $(MKSQUASHFSUSERIMG) $(IMG2SIMG)
 endif
 
@@ -845,6 +830,8 @@
 SELINUX_FC := $(TARGET_ROOT_OUT)/file_contexts.bin
 INTERNAL_USERIMAGES_DEPS += $(SELINUX_FC)
 
+INTERNAL_USERIMAGES_DEPS += $(BLK_ALLOC_TO_BASE_FS)
+
 # $(1): the path of the output dictionary file
 # $(2): additional "key=value" pairs to append to the dictionary file.
 define generate-userimage-prop-dictionary
@@ -855,6 +842,8 @@
 $(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_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))
 $(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1))
 $(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
@@ -862,6 +851,10 @@
 $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(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))
+$(if $(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT),$(hide) echo "vendor_squashfs_compressor_opt=$(BOARD_VENDORIMAGE_SQUASHFS_COMPRESSOR_OPT)" >> $(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))
 $(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))
@@ -879,6 +872,10 @@
 $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_subkey=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VBOOT_SIGNING_SUBKEY)" >> $(1))
 $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "futility=$(FUTILITY)" >> $(1))
 $(if $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT),$(hide) echo "vboot_signer_cmd=$(VBOOT_SIGNER)" >> $(1))
+$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_signing_args=$(INTERNAL_AVB_SIGNING_ARGS)" >> $(1))
+$(if $(BOARD_AVB_ENABLE),$(hide) echo "avb_avbtool=$(AVBTOOL)" >> $(1))
+$(if $(BOARD_AVB_ENABLE),$(hide) echo "system_avb_enable=$(BOARD_AVB_ENABLE)" >> $(1))
+$(if $(BOARD_AVB_ENABLE),$(hide) echo "system_avb_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS)" >> $(1))
 $(if $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),\
     $(hide) echo "recovery_as_boot=true" >> $(1))
 $(if $(filter true,$(BOARD_BUILD_SYSTEM_ROOT_IMAGE)),\
@@ -979,13 +976,12 @@
 	--ramdisk $(recovery_ramdisk)
 
 # Assumes this has already been stripped
-ifdef BOARD_KERNEL_CMDLINE
-  INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"
+ifdef INTERNAL_KERNEL_CMDLINE
+  INTERNAL_RECOVERYIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"
 endif
 ifdef BOARD_KERNEL_BASE
   INTERNAL_RECOVERYIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)
 endif
-BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
 ifdef BOARD_KERNEL_PAGESIZE
   INTERNAL_RECOVERYIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)
 endif
@@ -1047,6 +1043,12 @@
     $(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 $(and $(filter true,$(BOARD_USES_RECOVERY_AS_BOOT)),$(filter true,$(BOARD_AVB_ENABLE))), \
+      $(hide) $(AVBTOOL) add_hash_footer \
+        --image $(1) \
+        --partition_size $(BOARD_BOOTIMAGE_PARTITION_SIZE) \
+        --partition_name boot $(INTERNAL_AVB_SIGNING_ARGS) \
+        $(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS))
   $(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)))
@@ -1054,6 +1056,12 @@
 endef
 
 ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true)
+ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_BOOT_SIGNER))
+$(INSTALLED_BOOTIMAGE_TARGET) : $(BOOT_SIGNER)
+endif
+ifeq (true,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VBOOT))
+$(INSTALLED_BOOTIMAGE_TARGET) : $(VBOOT_SIGNER)
+endif
 $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \
 		$(INSTALLED_RAMDISK_TARGET) \
 		$(INTERNAL_RECOVERYIMAGE_FILES) \
@@ -1180,13 +1188,8 @@
            fi; \
            mkdir -p $(DIST_DIR); cp $(INSTALLED_FILES_FILE) $(DIST_DIR)/installed-files-rescued.txt; \
            exit 1 )
-  $(if $(BOARD_BVB_ENABLE), $(hide) $(BVBTOOL) add_image_hashes $(BOARD_BVB_ADD_IMAGE_HASHES_ARGS) --image $(1))
 endef
 
-ifeq ($(BOARD_BVB_ENABLE),true)
-FULL_SYSTEMIMAGE_DEPS += $(BVBTOOL)
-endif
-
 $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(BUILD_IMAGE_SRCS)
 	$(call build-systemimage-target,$@)
 
@@ -1347,7 +1350,7 @@
     $(hide) echo "Target boot fs tarball: $(INSTALLED_BOOTTARBALL_TARGET)"
     $(hide) mkdir -p $(PRODUCT_OUT)/boot
     $(hide) cp -f $(INTERNAL_BOOTIMAGE_FILES) $(PRODUCT_OUT)/boot/.
-    $(hide) echo $(BOARD_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline
+    $(hide) echo $(INTERNAL_KERNEL_CMDLINE) > $(PRODUCT_OUT)/boot/cmdline
     $(hide) $(MKTARBALL) $(FS_GET_STATS) \
                  $(PRODUCT_OUT) boot $(PRIVATE_BOOT_TAR) \
                  $(INSTALLED_BOOTTARBALL_TARGET) $(TARGET_OUT)
@@ -1440,10 +1443,11 @@
 ifdef BOARD_BPT_INPUT_FILES
 
 BUILT_BPTIMAGE_TARGET := $(PRODUCT_OUT)/partition-table.img
+BUILT_BPTJSON_TARGET := $(PRODUCT_OUT)/partition-table.bpt
 
 INTERNAL_BVBTOOL_MAKE_TABLE_ARGS := \
 	--output_gpt $(BUILT_BPTIMAGE_TARGET) \
-	--output_json $(PRODUCT_OUT)/partition-table.bpt \
+	--output_json $(BUILT_BPTJSON_TARGET) \
 	$(foreach file, $(BOARD_BPT_INPUT_FILES), --input $(file))
 
 ifdef BOARD_BPT_DISK_SIZE
@@ -1456,6 +1460,9 @@
 endef
 
 INSTALLED_BPTIMAGE_TARGET := $(BUILT_BPTIMAGE_TARGET)
+$(BUILT_BPTJSON_TARGET): $(INSTALLED_BPTIMAGE_TARGET)
+	$(hide) touch -c $(BUILT_BPTJSON_TARGET)
+
 $(INSTALLED_BPTIMAGE_TARGET): $(BPTTOOL) $(BOARD_BPT_INPUT_FILES)
 	$(build-bptimage-target)
 
@@ -1497,6 +1504,60 @@
 
 endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
 
+# -----------------------------------------------------------------
+# vbmeta image
+ifeq ($(BOARD_AVB_ENABLE),true)
+
+BUILT_VBMETAIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta.img
+
+INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS := \
+    --include_descriptors_from_image $(INSTALLED_BOOTIMAGE_TARGET) \
+    --include_descriptors_from_image $(INSTALLED_SYSTEMIMAGE) \
+    --generate_dm_verity_cmdline_from_hashtree $(INSTALLED_SYSTEMIMAGE)
+
+ifdef BOARD_AVB_ROLLBACK_INDEX
+INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS += --rollback_index $(BOARD_AVB_ROLLBACK_INDEX)
+endif
+
+ifndef BOARD_AVB_KEY_PATH
+# If key path isn't specified, use the 4096-bit test key.
+INTERNAL_AVB_SIGNING_ARGS := \
+    --algorithm SHA256_RSA4096 \
+    --key external/avb/test/data/testkey_rsa4096.pem
+else
+INTERNAL_AVB_SIGNING_ARGS := \
+    --algorithm $(BOARD_AVB_ALGORITHM) --key $(BOARD_AVB_KEY_PATH)
+endif
+
+ifndef BOARD_BOOTIMAGE_PARTITION_SIZE
+  $(error BOARD_BOOTIMAGE_PARTITION_SIZE must be set for BOARD_AVB_ENABLE)
+endif
+
+ifndef BOARD_SYSTEMIMAGE_PARTITION_SIZE
+  $(error BOARD_SYSTEMIMAGE_PARTITION_SIZE must be set for BOARD_AVB_ENABLE)
+endif
+
+define build-vbmetaimage-target
+  $(call pretty,"Target vbmeta image: $(INSTALLED_VBMETAIMAGE_TARGET)")
+  $(hide) $(AVBTOOL) make_vbmeta_image \
+    $(INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS) \
+    $(INTERNAL_AVB_SIGNING_ARGS) \
+    $(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS) \
+    --output $@
+endef
+
+INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_VBMETAIMAGE_TARGET)
+$(INSTALLED_VBMETAIMAGE_TARGET): $(AVBTOOL) $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_SYSTEMIMAGE)
+	$(build-vbmetaimage-target)
+
+.PHONY: vbmetaimage-nodeps
+vbmetaimage-nodeps:
+	$(build-vbmetaimage-target)
+
+# We need $(AVBTOOL) for system.img generation.
+FULL_SYSTEMIMAGE_DEPS += $(AVBTOOL)
+
+endif # BOARD_AVB_ENABLE
 
 # -----------------------------------------------------------------
 # vendor partition image
@@ -1608,7 +1669,8 @@
   $(HOST_OUT_EXECUTABLES)/fec \
   $(HOST_OUT_EXECUTABLES)/brillo_update_payload \
   $(HOST_OUT_EXECUTABLES)/lib/shflags/shflags \
-  $(HOST_OUT_EXECUTABLES)/delta_generator
+  $(HOST_OUT_EXECUTABLES)/delta_generator \
+  $(BLK_ALLOC_TO_BASE_FS)
 
 # Shared libraries.
 OTATOOLS += \
@@ -1652,7 +1714,7 @@
 	$(hide) rm -rf $@ $(zip_root)/releasetools/*.pyc
 	$(hide) (cd $(zip_root) && zip -qryX $(abspath $@) *)
 	$(hide) zip -qryX $(abspath $@) build/target/product/security/
-	$(hide) find device vendor -name \*.pk8 -o -name \*.x509.pem -o -name oem.prop | xargs zip -qryX $(abspath $@)>/dev/null || true
+	$(hide) find device vendor -name \*.pk8 -o -name verifiedboot\* -o -name \*.x509.pem -o -name oem\*.prop | xargs zip -qryX $(abspath $@)>/dev/null || true
 
 .PHONY: otatools-package
 otatools-package: $(BUILT_OTATOOLS_PACKAGE)
@@ -1754,8 +1816,8 @@
 	$(hide) $(ACP) \
 		$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/$(PRIVATE_RECOVERY_OUT)/second
 endif
-ifdef BOARD_KERNEL_CMDLINE
-	$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline
+ifdef INTERNAL_KERNEL_CMDLINE
+	$(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/cmdline
 endif
 ifdef BOARD_KERNEL_BASE
 	$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/$(PRIVATE_RECOVERY_OUT)/base
@@ -1783,8 +1845,8 @@
 	$(hide) $(ACP) \
 		$(INSTALLED_2NDBOOTLOADER_TARGET) $(zip_root)/BOOT/second
 endif
-ifdef BOARD_KERNEL_CMDLINE
-	$(hide) echo "$(BOARD_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
+ifdef INTERNAL_KERNEL_CMDLINE
+	$(hide) echo "$(INTERNAL_KERNEL_CMDLINE)" > $(zip_root)/BOOT/cmdline
 endif
 ifdef BOARD_KERNEL_BASE
 	$(hide) echo "$(BOARD_KERNEL_BASE)" > $(zip_root)/BOOT/base
@@ -1864,6 +1926,14 @@
 	# OTA scripts are only interested in fingerprint related properties
 	$(hide) echo "oem_fingerprint_properties=$(OEM_THUMBPRINT_PROPERTIES)" >> $(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))
+endif
+ifneq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH),)
+	$(hide) $(ACP) $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH) \
+	  $(zip_root)/META/$(notdir $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_BASE_FS_PATH))
+endif
 ifneq ($(strip $(SANITIZE_TARGET)),)
 	# We need to create userdata.img with real data because the instrumented libraries are in userdata.img.
 	$(hide) echo "userdata_img_with_data=true" >> $(zip_root)/META/misc_info.txt
@@ -1871,14 +1941,14 @@
 ifeq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true)
 	$(hide) echo "full_recovery_image=true" >> $(zip_root)/META/misc_info.txt
 endif
-ifeq ($(BOARD_BVB_ENABLE),true)
-	$(hide) echo "board_bvb_enable=true" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_make_boot_image_args=$(BOARD_BVB_MAKE_BOOT_IMAGE_ARGS)" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_sign_boot_image_args=$(BOARD_BVB_SIGN_BOOT_IMAGE_ARGS)" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_algorithm=$(BOARD_BVB_ALGORITHM)" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_key_path=$(BOARD_BVB_KEY_PATH)" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_rollback_index=$(BOARD_BVB_ROLLBACK_INDEX)" >> $(zip_root)/META/misc_info.txt
-	$(hide) echo "board_bvb_add_image_hashes_args=$(BOARD_BVB_ADD_IMAGE_HASHES_ARGS)" >> $(zip_root)/META/misc_info.txt
+ifeq ($(BOARD_AVB_ENABLE),true)
+	$(hide) echo "board_avb_enable=true" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_rollback_index=$(BOARD_AVB_ROLLBACK_INDEX)" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_key_path=$(BOARD_AVB_KEY_PATH)" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_algorithm=$(BOARD_AVB_ALGORITHM)" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_boot_add_hash_footer_args=$(BOARD_AVB_BOOT_ADD_HASH_FOOTER_ARGS)" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_system_add_hashtree_footer_args=$(BOARD_AVB_SYSTEM_ADD_HASHTREE_FOOTER_ARGS)" >> $(zip_root)/META/misc_info.txt
+	$(hide) echo "board_avb_make_vbmeta_image_args=$(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS)" >> $(zip_root)/META/misc_info.txt
 endif
 ifdef BOARD_BPT_INPUT_FILES
 	$(hide) echo "board_bpt_enable=true" >> $(zip_root)/META/misc_info.txt
@@ -2031,7 +2101,29 @@
 	$(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
 	$(hide) mkdir -p $(dir $@) $(TARGET_OUT_UNSTRIPPED) $(dir $(PRIVATE_LIST_FILE))
 	$(hide) find $(TARGET_OUT_UNSTRIPPED) | sort >$(PRIVATE_LIST_FILE)
-	$(hide) $(SOONG_ZIP) -d -o $@ -C $(TARGET_OUT_UNSTRIPPED) -l $(PRIVATE_LIST_FILE)
+	$(hide) $(SOONG_ZIP) -d -o $@ -C . -l $(PRIVATE_LIST_FILE)
+# -----------------------------------------------------------------
+# A zip of the coverage directory.
+#
+name := $(TARGET_PRODUCT)
+ifeq ($(TARGET_BUILD_TYPE),debug)
+name := $(name)_debug
+endif
+name := $(name)-coverage-$(FILE_NAME_TAG)
+COVERAGE_ZIP := $(PRODUCT_OUT)/$(name).zip
+ifndef TARGET_BUILD_APPS
+$(COVERAGE_ZIP): $(INSTALLED_SYSTEMIMAGE) \
+		$(INSTALLED_BOOTIMAGE_TARGET) \
+		$(INSTALLED_USERDATAIMAGE_TARGET) \
+		$(INSTALLED_VENDORIMAGE_TARGET)
+endif
+$(COVERAGE_ZIP): PRIVATE_LIST_FILE := $(call intermediates-dir-for,PACKAGING,coverage)/filelist
+$(COVERAGE_ZIP): $(SOONG_ZIP)
+	@echo "Package coverage: $@"
+	$(hide) rm -rf $@ $(PRIVATE_LIST_FILE)
+	$(hide) mkdir -p $(dir $@) $(TARGET_OUT_COVERAGE) $(dir $(PRIVATE_LIST_FILE))
+	$(hide) find $(TARGET_OUT_COVERAGE) | sort >$(PRIVATE_LIST_FILE)
+	$(hide) $(SOONG_ZIP) -d -o $@ -C $(TARGET_OUT_COVERAGE) -l $(PRIVATE_LIST_FILE)
 
 # -----------------------------------------------------------------
 # A zip of the Android Apps. Not keeping full path so that we don't
@@ -2079,7 +2171,7 @@
 # the dependency will be set up later in build/core/main.mk.
 $(PROGUARD_DICT_ZIP) :
 	@echo "Packaging Proguard obfuscation dictionary files."
-	$(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary`; \
+	$(hide) dict_files=`find $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS -name proguard_dictionary -o -name jack_dictionary`; \
 		if [ -n "$$dict_files" ]; then \
 		  unobfuscated_jars=$${dict_files//proguard_dictionary/classes.jar}; \
 		  zip -qX $@ $$dict_files $$unobfuscated_jars; \
@@ -2190,6 +2282,7 @@
 	$(tools_notice_file_txt) \
 	$(OUT_DOCS)/offline-sdk-timestamp \
 	$(SYMBOLS_ZIP) \
+	$(COVERAGE_ZIP) \
 	$(INSTALLED_SYSTEMIMAGE) \
 	$(INSTALLED_USERDATAIMAGE_TARGET) \
 	$(INSTALLED_RAMDISK_TARGET) \
diff --git a/core/aapt2.mk b/core/aapt2.mk
new file mode 100644
index 0000000..ccc4535
--- /dev/null
+++ b/core/aapt2.mk
@@ -0,0 +1,89 @@
+######################################
+# Compile resource with AAPT2
+# Input variables:
+# full_android_manifest,
+# my_res_resources, my_overlay_resources,
+# my_compiled_res_base_dir, my_res_package,
+# R_file_stamp, proguard_options_file
+# my_generated_res_dirs: Resources generated during the build process and we have to compile them in a single run of aapt2.
+# my_generated_res_dirs_deps: the dependency to use for my_generated_res_dirs.
+#
+# Output variables:
+# my_res_resources_flat, my_overlay_resources_flat,
+# my_generated_resources_flata
+#
+######################################
+
+
+# Compile all the resource files.
+my_res_resources_flat := \
+  $(foreach r, $(my_res_resources),\
+    $(eval o := $(call aapt2-compiled-resource-out-file,$(r),$(my_compiled_res_base_dir)))\
+    $(eval $(call aapt2-compile-one-resource-file-rule,$(r),$(o)))\
+    $(o))
+
+my_overlay_resources_flat := \
+  $(foreach r, $(my_overlay_resources),\
+    $(eval o := $(call aapt2-compiled-resource-out-file,$(r),$(my_compiled_res_base_dir)))\
+    $(eval $(call aapt2-compile-one-resource-file-rule,$(r),$(o)))\
+    $(o))
+
+my_generated_resources_flata :=
+# Compile generated resources
+ifneq ($(my_generated_res_dirs),)
+my_generated_resources_flata := $(my_compiled_res_base_dir)/gen_res.flata
+$(my_generated_resources_flata): PRIVATE_SOURCE_RES_DIRS := $(my_generated_res_dirs)
+$(my_generated_resources_flata) : $(my_generated_res_dirs_deps)
+	@echo "AAPT2 compile $@ <- $(PRIVATE_SOURCE_RES_DIRS)"
+	$(call aapt2-compile-resource-dirs)
+
+my_generated_resources_flata += $(my_generated_resources_flata)
+endif
+
+$(my_res_resources_flat) $(my_overlay_resources_flat) $(my_generated_resources_flata): \
+  PRIVATE_AAPT2_CFLAGS := $(PRODUCT_AAPT2_CFLAGS)
+
+my_static_library_resources := $(foreach l, $(call reverse-list,$(LOCAL_STATIC_ANDROID_LIBRARIES)),\
+  $(call intermediates-dir-for,JAVA_LIBRARIES,$(l),,COMMON)/package-res.apk)
+my_shared_library_resources := $(foreach l, $(LOCAL_SHARED_ANDROID_LIBRARIES),\
+  $(call intermediates-dir-for,JAVA_LIBRARIES,$(l),,COMMON)/package-res.apk)
+
+ifneq ($(my_static_library_resources),)
+$(my_res_package): PRIVATE_AAPT_FLAGS += --auto-add-overlay
+endif
+
+$(my_res_package): PRIVATE_RES_FLAT := $(my_res_resources_flat)
+$(my_res_package): PRIVATE_OVERLAY_FLAT := $(my_static_library_resources) $(my_generated_resources_flata) $(my_overlay_resources_flat)
+$(my_res_package): PRIVATE_SHARED_ANDROID_LIBRARIES := $(my_shared_library_resources)
+$(my_res_package): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file)
+$(my_res_package) : $(full_android_manifest) $(my_static_library_resources) $(my_shared_library_resources)
+$(my_res_package) : $(my_res_resources_flat) $(my_overlay_resources_flat) \
+  $(my_generated_resources_flata) $(my_static_library_resources) \
+  $(AAPT2)
+	@echo "AAPT2 link $@"
+	$(call aapt2-link)
+
+ifdef R_file_stamp
+$(R_file_stamp) : $(my_res_package) | $(ACP)
+	@echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)"
+	@rm -rf $@ && mkdir -p $(dir $@)
+	$(call find-generated-R.java)
+endif
+
+ifdef proguard_options_file
+$(proguard_options_file) : $(my_res_package)
+endif
+
+resource_export_package :=
+ifdef LOCAL_EXPORT_PACKAGE_RESOURCES
+# Put this module's resources into a PRODUCT-agnositc package that
+# other packages can use to build their own PRODUCT-agnostic R.java (etc.)
+# files.
+resource_export_package := $(intermediates.COMMON)/package-export.apk
+$(R_file_stamp) : $(resource_export_package)
+
+$(resource_export_package) : $(my_res_package) | $(ACP)
+	@echo "target Export Resources: $(PRIVATE_MODULE) $(@)"
+	$(copy-file-to-new-target)
+
+endif
diff --git a/core/android_manifest.mk b/core/android_manifest.mk
index 582bad4..0093e02 100644
--- a/core/android_manifest.mk
+++ b/core/android_manifest.mk
@@ -22,9 +22,12 @@
 my_full_libs_manifest_files += $(foreach lib, $(LOCAL_STATIC_JAVA_AAR_LIBRARIES),\
   $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/aar/AndroidManifest.xml)
 
+# With aapt2, we'll link in the built resource from the AAR.
+ifndef LOCAL_USE_AAPT2
 LOCAL_RESOURCE_DIR += $(foreach lib, $(LOCAL_STATIC_JAVA_AAR_LIBRARIES),\
   $(call intermediates-dir-for,JAVA_LIBRARIES,$(lib),,COMMON)/aar/res)
-endif
+endif  # LOCAL_USE_AAPT2
+endif  # LOCAL_STATIC_JAVA_AAR_LIBRARIES
 
 # Set up rules to merge library manifest files
 ifdef my_full_libs_manifest_files
diff --git a/core/base_rules.mk b/core/base_rules.mk
index aac551a..13d20e0 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -207,6 +207,14 @@
 endif
 endif
 
+ifeq ($(my_host_cross),true)
+  my_all_targets := host_cross_$(my_register_name)_all_targets
+else ifneq ($(LOCAL_IS_HOST_MODULE),)
+  my_all_targets := host_$(my_register_name)_all_targets
+else
+  my_all_targets := device_$(my_register_name)_all_targets
+endif
+
 # variant is enough to make nano class unique; it serves as a key to lookup (OS,ARCH) tuple
 aux_class := $($(my_prefix)OS_VARIANT)
 # Make sure that this IS_HOST/CLASS/MODULE combination is unique.
@@ -261,9 +269,6 @@
 # dependent binaries of a .toc file will be rebuilt only when the content of
 # the .toc file is changed.
 ###########################################################
-ifndef LOCAL_IS_HOST_MODULE
-# Disable .toc optimization for host modules: we may run the host binaries during the build process
-# and the libraries' implementation matters.
 ifeq ($(LOCAL_MODULE_CLASS),SHARED_LIBRARIES)
 LOCAL_INTERMEDIATE_TARGETS += $(LOCAL_BUILT_MODULE).toc
 $(LOCAL_BUILT_MODULE).toc: $(LOCAL_BUILT_MODULE)
@@ -273,8 +278,7 @@
 # Kati adds restat=1 to ninja. GNU make does nothing for this.
 .KATI_RESTAT: $(LOCAL_BUILT_MODULE).toc
 # Build .toc file when using mm, mma, or make $(my_register_name)
-$(my_register_name): $(LOCAL_BUILT_MODULE).toc
-endif
+$(my_all_targets): $(LOCAL_BUILT_MODULE).toc
 endif
 
 ###########################################################
@@ -320,13 +324,16 @@
 # Provide a short-hand for building this module.
 # We name both BUILT and INSTALLED in case
 # LOCAL_UNINSTALLABLE_MODULE is set.
+.PHONY: $(my_all_targets)
+$(my_all_targets): $(LOCAL_BUILT_MODULE) $(LOCAL_INSTALLED_MODULE)
+
 .PHONY: $(my_register_name)
-$(my_register_name): $(LOCAL_BUILT_MODULE) $(LOCAL_INSTALLED_MODULE)
+$(my_register_name): $(my_all_targets)
 
 ifneq ($(my_register_name),$(LOCAL_MODULE))
 # $(LOCAL_MODULE) covers all the multilib targets.
 .PHONY: $(LOCAL_MODULE)
-$(LOCAL_MODULE) : $(my_register_name)
+$(LOCAL_MODULE) : $(my_all_targets)
 endif
 
 # Set up phony targets that covers all modules under the given paths.
@@ -336,7 +343,7 @@
 $(foreach c, $(my_path_components),\
   $(eval my_path_prefix := $(my_path_prefix)-$(c))\
   $(eval .PHONY : $(my_path_prefix))\
-  $(eval $(my_path_prefix) : $(my_register_name)))
+  $(eval $(my_path_prefix) : $(my_all_targets)))
 
 ###########################################################
 ## Module installation rule
@@ -345,7 +352,7 @@
 my_init_rc_installed :=
 my_init_rc_pairs :=
 my_installed_symlinks :=
-ifndef LOCAL_UNINSTALLABLE_MODULE
+ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
 $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD := $(LOCAL_POST_INSTALL_CMD)
 $(LOCAL_INSTALLED_MODULE): $(LOCAL_BUILT_MODULE)
 	@echo "Install: $@"
@@ -365,7 +372,7 @@
 my_init_rc_new_installed := $(call copy-many-files,$(my_init_rc_new_pairs))
 ALL_INIT_RC_INSTALLED_PAIRS += $(my_init_rc_new_pairs)
 
-$(my_register_name) : $(my_init_rc_installed)
+$(my_all_targets) : $(my_init_rc_installed)
 endif # my_init_rc
 endif # !LOCAL_IS_HOST_MODULE
 
@@ -374,6 +381,8 @@
 $(foreach symlink,$(my_installed_symlinks),\
     $(call symlink-file,$(LOCAL_INSTALLED_MODULE),$(my_installed_module_stem),$(symlink)))
 
+$(my_all_targets) : | $(my_installed_symlinks)
+
 endif # !LOCAL_UNINSTALLABLE_MODULE
 
 ###########################################################
@@ -402,6 +411,50 @@
 endif
 
 ###########################################################
+## Compatibiliy suite files.
+###########################################################
+ifdef LOCAL_COMPATIBILITY_SUITE
+ifneq ($(words $(LOCAL_COMPATIBILITY_SUITE)),1)
+$(error $(LOCAL_PATH):$(LOCAL_MODULE) LOCAL_COMPATIBILITY_SUITE can be only one name)
+endif
+
+# The module itself.
+my_compat_dist := \
+  $(LOCAL_BUILT_MODULE):$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(my_installed_module_stem)
+
+# Make sure we only add the files once for multilib modules.
+ifndef $(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files
+$(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files := true
+
+# LOCAL_COMPATIBILITY_SUPPORT_FILES is a list of <src>[:<dest>].
+my_compat_dist += $(foreach f, $(LOCAL_COMPATIBILITY_SUPPORT_FILES),\
+  $(eval p := $(subst :,$(space),$(f)))\
+  $(eval s := $(word 1,$(p)))\
+  $(eval d := $(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(or $(word 2,$(p)),$(notdir $(word 1,$(p)))))\
+  $(s):$(d))
+
+ifneq (,$(wildcard $(LOCAL_PATH)/AndroidTest.xml))
+my_compat_dist += \
+  $(LOCAL_PATH)/AndroidTest.xml:$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE).config
+endif
+
+ifneq (,$(wildcard $(LOCAL_PATH)/DynamicConfig.xml))
+my_compat_dist += \
+  $(LOCAL_PATH)/DynamicConfig.xml:$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE).dynamic
+endif
+endif # $(my_prefix)$(LOCAL_MODULE_CLASS)_$(LOCAL_MODULE)_compat_files
+
+my_compat_files := $(call copy-many-files, $(my_compat_dist))
+
+COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES := \
+  $(COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES) \
+  $(my_compat_files)
+
+# Copy over the compatibility files when user runs mm/mmm.
+$(my_all_targets) : $(my_compat_files)
+endif  # LOCAL_COMPATIBILITY_SUITE
+
+###########################################################
 ## Register with ALL_MODULES
 ###########################################################
 
@@ -504,6 +557,7 @@
 ifneq (,$(filter $(my_module_tags),tests))
 $(j_or_n)-$(h_or_t)-tests $(j_or_n)-tests $(h_or_t)-tests : $(my_checked_module)
 endif
+$(LOCAL_MODULE)-$(h_or_t) : $(my_all_targets)
 endif
 
 ###########################################################
diff --git a/core/binary.mk b/core/binary.mk
index 0589de0..4dcb152 100644
--- a/core/binary.mk
+++ b/core/binary.mk
@@ -30,6 +30,8 @@
   endif
 endif
 
+my_soong_problems :=
+
 # 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.
@@ -52,9 +54,15 @@
 my_cxx_wrapper := $(CXX_WRAPPER)
 my_c_includes := $(LOCAL_C_INCLUDES)
 my_generated_sources := $(LOCAL_GENERATED_SOURCES)
-my_native_coverage := $(LOCAL_NATIVE_COVERAGE)
 my_additional_dependencies := $(LOCAL_ADDITIONAL_DEPENDENCIES)
 my_export_c_include_dirs := $(LOCAL_EXPORT_C_INCLUDE_DIRS)
+my_export_c_include_deps := $(LOCAL_EXPORT_C_INCLUDE_DEPS)
+
+ifneq (,$(foreach dir,$(COVERAGE_PATHS),$(filter $(dir)%,$(LOCAL_PATH))))
+  my_native_coverage := true
+else
+  my_native_coverage := false
+endif
 
 ifdef LOCAL_IS_HOST_MODULE
 my_allow_undefined_symbols := true
@@ -95,9 +103,7 @@
   # missing API levels to existing ones where necessary, but we're not doing
   # that for the generated libraries. Clip the API level to the minimum where
   # appropriate.
-  my_ndk_api := \
-    $(shell if [ $(LOCAL_SDK_VERSION) -lt $(my_min_sdk_version) ]; then \
-        echo $(my_min_sdk_version); else echo $(LOCAL_SDK_VERSION); fi)
+  my_ndk_api := $(call math_max,$(LOCAL_SDK_VERSION),$(my_min_sdk_version))
 
   # Traditionally this has come from android/api-level.h, but with the libc
   # headers unified it must be set by the build system since we don't have
@@ -209,7 +215,6 @@
     ifneq (,$(filter r10 r11,$(LOCAL_NDK_VERSION)))
       ifeq (c++_static,$(LOCAL_NDK_STL_VARIANT))
         my_ndk_stl_static_lib := $(my_libcxx_libdir)/libc++_static.a
-        my_ldlibs += -ldl
       else
         my_ndk_stl_shared_lib_fullpath := $(my_libcxx_libdir)/libc++_shared.so
       endif
@@ -218,7 +223,6 @@
         my_ndk_stl_static_lib := \
           $(my_libcxx_libdir)/libc++_static.a \
           $(my_libcxx_libdir)/libc++abi.a
-        my_ldlibs += -ldl
       else
         my_ndk_stl_shared_lib_fullpath := $(my_libcxx_libdir)/libc++_shared.so
       endif
@@ -229,6 +233,8 @@
       endif
     endif
 
+    my_ldlibs += -ldl
+
     my_ndk_stl_cppflags := -std=c++11
   else # LOCAL_NDK_STL_VARIANT is not c++_* either
   ifneq (,$(filter gnustl_%, $(LOCAL_NDK_STL_VARIANT)))
@@ -352,11 +358,13 @@
             my_clang := true
         endif
     endif
-# Add option to make clang the default for device build
-else ifeq ($(USE_CLANG_PLATFORM_BUILD),true)
+# Add option to make gcc the default for device build
+else ifeq ($(USE_CLANG_PLATFORM_BUILD),false)
     ifeq ($(my_clang),)
-        my_clang := true
+        my_clang := false
     endif
+else ifeq ($(my_clang),)
+    my_clang := true
 endif
 
 my_cpp_std_version := -std=gnu++14
@@ -409,11 +417,21 @@
 
 ifneq ($(LOCAL_NO_LIBCOMPILER_RT),true)
 # Add in libcompiler_rt for all regular device builds
-ifeq (,$(LOCAL_SDK_VERSION)$(WITHOUT_LIBCOMPILER_RT))
+ifeq (,$(WITHOUT_LIBCOMPILER_RT))
   my_static_libraries += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES)
 endif
 endif
 
+ifneq ($(filter ../%,$(my_src_files)),)
+my_soong_problems += dotdot_srcs
+endif
+ifneq ($(foreach i,$(my_c_includes),$(filter %/..,$(i))$(findstring /../,$(i))),)
+my_soong_problems += dotdot_incs
+endif
+ifneq ($(filter %.arm,$(my_src_files)),)
+my_soong_problems += srcs_dotarm
+endif
+
 ####################################################
 ## Add FDO flags if FDO is turned on and supported
 ## Please note that we will do option filtering during FDO build.
@@ -523,28 +541,25 @@
         my_cflags += --coverage -O0
         my_ldflags += --coverage
     endif
+
+    ifeq ($(my_clang),true)
+        my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBPROFILE_RT)
+    else
+        my_coverage_lib := $(call intermediates-dir-for,STATIC_LIBRARIES,libgcov,$(filter AUX,$(my_kind)),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libgcov.a
+    endif
+
+    $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_COVERAGE_LIB := $(my_coverage_lib)
+    $(LOCAL_INTERMEDIATE_TARGETS): $(my_coverage_lib)
 else
     my_native_coverage := false
 endif
 
-ifeq ($(my_clang),true)
-    my_coverage_lib := $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)LIBPROFILE_RT)
-else
-    my_coverage_lib := $(call intermediates-dir-for,STATIC_LIBRARIES,libgcov,$(filter AUX,$(my_kind)),,$(LOCAL_2ND_ARCH_VAR_PREFIX))/libgcov.a
-endif
-
-$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_COVERAGE_LIB := $(my_coverage_lib)
-
 ###########################################################
 ## Define PRIVATE_ variables used by multiple module types
 ###########################################################
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
     $(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
 
-ifeq ($(strip $(WITH_SYNTAX_CHECK)),)
-  LOCAL_NO_SYNTAX_CHECK := true
-endif
-
 ifeq ($(strip $(WITH_STATIC_ANALYZER)),)
   LOCAL_NO_STATIC_ANALYZER := true
 endif
@@ -573,10 +588,6 @@
 ifneq ($(LOCAL_NO_STATIC_ANALYZER),true)
   my_cc := CCC_CC=$(CLANG) CLANG=$(CLANG) \
            $(SYNTAX_TOOLS_PREFIX)/ccc-analyzer
-else
-ifneq ($(LOCAL_NO_SYNTAX_CHECK),true)
-  my_cc := $(my_cc) -fsyntax-only
-endif
 endif
 
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(my_cc)
@@ -593,10 +604,6 @@
 ifneq ($(LOCAL_NO_STATIC_ANALYZER),true)
   my_cxx := CCC_CXX=$(CLANG_CXX) CLANG_CXX=$(CLANG_CXX) \
             $(SYNTAX_TOOLS_PREFIX)/c++-analyzer
-else
-ifneq ($(LOCAL_NO_SYNTAX_CHECK),true)
-  my_cxx := $(my_cxx) -fsyntax-only
-endif
 endif
 
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LINKER := $(my_linker)
@@ -696,6 +703,7 @@
 renderscript_sources := $(filter %.rs %.fs,$(my_src_files))
 
 ifneq (,$(renderscript_sources))
+my_soong_problems += rs
 
 renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
 RenderScript_file_stamp := $(intermediates)/RenderScriptCPP.stamp
@@ -708,7 +716,7 @@
 else
 ifneq (,$(LOCAL_SDK_VERSION))
 # Set target-api for LOCAL_SDK_VERSIONs other than current.
-ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
+ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
 renderscript_target_api := $(LOCAL_SDK_VERSION)
 endif
 endif  # LOCAL_SDK_VERSION is set
@@ -775,6 +783,7 @@
 ###########################################################
 proto_sources := $(filter %.proto,$(my_src_files))
 ifneq ($(proto_sources),)
+my_soong_problems += proto
 proto_gen_dir := $(generated_sources_dir)/proto
 proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources))
 
@@ -857,6 +866,7 @@
 dbus_definitions := $(filter %.dbus-xml,$(my_src_files))
 dbus_generated_headers :=
 ifneq ($(dbus_definitions),)
+my_soong_problems += dbus
 
 dbus_definition_paths := $(addprefix $(LOCAL_PATH)/,$(dbus_definitions))
 dbus_service_config := $(filter %dbus-service-config.json,$(my_src_files))
@@ -912,6 +922,7 @@
 aidl_src := $(strip $(filter %.aidl,$(my_src_files)))
 aidl_gen_cpp :=
 ifneq ($(aidl_src),)
+my_soong_problems += aidl
 
 # Use the intermediates directory to avoid writing our own .cpp -> .o rules.
 aidl_gen_cpp_root := $(intermediates)/aidl-generated/src
@@ -938,6 +949,39 @@
 endif  # $(aidl_src) non-empty
 
 ###########################################################
+## Compile the .vts files to .cc (or .c) and then to .o
+###########################################################
+
+vts_src := $(strip $(filter %.vts,$(my_src_files)))
+vts_gen_cpp :=
+ifneq ($(vts_src),)
+my_soong_problems += vts
+
+# Use the intermediates directory to avoid writing our own .cpp -> .o rules.
+vts_gen_cpp_root := $(intermediates)/vts-generated/src
+vts_gen_include_root := $(intermediates)/vts-generated/include
+
+# Multi-architecture builds have distinct intermediates directories.
+# Thus we'll actually generate source for each architecture.
+$(foreach s,$(vts_src),\
+    $(eval $(call define-vts-cpp-rule,$(s),$(vts_gen_cpp_root),vts_gen_cpp)))
+$(foreach cpp,$(vts_gen_cpp), \
+    $(call include-depfile,$(addsuffix .vts.P,$(basename $(cpp))),$(cpp)))
+$(call track-src-file-gen,$(vts_src),$(vts_gen_cpp))
+
+$(vts_gen_cpp) : PRIVATE_MODULE := $(LOCAL_MODULE)
+$(vts_gen_cpp) : PRIVATE_HEADER_OUTPUT_DIR := $(vts_gen_include_root)
+$(vts_gen_cpp) : PRIVATE_VTS_FLAGS := $(addprefix -I,$(LOCAL_VTS_INCLUDES))
+
+# Add generated headers to include paths.
+my_c_includes += $(vts_gen_include_root)
+my_export_c_include_dirs += $(vts_gen_include_root)
+# Pick up the generated C++ files later for transformation to .o files.
+my_generated_sources += $(vts_gen_cpp)
+
+endif  # $(vts_src) non-empty
+
+###########################################################
 ## YACC: Compile .y/.yy files to .c/.cpp and then to .o.
 ###########################################################
 
@@ -1174,6 +1218,7 @@
 $(call track-src-file-obj,$(objc_sources),$(objc_objects))
 
 ifneq ($(strip $(objc_objects)),)
+my_soong_problems += objc
 $(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m \
     $(my_additional_dependencies)
 	$(transform-$(PRIVATE_HOST)m-to-o)
@@ -1189,6 +1234,7 @@
 $(call track-src-file-obj,$(objcpp_sources),$(objcpp_objects))
 
 ifneq ($(strip $(objcpp_objects)),)
+my_soong_problems += objc
 $(objcpp_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.mm \
     $(my_additional_dependencies)
 	$(transform-$(PRIVATE_HOST)mm-to-o)
@@ -1306,13 +1352,17 @@
 ####################################################
 
 my_link_type := $(intermediates)/link_type
+all_link_types: $(my_link_type)
 ifdef LOCAL_SDK_VERSION
-$(my_link_type): PRIVATE_LINK_TYPE := ndk
-$(my_link_type): PRIVATE_ALLOWED_TYPES := ndk
+$(my_link_type): PRIVATE_LINK_TYPE := native:ndk
+$(my_link_type): PRIVATE_WARN_TYPES :=
+$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk
 else
-$(my_link_type): PRIVATE_LINK_TYPE := platform
-$(my_link_type): PRIVATE_ALLOWED_TYPES := (ndk|platform)
+$(my_link_type): PRIVATE_LINK_TYPE := native:platform
+$(my_link_type): PRIVATE_WARN_TYPES :=
+$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk native:platform
 endif
+$(eval $(call link-type-partitions,$(my_link_type)))
 my_link_type_deps := $(strip \
    $(foreach l,$(my_whole_static_libraries) $(my_static_libraries), \
      $(call intermediates-dir-for,STATIC_LIBRARIES,$(l),$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX),$(my_host_cross))/link_type))
@@ -1324,16 +1374,9 @@
 $(my_link_type): PRIVATE_DEPS := $(my_link_type_deps)
 $(my_link_type): PRIVATE_MODULE := $(LOCAL_MODULE)
 $(my_link_type): PRIVATE_MAKEFILE := $(LOCAL_MODULE_MAKEFILE)
-$(my_link_type): $(my_link_type_deps)
+$(my_link_type): $(my_link_type_deps) $(CHECK_LINK_TYPE)
 	@echo Check module type: $@
-	$(hide) mkdir -p $(dir $@) && rm -f $@
-ifdef my_link_type_deps
-	$(hide) for f in $(PRIVATE_DEPS); do \
-	  grep -qE '^$(PRIVATE_ALLOWED_TYPES)$$' $$f || \
-	    ($(call echo-error,"$(PRIVATE_MAKEFILE): $(PRIVATE_MODULE) ($(PRIVATE_LINK_TYPE)) should not link to $$(basename $${f%_intermediates/link_type}) ($$(cat $$f))"); exit 1) \
-	done
-endif
-	$(hide) echo $(PRIVATE_LINK_TYPE) >$@
+	$(check-link-type)
 
 
 ###########################################################
@@ -1464,13 +1507,7 @@
     $(addprefix $($(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
       $(addsuffix $(so_suffix), \
         $(installed_shared_library_module_names)))
-ifdef LOCAL_IS_HOST_MODULE
-# Disable .toc optimization for host modules: we may run the host binaries during the build process
-# and the libraries' implementation matters.
-built_shared_library_deps := $(built_shared_libraries)
-else
 built_shared_library_deps := $(addsuffix .toc, $(built_shared_libraries))
-endif
 my_system_shared_libraries_fullpath :=
 endif
 
@@ -1596,7 +1633,7 @@
     endif
     # If tidy flags are not specified, default to check all header files.
     ifeq ($(my_tidy_flags),)
-      my_tidy_flags := -header-filter=.*
+      my_tidy_flags := $(call default_tidy_header_filter,$(LOCAL_PATH))
     endif
   endif
 endif
@@ -1621,6 +1658,10 @@
 endif
 endif
 
+# my_cxx_ldlibs may contain linker flags need to wrap certain libraries
+# (start-group/end-group), so append after the check above.
+my_ldlibs += $(my_cxx_ldlibs)
+
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(my_asflags)
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CONLYFLAGS := $(my_conlyflags)
@@ -1679,7 +1720,7 @@
 $(export_includes): PRIVATE_REEXPORTED_INCLUDES := $(export_include_deps)
 # 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)
+$(export_includes) : $(my_export_c_include_deps) $(my_generated_sources) $(export_include_deps)
 	@echo Export includes file: $< -- $@
 	$(hide) mkdir -p $(dir $@) && rm -f $@.tmp && touch $@.tmp
 ifdef my_export_c_include_dirs
@@ -1703,3 +1744,23 @@
 
 # Make sure export_includes gets generated when you are running mm/mmm
 $(LOCAL_BUILT_MODULE) : | $(export_includes) $(my_link_type)
+
+ifneq ($(LOCAL_MODULE_MAKEFILE),$(SOONG_ANDROID_MK))
+SOONG_CONV.$(LOCAL_MODULE).PROBLEMS := \
+    $(SOONG_CONV.$(LOCAL_MODULE).PROBLEMS) $(my_soong_problems)
+SOONG_CONV.$(LOCAL_MODULE).DEPS := \
+    $(SOONG_CONV.$(LOCAL_MODULE).DEPS) \
+    $(my_static_libraries) \
+    $(my_whole_static_libraries) \
+    $(my_shared_libraries) \
+    $(my_system_shared_libraries)
+SOONG_CONV := $(SOONG_CONV) $(LOCAL_MODULE)
+endif
+
+###########################################################
+# Coverage packaging.
+###########################################################
+ifeq ($(my_native_coverage),true)
+LOCAL_GCNO_FILES := $(patsubst %.o,%.gcno,$(all_objects))
+$(foreach f,$(all_objects),$(eval $(call gcno-touch-rule,$(f),$(f:.o=.gcno))))
+endif
diff --git a/core/build_id.mk b/core/build_id.mk
index 0e8e2cf..5a012b9 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=MASTER
+export BUILD_ID=NYC
diff --git a/core/clang/config.mk b/core/clang/config.mk
index 7113892..c2a0bf4 100644
--- a/core/clang/config.mk
+++ b/core/clang/config.mk
@@ -138,11 +138,6 @@
 # provides to Clang (for supporting features like -ftrapv).
 COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES := libcompiler_rt-extras
 
-ifeq ($(HOST_PREFER_32_BIT),true)
-# We don't have 32-bit prebuilt libLLVM/libclang, so force to build them from source.
-FORCE_BUILD_LLVM_COMPONENTS := true
-endif
-
 # A list of projects that are allowed to set LOCAL_CLANG to false.
 # INTERNAL_LOCAL_CLANG_EXCEPTION_PROJECTS is defined later in other config.mk.
 LOCAL_CLANG_EXCEPTION_PROJECTS = \
diff --git a/core/clang/tidy.mk b/core/clang/tidy.mk
index 860257f..a081056 100644
--- a/core/clang/tidy.mk
+++ b/core/clang/tidy.mk
@@ -18,19 +18,26 @@
 # Global tidy checks include only google*, performance*,
 # and misc-macro-parentheses, but not google-readability*
 # or google-runtime-references.
-DEFAULT_GLOBAL_TIDY_CHECKS := \
+DEFAULT_GLOBAL_TIDY_CHECKS ?= \
   $(subst $(space),, \
-    -*,google*,performance*,misc-macro-parentheses \
-    ,-google-readability*,-google-runtime-references \
+    -*,google* \
+    ,misc-macro-parentheses \
+    ,performance* \
+    ,-google-readability* \
+    ,-google-runtime-references \
   )
 
 # There are too many clang-tidy warnings in external and vendor projects.
 # Enable only some google checks for these projects.
-DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS := \
+DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS ?= \
   $(subst $(space),, \
-    -*,google*,-google-build-using-namespace \
-    ,-google-readability*,-google-runtime-references \
-    ,-google-explicit-constructor,-google-runtime-int \
+    -*,google* \
+    ,-google-build-using-namespace \
+    ,-google-default-arguments \
+    ,-google-explicit-constructor \
+    ,-google-readability* \
+    ,-google-runtime-int \
+    ,-google-runtime-references \
   )
 
 # Every word in DEFAULT_LOCAL_TIDY_CHECKS list has the following format:
@@ -40,9 +47,11 @@
   external/:$(DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS) \
   external/google:$(DEFAULT_GLOBAL_TIDY_CHECKS) \
   external/webrtc:$(DEFAULT_GLOBAL_TIDY_CHECKS) \
+  frameworks/compile/mclinker/:$(DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS) \
   hardware/qcom:$(DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS) \
   vendor/:$(DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS) \
   vendor/google:$(DEFAULT_GLOBAL_TIDY_CHECKS) \
+  vendor/google_devices:$(DEFAULT_EXTERNAL_VENDOR_TIDY_CHECKS) \
 
 # Returns 2nd word of $(1) if $(2) has prefix of the 1st word of $(1).
 define find_default_local_tidy_check2
@@ -65,3 +74,27 @@
   ) \
 )
 endef
+
+# Give warnings to header files only in selected directories.
+# Do not give warnings to external or vendor header files,
+# which contain too many warnings.
+DEFAULT_TIDY_HEADER_DIRS := \
+  $(subst $(space),, \
+     art/ \
+    |bionic/ \
+    |bootable/ \
+    |build/ \
+    |cts/ \
+    |dalvik/ \
+    |developers/ \
+    |development/ \
+    |frameworks/ \
+    |libcore/ \
+    |libnativehelper/ \
+    |system/ \
+  )
+
+# Default filter contains current directory $1 and DEFAULT_TIDY_HEADER_DIRS.
+define default_tidy_header_filter
+  -header-filter="($(subst $(space),,$1|$(DEFAULT_TIDY_HEADER_DIRS)))"
+endef
diff --git a/core/clang/versions.mk b/core/clang/versions.mk
index 5988eff..03341d9 100644
--- a/core/clang/versions.mk
+++ b/core/clang/versions.mk
@@ -1,5 +1,5 @@
 ## Clang/LLVM release versions.
 
 LLVM_RELEASE_VERSION := 3.8
-LLVM_PREBUILTS_VERSION ?= clang-3016494
+LLVM_PREBUILTS_VERSION ?= clang-3289846
 LLVM_PREBUILTS_BASE ?= prebuilts/clang/host
diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk
index de6a5eb..6a29585 100644
--- a/core/cleanbuild.mk
+++ b/core/cleanbuild.mk
@@ -151,24 +151,18 @@
 # necessary to keep things consistent.
 
 previous_build_config_file := $(PRODUCT_OUT)/previous_build_config.mk
+current_build_config_file := $(PRODUCT_OUT)/current_build_config.mk
 
 current_build_config := \
     $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)
-current_sanitize_target := $(strip $(SANITIZE_TARGET))
-ifeq (,$(current_sanitize_target))
-  current_sanitize_target := false
-endif
 force_installclean := false
-force_objclean := false
 
 # Read the current state from the file, if present.
 # Will set PREVIOUS_BUILD_CONFIG.
 #
 PREVIOUS_BUILD_CONFIG :=
-PREVIOUS_SANITIZE_TARGET :=
 -include $(previous_build_config_file)
 PREVIOUS_BUILD_CONFIG := $(strip $(PREVIOUS_BUILD_CONFIG))
-PREVIOUS_SANITIZE_TARGET := $(strip $(PREVIOUS_SANITIZE_TARGET))
 
 ifdef PREVIOUS_BUILD_CONFIG
   ifneq "$(current_build_config)" "$(PREVIOUS_BUILD_CONFIG)"
@@ -181,27 +175,19 @@
   endif
 endif  # else, this is the first build, so no need to clean.
 
-ifdef PREVIOUS_SANITIZE_TARGET
-  ifneq "$(current_sanitize_target)" "$(PREVIOUS_SANITIZE_TARGET)"
-    $(info *** SANITIZE_TARGET changed: "$(PREVIOUS_SANITIZE_TARGET)" -> "$(current_sanitize_target)")
-    force_objclean := true
-  endif
-endif  # else, this is the first build, so no need to clean.
-
 # Write the new state to the file.
 #
-ifneq ($(PREVIOUS_BUILD_CONFIG)-$(PREVIOUS_SANITIZE_TARGET),$(current_build_config)-$(current_sanitize_target))
 $(shell \
-  mkdir -p $(dir $(previous_build_config_file)) && \
+  mkdir -p $(dir $(current_build_config_file)) && \
   echo "PREVIOUS_BUILD_CONFIG := $(current_build_config)" > \
-      $(previous_build_config_file) && \
-  echo "PREVIOUS_SANITIZE_TARGET := $(current_sanitize_target)" >> \
-      $(previous_build_config_file) \
+      $(current_build_config_file) \
  )
-endif
+$(shell cmp $(current_build_config_file) $(previous_build_config_file) > /dev/null 2>&1 || \
+  mv -f $(current_build_config_file) $(previous_build_config_file))
+
 PREVIOUS_BUILD_CONFIG :=
-PREVIOUS_SANITIZE_TARGET :=
 previous_build_config_file :=
+current_build_config_file :=
 current_build_config :=
 
 #
@@ -248,12 +234,6 @@
 	$(PRODUCT_OUT)/data-qemu/* \
 	$(PRODUCT_OUT)/userdata-qemu.img
 
-# The files/dirs to delete during an objclean, which removes any files
-# in the staging and emulator data partitions.
-objclean_files := \
-	$(TARGET_OUT_INTERMEDIATES) \
-	$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES)
-
 # make sure *_OUT is set so that we won't result in deleting random parts
 # of the filesystem.
 ifneq (2,$(words $(HOST_OUT) $(PRODUCT_OUT)))
@@ -273,12 +253,6 @@
 	$(hide) rm -rf $(FILES)
 	@echo "Deleted images and staging directories."
 
-.PHONY: objclean
-objclean: FILES := $(objclean_files)
-objclean:
-	$(hide) rm -rf $(FILES)
-	@echo "Deleted images and staging directories."
-
 ifeq "$(force_installclean)" "true"
   $(info *** Forcing "make installclean"...)
   $(info *** rm -rf $(dataclean_files) $(installclean_files))
@@ -287,14 +261,6 @@
 endif
 force_installclean :=
 
-ifeq "$(force_objclean)" "true"
-  $(info *** Forcing cleanup of intermediate files...)
-  $(info *** rm -rf $(objclean_files))
-  $(shell rm -rf $(objclean_files))
-  $(info *** Done with the cleaning, now starting the real build.)
-endif
-force_objclean :=
-
 ###########################################################
 
 .PHONY: clean-jack-files
diff --git a/core/clear_vars.mk b/core/clear_vars.mk
index 55d0021..faf18e3 100644
--- a/core/clear_vars.mk
+++ b/core/clear_vars.mk
@@ -56,6 +56,7 @@
 LOCAL_CONLYFLAGS:=
 LOCAL_RTTI_FLAG:=
 LOCAL_C_INCLUDES:=
+LOCAL_EXPORT_C_INCLUDE_DEPS:=
 LOCAL_EXPORT_C_INCLUDE_DIRS:=
 LOCAL_LDFLAGS:=
 LOCAL_CLANG_LDFLAGS:=
@@ -76,6 +77,8 @@
 LOCAL_NO_STANDARD_LIBRARIES:=
 LOCAL_CLASSPATH:=
 LOCAL_JACK_CLASSPATH:=
+LOCAL_JACK_PLUGIN_PATH:=
+LOCAL_JACK_PLUGIN:=
 LOCAL_DROIDDOC_USE_STANDARD_DOCLET:=
 LOCAL_DROIDDOC_SOURCE_PATH:=
 LOCAL_DROIDDOC_TEMPLATE_DIR:=
@@ -84,6 +87,7 @@
 LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:=
 LOCAL_DROIDDOC_OPTIONS:=
 LOCAL_DROIDDOC_HTML_DIR:=
+LOCAL_DROIDDOC_STUB_OUT_DIR:=
 LOCAL_ADDITIONAL_HTML_DIR:=
 LOCAL_ASSET_DIR:=
 LOCAL_RESOURCE_DIR:=
@@ -105,6 +109,7 @@
 LOCAL_RES_LIBRARIES:=
 LOCAL_MANIFEST_INSTRUMENTATION_FOR:=
 LOCAL_AIDL_INCLUDES:=
+LOCAL_VTS_INCLUDES:=
 LOCAL_JARJAR_RULES:=
 LOCAL_ADDITIONAL_JAVA_DIR:=
 LOCAL_ALLOW_UNDEFINED_SYMBOLS:=
@@ -141,6 +146,7 @@
 LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,nano,full,nanopb-c,nanopb-c-enable_malloc
 LOCAL_PROTOC_FLAGS:=
 LOCAL_PROTO_JAVA_OUTPUT_PARAMS:=
+LOCAL_VTSC_FLAGS:=
 LOCAL_NO_CRT:=
 LOCAL_NO_LIBCOMPILER_RT:=
 LOCAL_NO_LIBGCC:=
@@ -150,6 +156,8 @@
 LOCAL_ODM_MODULE:=
 LOCAL_PRIVILEGED_MODULE:=
 LOCAL_MODULE_OWNER:=
+LOCAL_COMPATIBILITY_SUITE:=
+LOCAL_COMPATIBILITY_SUPPORT_FILES:=
 LOCAL_CTS_TEST_PACKAGE:=
 LOCAL_CTS_TEST_RUNNER:=
 LOCAL_CLANG:=
@@ -165,7 +173,6 @@
 LOCAL_POST_INSTALL_CMD:=
 LOCAL_HAL_STATIC_LIBRARIES:=
 LOCAL_RMTYPEDEFS:=
-LOCAL_NO_SYNTAX_CHECK:=
 LOCAL_NO_STATIC_ANALYZER:=
 LOCAL_TIDY:=
 LOCAL_TIDY_CHECKS:=
@@ -186,17 +193,22 @@
 LOCAL_MODULE_UNSUPPORTED_HOST_CROSS_ARCH_WARN:=
 LOCAL_NO_FPIE :=
 LOCAL_CXX_STL := default
-LOCAL_NATIVE_COVERAGE :=
 LOCAL_DPI_VARIANTS:=
 LOCAL_DPI_FILE_STEM:=
 LOCAL_SANITIZE:=
 LOCAL_SANITIZE_RECOVER:=
+LOCAL_SANITIZE_DIAG:=
 LOCAL_NOSANITIZE:=
+LOCAL_DATA_BINDING:=
 LOCAL_DBUS_PROXY_PREFIX:=
 LOCAL_INIT_RC:=
 LOCAL_MODULE_SYMLINKS:=
 LOCAL_MODULE_HOST_OS:=
+LOCAL_FINDBUGS_FLAGS:=
 LOCAL_NOTICE_FILE:=
+LOCAL_USE_AAPT2:=$(USE_AAPT2)
+LOCAL_STATIC_ANDROID_LIBRARIES:=
+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:=
@@ -226,6 +238,7 @@
 LOCAL_PREBUILT_JNI_LIBS_$(TARGET_ARCH):=
 LOCAL_STRIP_MODULE_$(TARGET_ARCH):=
 LOCAL_PACK_MODULE_RELOCATIONS_$(TARGET_ARCH):=
+LOCAL_GCNO_FILES:=
 ifdef TARGET_2ND_ARCH
 LOCAL_SRC_FILES_$(TARGET_2ND_ARCH):=
 LOCAL_SRC_FILES_EXCLUDE_$(TARGET_2ND_ARCH):=
@@ -363,7 +376,6 @@
 LOCAL_MODULE_SYMLINKS_32:=
 LOCAL_MODULE_SYMLINKS_64:=
 LOCAL_JAVA_LANGUAGE_VERSION:=
-LOCAL_CTS_GTEST_LIST_EXECUTABLE:=
 
 LOCAL_IS_AUX_MODULE :=
 LOCAL_AUX_TOOLCHAIN :=
diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk
index 534c823..9a55cb5 100644
--- a/core/combo/HOST_darwin-x86.mk
+++ b/core/combo/HOST_darwin-x86.mk
@@ -31,14 +31,13 @@
 define transform-host-o-to-shared-lib-inner
 $(hide) $(PRIVATE_CXX) \
         -dynamiclib -single_module -read_only_relocs suppress \
-        $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \
         $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
             $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
         ) \
         $(PRIVATE_ALL_OBJECTS) \
         $(addprefix -force_load , $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
-        $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
-        $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+        $(PRIVATE_ALL_SHARED_LIBRARIES) \
+        $(PRIVATE_ALL_STATIC_LIBRARIES) \
         $(PRIVATE_LDLIBS) \
         -o $@ \
         -install_name @rpath/$(notdir $@) \
@@ -53,14 +52,13 @@
           -Wl,-rpath,@loader_path/$(path)) \
         -o $@ \
         -Wl,-headerpad_max_install_names \
-        $($(PRIVATE_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS) \
         $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
            $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
         ) \
-        $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
+        $(PRIVATE_ALL_SHARED_LIBRARIES) \
         $(PRIVATE_ALL_OBJECTS) \
-        $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
-        $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+        $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
+        $(PRIVATE_ALL_STATIC_LIBRARIES) \
         $(PRIVATE_LDFLAGS) \
         $(PRIVATE_LDLIBS)
 endef
diff --git a/core/combo/arch/mips64/mips64r6.mk b/core/combo/arch/mips64/mips64r6.mk
index 9d9068c..42d6c9e 100644
--- a/core/combo/arch/mips64/mips64r6.mk
+++ b/core/combo/arch/mips64/mips64r6.mk
@@ -1,3 +1,3 @@
 # Configuration for Android on mips64r6.
 
-ARCH_MIPS_REV6 := true
+ARCH_MIPS64_REV6 := true
diff --git a/core/config.mk b/core/config.mk
index 4f4b742..17fb82c 100644
--- a/core/config.mk
+++ b/core/config.mk
@@ -35,24 +35,15 @@
 # only has an effect on python 2.6 and above.
 export PYTHONDONTWRITEBYTECODE := 1
 
-# Standard source directories.
-# TODO: Enforce some kind of layering; only add include paths
-#       when a module links against a particular library.
-# TODO: See if we can remove most of these from the global list.
-SRC_SYSTEM_HEADERS := \
-	$(wildcard system/core/include) \
-	$(wildcard system/media/audio/include) \
-	$(wildcard hardware/libhardware/include) \
-	$(wildcard hardware/libhardware_legacy/include) \
-	$(wildcard hardware/ril/include) \
-	$(wildcard libnativehelper/include) \
-	$(wildcard frameworks/native/include) \
-	$(wildcard frameworks/native/opengl/include) \
-	$(wildcard frameworks/av/include) \
-	$(wildcard frameworks/base/include)
+ifneq ($(filter --color=always, $(GREP_OPTIONS)),)
+$(warning The build system needs unmodified output of grep.)
+$(error Please remove --color=always from your  $$GREP_OPTIONS)
+endif
+
 SRC_TARGET_DIR := $(TOPDIR)build/target
 SRC_API_DIR := $(TOPDIR)prebuilts/sdk/api
 SRC_SYSTEM_API_DIR := $(TOPDIR)prebuilts/sdk/system-api
+SRC_TEST_API_DIR := $(TOPDIR)prebuilts/sdk/test-api
 
 # Some specific paths to tools
 SRC_DROIDDOC_DIR := $(TOPDIR)build/tools/droiddoc
@@ -157,7 +148,7 @@
 
 # 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)
 
 # The build system exposes several variables for where to find the kernel
 # headers:
@@ -225,6 +216,9 @@
 endif
 TARGET_CPU_ABI2 := $(strip $(TARGET_CPU_ABI2))
 
+BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
+BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
+
 # Commands to generate .toc file common to ELF .so files.
 define _gen_toc_command_for_elf
 $(hide) ($($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)READELF) -d $(1) | grep SONAME || echo "No SONAME for $1") > $(2)
@@ -234,7 +228,7 @@
 # Commands to generate .toc file from Darwin dynamic library.
 define _gen_toc_command_for_macho
 $(hide) otool -l $(1) | grep LC_ID_DYLIB -A 5 > $(2)
-$(hide) nm -gP $(1) | cut -f1-2 -d" " | grep -v U$$ >> $(2)
+$(hide) nm -gP $(1) | cut -f1-2 -d" " | (grep -v U$$ >> $(2) || true)
 endef
 
 combo_target := HOST_
@@ -275,9 +269,14 @@
 include $(BUILD_SYSTEM)/combo/select.mk
 endif
 
+ifndef KATI
 include $(BUILD_SYSTEM)/ccache.mk
 include $(BUILD_SYSTEM)/goma.mk
 
+export CC_WRAPPER
+export CXX_WRAPPER
+endif
+
 ifdef TARGET_PREFER_32_BIT
 TARGET_PREFER_32_BIT_APPS := true
 TARGET_PREFER_32_BIT_EXECUTABLES := true
@@ -337,13 +336,10 @@
 2ND_TARGET_GCC_VERSION := 4.9
 endif
 
-# Normalize WITH_STATIC_ANALYZER and WITH_SYNTAX_CHECK
+# Normalize WITH_STATIC_ANALYZER
 ifeq ($(strip $(WITH_STATIC_ANALYZER)),0)
   WITH_STATIC_ANALYZER :=
 endif
-ifeq ($(strip $(WITH_SYNTAX_CHECK)),0)
-  WITH_SYNTAX_CHECK :=
-endif
 
 # define clang/llvm versions and base directory.
 include $(BUILD_SYSTEM)/clang/versions.mk
@@ -362,7 +358,7 @@
   PATH_TO_CLANG_TIDY :=
 endif
 
-# Disable WITH_STATIC_ANALYZER and WITH_SYNTAX_CHECK if tool can't be found
+# Disable WITH_STATIC_ANALYZER if tool can't be found
 SYNTAX_TOOLS_PREFIX := \
     $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/tools/scan-build/libexec
 ifneq ($(strip $(WITH_STATIC_ANALYZER)),)
@@ -372,14 +368,6 @@
   endif
 endif
 
-# WITH_STATIC_ANALYZER trumps WITH_SYNTAX_CHECK
-ifneq ($(strip $(WITH_STATIC_ANALYZER)),)
-  ifneq ($(strip $(WITH_SYNTAX_CHECK)),)
-    $(warning *** Disable WITH_SYNTAX_CHECK in the presence of static analyzer WITH_STATIC_ANALYZER)
-    WITH_SYNTAX_CHECK :=
-  endif
-endif
-
 # Pick a Java compiler.
 include $(BUILD_SYSTEM)/combo/javac.mk
 
@@ -463,6 +451,7 @@
 
 AIDL := $(HOST_OUT_EXECUTABLES)/aidl
 AAPT := $(HOST_OUT_EXECUTABLES)/aapt
+AAPT2 := $(HOST_OUT_EXECUTABLES)/aapt2
 ZIPALIGN := $(HOST_OUT_EXECUTABLES)/zipalign
 SIGNAPK_JAR := $(HOST_OUT_JAVA_LIBRARIES)/signapk$(COMMON_JAVA_PACKAGE_SUFFIX)
 SIGNAPK_JNI_LIBRARY_PATH := $(HOST_OUT_SHARED_LIBRARIES)
@@ -477,7 +466,11 @@
 
 # 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
@@ -490,6 +483,7 @@
 ifneq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
 AIDL := $(prebuilt_sdk_tools_bin)/aidl
 AAPT := $(prebuilt_sdk_tools_bin)/aapt
+AAPT2 := $(prebuilt_sdk_tools_bin)/aapt2
 ZIPALIGN := $(prebuilt_sdk_tools_bin)/zipalign
 SIGNAPK_JAR := $(prebuilt_sdk_tools)/lib/signapk$(COMMON_JAVA_PACKAGE_SUFFIX)
 # Use 64-bit libraries unconditionally because 32-bit JVMs are no longer supported
@@ -537,6 +531,7 @@
     $(wildcard external/nanopb-c/generator/*.py \
                external/nanopb-c/generator/google/*.py \
                external/nanopb-c/generator/proto/*.py)
+VTSC := $(HOST_OUT_EXECUTABLES)/vtsc$(HOST_EXECUTABLE_SUFFIX)
 DBUS_GENERATOR := $(HOST_OUT_EXECUTABLES)/dbus-binding-generator
 MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)
 MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)
@@ -550,14 +545,15 @@
 else
 BPTTOOL := $(BOARD_CUSTOM_BPTTOOL)
 endif
-ifeq (,$(strip $(BOARD_CUSTOM_BVBTOOL)))
-BVBTOOL := $(HOST_OUT_EXECUTABLES)/bvbtool$(HOST_EXECUTABLE_SUFFIX)
+ifeq (,$(strip $(BOARD_CUSTOM_AVBTOOL)))
+AVBTOOL := $(HOST_OUT_EXECUTABLES)/avbtool$(HOST_EXECUTABLE_SUFFIX)
 else
-BVBTOOL := $(BOARD_CUSTOM_BVBTOOL)
+AVBTOOL := $(BOARD_CUSTOM_AVBTOOL)
 endif
 APICHECK := $(HOST_OUT_EXECUTABLES)/apicheck$(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)
 MKEXTUSERIMG := $(HOST_OUT_EXECUTABLES)/mkuserimg.sh
 MAKE_SQUASHFS := $(HOST_OUT_EXECUTABLES)/mksquashfs$(HOST_EXECUTABLE_SUFFIX)
 MKSQUASHFSUSERIMG := $(HOST_OUT_EXECUTABLES)/mksquashfsimage.sh
@@ -569,6 +565,9 @@
 MKTARBALL := build/tools/mktarball.sh
 TUNE2FS := $(HOST_OUT_EXECUTABLES)/tune2fs$(HOST_EXECUTABLE_SUFFIX)
 JARJAR := $(HOST_OUT_JAVA_LIBRARIES)/jarjar.jar
+DATA_BINDING_COMPILER := $(HOST_OUT_JAVA_LIBRARIES)/databinding-compiler.jar
+FAT16COPY := build/tools/fat16copy.py
+CHECK_LINK_TYPE := build/tools/check_link_type.py
 
 ifneq ($(ANDROID_JACK_EXTRA_ARGS),)
 JACK_DEFAULT_ARGS :=
@@ -667,9 +666,6 @@
 RELATIVE_PWD :=
 endif
 
-HOST_GLOBAL_LD_DIRS := -L$(HOST_OUT_INTERMEDIATE_LIBRARIES)
-TARGET_GLOBAL_LD_DIRS := -L$(TARGET_OUT_INTERMEDIATE_LIBRARIES)
-
 HOST_PROJECT_INCLUDES :=
 HOST_PROJECT_SYSTEM_INCLUDES := $(HOST_OUT_HEADERS)
 TARGET_PROJECT_INCLUDES :=
@@ -678,24 +674,20 @@
 		$(TARGET_PRODUCT_KERNEL_HEADERS)
 
 ifdef TARGET_2ND_ARCH
-$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS := -L$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)
 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_PROJECT_INCLUDES := $(TARGET_PROJECT_INCLUDES)
 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_PROJECT_SYSTEM_INCLUDES := $(TARGET_PROJECT_SYSTEM_INCLUDES)
 endif
 
 ifdef HOST_2ND_ARCH
-$(HOST_2ND_ARCH_VAR_PREFIX)HOST_GLOBAL_LD_DIRS := -L$($(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES)
 $(HOST_2ND_ARCH_VAR_PREFIX)HOST_PROJECT_INCLUDES := $(HOST_PROJECT_INCLUDES)
 $(HOST_2ND_ARCH_VAR_PREFIX)HOST_PROJECT_SYSTEM_INCLUDES := $(HOST_PROJECT_SYSTEM_INCLUDES)
 endif
 
 ifdef HOST_CROSS_OS
-HOST_CROSS_GLOBAL_LD_DIRS := -L$(HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES)
 HOST_CROSS_PROJECT_INCLUDES :=
 HOST_CROSS_PROJECT_SYSTEM_INCLUDES := $(HOST_CROSS_OUT_HEADERS)
 
 ifdef HOST_CROSS_2ND_ARCH
-$(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_GLOBAL_LD_DIRS := -L$($(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_OUT_INTERMEDIATE_LIBRARIES)
 $(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_PROJECT_INCLUDES:= $(HOST_CROSS_PROJECT_INCLUDES)
 $(HOST_CROSS_2ND_ARCH_VAR_PREFIX)HOST_CROSS_PROJECT_SYSTEM_INCLUDES:= $(HOST_CROSS_PROJECT_SYSTEM_INCLUDES)
 endif
@@ -756,13 +748,15 @@
     $(patsubst $(HISTORICAL_SDK_VERSIONS_ROOT)/%/android.jar,%, \
     $(wildcard $(HISTORICAL_SDK_VERSIONS_ROOT)/*/android.jar)))
 
-# We don't have prebuilt system_current SDK yet.
-TARGET_AVAILABLE_SDK_VERSIONS := $(TARGET_AVAILABLE_SDK_VERSIONS)
+# We don't have prebuilt test_current SDK yet.
+TARGET_AVAILABLE_SDK_VERSIONS := test_current $(TARGET_AVAILABLE_SDK_VERSIONS)
 
 INTERNAL_PLATFORM_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/public_api.txt
 INTERNAL_PLATFORM_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/removed.txt
 INTERNAL_PLATFORM_SYSTEM_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/system-api.txt
 INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/system-removed.txt
+INTERNAL_PLATFORM_TEST_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/test-api.txt
+INTERNAL_PLATFORM_TEST_REMOVED_API_FILE := $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/test-removed.txt
 
 # This is the standard way to name a directory containing prebuilt target
 # objects. E.g., prebuilt/$(TARGET_PREBUILT_TAG)/libc.so
diff --git a/core/config_sanitizers.mk b/core/config_sanitizers.mk
index ac3e4fc..2e14fef 100644
--- a/core/config_sanitizers.mk
+++ b/core/config_sanitizers.mk
@@ -133,6 +133,11 @@
   endif
 endif
 
+ifneq ($(filter cfi,$(my_sanitize)),)
+  my_cflags += -flto -fsanitize-cfi-cross-dso -fvisibility=default
+  my_ldflags += -flto -fsanitize-cfi-cross-dso -fsanitize=cfi -Wl,-plugin-opt,O1 -Wl,-export-dynamic-symbol=__cfi_check
+endif
+
 # If local or global modules need ASAN, add linker flags.
 ifneq ($(filter address,$(my_global_sanitize) $(my_sanitize)),)
   my_ldflags += $(ADDRESS_SANITIZER_CONFIG_EXTRA_LDFLAGS)
@@ -187,3 +192,13 @@
   recover_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_RECOVER)),
   my_cflags += -fsanitize-recover=$(recover_arg)
 endif
+
+ifneq ($(strip $(LOCAL_SANITIZE_DIAG)),)
+  notrap_arg := $(subst $(space),$(comma),$(LOCAL_SANITIZE_DIAG)),
+  my_cflags += -fno-sanitize-trap=$(notrap_arg)
+  # Diagnostic requires a runtime library, unless ASan or TSan are also enabled.
+  ifeq ($(filter address thread,$(my_sanitize)),)
+    # Does not have to be the first DT_NEEDED unlike ASan.
+    my_shared_libraries += $($(LOCAL_2ND_ARCH_VAR_PREFIX)UBSAN_RUNTIME_LIBRARY)
+  endif
+endif
diff --git a/core/cxx_stl_setup.mk b/core/cxx_stl_setup.mk
index bff4d23..fd9c442 100644
--- a/core/cxx_stl_setup.mk
+++ b/core/cxx_stl_setup.mk
@@ -70,6 +70,7 @@
     endif
 endif
 
+my_cxx_ldlibs :=
 ifneq ($(filter $(my_cxx_stl),libc++ libc++_static),)
     my_cflags += -D_USING_LIBCXX
 
@@ -89,7 +90,7 @@
         my_cppflags += -nostdinc++
         my_ldflags += -nodefaultlibs
         my_ldlibs += -lpthread -lm
-        my_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs)
+        my_cxx_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs)
     else
         ifeq (arm,$($(my_prefix)$(LOCAL_2ND_ARCH_VAR_PREFIX)ARCH))
             my_static_libraries += libunwind_llvm
@@ -114,7 +115,7 @@
     ifdef LOCAL_IS_HOST_MODULE
         my_cppflags += -nostdinc++
         my_ldflags += -nodefaultlibs
-        my_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs)
+        my_cxx_ldlibs += $($($(my_prefix)OS)_$(my_link_type)_gcclibs)
     endif
 else
     $(error $(LOCAL_PATH): $(LOCAL_MODULE): $(my_cxx_stl) is not a supported STL.)
diff --git a/core/definitions.mk b/core/definitions.mk
index d1284e6..61e0461 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -123,6 +123,15 @@
 $(filter true, $(1))
 endef
 
+###########################################################
+## Rule for touching GCNO files.
+###########################################################
+define gcno-touch-rule
+$(2): $(1)
+	touch -c $$@
+endef
+
+###########################################################
 
 ###########################################################
 ## Retrieve the directory of the current makefile
@@ -302,6 +311,24 @@
 endef
 
 ###########################################################
+## Find all files named "*.vts" under the named directories,
+## which must be relative to $(LOCAL_PATH).  The returned list
+## is relative to $(LOCAL_PATH).
+###########################################################
+
+define all-vts-files-under
+$(call all-named-files-under,*.vts,$(1))
+endef
+
+###########################################################
+## Find all of the "*.vts" files under $(LOCAL_PATH).
+###########################################################
+
+define all-subdir-vts-files
+$(call all-vts-files-under,.)
+endef
+
+###########################################################
 ## Find all of the logtags files under the named directories.
 ## Meant to be used like:
 ##    SRC_FILES := $(call all-logtags-files-under,src)
@@ -576,25 +603,6 @@
 endef
 
 ###########################################################
-## Convert "path/to/libXXX.so" to "-lXXX".
-## Any "path/to/libXXX.a" elements pass through unchanged.
-###########################################################
-
-define normalize-libraries
-$(foreach so,$(filter %.so,$(1)),-l$(patsubst lib%.so,%,$(notdir $(so))))\
-$(filter-out %.so,$(1))
-endef
-
-# TODO: change users to call the common version.
-define normalize-host-libraries
-$(call normalize-libraries,$(1))
-endef
-
-define normalize-target-libraries
-$(call normalize-libraries,$(1))
-endef
-
-###########################################################
 ## Convert a list of short module names (e.g., "framework", "Browser")
 ## into the list of files that are built for those modules.
 ## NOTE: this won't return reliable results until after all
@@ -710,15 +718,6 @@
 endef
 
 ###########################################################
-## Run rot13 on a string
-## $(1): the string.  Must be one line.
-###########################################################
-define rot13
-$(shell echo $(1) | tr 'a-zA-Z' 'n-za-mN-ZA-M')
-endef
-
-
-###########################################################
 ## Returns true if $(1) and $(2) are equal.  Returns
 ## the empty string if they are not equal.
 ###########################################################
@@ -741,6 +740,13 @@
 endef
 
 ###########################################################
+## Convert "a b c" into "a,b,c"
+###########################################################
+define normalize-comma-list
+$(subst $(space),$(comma),$(strip $(1)))
+endef
+
+###########################################################
 ## Read the word out of a colon-separated list of words.
 ## This has the same behavior as the built-in function
 ## $(word n,str).
@@ -1106,6 +1112,31 @@
 endef
 
 ###########################################################
+## Commands for running vts
+###########################################################
+
+define transform-vts-to-cpp
+@mkdir -p $(dir $@)
+@mkdir -p $(PRIVATE_HEADER_OUTPUT_DIR)
+@echo "Generating C++ from VTS: $(PRIVATE_MODULE) <= $<"
+$(hide) $(VTSC) -d$(basename $@).vts.P $(PRIVATE_VTS_FLAGS) \
+    $< $(PRIVATE_HEADER_OUTPUT_DIR) $@
+endef
+
+## Given a .vts file path generate the rule to compile it a .cpp file.
+# $(1): a .vts source file
+# $(2): a directory to place the generated .cpp files in
+# $(3): name of a variable to add the path to the generated source file to
+#
+# You must call this with $(eval).
+define define-vts-cpp-rule
+define-vts-cpp-rule-src := $(patsubst %.vts,%$(LOCAL_CPP_EXTENSION),$(subst ../,dotdot/,$(addprefix $(2)/,$(1))))
+$$(define-vts-cpp-rule-src) : $(LOCAL_PATH)/$(1) $(VTSC)
+	$$(transform-vts-to-cpp)
+$(3) += $$(define-vts-cpp-rule-src)
+endef
+
+###########################################################
 ## Commands for running java-event-log-tags.py
 ###########################################################
 
@@ -1631,9 +1662,9 @@
 	-Wl,--gc-sections \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(PRIVATE_LDFLAGS) \
 	-o $@
 endef
@@ -1650,9 +1681,9 @@
 	-Wl,--gc-sections \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(PRIVATE_LDFLAGS) \
 	-Wl,-Map=$(@).map \
 	-o $@
@@ -1745,21 +1776,20 @@
 	-Wl,-rpath,\$$ORIGIN/../$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
 	-Wl,-rpath,\$$ORIGIN/$(notdir $($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_SHARED_LIBRARIES)) \
 	-shared -Wl,-soname,$(notdir $@) \
-	$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \
 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
 	   $(PRIVATE_HOST_GLOBAL_LDFLAGS) \
 	) \
 	$(PRIVATE_LDFLAGS) \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
+	$(PRIVATE_ALL_SHARED_LIBRARIES) \
 	-o $@ \
 	$(PRIVATE_LDLIBS)
 endef
@@ -1791,10 +1821,10 @@
 	$(PRIVATE_TARGET_CRTBEGIN_SO_O) \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
 	$(PRIVATE_TARGET_LIBATOMIC) \
@@ -1879,10 +1909,10 @@
 	$(PRIVATE_TARGET_CRTBEGIN_DYNAMIC_O) \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
 	$(PRIVATE_TARGET_LIBATOMIC) \
@@ -1924,15 +1954,15 @@
 	$(PRIVATE_LDFLAGS) \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-target-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
-	$(call normalize-target-libraries,$(filter-out %libcompiler_rt.a,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))))) \
+	$(filter-out %libcompiler_rt.a,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \
 	-Wl,--start-group \
-	$(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
-	$(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
+	$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_TARGET_COVERAGE_LIB)) \
 	$(PRIVATE_TARGET_LIBATOMIC) \
-	$(call normalize-target-libraries,$(filter %libcompiler_rt.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
+	$(filter %libcompiler_rt.a,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
 	$(PRIVATE_TARGET_LIBGCC) \
 	-Wl,--end-group \
 	$(PRIVATE_TARGET_CRTEND_O)
@@ -1963,18 +1993,17 @@
 $(hide) $(PRIVATE_CXX) \
 	$(PRIVATE_ALL_OBJECTS) \
 	-Wl,--whole-archive \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES) \
 	-Wl,--no-whole-archive \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
+	$(PRIVATE_ALL_STATIC_LIBRARIES) \
 	$(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),-lgcov) \
 	$(if $(filter true,$(NATIVE_COVERAGE)),$(PRIVATE_HOST_LIBPROFILE_RT)) \
-	$(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
+	$(PRIVATE_ALL_SHARED_LIBRARIES) \
 	-Wl,-rpath-link=$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)OUT_INTERMEDIATE_LIBRARIES) \
 	$(foreach path,$(PRIVATE_RPATHS), \
 	  -Wl,-rpath,\$$ORIGIN/$(path)) \
-	$($(PRIVATE_2ND_ARCH_VAR_PREFIX)$(PRIVATE_PREFIX)GLOBAL_LD_DIRS) \
 	$(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \
 		$(PRIVATE_HOST_GLOBAL_LDFLAGS) \
 	) \
@@ -1997,6 +2026,10 @@
 
 # Add BUILD_NUMBER to apps default version name if it's unbundled build.
 ifdef TARGET_BUILD_APPS
+TARGET_BUILD_WITH_APPS_VERSION_NAME := true
+endif
+
+ifdef TARGET_BUILD_WITH_APPS_VERSION_NAME
 APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)-$(BUILD_NUMBER_FROM_FILE)
 else
 APPS_DEFAULT_VERSION_NAME := $(PLATFORM_VERSION)
@@ -2034,6 +2067,88 @@
     --skip-symbols-without-default-localization
 endef
 
+# Search for generated R.java/Manifest.java, copy the found R.java as $@.
+# Also copy them to a central 'R' directory to make it easier to add the files to an IDE.
+define find-generated-R.java
+$(hide) for GENERATED_MANIFEST_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \
+  -name Manifest.java 2> /dev/null`; do \
+    dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_MANIFEST_FILE`; \
+    mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
+    $(ACP) -fp $$GENERATED_MANIFEST_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
+  done;
+$(hide) for GENERATED_R_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \
+  -name R.java 2> /dev/null`; do \
+    dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_R_FILE`; \
+    mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
+    $(ACP) -fp $$GENERATED_R_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir \
+      || exit 31; \
+    $(ACP) -fp $$GENERATED_R_FILE $@ || exit 32; \
+  done;
+@# Ensure that the target file is always created, i.e. also in case we did not
+@# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding.
+$(hide) touch $@
+endef
+
+###########################################################
+# AAPT2 compilation and link
+###########################################################
+define aapt2-compile-one-resource-file
+@mkdir -p $(dir $@)
+$(hide) $(AAPT2) compile -o $(dir $@) $(PRIVATE_AAPT2_CFLAGS) --legacy $<
+endef
+
+define aapt2-compile-resource-dirs
+@mkdir -p $(dir $@)
+$(hide) $(AAPT2) compile -o $@ $(addprefix --dir ,$(PRIVATE_SOURCE_RES_DIRS)) \
+  $(PRIVATE_AAPT2_CFLAGS) --legacy
+endef
+
+# Set up rule to compile one resource file with aapt2.
+# Must be called with $(eval).
+# $(1): the source file
+# $(2): the output file
+define aapt2-compile-one-resource-file-rule
+$(2) : $(1) $(AAPT2)
+	@echo "AAPT2 compile $$@ <- $$<"
+	$$(call aapt2-compile-one-resource-file)
+endef
+
+# Convert input resource file path to output file path.
+# values-[config]/<file>.xml -> values-[config]_<file>.arsc.flat;
+# For other resource file, just replace the last "/" with "_" and
+# add .flat extension.
+#
+# $(1): the input resource file path
+# $(2): the base dir of the output file path
+# Returns: the compiled output file path
+define aapt2-compiled-resource-out-file
+$(eval _p_w := $(strip $(subst /,$(space),$(dir $(1)))))$(2)/$(subst $(space),/,$(_p_w))_$(if $(filter values%,$(lastword $(_p_w))),$(patsubst %.xml,%.arsc,$(notdir $(1))),$(notdir $(1))).flat
+endef
+
+define aapt2-link
+@mkdir -p $(dir $@)
+$(call dump-words-to-file,$(PRIVATE_RES_FLAT),$(dir $@)aapt2-flat-list)
+$(hide) $(AAPT2) link -o $@ \
+  $(PRIVATE_AAPT_FLAGS) \
+  $(addprefix --manifest ,$(PRIVATE_ANDROID_MANIFEST)) \
+  $(addprefix -I ,$(PRIVATE_AAPT_INCLUDES)) \
+  $(addprefix -I ,$(PRIVATE_SHARED_ANDROID_LIBRARIES)) \
+  $(addprefix --java ,$(PRIVATE_SOURCE_INTERMEDIATES_DIR)) \
+  $(addprefix --proguard ,$(PRIVATE_PROGUARD_OPTIONS_FILE)) \
+  $(addprefix --min-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
+  $(addprefix --target-sdk-version ,$(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
+  $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product ,$(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \
+  $(addprefix -c ,$(PRIVATE_PRODUCT_AAPT_CONFIG)) \
+  $(addprefix --preferred-density ,$(PRIVATE_PRODUCT_AAPT_PREF_CONFIG)) \
+  $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
+  $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
+  $(addprefix --rename-manifest-package ,$(PRIVATE_MANIFEST_PACKAGE_NAME)) \
+  $(addprefix --rename-instrumentation-target-package ,$(PRIVATE_MANIFEST_INSTRUMENTATION_FOR)) \
+  $(addprefix -R , $(PRIVATE_OVERLAY_FLAT)) \
+  \@$(dir $@)aapt2-flat-list
+endef
+
+###########################################################
 xlint_unchecked := -Xlint:unchecked
 
 # emit-line, <word list>, <output file>
@@ -2045,33 +2160,34 @@
 define dump-words-to-file
         @rm -f $(2)
         @touch $(2)
-        @$(call emit-line,$(wordlist 1,200,$(1)),$(2))
-        @$(call emit-line,$(wordlist 201,400,$(1)),$(2))
-        @$(call emit-line,$(wordlist 401,600,$(1)),$(2))
-        @$(call emit-line,$(wordlist 601,800,$(1)),$(2))
-        @$(call emit-line,$(wordlist 801,1000,$(1)),$(2))
-        @$(call emit-line,$(wordlist 1001,1200,$(1)),$(2))
-        @$(call emit-line,$(wordlist 1201,1400,$(1)),$(2))
-        @$(call emit-line,$(wordlist 1401,1600,$(1)),$(2))
-        @$(call emit-line,$(wordlist 1601,1800,$(1)),$(2))
-        @$(call emit-line,$(wordlist 1801,2000,$(1)),$(2))
-        @$(call emit-line,$(wordlist 2001,2200,$(1)),$(2))
-        @$(call emit-line,$(wordlist 2201,2400,$(1)),$(2))
-        @$(call emit-line,$(wordlist 2401,2600,$(1)),$(2))
-        @$(call emit-line,$(wordlist 2601,2800,$(1)),$(2))
-        @$(call emit-line,$(wordlist 2801,3000,$(1)),$(2))
-        @$(call emit-line,$(wordlist 3001,3200,$(1)),$(2))
-        @$(call emit-line,$(wordlist 3201,3400,$(1)),$(2))
-        @$(call emit-line,$(wordlist 3401,3600,$(1)),$(2))
-        @$(call emit-line,$(wordlist 3601,3800,$(1)),$(2))
-        @$(call emit-line,$(wordlist 3801,4000,$(1)),$(2))
-        @$(call emit-line,$(wordlist 4001,4200,$(1)),$(2))
-        @$(call emit-line,$(wordlist 4201,4400,$(1)),$(2))
-        @$(call emit-line,$(wordlist 4401,4600,$(1)),$(2))
-        @$(call emit-line,$(wordlist 4601,4800,$(1)),$(2))
-        @$(call emit-line,$(wordlist 4801,5000,$(1)),$(2))
-        @$(call emit-line,$(wordlist 5001,5200,$(1)),$(2))
-        @$(if $(wordlist 5201,5202,$(1)),$(error Too many words ($(words $(1)))))
+        @$(call emit-line,$(wordlist 1,500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 501,1000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 1001,1500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 1501,2000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 2001,2500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 2501,3000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 3001,3500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 3501,4000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 4001,4500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 4501,5000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 5001,5500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 5501,6000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 6001,6500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 6501,7000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 7001,7500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 7501,8000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 8001,8500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 8501,9000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 9001,9500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 9501,10000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 10001,10500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 10501,11000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 11001,11500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 11501,12000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 12001,12500,$(1)),$(2))
+        @$(call emit-line,$(wordlist 12501,13000,$(1)),$(2))
+        @$(call emit-line,$(wordlist 13001,13500,$(1)),$(2))
+        @$(if $(wordlist 13501,13502,$(1)),$(error Too many words ($(words $(1)))))
 endef
 
 # For a list of jar files, unzip them to a specified directory,
@@ -2207,6 +2323,9 @@
     $(addprefix --classpath ,$(strip \
         $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
     $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
+    $(addprefix --pluginpath ,$(strip \
+         $(call normalize-path-list,$(PRIVATE_JACK_PLUGIN_PATH)))) \
+    $(if $(PRIVATE_JACK_PLUGIN),--plugin $(call normalize-comma-list,$(PRIVATE_JACK_PLUGIN))) \
     $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
     -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
     -D jack.import.resource.policy=keep-first \
@@ -2266,6 +2385,9 @@
 	$(hide) find $@.tmpjill.res -iname "*.class" -delete
 	$(hide) $(call call-jack) \
 	    $(PRIVATE_JACK_FLAGS) \
+	    $(addprefix --pluginpath ,$(strip \
+                $(call normalize-path-list,$(PRIVATE_JACK_PLUGIN_PATH)))) \
+	    $(if $(PRIVATE_JACK_PLUGIN),--plugin $(call normalize-comma-list,$(PRIVATE_JACK_PLUGIN))) \
         -D jack.import.resource.policy=keep-first \
         -D jack.import.type.policy=keep-first \
         -D jack.android.min-api-level=$(PRIVATE_JACK_MIN_SDK_VERSION) \
@@ -2373,6 +2495,9 @@
     $(addprefix --classpath ,$(strip \
         $(call normalize-path-list,$(PRIVATE_JACK_SHARED_LIBRARIES)))) \
     $(addprefix --import ,$(call reverse-list,$(PRIVATE_STATIC_JACK_LIBRARIES))) \
+    $(addprefix --pluginpath ,$(strip \
+        $(call normalize-path-list,$(PRIVATE_JACK_PLUGIN_PATH)))) \
+    $(if $(PRIVATE_JACK_PLUGIN),--plugin $(call normalize-comma-list,$(PRIVATE_JACK_PLUGIN))) \
     $(if $(PRIVATE_EXTRA_JAR_ARGS),--import-resource $@.res.tmp) \
     -D jack.import.resource.policy=keep-first \
     -D jack.import.type.policy=keep-first \
@@ -2435,7 +2560,7 @@
     $(addprefix -I , $(PRIVATE_AAPT_INCLUDES)) \
     $(addprefix --min-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
     $(addprefix --target-sdk-version , $(PRIVATE_DEFAULT_APP_TARGET_SDK)) \
-    $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(TARGET_AAPT_CHARACTERISTICS))) \
+    $(if $(filter --product,$(PRIVATE_AAPT_FLAGS)),,$(addprefix --product , $(PRIVATE_TARGET_AAPT_CHARACTERISTICS))) \
     $(if $(filter --version-code,$(PRIVATE_AAPT_FLAGS)),,--version-code $(PLATFORM_SDK_VERSION)) \
     $(if $(filter --version-name,$(PRIVATE_AAPT_FLAGS)),,--version-name $(APPS_DEFAULT_VERSION_NAME)) \
     $(addprefix --rename-manifest-package , $(PRIVATE_MANIFEST_PACKAGE_NAME)) \
@@ -2509,10 +2634,14 @@
 # decimal number) instead. If the APK does not specify a minSdkVersion, returns
 # 0 to match how the Android platform interprets this situation at runtime.
 #
+# This currently substitutes any version which contains characters other than
+# digits with the current platform's API Level number. This is because I
+# couldn't figure out an easy way to perform the substitution only for the
+# version codes listed in PLATFORM_VERSION_ALL_CODENAMES.
 define get-package-min-sdk-version-int
 $$(($(AAPT) dump badging $(1) 2>&1 | grep '^sdkVersion' || echo "sdkVersion:'0'") \
     | cut -d"'" -f2 | \
-    sed -e s/^$(PLATFORM_VERSION_CODENAME)$$/$(PLATFORM_SDK_VERSION)/)
+    sed -e s/^.*[^0-9].*$$/$(PLATFORM_SDK_VERSION)/)
 endef
 
 # Sign a package using the specified key/cert.
@@ -2534,13 +2663,15 @@
 # Align STORED entries of a package on 4-byte boundaries to make them easier to mmap.
 #
 define align-package
-$(hide) mv $@ $@.unaligned
-$(hide) $(ZIPALIGN) \
+$(hide) if ! $(ZIPALIGN) -c $(ZIPALIGN_PAGE_ALIGN_FLAGS) 4 $@ >/dev/null ; then \
+  mv $@ $@.unaligned; \
+  $(ZIPALIGN) \
     -f \
     $(ZIPALIGN_PAGE_ALIGN_FLAGS) \
     4 \
-    $@.unaligned $@.aligned
-$(hide) mv $@.aligned $@
+    $@.unaligned $@.aligned; \
+  mv $@.aligned $@; \
+  fi
 endef
 
 # Remove dynamic timestamps from packages
@@ -2552,7 +2683,7 @@
 # Uncompress shared libraries embedded in an apk.
 #
 define uncompress-shared-libs
-$(hide) if unzip -l $@ $(PRIVATE_EMBEDDED_JNI_LIBS) >/dev/null ; then \
+$(hide) if (zipinfo $@ $(PRIVATE_EMBEDDED_JNI_LIBS) 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
   rm -rf $(dir $@)uncompressedlibs && mkdir $(dir $@)uncompressedlibs; \
   unzip $@ $(PRIVATE_EMBEDDED_JNI_LIBS) -d $(dir $@)uncompressedlibs && \
   zip -d $@ 'lib/*.so' && \
@@ -2992,6 +3123,93 @@
 endef
 
 ###########################################################
+# Link type checking
+###########################################################
+define check-link-type
+$(hide) mkdir -p $(dir $@) && rm -f $@
+$(hide) $(CHECK_LINK_TYPE) --makefile $(PRIVATE_MAKEFILE) --module $(PRIVATE_MODULE) \
+  --type "$(PRIVATE_LINK_TYPE)" $(addprefix --allowed ,$(PRIVATE_ALLOWED_TYPES)) \
+  $(addprefix --warn ,$(PRIVATE_WARN_TYPES)) $(PRIVATE_DEPS)
+$(hide) echo "$(PRIVATE_LINK_TYPE)" >$@
+endef
+
+define link-type-partitions
+ifndef LOCAL_IS_HOST_MODULE
+ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE))
+ifneq ($(filter $(TARGET_OUT_VENDOR)/%,$(my_module_path)),)
+$(1): PRIVATE_LINK_TYPE += partition:vendor
+$(1): PRIVATE_WARN_TYPES += partition:data
+$(1): PRIVATE_ALLOWED_TYPES += partition:vendor partition:oem partition:odm
+else ifneq ($(filter $(TARGET_OUT_OEM)/%,$(my_module_path)),)
+$(1): PRIVATE_LINK_TYPE += partition:oem
+$(1): PRIVATE_WARN_TYPES += partition:data
+$(1): PRIVATE_ALLOWED_TYPES += partition:vendor partition:oem partition:odm
+else ifneq ($(filter $(TARGET_OUT_ODM)/%,$(my_module_path)),)
+$(1): PRIVATE_LINK_TYPE += partition:odm
+$(1): PRIVATE_WARN_TYPES += partition:data
+$(1): PRIVATE_ALLOWED_TYPES += partition:vendor partition:oem partition:odm
+else ifneq ($(filter $(TARGET_OUT_DATA)/%,$(my_module_path)),)
+$(1): PRIVATE_LINK_TYPE += partition:data
+$(1): PRIVATE_ALLOWED_TYPES += partition:data partition:vendor partition:oem partition:odm
+else
+$(1): PRIVATE_WARN_TYPES += partition:vendor partition:oem partition:odm partition:data
+endif
+else # uninstallable module
+$(1): PRIVATE_ALLOWED_TYPES += partition:vendor partition:oem partition:odm partition:data
+endif
+endif
+endef
+
+###########################################################
+# Basic math functions for positive integers <= 100
+#
+# (SDK versions for example)
+###########################################################
+__MATH_NUMBERS :=  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 \
+                  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 \
+                  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 \
+                  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
+                  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
+
+# Returns true if $(1) is a positive integer <= 100, otherwise returns nothing.
+define math_is_number
+$(strip \
+  $(if $(1),,$(error Argument missing)) \
+  $(if $(word 2,$(1)),$(error Multiple words in a single argument: $(1))) \
+  $(if $(filter $(1),$(__MATH_NUMBERS)),true))
+endef
+
+#$(warning true == $(call math_is_number,2))
+#$(warning == $(call math_is_number,foo))
+#$(call math_is_number,1 2)
+#$(call math_is_number,no 2)
+
+define _math_check_valid
+$(if $(call math_is_number,$(1)),,$(error Only positive integers <= 100 are supported (not $(1))))
+endef
+
+#$(call _math_check_valid,0)
+#$(call _math_check_valid,1)
+#$(call _math_check_valid,100)
+#$(call _math_check_valid,101)
+#$(call _math_check_valid,)
+#$(call _math_check_valid,1 2)
+
+# Returns the greater of $1 or $2.
+# If $1 or $2 is not a positive integer <= 100, then an error is generated.
+define math_max
+$(strip $(call _math_check_valid,$(1)) $(call _math_check_valid,$(2)) \
+  $(lastword $(filter $(1) $(2),$(__MATH_NUMBERS))))
+endef
+
+#$(call math_max)
+#$(call math_max,1)
+#$(call math_max,1 2,3)
+#$(warning 1 == $(call math_max,1,1))
+#$(warning 42 == $(call math_max,5,42))
+#$(warning 42 == $(call math_max,42,5))
+
+###########################################################
 ## Other includes
 ###########################################################
 
diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk
index 3a43336..fa8bb19 100644
--- a/core/dex_preopt.mk
+++ b/core/dex_preopt.mk
@@ -19,6 +19,22 @@
 # The default value for LOCAL_DEX_PREOPT
 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
+# 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
+# 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
+
 GLOBAL_DEXPREOPT_FLAGS :=
 ifeq ($(WITH_DEXPREOPT_PIC),true)
 # Compile boot.oat as position-independent code if WITH_DEXPREOPT_PIC=true
diff --git a/core/dex_preopt_libart.mk b/core/dex_preopt_libart.mk
index 64ea226..ab54b1d 100644
--- a/core/dex_preopt_libart.mk
+++ b/core/dex_preopt_libart.mk
@@ -25,10 +25,6 @@
 COMPILED_CLASSES := $(call word-colon,1,$(firstword \
     $(filter %system/etc/compiled-classes,$(PRODUCT_COPY_FILES))))
 
-# start of image reserved address space
-LIBART_IMG_HOST_BASE_ADDRESS   := 0x60000000
-LIBART_IMG_TARGET_BASE_ADDRESS := 0x70000000
-
 define get-product-default-property
 $(strip $(patsubst $(1)=%,%,$(filter $(1)=%,$(PRODUCT_DEFAULT_PROPERTY_OVERRIDES))))
 endef
@@ -45,7 +41,6 @@
 # building the image. We therefore limit the Xmx value. This isn't done
 # via a property as we want the larger Xmx value if we're running on a
 # MIPS device.
-LIBART_IMG_TARGET_BASE_ADDRESS := 0x30000000
 DEX2OAT_XMX := 128m
 endif
 
@@ -71,6 +66,13 @@
 LIBART_TARGET_BOOT_DEX_LOCATIONS := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),/$(DEXPREOPT_BOOT_JAR_DIR)/$(jar).jar)
 LIBART_TARGET_BOOT_DEX_FILES := $(foreach jar,$(LIBART_TARGET_BOOT_JARS),$(call intermediates-dir-for,JAVA_LIBRARIES,$(jar),,COMMON)/javalib.jar)
 
+# dex preopt on the bootclasspath produces multiple files.  The first dex file
+# is converted into to boot.art (to match the legacy assumption that boot.art
+# exists), and the rest are converted to boot-<name>.art.
+# In addition, each .art file has an associated .oat file.
+LIBART_TARGET_BOOT_ART_EXTRA_FILES := $(foreach jar,$(wordlist 2,999,$(LIBART_TARGET_BOOT_JARS)),boot-$(jar).art boot-$(jar).oat boot-$(jar).vdex)
+LIBART_TARGET_BOOT_ART_EXTRA_FILES += boot.oat boot.vdex
+
 my_2nd_arch_prefix :=
 include $(BUILD_SYSTEM)/dex_preopt_libart_boot.mk
 
diff --git a/core/dex_preopt_libart_boot.mk b/core/dex_preopt_libart_boot.mk
index a4a5bd3..1a0dc5b 100644
--- a/core/dex_preopt_libart_boot.mk
+++ b/core/dex_preopt_libart_boot.mk
@@ -28,6 +28,8 @@
 $(my_2nd_arch_prefix)LIBART_TARGET_BOOT_OAT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)$(patsubst %.art,%.oat,$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME))
 
 $(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE := $(PRODUCT_OUT)$($(my_2nd_arch_prefix)LIBART_BOOT_IMAGE_FILENAME)
+$(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES := $(addprefix $(dir $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)),\
+    $(LIBART_TARGET_BOOT_ART_EXTRA_FILES))
 
 # If we have a compiled-classes file, create a parameter.
 COMPILED_CLASSES_FLAGS :=
@@ -35,10 +37,18 @@
   COMPILED_CLASSES_FLAGS := --compiled-classes=$(COMPILED_CLASSES)
 endif
 
-# The rule to install boot.art and boot.oat
-$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP)
-	$(hide) $(ACP) -fp $(dir $<)/*.art $(dir $@)
-	$(hide) $(ACP) -fp $(dir $<)/*.oat $(dir $@)
+# The rule to install boot.art
+# Depends on installed boot.oat, boot-*.art, boot-*.oat
+$($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME) | $(ACP) $($(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES)
+	@echo "Install: $@"
+	$(copy-file-to-target)
+
+# The rule to install boot.oat, boot-*.art, boot-*.oat
+# Depends on built-but-not-installed boot.art
+$($(my_2nd_arch_prefix)LIBART_TARGET_BOOT_ART_EXTRA_INSTALLED_FILES) : $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME)  | $(ACP)
+	@echo "Install: $@"
+	@mkdir -p $(dir $@)
+	$(hide) $(ACP) -fp $(dir $<)$(notdir $@) $@
 
 $($(my_2nd_arch_prefix)DEFAULT_DEX_PREOPT_BUILT_IMAGE_FILENAME): PRIVATE_2ND_ARCH_VAR_PREFIX := $(my_2nd_arch_prefix)
 # Use dex2oat debug version for better error reporting
diff --git a/core/dex_preopt_odex_install.mk b/core/dex_preopt_odex_install.mk
index b7ecf2e..0966bd5 100644
--- a/core/dex_preopt_odex_install.mk
+++ b/core/dex_preopt_odex_install.mk
@@ -41,8 +41,11 @@
 endif
 
 built_odex :=
+built_vdex :=
 installed_odex :=
+installed_vdex :=
 built_installed_odex :=
+built_installed_vdex :=
 ifdef LOCAL_DEX_PREOPT
 dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE))
 ifdef dexpreopt_boot_jar_module
@@ -91,7 +94,9 @@
 endif  # boot jar
 
 built_odex := $(strip $(built_odex))
+built_vdex := $(strip $(built_vdex))
 installed_odex := $(strip $(installed_odex))
+installed_vdex := $(strip $(installed_vdex))
 
 ifdef built_odex
 ifndef LOCAL_DEX_PREOPT_FLAGS
@@ -103,17 +108,25 @@
 
 $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
 
+$(built_vdex): $(built_odex)
+
 # 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)))
 	@echo "Install: $@"
 	$(copy-file-to-target)
+$(installed_vdex) : $(dir $(LOCAL_INSTALLED_MODULE))%$(notdir $(word 1,$(installed_vdex))) \
+                  : $(dir $(LOCAL_BUILT_MODULE))%$(notdir $(word 1,$(built_vdex)))
+	@echo "Install: $@"
+	$(copy-file-to-target)
 endif
 
 # Add the installed_odex to the list of installed files for this module.
 ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex)
+ALL_MODULES.$(my_register_name).INSTALLED += $(installed_vdex)
 ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_odex)
+ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_vdex)
 
 # Record dex-preopt config.
 DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT)
@@ -128,7 +141,7 @@
   $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE))
 
 
-# Make sure to install the .odex when you run "make <module_name>"
-$(my_register_name): $(installed_odex)
+# Make sure to install the .odex and .vdex when you run "make <module_name>"
+$(my_all_targets): $(installed_odex) $(installed_vdex)
 
 endif # LOCAL_DEX_PREOPT
diff --git a/core/dpi_specific_apk.mk b/core/dpi_specific_apk.mk
index 2f81ba0..bcc5c18 100644
--- a/core/dpi_specific_apk.mk
+++ b/core/dpi_specific_apk.mk
@@ -17,7 +17,7 @@
 $(built_dpi_apk): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR)
 $(built_dpi_apk): PRIVATE_ASSET_DIR := $(LOCAL_ASSET_DIR)
 $(built_dpi_apk): PRIVATE_AAPT_INCLUDES := $(all_library_res_package_exports)
-ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
+ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
 $(built_dpi_apk): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION)
 else
 $(built_dpi_apk): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK)
diff --git a/core/droiddoc.mk b/core/droiddoc.mk
index 06506db..a70ab03 100644
--- a/core/droiddoc.mk
+++ b/core/droiddoc.mk
@@ -69,6 +69,9 @@
   else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current)
     LOCAL_JAVA_LIBRARIES := android_system_stubs_current $(LOCAL_JAVA_LIBRARIES)
     $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, android_system_stubs_current)
+  else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current)
+    LOCAL_JAVA_LIBRARIES := android_test_stubs_current $(LOCAL_JAVA_LIBRARIES)
+    $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, android_test_stubs_current)
   else
     LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES)
     $(full_target): PRIVATE_BOOTCLASSPATH := $(call java-lib-files, sdk_v$(LOCAL_SDK_VERSION))
@@ -100,6 +103,7 @@
 
 $(full_target): PRIVATE_OUT_DIR := $(out_dir)
 $(full_target): PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS)
+$(full_target): PRIVATE_STUB_OUT_DIR := $(LOCAL_DROIDDOC_STUB_OUT_DIR)
 
 # Lists the input files for the doc build into a text file
 # suitable for the @ syntax of javadoc.
@@ -165,6 +169,7 @@
         $(LOCAL_ADDITIONAL_DEPENDENCIES)
 	@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), \
 			$(PRIVATE_SOURCE_INTERMEDIATES_DIR) $(PRIVATE_ADDITIONAL_JAVA_DIR))
 	$(hide) ( \
@@ -186,6 +191,7 @@
                 -d $(PRIVATE_OUT_DIR) \
                 $(PRIVATE_CURRENT_BUILD) $(PRIVATE_CURRENT_TIME) \
                 $(PRIVATE_DROIDDOC_OPTIONS) \
+                $(addprefix -stubs ,$(PRIVATE_STUB_OUT_DIR)) \
         && touch -f $@ \
     ) || (rm -rf $(PRIVATE_OUT_DIR) $(PRIVATE_SRC_LIST_FILE); exit 45)
 
diff --git a/core/envsetup.mk b/core/envsetup.mk
index a0e322a..8794c8a 100644
--- a/core/envsetup.mk
+++ b/core/envsetup.mk
@@ -261,10 +261,12 @@
 HOST_OUT_JAVA_LIBRARIES := $(HOST_OUT)/framework
 HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon
 HOST_OUT_NATIVE_TESTS := $(HOST_OUT)/nativetest64
+HOST_OUT_COVERAGE := $(HOST_OUT)/coverage
 
 HOST_CROSS_OUT_EXECUTABLES := $(HOST_CROSS_OUT)/bin
 HOST_CROSS_OUT_SHARED_LIBRARIES := $(HOST_CROSS_OUT)/lib
 HOST_CROSS_OUT_NATIVE_TESTS := $(HOST_CROSS_OUT)/nativetest
+HOST_CROSS_OUT_COVERAGE := $(HOST_CROSS_OUT)/coverage
 
 HOST_OUT_INTERMEDIATES := $(HOST_OUT)/obj
 HOST_OUT_HEADERS := $(HOST_OUT_INTERMEDIATES)/include
@@ -298,11 +300,7 @@
 
 # The default host library path.
 # It always points to the path where we build libraries in the default bitness.
-ifeq ($(HOST_PREFER_32_BIT),true)
-HOST_LIBRARY_PATH := $($(HOST_2ND_ARCH_VAR_PREFIX)HOST_OUT_SHARED_LIBRARIES)
-else
 HOST_LIBRARY_PATH := $(HOST_OUT_SHARED_LIBRARIES)
-endif
 
 # Out for HOST_CROSS_2ND_ARCH
 HOST_CROSS_2ND_ARCH_VAR_PREFIX := 2ND_
@@ -377,8 +375,10 @@
 TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC)
 ifeq ($(TARGET_IS_64_BIT),true)
 TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest64
+TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest64
 else
 TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest
+TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest
 endif
 TARGET_OUT_DATA_FAKE := $(TARGET_OUT_DATA)/fake_packages
 
@@ -387,8 +387,10 @@
 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_APPS := $(TARGET_OUT_DATA_APPS)
 ifeq ($(TARGET_TRANSLATE_2ND_ARCH),true)
 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest/$(TARGET_2ND_ARCH)
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest/$(TARGET_2ND_ARCH)
 else
 $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest
+$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS := $(TARGET_OUT_DATA)/benchmarktest
 endif
 
 TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
@@ -467,6 +469,7 @@
 TARGET_ROOT_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)
 TARGET_ROOT_OUT_SBIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/sbin
 TARGET_ROOT_OUT_BIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/bin
+TARGET_OUT_COVERAGE := $(PRODUCT_OUT)/coverage
 
 TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT)
 TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin
diff --git a/core/executable_internal.mk b/core/executable_internal.mk
index 2b8a47c..593f9f4 100644
--- a/core/executable_internal.mk
+++ b/core/executable_internal.mk
@@ -34,7 +34,7 @@
 endif
 
 # Define PRIVATE_ variables from global vars
-my_target_global_ld_dirs := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS)
+my_target_global_ld_dirs :=
 ifeq ($(LOCAL_NO_LIBGCC),true)
 my_target_libgcc :=
 else
diff --git a/core/executable_prefer_symlink.mk b/core/executable_prefer_symlink.mk
index e59e8c2..9b9814e 100644
--- a/core/executable_prefer_symlink.mk
+++ b/core/executable_prefer_symlink.mk
@@ -33,11 +33,7 @@
   endif
 else
   my_symlink := $(addprefix $(HOST_OUT)/bin/, $(LOCAL_MODULE))
-  ifneq ($(HOST_PREFER_32_BIT),true)
-    my_src_binary_name := $(LOCAL_MODULE_STEM_64)
-  else
-    my_src_binary_name := $(LOCAL_MODULE_STEM_32)
-  endif
+  my_src_binary_name := $(LOCAL_MODULE_STEM_64)
 endif
 
 $(call symlink-file,$(my_module_path)/$(my_src_binary_name),$(my_src_binary_name),$(my_symlink))
diff --git a/core/fuzz_test.mk b/core/fuzz_test.mk
index c31e2e7..f6d6e9a 100644
--- a/core/fuzz_test.mk
+++ b/core/fuzz_test.mk
@@ -23,8 +23,8 @@
 $(error $(LOCAL_PATH): Do not set LOCAL_MODULE_PATH_64 when building test $(LOCAL_MODULE))
 endif
 
-LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
-LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
+LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/fuzzers/$(LOCAL_MODULE)
+LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/fuzzers/$(LOCAL_MODULE)
 
 ifndef LOCAL_MULTILIB
 ifndef LOCAL_32_BIT_ONLY
diff --git a/core/goma.mk b/core/goma.mk
index c0c27c5..4e8318a 100644
--- a/core/goma.mk
+++ b/core/goma.mk
@@ -14,6 +14,9 @@
 # limitations under the License.
 #
 
+# Used by the compiler wrapper, but should only be set by gomacc
+unexport GOMACC_PATH
+
 # Notice: this works only with Google's Goma build infrastructure.
 ifneq ($(filter-out false,$(USE_GOMA)),)
   # Goma requires a lot of processes and file descriptors.
@@ -46,7 +49,9 @@
   # gomacc can start goma client's daemon process automatically, but
   # it is safer and faster to start up it beforehand. We run this as a
   # background process so this won't slow down the build.
-  $(shell ( $(goma_ctl) ensure_start ) &> /dev/null &)
+  ifndef NOSTART_GOMA
+    $(shell ( $(goma_ctl) ensure_start ) &> /dev/null &)
+  endif
 
   goma_ctl :=
   goma_dir :=
diff --git a/core/host_dalvik_java_library.mk b/core/host_dalvik_java_library.mk
index cee3cc4..64b610e 100644
--- a/core/host_dalvik_java_library.mk
+++ b/core/host_dalvik_java_library.mk
@@ -85,7 +85,9 @@
 
 ifneq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true)
 $(built_dex): PRIVATE_CLASSES_JACK := $(full_classes_jack)
-$(built_dex): $(jack_all_deps) | setup-jack-server
+$(built_dex): PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(built_dex): PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
+$(built_dex): $(jack_all_deps) $(LOCAL_JACK_PLUGIN_PATH) | setup-jack-server
 	@echo Building with Jack: $@
 	$(jack-java-to-dex)
 
@@ -103,7 +105,9 @@
 	$(add-carried-jack-resources)
 
 else  # LOCAL_IS_STATIC_JAVA_LIBRARY
-$(full_classes_jack): $(jack_all_deps) | setup-jack-server
+$(full_classes_jack): PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(full_classes_jack): PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
+$(full_classes_jack): $(jack_all_deps) $(LOCAL_JACK_PLUGIN_PATH) | setup-jack-server
 	@echo Building with Jack: $@
 	$(java-to-jack)
 
diff --git a/core/host_executable.mk b/core/host_executable.mk
index 78223eb..1480c2c 100644
--- a/core/host_executable.mk
+++ b/core/host_executable.mk
@@ -6,14 +6,10 @@
 
 ifndef LOCAL_MODULE_HOST_ARCH
 ifndef my_module_multilib
-ifeq ($(HOST_PREFER_32_BIT),true)
-my_module_multilib := 32
-else
 # By default we only build host module for the first arch.
 my_module_multilib := first
 endif
 endif
-endif
 
 ifeq ($(LOCAL_NO_FPIE),)
 LOCAL_LDFLAGS += $(HOST_FPIE_FLAGS)
diff --git a/core/host_java_library.mk b/core/host_java_library.mk
index 0a7dd8a..cc26d7c 100644
--- a/core/host_java_library.mk
+++ b/core/host_java_library.mk
@@ -73,6 +73,7 @@
 	$(transform-host-java-to-package)
 
 javac-check : $(full_classes_compiled_jar)
+javac-check-$(LOCAL_MODULE) : $(full_classes_compiled_jar)
 
 # Run jarjar if necessary, otherwise just copy the file.
 ifneq ($(strip $(LOCAL_JARJAR_RULES)),)
diff --git a/core/host_shared_library.mk b/core/host_shared_library.mk
index df24b63..5da7913 100644
--- a/core/host_shared_library.mk
+++ b/core/host_shared_library.mk
@@ -6,14 +6,10 @@
 
 ifndef LOCAL_MODULE_HOST_ARCH
 ifndef my_module_multilib
-ifeq ($(HOST_PREFER_32_BIT),true)
-my_module_multilib := 32
-else
 # libraries default to building for both architecturess
 my_module_multilib := both
 endif
 endif
-endif
 
 LOCAL_2ND_ARCH_VAR_PREFIX :=
 include $(BUILD_SYSTEM)/module_arch_supported.mk
diff --git a/core/host_static_library.mk b/core/host_static_library.mk
index 61f5569..aa0421e 100644
--- a/core/host_static_library.mk
+++ b/core/host_static_library.mk
@@ -6,14 +6,10 @@
 
 ifndef LOCAL_MODULE_HOST_ARCH
 ifndef my_module_multilib
-ifeq ($(HOST_PREFER_32_BIT),true)
-my_module_multilib := 32
-else
 # libraries default to building for both architecturess
 my_module_multilib := both
 endif
 endif
-endif
 
 LOCAL_2ND_ARCH_VAR_PREFIX :=
 include $(BUILD_SYSTEM)/module_arch_supported.mk
diff --git a/core/install_jni_libs_internal.mk b/core/install_jni_libs_internal.mk
index 9f5d445..14cc384 100644
--- a/core/install_jni_libs_internal.mk
+++ b/core/install_jni_libs_internal.mk
@@ -102,28 +102,26 @@
 # Verify that all included libraries are built against the NDK
 ifneq ($(strip $(LOCAL_JNI_SHARED_LIBRARIES)),)
 my_link_type := $(call intermediates-dir-for,APPS,$(LOCAL_MODULE))/$(my_2nd_arch_prefix)jni_link_type
+all_link_types: $(my_link_type)
 my_link_type_deps := $(strip \
   $(foreach l,$(LOCAL_JNI_SHARED_LIBRARIES),\
     $(call intermediates-dir-for,SHARED_LIBRARIES,$(l),,,$(my_2nd_arch_prefix))/link_type))
 ifneq ($(LOCAL_SDK_VERSION),)
-$(my_link_type): PRIVATE_LINK_TYPE := sdk
-$(my_link_type): PRIVATE_ALLOWED_TYPES := ndk
+$(my_link_type): PRIVATE_LINK_TYPE := app:sdk
+$(my_link_type): PRIVATE_WARN_TYPES := native:platform
+$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk
 else
-$(my_link_type): PRIVATE_LINK_TYPE := platform
-$(my_link_type): PRIVATE_ALLOWED_TYPES := (ndk|platform)
+$(my_link_type): PRIVATE_LINK_TYPE := app:platform
+$(my_link_type): PRIVATE_WARN_TYPES :=
+$(my_link_type): PRIVATE_ALLOWED_TYPES := native:ndk native:platform
 endif
+$(eval $(call link-type-partitions,$(my_link_type)))
 $(my_link_type): PRIVATE_DEPS := $(my_link_type_deps)
 $(my_link_type): PRIVATE_MODULE := $(LOCAL_MODULE)
 $(my_link_type): PRIVATE_MAKEFILE := $(LOCAL_MODULE_MAKEFILE)
-$(my_link_type): $(my_link_type_deps)
+$(my_link_type): $(my_link_type_deps) $(CHECK_LINK_TYPE)
 	@echo Check JNI module types: $@
-	$(hide) mkdir -p $(dir $@)
-	$(hide) rm -f $@
-	$(hide) for f in $(PRIVATE_DEPS); do \
-	  grep -qE '^$(PRIVATE_ALLOWED_TYPES)$$' $$f || \
-	    $(call echo-warning,"$(PRIVATE_MAKEFILE): $(PRIVATE_MODULE) ($(PRIVATE_LINK_TYPE)) should not link to $$(basename $${f%_intermediates/link_type}) ($$(cat $$f))"); \
-	done
-	$(hide) touch $@
+	$(check-link-type)
 
 $(LOCAL_BUILT_MODULE): | $(my_link_type)
 
diff --git a/core/java.mk b/core/java.mk
index 85823b7..9199f7c 100644
--- a/core/java.mk
+++ b/core/java.mk
@@ -31,6 +31,8 @@
         LOCAL_JAVA_LIBRARIES := android_stubs_current $(LOCAL_JAVA_LIBRARIES)
       else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current)
         LOCAL_JAVA_LIBRARIES := android_system_stubs_current $(LOCAL_JAVA_LIBRARIES)
+      else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current)
+        LOCAL_JAVA_LIBRARIES := android_test_stubs_current $(LOCAL_JAVA_LIBRARIES)
       else
         LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES)
       endif
@@ -39,6 +41,8 @@
         my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION)
       else ifeq ($(LOCAL_SDK_VERSION),system_current)
         my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION)
+      else ifeq ($(LOCAL_SDK_VERSION),test_current)
+        my_jack_min_sdk_version := $(PLATFORM_JACK_MIN_SDK_VERSION)
       else
         my_jack_min_sdk_version := $(LOCAL_SDK_VERSION)
       endif
@@ -68,10 +72,12 @@
 endif
 endif
 
-# LOCAL_STATIC_JAVA_AAR_LIBRARIES are special LOCAL_STATIC_JAVA_LIBRARIES
-LOCAL_STATIC_JAVA_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_AAR_LIBRARIES))
-
-LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES))
+# LOCAL_STATIC_JAVA_AAR_LIBRARIES and LOCAL_STATIC_ANDROID_LIBRARIES are also LOCAL_STATIC_JAVA_LIBRARIES.
+LOCAL_STATIC_JAVA_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_LIBRARIES) \
+    $(LOCAL_STATIC_JAVA_AAR_LIBRARIES) \
+    $(LOCAL_STATIC_ANDROID_LIBRARIES))
+# LOCAL_SHARED_ANDROID_LIBRARIES are also LOCAL_JAVA_LIBRARIES.
+LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES) $(LOCAL_SHARED_ANDROID_LIBRARIES))
 
 LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM))
 ifeq ($(LOCAL_BUILT_MODULE_STEM),)
@@ -137,6 +143,7 @@
 # Because names of the java files from RenderScript are unknown until the
 # .rs file(s) are compiled, we have to depend on a timestamp file.
 RenderScript_file_stamp :=
+rs_generated_res_dir :=
 rs_compatibility_jni_libs :=
 ifneq ($(renderscript_sources),)
 renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
@@ -151,7 +158,7 @@
 else
   ifneq (,$(LOCAL_SDK_VERSION))
     # Set target-api for LOCAL_SDK_VERSIONs other than current.
-    ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
+    ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
       renderscript_target_api := $(LOCAL_SDK_VERSION)
     endif
   endif  # LOCAL_SDK_VERSION is set
@@ -176,7 +183,7 @@
 renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS)
 
 # prepend the RenderScript system include path
-ifneq ($(filter-out current system_current,$(LOCAL_SDK_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_VERSION))),)
+ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_current,$(LOCAL_SDK_VERSION))),)
 # if a numeric LOCAL_SDK_VERSION, or current LOCAL_SDK_VERSION with TARGET_BUILD_APPS
 LOCAL_RENDERSCRIPT_INCLUDES := \
     $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/clang-include \
@@ -269,7 +276,8 @@
 
 LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp)
 # Make sure the generated resource will be added to the apk.
-LOCAL_RESOURCE_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript/res $(LOCAL_RESOURCE_DIR)
+rs_generated_res_dir := $(renderscript_intermediate.COMMON)/res
+LOCAL_RESOURCE_DIR := $(rs_generated_res_dir) $(LOCAL_RESOURCE_DIR)
 endif
 
 
@@ -283,7 +291,7 @@
 
 aidl_preprocess_import :=
 ifdef LOCAL_SDK_VERSION
-ifneq ($(filter current system_current, $(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS)),)
+ifneq ($(filter current system_current test_current, $(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS)),)
   # LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS
   aidl_preprocess_import := $(TARGET_OUT_COMMON_INTERMEDIATES)/framework.aidl
 else
@@ -408,6 +416,7 @@
 	$(transform-java-to-classes.jar)
 
 javac-check : $(full_classes_compiled_jar)
+javac-check-$(LOCAL_MODULE) : $(full_classes_compiled_jar)
 
 # Run jarjar if necessary, otherwise just copy the file.
 ifneq ($(strip $(LOCAL_JARJAR_RULES)),)
@@ -446,7 +455,7 @@
 ifneq (,$(filter android-support-%,$(LOCAL_STATIC_JAVA_LIBRARIES)))
 ifdef LOCAL_SDK_VERSION
 ifdef TARGET_BUILD_APPS
-ifeq (,$(filter current system_current, $(LOCAL_SDK_VERSION)))
+ifeq (,$(filter current system_current test_current, $(LOCAL_SDK_VERSION)))
   my_support_library_sdk_raise := $(call java-lib-files, sdk_vcurrent)
 endif
 else
@@ -551,13 +560,13 @@
 	$(hide) $(ACP) -fp $(dir $<)/classes*.dex $(dir $@)
 
 findbugs_xml := $(intermediates.COMMON)/findbugs.xml
-$(findbugs_xml) : PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \
-								$(call normalize-path-list,$(filter %.jar,\
-										$(full_java_libs)))))
-$(findbugs_xml) : $(full_classes_jar)
+$(findbugs_xml): PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \
+    $(call normalize-path-list,$(filter %.jar,$(full_java_libs)))))
+$(findbugs_xml): PRIVATE_FINDBUGS_FLAGS := $(LOCAL_FINDBUGS_FLAGS)
+$(findbugs_xml) : $(full_classes_jar) $(filter %.xml, $(LOCAL_FINDBUGS_FLAGS))
 	@echo Findbugs: $@
 	$(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \
-		$(PRIVATE_AUXCLASSPATH) \
+		$(PRIVATE_AUXCLASSPATH) $(PRIVATE_FINDBUGS_FLAGS) \
 		$< \
 		> $@
 
@@ -626,7 +635,9 @@
 	$(jack-check-java)
 
 ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true)
-$(full_classes_jack): $(jack_all_deps) | setup-jack-server
+$(full_classes_jack): PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(full_classes_jack): PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
+$(full_classes_jack): $(jack_all_deps) $(LOCAL_JACK_PLUGIN_PATH) | setup-jack-server
 	@echo Building with Jack: $@
 	$(java-to-jack)
 
@@ -639,6 +650,8 @@
 $(built_dex_intermediate): PRIVATE_CLASSES_JACK := $(full_classes_jack)
 
 ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
+LOCAL_JACK_PLUGIN_PATH += $(HOST_OUT_JAVA_LIBRARIES)/jack-coverage-plugin.jar
+LOCAL_JACK_PLUGIN += com.android.jack.coverage.CodeCoverage
 $(built_dex_intermediate): PRIVATE_JACK_COVERAGE_OPTIONS := \
     -D jack.coverage=true \
     -D jack.coverage.metadata.file=$(intermediates.COMMON)/coverage.em \
@@ -649,7 +662,9 @@
 $(built_dex_intermediate): PRIVATE_JACK_COVERAGE_OPTIONS :=
 endif
 
-$(built_dex_intermediate): $(jack_all_deps) | setup-jack-server
+$(built_dex_intermediate): PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(built_dex_intermediate): PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
+$(built_dex_intermediate): $(jack_all_deps) $(LOCAL_JACK_PLUGIN_PATH) | setup-jack-server
 	@echo Building with Jack: $@
 	$(jack-java-to-dex)
 
@@ -663,9 +678,11 @@
 
 endif #LOCAL_IS_STATIC_JAVA_LIBRARY
 
+$(noshrob_classes_jack): PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(noshrob_classes_jack): PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
 $(noshrob_classes_jack): PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-noshrob-rsc
 $(noshrob_classes_jack): PRIVATE_JACK_PROGUARD_FLAGS :=
-$(noshrob_classes_jack): $(jack_all_deps) | setup-jack-server
+$(noshrob_classes_jack): $(jack_all_deps) $(LOCAL_JACK_PLUGIN_PATH) | setup-jack-server
 	@echo Building with Jack: $@
 	$(java-to-jack)
 endif  # full_classes_jar is defined
diff --git a/core/java_common.mk b/core/java_common.mk
index 5eac1f2..1119a37 100644
--- a/core/java_common.mk
+++ b/core/java_common.mk
@@ -185,9 +185,11 @@
 my_bootclasspath := $(call java-lib-files,android_stubs_current)
 else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current)
 my_bootclasspath := $(call java-lib-files,android_system_stubs_current)
+else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),test_current)
+my_bootclasspath := $(call java-lib-files,android_test_stubs_current)
 else
 my_bootclasspath := $(call java-lib-files,sdk_v$(LOCAL_SDK_VERSION))
-endif # current or system_current
+endif # current, system_current, or test_current
 endif # LOCAL_SDK_VERSION
 $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_BOOTCLASSPATH := -bootclasspath $(my_bootclasspath)
 
@@ -296,9 +298,10 @@
 endif
 endif
 
-$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) $(PRODUCT_AAPT_FLAGS)
-$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME)
-$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) $(PRODUCT_AAPT_FLAGS)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS := $(TARGET_AAPT_CHARACTERISTICS)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_PACKAGE_NAME := $(LOCAL_MANIFEST_PACKAGE_NAME)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := $(LOCAL_MANIFEST_INSTRUMENTATION_FOR)
 
 ifdef aidl_sources
 ALL_MODULES.$(my_register_name).AIDL_FILES := $(aidl_sources)
@@ -308,7 +311,7 @@
 endif
 endif  # !LOCAL_IS_HOST_MODULE
 
-$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_ALL_JAVA_LIBRARIES := $(full_java_libs)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_JAVA_LIBRARIES := $(full_java_libs)
 
 ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR := \
     $(ALL_MODULES.$(my_register_name).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR)
@@ -365,8 +368,8 @@
 endif  # !LOCAL_IS_HOST_MODULE
 
 # Propagate local configuration options to this target.
-$(LOCAL_INTERMEDIATE_TARGETS) : PRIVATE_JACK_SHARED_LIBRARIES:= $(full_shared_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
 
@@ -376,6 +379,7 @@
 ###########################################################
 ifndef LOCAL_IS_HOST_MODULE
 my_link_type := $(intermediates.COMMON)/link_type
+all_link_types: $(my_link_type)
 my_link_type_deps := $(strip \
   $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES),\
     $(call intermediates-dir-for, \
@@ -384,27 +388,25 @@
     $(call intermediates-dir-for, \
       APPS,$(lib),,COMMON)/link_type))
 ifeq ($(LOCAL_SDK_VERSION),system_current)
-$(my_link_type): PRIVATE_LINK_TYPE := system
-$(my_link_type): PRIVATE_ALLOWED_TYPES := (sdk|system)
+$(my_link_type): PRIVATE_LINK_TYPE := java:system
+$(my_link_type): PRIVATE_WARN_TYPES := java:platform
+$(my_link_type): PRIVATE_ALLOWED_TYPES := java:sdk java:system
 else ifneq ($(LOCAL_SDK_VERSION),)
-$(my_link_type): PRIVATE_LINK_TYPE := sdk
-$(my_link_type): PRIVATE_ALLOWED_TYPES := sdk
+$(my_link_type): PRIVATE_LINK_TYPE := java:sdk
+$(my_link_type): PRIVATE_WARN_TYPES := java:system java:platform
+$(my_link_type): PRIVATE_ALLOWED_TYPES := java:sdk
 else
-$(my_link_type): PRIVATE_LINK_TYPE := platform
-$(my_link_type): PRIVATE_ALLOWED_TYPES := (sdk|system|platform)
+$(my_link_type): PRIVATE_LINK_TYPE := java:platform
+$(my_link_type): PRIVATE_WARN_TYPES :=
+$(my_link_type): PRIVATE_ALLOWED_TYPES := java:sdk java:system java:platform
 endif
+$(eval $(call link-type-partitions,$(my_link_type)))
 $(my_link_type): PRIVATE_DEPS := $(my_link_type_deps)
 $(my_link_type): PRIVATE_MODULE := $(LOCAL_MODULE)
 $(my_link_type): PRIVATE_MAKEFILE := $(LOCAL_MODULE_MAKEFILE)
-$(my_link_type): $(my_link_type_deps)
+$(my_link_type): $(my_link_type_deps) $(CHECK_LINK_TYPE)
 	@echo Check Java library module types: $@
-	$(hide) mkdir -p $(dir $@)
-	$(hide) rm -f $@
-	$(hide) for f in $(PRIVATE_DEPS); do \
-	  grep -qE '^$(PRIVATE_ALLOWED_TYPES)$$' $$f || \
-	    $(call echo-warning,"$(PRIVATE_MAKEFILE): $(PRIVATE_MODULE) ($(PRIVATE_LINK_TYPE)) should not link to $$(basename $${f%_intermediates/link_type}) ($$(cat $$f))"); \
-	done
-	$(hide) echo $(PRIVATE_LINK_TYPE) >$@
+	$(check-link-type)
 
 $(LOCAL_BUILT_MODULE): $(my_link_type)
 endif  # !LOCAL_IS_HOST_MODULE
diff --git a/core/main.mk b/core/main.mk
index 36195c4..dabe093 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -82,6 +82,7 @@
     ramdisk-nodeps \
     bootimage-nodeps \
     recoveryimage-nodeps \
+    vbmetaimage-nodeps \
     product-graph dump-products
 
 ifneq ($(filter $(dont_bother_goals), $(MAKECMDGOALS)),)
@@ -125,6 +126,8 @@
 
 # CTS-specific config.
 -include cts/build/config.mk
+# VTS-specific config.
+-include test/vts/tools/vts-tradefed/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
@@ -212,11 +215,11 @@
 
 # Check for the current jdk
 ifeq ($(requires_openjdk), true)
-# The user asked for java7 openjdk, so check that the host
-# java version is really openjdk
+# The user asked for openjdk, so check that the host
+# java version is really openjdk and not some other JDK.
 ifeq ($(shell echo '$(java_version_str)' | grep -i openjdk),)
 $(info ************************************************************)
-$(info You asked for an OpenJDK 7 build but your version is)
+$(info You asked for an OpenJDK based build but your version is)
 $(info $(java_version_str).)
 $(info ************************************************************)
 $(error stop)
@@ -341,6 +344,14 @@
 # Jacoco package name for Jack
 -include $(TOPDIR)external/jacoco/config.mk
 
+#
+# -----------------------------------------------------------------
+# Enable dynamic linker developer warnings for all builds except
+# final release.
+ifneq ($(PLATFORM_VERSION_CODENAME),REL)
+  ADDITIONAL_BUILD_PROPERTIES += ro.bionic.ld.warning=1
+endif
+
 # -----------------------------------------------------------------
 ###
 ### In this section we set up the things that are different
@@ -390,18 +401,6 @@
     enable_target_debugging :=
   endif
 
-  # Turn on Dalvik preoptimization for user builds, but only if not
-  # explicitly disabled and the build is running on Linux (since host
-  # Dalvik isn't built for non-Linux hosts).
-  ifeq (,$(WITH_DEXPREOPT))
-    ifeq ($(user_variant),user)
-      ifeq ($(HOST_OS),linux)
-        # TODO: turn on WITH_DEXPREOPT for libart user builds.
-        # WITH_DEXPREOPT := true
-      endif
-    endif
-  endif
-
   # Disallow mock locations by default for user builds
   ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0
 
@@ -437,12 +436,9 @@
           ro.setupwizard.mode=OPTIONAL
 endif
 ifndef is_sdk_build
-  # Don't verify or compile the image on eng builds to speed startup.
+  # To speedup startup of non-preopted builds, don't verify or compile the boot image.
   ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.image-dex2oat-filter=verify-at-runtime
-  # Don't verify or compile apps on eng builds to speed startup.
-  ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.dex2oat-filter=verify-at-runtime
 endif
-  ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.usejit=true
 endif
 
 ## sdk ##
@@ -508,12 +504,9 @@
 
 FULL_BUILD := true
 
-# Before we go and include all of the module makefiles, stash away
-# the PRODUCT_* values so that later we can verify they are not modified.
-stash_product_vars:=true
-ifeq ($(stash_product_vars),true)
-  $(call stash-product-vars, __STASHED)
-endif
+# Before we go and include all of the module makefiles, mark the PRODUCT_*
+# values readonly so that they won't be modified.
+$(call readonly-product-vars)
 
 ifneq ($(ONE_SHOT_MAKEFILE),)
 # We've probably been invoked by the "mm" shell function
@@ -578,10 +571,6 @@
 # Now with all Android.mks loaded we can do post cleaning steps.
 include $(BUILD_SYSTEM)/post_clean.mk
 
-ifeq ($(stash_product_vars),true)
-  $(call assert-product-vars, __STASHED)
-endif
-
 # -------------------------------------------------------------------
 # All module makefiles have been included at this point.
 # -------------------------------------------------------------------
@@ -664,16 +653,24 @@
 $(1): | $(2)
 endef
 
+# Use a normal dependency instead of an order-only dependency when installing
+# host dynamic binaries so that the timestamp of the final binary always
+# changes, even if the toc optimization has skipped relinking the binary
+# and its dependant shared libraries.
+define add-required-host-so-deps
+$(1): $(2)
+endef
+
 $(foreach m,$(ALL_MODULES), \
   $(eval r := $(ALL_MODULES.$(m).REQUIRED)) \
   $(if $(r), \
     $(eval r := $(call module-installed-files,$(r))) \
     $(eval t_m := $(filter $(TARGET_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
-    $(eval h_m := $(filter $(HOST_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
-    $(eval hc_m := $(filter $(HOST_CROSS_OUT_ROOT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
+    $(eval h_m := $(filter $(HOST_OUT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
+    $(eval hc_m := $(filter $(HOST_CROSS_OUT)/%, $(ALL_MODULES.$(m).INSTALLED))) \
     $(eval t_r := $(filter $(TARGET_OUT_ROOT)/%, $(r))) \
-    $(eval h_r := $(filter $(HOST_OUT_ROOT)/%, $(r))) \
-    $(eval hc_r := $(filter $(HOST_CROSS_OUT_ROOT)/%, $(r))) \
+    $(eval h_r := $(filter $(HOST_OUT)/%, $(r))) \
+    $(eval hc_r := $(filter $(HOST_CROSS_OUT)/%, $(r))) \
     $(eval t_m := $(filter-out $(t_r), $(t_m))) \
     $(eval h_m := $(filter-out $(h_r), $(h_m))) \
     $(eval hc_m := $(filter-out $(hc_r), $(hc_m))) \
@@ -701,11 +698,14 @@
   $(eval p := $(subst :,$(space),$(m)))\
   $(eval mod := $(firstword $(p)))\
   $(eval deps := $(subst $(comma),$(space),$(lastword $(p))))\
+  $(eval root := $(1)OUT$(if $(call streq,$(1),TARGET_),_ROOT))\
   $(if $(2),$(eval deps := $(addsuffix $($(1)2ND_ARCH_MODULE_SUFFIX),$(deps))))\
   $(if $(3),$(eval deps := $(addprefix host_cross_,$(deps))))\
-  $(eval r := $(filter $($(1)OUT)/%,$(call module-installed-files,\
+  $(eval r := $(filter $($(root))/%,$(call module-installed-files,\
     $(deps))))\
-  $(eval $(call add-required-deps,$(word 2,$(p)),$(r)))\
+  $(if $(filter $(1),HOST_),\
+    $(eval $(call add-required-host-so-deps,$(word 2,$(p)),$(r))),\
+    $(eval $(call add-required-deps,$(word 2,$(p)),$(r))))\
   $(eval ALL_MODULES.$(mod).REQUIRED += $(deps)))
 endef
 
@@ -940,6 +940,9 @@
 .PHONY: bootimage
 bootimage: $(INSTALLED_BOOTIMAGE_TARGET)
 
+.PHONY: vbmetaimage
+vbmetaimage: $(INSTALLED_VBMETAIMAGE_TARGET)
+
 .PHONY: auxiliary
 auxiliary: $(INSTALLED_AUX_TARGETS)
 
@@ -949,6 +952,7 @@
 	systemimage \
 	$(INSTALLED_BOOTIMAGE_TARGET) \
 	$(INSTALLED_RECOVERYIMAGE_TARGET) \
+	$(INSTALLED_VBMETAIMAGE_TARGET) \
 	$(INSTALLED_USERDATAIMAGE_TARGET) \
 	$(INSTALLED_CACHEIMAGE_TARGET) \
 	$(INSTALLED_BPTIMAGE_TARGET) \
@@ -993,6 +997,9 @@
   $(SYMBOLS_ZIP) : $(apps_only_installed_files)
   $(call dist-for-goals,apps_only, $(SYMBOLS_ZIP))
 
+  $(COVERAGE_ZIP) : $(apps_only_installed_files)
+  $(call dist-for-goals,apps_only, $(COVERAGE_ZIP))
+
 .PHONY: apps_only
 apps_only: $(unbundled_build_modules)
 
@@ -1013,6 +1020,7 @@
     $(INTERNAL_OTA_PACKAGE_TARGET) \
     $(BUILT_OTATOOLS_PACKAGE) \
     $(SYMBOLS_ZIP) \
+    $(COVERAGE_ZIP) \
     $(INSTALLED_FILES_FILE) \
     $(INSTALLED_FILES_FILE_VENDOR) \
     $(INSTALLED_BUILD_PROP_TARGET) \
@@ -1055,6 +1063,7 @@
 $(call dist-for-goals,sdk win_sdk, \
     $(ALL_SDK_TARGETS) \
     $(SYMBOLS_ZIP) \
+    $(COVERAGE_ZIP) \
     $(INSTALLED_BUILD_PROP_TARGET) \
 )
 
@@ -1136,4 +1145,7 @@
 ndk: $(SOONG_OUT_DIR)/ndk.timestamp
 .PHONY: ndk
 
+.PHONY: all_link_types
+all_link_types:
+
 endif # KATI
diff --git a/core/native_benchmark.mk b/core/native_benchmark.mk
index 7b04d87..e73bcad 100644
--- a/core/native_benchmark.mk
+++ b/core/native_benchmark.mk
@@ -6,8 +6,13 @@
 
 LOCAL_STATIC_LIBRARIES += libgoogle-benchmark
 
-ifndef LOCAL_MODULE_PATH
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(LOCAL_MODULE)
+LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_METRIC_TESTS)/$(LOCAL_MODULE)
+LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_METRIC_TESTS)/$(LOCAL_MODULE)
+
+ifndef LOCAL_MULTILIB
+ifndef LOCAL_32_BIT_ONLY
+LOCAL_MULTILIB := both
+endif
 endif
 
 include $(BUILD_EXECUTABLE)
diff --git a/core/ninja.mk b/core/ninja.mk
index 2e538f5..30146d2 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
 
 include $(BUILD_SYSTEM)/soong.mk
 
@@ -55,6 +59,7 @@
 	userdataimage \
 	userdebug \
 	valgrind-test-art% \
+	vts \
 	win_sdk \
 	winsdk-tools
 
@@ -112,7 +117,7 @@
 # proceeding with undefined behavior.
 NINJA_EXTRA_ARGS += -w dupbuild=err
 
-ifdef USE_GOMA
+ifneq ($(filter-out false,$(USE_GOMA)),)
 KATI_MAKEPARALLEL := $(MAKEPARALLEL)
 # Ninja runs remote jobs (i.e., commands which contain gomacc) with
 # this parallelism. Note the parallelism of all other jobs is still
@@ -121,6 +126,14 @@
 NINJA_EXTRA_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
 
 NINJA_ARGS += $(NINJA_EXTRA_ARGS)
@@ -129,8 +142,8 @@
 
 $(COMBINED_BUILD_NINJA): $(KATI_BUILD_NINJA)
 	$(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 "include $(KATI_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA)
+	$(hide) echo "include $(SOONG_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA)
 
 $(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper
 	@#empty
@@ -138,7 +151,7 @@
 .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
diff --git a/core/package_internal.mk b/core/package_internal.mk
index e0df325..af1d2a5 100644
--- a/core/package_internal.mk
+++ b/core/package_internal.mk
@@ -57,6 +57,9 @@
 endif
 LOCAL_MODULE_CLASS := APPS
 
+intermediates := $(call local-intermediates-dir)
+intermediates.COMMON := $(call local-intermediates-dir,COMMON)
+
 #################################
 include $(BUILD_SYSTEM)/configure_local_jack.mk
 #################################
@@ -112,6 +115,45 @@
 need_compile_asset := true
 endif
 
+my_res_package :=
+ifdef LOCAL_USE_AAPT2
+# In aapt2 the last takes precedence.
+my_resource_dirs := $(call reverse-list,$(LOCAL_RESOURCE_DIR))
+my_res_dir :=
+my_overlay_res_dirs :=
+
+ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),)
+# If we are using static android libraries, every source file becomes an overlay.
+# This is to emulate old AAPT behavior which simulated library support.
+my_res_dir :=
+my_overlay_res_dirs := $(my_resource_dirs)
+else
+# Without static libraries, the first directory is our directory, which can then be
+# overlaid by the rest. (First directory in my_resource_dirs is last directory in
+# $(LOCAL_RESOURCE_DIR) due to it being reversed.
+my_res_dir := $(firstword $(my_resource_dirs))
+my_overlay_res_dirs := $(wordlist 2,999,$(my_resource_dirs))
+endif
+
+my_overlay_resources := $(strip \
+  $(foreach d,$(my_overlay_res_dirs),\
+    $(addprefix $(d)/, \
+        $(call find-subdir-assets,$(d)))))
+
+my_res_resources := $(strip \
+    $(addprefix $(my_res_dir)/, \
+        $(call find-subdir-assets,$(my_res_dir))))
+
+all_resources := $(strip $(my_res_resources) $(my_overlay_resources))
+
+# The linked resource package.
+my_res_package := $(intermediates)/package-res.apk
+LOCAL_INTERMEDIATE_TARGETS += $(my_res_package)
+
+# Always run aapt2, because we need to at least compile the AndroidManifest.xml.
+need_compile_res := true
+
+else  # LOCAL_USE_AAPT2
 all_resources := $(strip \
     $(foreach dir, $(LOCAL_RESOURCE_DIR), \
       $(addprefix $(dir)/, \
@@ -121,13 +163,14 @@
        ) \
      ))
 
+endif  # LOCAL_USE_AAPT2
+
 ifneq ($(all_resources),)
   need_compile_res := true
 endif
 
 all_res_assets := $(strip $(all_assets) $(all_resources))
 
-intermediates.COMMON := $(call local-intermediates-dir,COMMON)
 
 # If no assets or resources were found, clear the directory variables so
 # we don't try to build them.
@@ -214,6 +257,24 @@
 
 rs_compatibility_jni_libs :=
 
+ifeq ($(LOCAL_DATA_BINDING),true)
+data_binding_intermediates := $(intermediates.COMMON)/data-binding
+
+LOCAL_JAVACFLAGS += -processorpath $(DATA_BINDING_COMPILER) -s $(data_binding_intermediates)/anno-src
+LOCAL_JACK_FLAGS += --processorpath $(DATA_BINDING_COMPILER)
+
+LOCAL_STATIC_JAVA_LIBRARIES += databinding-baselibrary
+LOCAL_STATIC_JAVA_AAR_LIBRARIES += databinding-library databinding-adapters
+
+data_binding_res_in := $(LOCAL_RESOURCE_DIR)
+data_binding_res_out := $(data_binding_intermediates)/res
+
+# Replace with the processed merged res dir.
+LOCAL_RESOURCE_DIR := $(data_binding_res_out)
+
+LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages com.android.databinding.library
+endif  # LOCAL_DATA_BINDING
+
 include $(BUILD_SYSTEM)/android_manifest.mk
 
 #################################
@@ -227,7 +288,7 @@
 
 $(LOCAL_INTERMEDIATE_TARGETS): \
     PRIVATE_ANDROID_MANIFEST := $(full_android_manifest)
-ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
+ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
 $(LOCAL_INTERMEDIATE_TARGETS): \
     PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION)
 else
@@ -235,7 +296,43 @@
     PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK)
 endif
 
+ifeq ($(LOCAL_DATA_BINDING),true)
+data_binding_stamp := $(data_binding_intermediates)/data-binding.stamp
+$(data_binding_stamp): PRIVATE_INTERMEDIATES := $(data_binding_intermediates)
+$(data_binding_stamp): PRIVATE_MANIFEST := $(full_android_manifest)
+# Generate code into $(LOCAL_INTERMEDIATE_SOURCE_DIR) so that the generated .java files
+# will be automatically picked up by function compile-java.
+$(data_binding_stamp): PRIVATE_SRC_OUT := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/data-binding
+$(data_binding_stamp): PRIVATE_XML_OUT := $(data_binding_intermediates)/xml
+$(data_binding_stamp): PRIVATE_RES_OUT := $(data_binding_res_out)
+$(data_binding_stamp): PRIVATE_RES_IN := $(data_binding_res_in)
+$(data_binding_stamp): PRIVATE_ANNO_SRC_DIR := $(data_binding_intermediates)/anno-src
+
+$(data_binding_stamp) : $(all_res_assets) $(full_android_manifest) \
+    $(DATA_BINDING_COMPILER)
+	@echo "Data-binding process: $@"
+	@rm -rf $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) && \
+	  mkdir -p $(PRIVATE_INTERMEDIATES) $(PRIVATE_SRC_OUT) \
+	      $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_ANNO_SRC_DIR)
+	$(hide) java -classpath $(DATA_BINDING_COMPILER) android.databinding.tool.MakeCopy \
+	  $(PRIVATE_MANIFEST) $(PRIVATE_SRC_OUT) $(PRIVATE_XML_OUT) $(PRIVATE_RES_OUT) $(PRIVATE_RES_IN)
+	$(hide) touch $@
+
+# Make sure the data-binding process happens before javac and generation of R.java.
+$(R_file_stamp) $(full_classes_compiled_jar) : $(data_binding_stamp)
+# The dependency path when jack is enabled
+$(built_dex_intermediate) : $(data_binding_stamp)
+endif  # LOCAL_DATA_BINDING
+
 ifeq ($(need_compile_res),true)
+ifdef LOCAL_USE_AAPT2
+my_compiled_res_base_dir := $(intermediates)/flat-res
+my_generated_res_dirs := $(rs_generated_res_dir)
+my_generated_res_dirs_deps := $(RenderScript_file_stamp)
+# Add AAPT2 link specific flags.
+$(my_res_package): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --no-static-lib-packages
+include $(BUILD_SYSTEM)/aapt2.mk
+else  # LOCAL_USE_AAPT2
 
 # Since we don't know where the real R.java file is going to end up,
 # we need to use another file to stand in its place.  We'll just
@@ -253,23 +350,7 @@
 	@echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)"
 	@rm -rf $@ && mkdir -p $(dir $@)
 	$(create-resource-java-files)
-	$(hide) for GENERATED_MANIFEST_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \
-					-name Manifest.java 2> /dev/null`; do \
-		dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_MANIFEST_FILE`; \
-		mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
-		$(ACP) -fp $$GENERATED_MANIFEST_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
-	done;
-	$(hide) for GENERATED_R_FILE in `find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) \
-					-name R.java 2> /dev/null`; do \
-		dir=`awk '/package/{gsub(/\./,"/",$$2);gsub(/;/,"",$$2);print $$2;exit}' $$GENERATED_R_FILE`; \
-		mkdir -p $(TARGET_COMMON_OUT_ROOT)/R/$$dir; \
-		$(ACP) -fp $$GENERATED_R_FILE $(TARGET_COMMON_OUT_ROOT)/R/$$dir \
-			|| exit 31; \
-		$(ACP) -fp $$GENERATED_R_FILE $@ || exit 32; \
-	done;
-	@# Ensure that the target file is always created, i.e. also in case we did not
-	@# enter the GENERATED_R_FILE-loop above. This avoids unnecessary rebuilding.
-	$(hide) touch $@
+	$(call find-generated-R.java)
 
 $(proguard_options_file): $(R_file_stamp)
 
@@ -291,6 +372,8 @@
 	$(add-assets-to-package)
 endif
 
+endif  # LOCAL_USE_AAPT2
+
 # Make sure to generate R.java before compiling.
 # Other modules should depend on the BUILT module if
 # they want to use this module's R.java file.
@@ -309,7 +392,7 @@
 # Most packages should link against the resources defined by framework-res.
 # Even if they don't have their own resources, they may use framework
 # resources.
-ifneq ($(filter-out current system_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_RES_VERSION))),)
+ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_current,$(LOCAL_SDK_RES_VERSION))),)
 # for released sdk versions, the platform resources were built into android.jar.
 framework_res_package_export := \
     $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar
@@ -332,10 +415,13 @@
     $(framework_res_package_export_deps) \
     $(foreach lib,$(LOCAL_RES_LIBRARIES),\
         $(call intermediates-dir-for,APPS,$(lib),,COMMON)/src/R.stamp)
-
 $(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)
+
+ifdef LOCAL_USE_AAPT2
+$(my_res_package) : $(all_library_res_package_export_deps)
+endif
 endif # LOCAL_NO_STANDARD_LIBRARIES
 
 ifneq ($(full_classes_jar),)
@@ -382,7 +468,6 @@
 $(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(additional_certificates)
 
 # Define the rule to build the actual package.
-$(LOCAL_BUILT_MODULE): $(AAPT)
 # PRIVATE_JNI_SHARED_LIBRARIES is a list of <abi>:<path_of_built_lib>.
 $(LOCAL_BUILT_MODULE): PRIVATE_JNI_SHARED_LIBRARIES := $(jni_shared_libraries_with_abis)
 # PRIVATE_JNI_SHARED_LIBRARIES_ABI is a list of ABI names.
@@ -392,20 +477,30 @@
     LOCAL_AAPT_INCLUDE_ALL_RESOURCES := true
 endif
 ifeq ($(LOCAL_AAPT_INCLUDE_ALL_RESOURCES),true)
-    $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG :=
-    $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
+    $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG :=
+    $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
 else
-    $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG)
+    $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_CONFIG := $(PRODUCT_AAPT_CONFIG)
 ifdef LOCAL_PACKAGE_SPLITS
-    $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
+    $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
 else
-    $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG)
+    $(my_res_package) $(LOCAL_BUILT_MODULE): PRIVATE_PRODUCT_AAPT_PREF_CONFIG := $(PRODUCT_AAPT_PREF_CONFIG)
 endif
 endif
-$(LOCAL_BUILT_MODULE): $(all_res_assets) $(jni_shared_libraries) $(full_android_manifest)
+$(LOCAL_BUILT_MODULE) : $(jni_shared_libraries)
+ifdef LOCAL_USE_AAPT2
+$(LOCAL_BUILT_MODULE): PRIVATE_RES_PACKAGE := $(my_res_package)
+$(LOCAL_BUILT_MODULE) : $(my_res_package) $(AAPT2) | $(ACP)
+else
+$(LOCAL_BUILT_MODULE) : $(all_res_assets) $(full_android_manifest) $(AAPT)
+endif
 	@echo "target Package: $(PRIVATE_MODULE) ($@)"
+ifdef LOCAL_USE_AAPT2
+	$(call copy-file-to-new-target)
+else  # ! LOCAL_USE_AAPT2
 	$(create-empty-package)
 	$(add-assets-to-package)
+endif  # LOCAL_USE_AAPT2
 ifneq ($(jni_shared_libraries),)
 	$(add-jni-shared-libs-to-package)
 endif
@@ -484,15 +579,24 @@
   $(foreach s,$(my_split_suffixes),$(built_module_path)/package_$(s).apk:$(my_module_path)/$(LOCAL_MODULE)_$(s).apk)
 
 # Make sure to install the splits when you run "make <module_name>".
-$(my_register_name): $(installed_apk_splits)
+$(my_all_targets): $(installed_apk_splits)
+
+ifdef LOCAL_COMPATIBILITY_SUITE
+cts_testcase_file := $(foreach s,$(my_split_suffixes),$(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE)_$(s).apk)
+$(cts_testcase_file) : $(COMPATIBILITY_TESTCASES_OUT_$(LOCAL_COMPATIBILITY_SUITE))/$(LOCAL_MODULE)_%.apk : $(built_module_path)/package_%.apk | $(ACP)
+	$(copy-file-to-new-target)
+
+COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES := \
+  $(COMPATIBILITY.$(LOCAL_COMPATIBILITY_SUITE).FILES) \
+  $(cts_testcase_file)
+
+$(my_all_targets) : $(cts_testcase_file)
+endif # LOCAL_COMPATIBILITY_SUITE
 endif # LOCAL_PACKAGE_SPLITS
 
 # Save information about this package
 PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
 PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_FILES := $(all_resources)
-ifdef package_resource_overlays
-PACKAGES.$(LOCAL_PACKAGE_NAME).RESOURCE_OVERLAYS := $(package_resource_overlays)
-endif
 
 PACKAGES := $(PACKAGES) $(LOCAL_PACKAGE_NAME)
 
diff --git a/core/pathmap.mk b/core/pathmap.mk
index 495f1a5..13b3fe4 100644
--- a/core/pathmap.mk
+++ b/core/pathmap.mk
@@ -49,8 +49,7 @@
     audio-route:system/media/audio_route/include \
     wilhelm:frameworks/wilhelm/include \
     wilhelm-ut:frameworks/wilhelm/src/ut \
-    mediandk:frameworks/av/media/ndk/ \
-    speex:external/speex/include
+    mediandk:frameworks/av/media/ndk/
 
 #
 # Returns the path to the requested module's include directory,
@@ -120,6 +119,7 @@
         v7/preference \
         v14/preference \
         v17/preference-leanback \
+        documents-archive \
         customtabs
 
 #
@@ -136,6 +136,8 @@
 FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS := \
 	$(addprefix frameworks/support/,$(FRAMEWORKS_SUPPORT_SUBDIRS)) \
 	$(addprefix frameworks/,$(FRAMEWORKS_MULTIDEX_SUBDIRS)) \
+        frameworks/support/graphics/drawable/animated \
+        frameworks/support/graphics/drawable/static \
 	frameworks/support/v7/appcompat/src \
 	frameworks/support/v7/recyclerview/src
 
@@ -144,6 +146,8 @@
 #
 FRAMEWORKS_SUPPORT_JAVA_LIBRARIES := \
     $(foreach dir,$(FRAMEWORKS_SUPPORT_SUBDIRS),android-support-$(subst /,-,$(dir))) \
+    android-support-vectordrawable \
+    android-support-animatedvectordrawable \
     android-support-v7-appcompat \
     android-support-v7-recyclerview \
     android-support-multidex \
@@ -154,8 +158,8 @@
 #
 FRAMEWORKS_DATA_BINDING_SUBDIRS := \
         baseLibrary/src/main \
-        library/src/main \
-        library/src/doc
+        extensions/library/src/main \
+        extensions/library/src/doc
 
 #
 # A version of FRAMEWORKS_DATA_BINDING_SUBDIRS that is expanded to full paths from
diff --git a/core/pdk_config.mk b/core/pdk_config.mk
index bd72a06..c0aaacd 100644
--- a/core/pdk_config.mk
+++ b/core/pdk_config.mk
@@ -36,7 +36,9 @@
 	$(PDK_PLATFORM_JAVA_ZIP_JAVA_HOST_LIB_DIR)
 
 PDK_PLATFORM_JAVA_ZIP_CONTENTS += $(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_LIB_DIR),\
-    $(lib_dir)/classes.jack $(lib_dir)/classes.jar $(lib_dir)/javalib.jar)
+    $(lib_dir)/classes.jack $(lib_dir)/classes.jar $(lib_dir)/classes.jar.toc \
+    $(lib_dir)/javalib.jar  $(lib_dir)/classes*.dex \
+    $(lib_dir)/classes.dex.toc )
 
 # check and override java support level
 ifneq ($(TARGET_BUILD_PDK)$(PDK_FUSION_PLATFORM_ZIP),)
@@ -102,10 +104,8 @@
 endif
 
 define JAVA_dependency_template
-$(PDK_FUSION_OUT_DIR)/$(strip $(1)): $(_pdk_fusion_intermediates)/$(strip $(1)) \
-  $(PDK_FUSION_OUT_DIR)/$(strip $(2)) $(_pdk_fusion_stamp)
-	@mkdir -p $$(dir $$@)
-	$(hide) cp -fpPR $$< $$@
+$(call add-dependency,$(PDK_FUSION_OUT_DIR)/$(strip $(1)),\
+  $(foreach d,$(filter $(2),$(_pdk_fusion_java_file_list)),$(PDK_FUSION_OUT_DIR)/$(d)))
 endef
 
 # needs explicit dependency as package-export.apk is not explicitly pulled
@@ -118,6 +118,14 @@
 $(eval $(call JAVA_dependency_template,$(lib_dir)/javalib.jar,\
 $(lib_dir)/classes.jar)))
 
+# pull .jack and .dex files
+$(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR),\
+  $(eval $(call JAVA_dependency_template,$(lib_dir)/classes.jar.toc,\
+    $(lib_dir)/classes.jar $(lib_dir)/classes.jack)))
+$(foreach lib_dir,$(PDK_PLATFORM_JAVA_ZIP_JAVA_TARGET_LIB_DIR),\
+  $(eval $(call JAVA_dependency_template,$(lib_dir)/classes.dex.toc,\
+    $(lib_dir)/classes.jar $(lib_dir)/classes.jack $(lib_dir)/classes%.dex)))
+
 # implicit rules for all other target files
 $(TARGET_COMMON_OUT_ROOT)/% : $(_pdk_fusion_intermediates)/target/common/% $(_pdk_fusion_stamp)
 	@mkdir -p $(dir $@)
diff --git a/core/post_clean.mk b/core/post_clean.mk
index f08abff..d7e8322 100644
--- a/core/post_clean.mk
+++ b/core/post_clean.mk
@@ -16,44 +16,6 @@
 # This file must be included after all Android.mks have been loaded.
 
 #######################################################
-# Checks the current build configurations against the previous build,
-# clean artifacts in TARGET_COMMON_OUT_ROOT if necessary.
-# If a package's resource overlay has been changed, its R class needs to be
-# regenerated.
-previous_package_overlay_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/previous_overlays.txt
-current_package_overlay_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/current_overlays.txt
-current_all_packages_config := $(dir $(current_package_overlay_config))current_packages.txt
-
-$(shell rm -rf $(current_package_overlay_config) \
-    && mkdir -p $(dir $(current_package_overlay_config)) \
-    && touch $(current_package_overlay_config))
-$(shell echo '$(PACKAGES)' > $(current_all_packages_config))
-$(foreach p, $(PACKAGES), $(if $(PACKAGES.$(p).RESOURCE_OVERLAYS), \
-  $(shell echo '$(p)' '$(PACKAGES.$(p).RESOURCE_OVERLAYS)' >> $(current_package_overlay_config))))
-
-ifneq (,$(wildcard $(previous_package_overlay_config)))
-packages_overlay_changed := $(shell build/tools/diff_package_overlays.py \
-    $(current_all_packages_config) $(current_package_overlay_config) \
-    $(previous_package_overlay_config))
-ifneq (,$(packages_overlay_changed))
-overlay_cleanup_cmd := $(strip rm -rf $(foreach p, $(packages_overlay_changed),\
-    $(TARGET_OUT_COMMON_INTERMEDIATES)/APPS/$(p)_intermediates))
-$(info *** Overlay change detected, clean shared intermediate files...)
-$(info *** $(overlay_cleanup_cmd))
-$(shell $(overlay_cleanup_cmd))
-overlay_cleanup_cmd :=
-endif
-packages_overlay_changed :=
-endif
-
-# Now current becomes previous.
-$(shell mv -f $(current_package_overlay_config) $(previous_package_overlay_config))
-
-previous_package_overlay_config :=
-current_package_overlay_config :=
-current_all_packages_config :=
-
-#######################################################
 # Check if we need to delete obsolete generated java files.
 # When an aidl/proto/etc file gets deleted (or renamed), the generated java file is obsolete.
 previous_gen_java_config := $(TARGET_OUT_COMMON_INTERMEDIATES)/previous_gen_java_config.mk
diff --git a/core/prebuilt_internal.mk b/core/prebuilt_internal.mk
index 701414a..af59756 100644
--- a/core/prebuilt_internal.mk
+++ b/core/prebuilt_internal.mk
@@ -79,6 +79,12 @@
   prebuilt_module_is_a_library :=
 endif
 
+ifeq ($(LOCAL_MODULE_MAKEFILE),$(SOONG_ANDROID_MK))
+ifeq ($(prebuilt_module_is_a_library),true)
+SOONG_ALREADY_CONV := $(SOONG_ALREADY_CONV) $(LOCAL_MODULE)
+endif
+endif
+
 # Don't install static libraries by default.
 ifndef LOCAL_UNINSTALLABLE_MODULE
 ifeq (STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS))
@@ -120,7 +126,7 @@
 ifdef prebuilt_module_is_a_library
 export_includes := $(intermediates)/export_includes
 $(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDE_DIRS)
-$(export_includes) :
+$(export_includes): $(LOCAL_EXPORT_C_INCLUDE_DEPS)
 	@echo Export includes file: $< -- $@
 	$(hide) mkdir -p $(dir $@) && rm -f $@
 ifdef LOCAL_EXPORT_C_INCLUDE_DIRS
@@ -132,11 +138,12 @@
 endif
 
 my_link_type := $(intermediates)/link_type
-$(my_link_type): PRIVATE_LINK_TYPE := $(if $(LOCAL_SDK_VERSION),ndk,platform)
+$(my_link_type): PRIVATE_LINK_TYPE := native:$(if $(LOCAL_SDK_VERSION),ndk,platform)
+$(eval $(call link-type-partitions,$(my_link_type)))
 $(my_link_type):
 	@echo Check module type: $@
 	$(hide) mkdir -p $(dir $@) && rm -f $@
-	$(hide) echo $(PRIVATE_LINK_TYPE) >$@
+	$(hide) echo "$(PRIVATE_LINK_TYPE)" >$@
 
 $(LOCAL_BUILT_MODULE) : | $(export_includes) $(my_link_type)
 endif  # prebuilt_module_is_a_library
@@ -165,6 +172,16 @@
 # "my_strip_module not true" because otherwise the rules are defined in dynamic_binary.mk.
 endif  # my_strip_module not true
 
+# Coverage information is needed when static lib is a dependency of another
+# coverage-enabled module.
+ifeq (STATIC_LIBRARIES, $(LOCAL_MODULE_CLASS))
+GCNO_ARCHIVE := $(LOCAL_MODULE).gcnodir
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_OBJECTS :=
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_WHOLE_STATIC_LIBRARIES :=
+$(intermediates)/$(GCNO_ARCHIVE) :
+	$(transform-o-to-static-lib)
+endif
+
 ifeq ($(LOCAL_MODULE_CLASS),APPS)
 PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
 
@@ -239,7 +256,7 @@
 #######################################
 ifneq ($(LOCAL_REPLACE_PREBUILT_APK_INSTALLED),)
 # There is a replacement for the prebuilt .apk we can install without any processing.
-$(built_module) : $(LOCAL_REPLACE_PREBUILT_APK_INSTALLED) | $(ACP)
+$(built_module) : $(LOCAL_REPLACE_PREBUILT_APK_INSTALLED)
 	$(transform-prebuilt-to-target)
 
 else  # ! LOCAL_REPLACE_PREBUILT_APK_INSTALLED
@@ -319,11 +336,12 @@
   $(foreach s,$(LOCAL_PACKAGE_SPLITS),$(built_module_path)/$(notdir $(s)):$(my_module_path)/$(notdir $(s)))
 
 # Make sure to install the splits when you run "make <module_name>".
-$(my_register_name): $(installed_apk_splits)
+$(my_all_targets): $(installed_apk_splits)
 
 endif # LOCAL_PACKAGE_SPLITS
 
-else ifeq ($(prebuilt_module_is_dex_javalib),true)  # LOCAL_MODULE_CLASS != APPS
+else # LOCAL_MODULE_CLASS != APPS
+ifeq ($(prebuilt_module_is_dex_javalib),true)
 # This is a target shared library, i.e. a jar with classes.dex.
 #######################################
 # defines built_odex along with rule to install odex
@@ -333,7 +351,7 @@
 ifneq ($(dexpreopt_boot_jar_module),) # boot jar
 # boot jar's rules are defined in dex_preopt.mk
 dexpreopted_boot_jar := $(DEXPREOPT_BOOT_JAR_DIR_FULL_PATH)/$(dexpreopt_boot_jar_module)_nodex.jar
-$(built_module) : $(dexpreopted_boot_jar) | $(ACP)
+$(built_module) : $(dexpreopted_boot_jar)
 	$(call copy-file-to-target)
 
 # For libart boot jars, we don't have .odex files.
@@ -344,14 +362,14 @@
 	@echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)"
 	$(call dexpreopt-one-file,$<,$@)
 
-$(built_module) : $(my_prebuilt_src_file) | $(ACP)
+$(built_module) : $(my_prebuilt_src_file)
 	$(call copy-file-to-target)
 ifneq (nostripping,$(LOCAL_DEX_PREOPT))
 	$(call dexpreopt-remove-classes.dex,$@)
 endif
 endif # boot jar
 else # ! LOCAL_DEX_PREOPT
-$(built_module) : $(my_prebuilt_src_file) | $(ACP)
+$(built_module) : $(my_prebuilt_src_file)
 	$(call copy-file-to-target)
 endif # LOCAL_DEX_PREOPT
 
@@ -366,6 +384,7 @@
 	$(hide) chmod +x $@
 endif
 endif # ! prebuilt_module_is_dex_javalib
+endif # LOCAL_MODULE_CLASS != APPS
 
 ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES)
 my_src_jar := $(my_prebuilt_src_file)
@@ -379,30 +398,32 @@
 
 my_link_type := $(intermediates.COMMON)/link_type
 ifeq ($(LOCAL_SDK_VERSION),system_current)
-$(my_link_type): PRIVATE_LINK_TYPE := system
+$(my_link_type): PRIVATE_LINK_TYPE := java:system
 else ifneq ($(LOCAL_SDK_VERSION),)
-$(my_link_type): PRIVATE_LINK_TYPE := sdk
+$(my_link_type): PRIVATE_LINK_TYPE := java:sdk
 else
-$(my_link_type): PRIVATE_LINK_TYPE := platform
+$(my_link_type): PRIVATE_LINK_TYPE := java:platform
 endif
+$(eval $(call link-type-partitions,$(my_link_type)))
 $(my_link_type):
 	@echo Check module type: $@
 	$(hide) mkdir -p $(dir $@) && rm -f $@
-	$(hide) echo $(PRIVATE_LINK_TYPE) >$@
+	$(hide) echo "$(PRIVATE_LINK_TYPE)" >$@
 $(LOCAL_BUILT_MODULE): $(my_link_type)
 
 ifeq ($(prebuilt_module_is_dex_javalib),true)
 # For prebuilt shared Java library we don't have classes.jar.
-$(common_javalib_jar) : $(my_src_jar) | $(ACP)
+$(common_javalib_jar) : $(my_src_jar)
 	$(transform-prebuilt-to-target)
 
 else  # ! prebuilt_module_is_dex_javalib
 
-ifneq ($(filter %.aar, $(my_prebuilt_src_file)),)
+my_src_aar := $(filter %.aar, $(my_prebuilt_src_file))
+ifneq ($(my_src_aar),)
 # This is .aar file, archive of classes.jar and Android resources.
 my_src_jar := $(intermediates.COMMON)/aar/classes.jar
 
-$(my_src_jar) : $(my_prebuilt_src_file)
+$(my_src_jar) : $(my_src_aar)
 	$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)
 	$(hide) unzip -qo -d $(dir $@) $<
 	# Make sure the extracted classes.jar has a new timestamp.
@@ -418,6 +439,36 @@
 
 $(call define-jar-to-toc-rule, $(common_classes_jar))
 
+ifdef LOCAL_USE_AAPT2
+ifneq ($(my_src_aar),)
+my_res_package := $(intermediates.COMMON)/package-res.apk
+
+# We needed only very few PRIVATE variables and aapt2.mk input variables. Reset the unnecessary ones.
+$(my_res_package): PRIVATE_AAPT2_CFLAGS :=
+$(my_res_package): PRIVATE_ANDROID_MANIFEST := $(intermediates.COMMON)/aar/AndroidManifest.xml
+$(my_res_package): PRIVATE_AAPT_INCLUDES :=
+$(my_res_package): PRIVATE_SOURCE_INTERMEDIATES_DIR :=
+$(my_res_package): PRIVATE_PROGUARD_OPTIONS_FILE :=
+$(my_res_package): PRIVATE_DEFAULT_APP_TARGET_SDK :=
+$(my_res_package): PRIVATE_DEFAULT_APP_TARGET_SDK :=
+$(my_res_package): PRIVATE_PRODUCT_AAPT_CONFIG :=
+$(my_res_package): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
+$(my_res_package): PRIVATE_TARGET_AAPT_CHARACTERISTICS :=
+
+full_android_manifest :=
+my_res_resources :=
+my_overlay_resources :=
+my_compiled_res_base_dir :=
+R_file_stamp :=
+proguard_options_file :=
+my_generated_res_dirs := $(intermediates.COMMON)/aar/res
+my_generated_res_dirs_deps := $(my_src_jar)
+include $(BUILD_SYSTEM)/aapt2.mk
+
+# Make sure my_res_package is created when you run mm/mmm.
+$(built_module) : $(my_res_package)
+endif  # $(my_src_aar)
+endif  # LOCAL_USE_AAPT2
 # make sure the classes.jar and javalib.jar are built before $(LOCAL_BUILT_MODULE)
 $(built_module) : $(common_javalib_jar)
 
@@ -428,8 +479,10 @@
 
 # We may be building classes.jack from a host jar for host dalvik Java library.
 $(intermediates.COMMON)/classes.jack : PRIVATE_JACK_FLAGS:=$(LOCAL_JACK_FLAGS)
-$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_MIN_SDK_VERSION := 1
-$(intermediates.COMMON)/classes.jack : $(my_src_jar) \
+$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_MIN_SDK_VERSION := $(if $(strip $(LOCAL_MIN_SDK_VERSION)),$(LOCAL_MIN_SDK_VERSION),1)
+$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_PLUGIN_PATH := $(LOCAL_JACK_PLUGIN_PATH)
+$(intermediates.COMMON)/classes.jack : PRIVATE_JACK_PLUGIN := $(LOCAL_JACK_PLUGIN)
+$(intermediates.COMMON)/classes.jack : $(LOCAL_JACK_PLUGIN_PATH) $(my_src_jar) \
         $(LOCAL_ADDITIONAL_DEPENDENCIES) $(JACK_DEFAULT_ARGS) $(JACK) \
         | setup-jack-server
 	$(transform-jar-to-jack)
diff --git a/core/product.mk b/core/product.mk
index 7dfaa19..d4790d5 100644
--- a/core/product.mk
+++ b/core/product.mk
@@ -121,12 +121,15 @@
     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 \
     VENDOR_PRODUCT_RESTRICT_VENDOR_FILES \
     VENDOR_EXCEPTION_MODULES \
     VENDOR_EXCEPTION_PATHS \
 
 
+
 define dump-product
 $(info ==== $(1) ====)\
 $(foreach v,$(_product_var_list),\
@@ -293,33 +296,15 @@
 	GLOBAL_CLANG_CFLAGS_NO_OVERRIDE \
 
 #
-# Stash values of the variables in _product_stash_var_list.
-# $(1): Renamed prefix
+# Mark the variables in _product_stash_var_list as readonly
 #
-define stash-product-vars
+define readonly-product-vars
 $(foreach v,$(_product_stash_var_list), \
-        $(eval $(strip $(1))_$(call rot13,$(v)):=$$($$(v))) \
+	$(eval $(v) ?=) \
+	$(eval .KATI_READONLY := $(v)) \
  )
 endef
 
-#
-# Assert that the the variable stashed by stash-product-vars remains untouched.
-# $(1): The prefix as supplied to stash-product-vars
-#
-define assert-product-vars
-$(strip \
-  $(eval changed_variables:=)
-  $(foreach v,$(_product_stash_var_list), \
-    $(if $(call streq,$($(v)),$($(strip $(1))_$(call rot13,$(v)))),, \
-        $(eval $(warning $(v) has been modified: $($(v)))) \
-        $(eval $(warning previous value: $($(strip $(1))_$(call rot13,$(v))))) \
-        $(eval changed_variables := $(changed_variables) $(v))) \
-   ) \
-  $(if $(changed_variables),\
-    $(eval $(error The following variables have been changed: $(changed_variables))),)
-)
-endef
-
 define add-to-product-copy-files-if-exists
 $(if $(wildcard $(word 1,$(subst :, ,$(1)))),$(1))
 endef
diff --git a/core/product_config.mk b/core/product_config.mk
index f00f4cd..3b8c0eb 100644
--- a/core/product_config.mk
+++ b/core/product_config.mk
@@ -149,7 +149,7 @@
 unbundled_goals := $(strip $(filter APP-%,$(MAKECMDGOALS)))
 ifdef unbundled_goals
   ifneq ($(words $(unbundled_goals)),1)
-    $(error Only one APP-* goal may be specified; saw "$(unbundled_goals)"))
+    $(error Only one APP-* goal may be specified; saw "$(unbundled_goals)")
   endif
   TARGET_BUILD_APPS := $(strip $(subst -, ,$(patsubst APP-%,%,$(unbundled_goals))))
   ifneq ($(filter $(DEFAULT_GOAL),$(MAKECMDGOALS)),)
@@ -189,6 +189,8 @@
 all_product_configs := $(get-all-product-makefiles)
 endif
 
+all_named_products :=
+
 # Find the product config makefile for the current product.
 # all_product_configs consists items like:
 # <product_name>:<path_to_the_product_makefile>
@@ -202,9 +204,11 @@
     $(eval _cpm_word2 := $(word 2,$(_cpm_words)))\
     $(if $(_cpm_word2),\
         $(eval all_product_makefiles += $(_cpm_word2))\
+        $(eval all_named_products += $(_cpm_word2))\
         $(if $(filter $(TARGET_PRODUCT),$(_cpm_word1)),\
             $(eval current_product_makefile += $(_cpm_word2)),),\
         $(eval all_product_makefiles += $(f))\
+        $(eval all_named_products += $(basename $(notdir $(f))))\
         $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),\
             $(eval current_product_makefile += $(f)),)))
 _cpm_words :=
@@ -299,9 +303,11 @@
 
 # product-scoped aapt flags
 PRODUCT_AAPT_FLAGS :=
+PRODUCT_AAPT2_CFLAGS :=
 ifneq ($(filter en_XA ar_XB,$(PRODUCT_LOCALES)),)
-# Force generating resources for pseudo-locales.
-PRODUCT_AAPT_FLAGS += --pseudo-localize
+  # Force generating resources for pseudo-locales.
+  PRODUCT_AAPT2_CFLAGS += --pseudo-localize
+  PRODUCT_AAPT_FLAGS += --pseudo-localize
 endif
 
 PRODUCT_BRAND := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BRAND))
@@ -349,18 +355,18 @@
 PRODUCT_PROPERTY_OVERRIDES := \
     $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PROPERTY_OVERRIDES))
 
-# A list of property assignments, like "key = value", with zero or more
-# whitespace characters on either side of the '='.
-# used for adding properties to default.prop
-PRODUCT_DEFAULT_PROPERTY_OVERRIDES := \
-    $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
-
 PRODUCT_SHIPPING_API_LEVEL := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SHIPPING_API_LEVEL))
 ifdef PRODUCT_SHIPPING_API_LEVEL
 ADDITIONAL_BUILD_PROPERTIES += \
     ro.product.first_api_level=$(PRODUCT_SHIPPING_API_LEVEL)
 endif
 
+# A list of property assignments, like "key = value", with zero or more
+# whitespace characters on either side of the '='.
+# used for adding properties to default.prop
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES := \
+    $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEFAULT_PROPERTY_OVERRIDES))
+
 # Should we use the default resources or add any product specific overlays
 PRODUCT_PACKAGE_OVERLAYS := \
     $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGE_OVERLAYS))
diff --git a/core/proguard.flags b/core/proguard.flags
index 0641627..6ed1f9b 100644
--- a/core/proguard.flags
+++ b/core/proguard.flags
@@ -10,9 +10,9 @@
 #-flattenpackagehierarchy
 
 # Keep classes and methods that have the guava @VisibleForTesting annotation
--keep @com.google.common.annotations.VisibleForTesting class *
+-keep @**.VisibleForTesting class *
 -keepclassmembers class * {
-@com.google.common.annotations.VisibleForTesting *;
+@**.VisibleForTesting *;
 }
 
 -include proguard_basic_keeps.flags
diff --git a/core/setup_one_odex.mk b/core/setup_one_odex.mk
index ec8a28a..40dbb55 100644
--- a/core/setup_one_odex.mk
+++ b/core/setup_one_odex.mk
@@ -35,5 +35,10 @@
 my_installed_odex := $(call get-odex-file-path,$($(my_2nd_arch_prefix)DEX2OAT_TARGET_ARCH),$(LOCAL_INSTALLED_MODULE))
 
 built_odex += $(my_built_odex)
+built_vdex += $(patsubst %.odex,%.vdex,$(my_built_odex))
+
 installed_odex += $(my_installed_odex)
+installed_vdex += $(patsubst %.odex,%.vdex,$(my_installed_odex))
+
 built_installed_odex += $(my_built_odex):$(my_installed_odex)
+built_installed_vdex += $(my_built_vdex):$(my_installed_vdex)
diff --git a/core/shared_library_internal.mk b/core/shared_library_internal.mk
index 35899f9..1a8975a 100644
--- a/core/shared_library_internal.mk
+++ b/core/shared_library_internal.mk
@@ -39,7 +39,7 @@
 include $(BUILD_SYSTEM)/dynamic_binary.mk
 
 # Define PRIVATE_ variables from global vars
-my_target_global_ld_dirs := $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_GLOBAL_LD_DIRS)
+my_target_global_ld_dirs :=
 ifeq ($(LOCAL_NO_LIBGCC),true)
 my_target_libgcc :=
 else
@@ -81,4 +81,38 @@
         $(LOCAL_ADDITIONAL_DEPENDENCIES)
 	$(transform-o-to-shared-lib)
 
+ifeq ($(my_native_coverage),true)
+gcno_suffix := .gcnodir
+
+built_whole_gcno_libraries := \
+    $(foreach lib,$(my_whole_static_libraries), \
+      $(call intermediates-dir-for, \
+        STATIC_LIBRARIES,$(lib),$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX), \
+        $(my_host_cross))/$(lib)$(gcno_suffix))
+
+built_static_gcno_libraries := \
+    $(foreach lib,$(my_static_libraries), \
+      $(call intermediates-dir-for, \
+        STATIC_LIBRARIES,$(lib),$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX), \
+        $(my_host_cross))/$(lib)$(gcno_suffix))
+
+ifdef LOCAL_IS_HOST_MODULE
+my_coverage_path := $($(my_prefix)OUT_COVERAGE)/$(patsubst $($(my_prefix)OUT)/%,%,$(my_module_path))
+else
+my_coverage_path := $(TARGET_OUT_COVERAGE)/$(patsubst $(PRODUCT_OUT)/%,%,$(my_module_path))
+endif
+
+GCNO_ARCHIVE := $(basename $(my_installed_module_stem))$(gcno_suffix)
+
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_OBJECTS := $(strip $(LOCAL_GCNO_FILES))
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(strip $(built_whole_gcno_libraries)) $(strip $(built_static_gcno_libraries))
+$(intermediates)/$(GCNO_ARCHIVE) : $(LOCAL_GCNO_FILES) $(built_whole_gcno_libraries) $(built_static_gcno_libraries)
+	$(transform-o-to-static-lib)
+
+$(my_coverage_path)/$(GCNO_ARCHIVE) : $(intermediates)/$(GCNO_ARCHIVE)
+	$(copy-file-to-target)
+
+$(LOCAL_BUILT_MODULE): $(my_coverage_path)/$(GCNO_ARCHIVE)
+endif
+
 endif  # skip_build_from_source
diff --git a/core/soong.mk b/core/soong.mk
index 3f0ee85..cd5eff4 100644
--- a/core/soong.mk
+++ b/core/soong.mk
@@ -52,6 +52,9 @@
 	echo '    "Cpusets": $(if $(strip $(ENABLE_CPUSETS)),true,false),'; \
 	echo '    "Schedboost": $(if $(strip $(ENABLE_SCHEDBOOST)),true,false),'; \
 	echo '    "Binder32bit": $(if $(BINDER32BIT),true,false),'; \
+	echo '    "DevicePrefer32BitExecutables": $(if $(filter true,$(TARGET_PREFER_32_BIT_EXECUTABLES)),true,false),'; \
+	echo '    "UseGoma": $(if $(filter-out false,$(USE_GOMA)),true,false),'; \
+	echo '    "Debuggable": $(if $(filter userdebug eng,$(TARGET_BUILD_VARIANT)),true,false),'; \
 	echo ''; \
 	echo '    "DeviceName": "$(TARGET_DEVICE)",'; \
 	echo '    "DeviceArch": "$(TARGET_ARCH)",'; \
@@ -88,4 +91,4 @@
 # prebuilts.
 .PHONY: run_soong
 run_soong: $(SOONG_BOOTSTRAP) $(SOONG_VARIABLES) $(SOONG_IN_MAKE) FORCE
-	$(hide) $(SOONG) $(SOONG_BUILD_NINJA) $(NINJA_EXTRA_ARGS)
+	$(hide) SKIP_NINJA=true $(SOONG)
diff --git a/core/static_java_library.mk b/core/static_java_library.mk
index d6dd065..258c5f8 100644
--- a/core/static_java_library.mk
+++ b/core/static_java_library.mk
@@ -28,6 +28,10 @@
 include $(BUILD_SYSTEM)/configure_local_jack.mk
 #################################
 
+intermediates.COMMON := $(call local-intermediates-dir,COMMON)
+
+my_res_package :=
+
 # Hack to build static Java library with Android resource
 # See bug 5714516
 all_resources :=
@@ -35,6 +39,14 @@
 # A static Java library needs to explicily set LOCAL_RESOURCE_DIR.
 ifdef LOCAL_RESOURCE_DIR
 need_compile_res := true
+endif
+ifdef LOCAL_USE_AAPT2
+ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),)
+need_compile_res := true
+endif
+endif
+
+ifeq ($(need_compile_res),true)
 all_resources := $(strip \
     $(foreach dir, $(LOCAL_RESOURCE_DIR), \
       $(addprefix $(dir)/, \
@@ -57,7 +69,6 @@
 
 proguard_options_file :=
 
-intermediates.COMMON := $(call local-intermediates-dir,COMMON)
 ifneq ($(LOCAL_PROGUARD_ENABLED),custom)
   proguard_options_file := $(intermediates.COMMON)/proguard_options
 endif
@@ -69,6 +80,18 @@
 endif
 LOCAL_JACK_PROGUARD_FLAGS := $(addprefix -include ,$(proguard_options_file)) $(LOCAL_JACK_PROGUARD_FLAGS)
 
+R_file_stamp := $(intermediates.COMMON)/src/R.stamp
+LOCAL_INTERMEDIATE_TARGETS += $(R_file_stamp)
+
+ifdef LOCAL_USE_AAPT2
+# For library we treat all the resource equal with no overlay.
+my_res_resources := $(all_resources)
+my_overlay_resources :=
+# For libraries put everything in the COMMON intermediate directory.
+my_res_package := $(intermediates.COMMON)/package-res.apk
+
+LOCAL_INTERMEDIATE_TARGETS += $(my_res_package)
+endif  # LOCAL_USE_AAPT2
 endif  # LOCAL_RESOURCE_DIR
 
 all_res_assets := $(all_resources)
@@ -76,8 +99,6 @@
 include $(BUILD_SYSTEM)/java_library.mk
 
 ifeq (true,$(need_compile_res))
-R_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.stamp
-
 include $(BUILD_SYSTEM)/android_manifest.mk
 
 LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION))
@@ -89,7 +110,7 @@
 framework_res_package_export_deps :=
 # Please refer to package.mk
 ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
-ifneq ($(filter-out current system_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_RES_VERSION))),)
+ifneq ($(filter-out current system_current test_current,$(LOCAL_SDK_RES_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current test_current,$(LOCAL_SDK_RES_VERSION))),)
 framework_res_package_export := \
     $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar
 framework_res_package_export_deps := $(framework_res_package_export)
@@ -101,29 +122,47 @@
 endif
 endif
 
-$(R_file_stamp): PRIVATE_MODULE := $(LOCAL_MODULE)
 # add --non-constant-id to prevent inlining constants.
 # AAR needs text symbol file R.txt.
-$(R_file_stamp): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id --output-text-symbols $(LOCAL_INTERMEDIATE_SOURCE_DIR)
-$(R_file_stamp): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)
-$(R_file_stamp): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest)
-$(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml
-$(R_file_stamp): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR)
-$(R_file_stamp): PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)
-ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
-$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION)
+ifdef LOCAL_USE_AAPT2
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --static-lib --no-static-lib-packages
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PRODUCT_AAPT_CONFIG :=
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PRODUCT_AAPT_PREF_CONFIG :=
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_AAPT_CHARACTERISTICS :=
 else
-$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id --output-text-symbols $(LOCAL_INTERMEDIATE_SOURCE_DIR)
 endif
-$(R_file_stamp): PRIVATE_ASSET_DIR :=
-$(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file)
-$(R_file_stamp): PRIVATE_MANIFEST_PACKAGE_NAME :=
-$(R_file_stamp): PRIVATE_MANIFEST_INSTRUMENTATION_FOR :=
 
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_AAPT_INCLUDES := $(framework_res_package_export)
+
+ifneq (,$(filter-out current system_current test_current, $(LOCAL_SDK_VERSION)))
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION)
+else
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK)
+endif
+
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASSET_DIR :=
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_PROGUARD_OPTIONS_FILE := $(proguard_options_file)
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_PACKAGE_NAME :=
+$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_MANIFEST_INSTRUMENTATION_FOR :=
+
+ifdef LOCAL_USE_AAPT2
+# One more level with name res so we can zip up the flat resources that can be linked by apps.
+my_compiled_res_base_dir := $(intermediates.COMMON)/flat-res/res
+my_generated_res_dirs := $(rs_generated_res_dir)
+my_generated_res_dirs_deps := $(RenderScript_file_stamp)
+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) ($@)"
 	$(create-resource-java-files)
 	$(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@
+endif  # LOCAL_USE_AAPT2
 
 $(LOCAL_BUILT_MODULE) \
 $(full_classes_compiled_jar) \
@@ -134,10 +173,10 @@
 built_aar := $(intermediates.COMMON)/javalib.aar
 $(built_aar): PRIVATE_MODULE := $(LOCAL_MODULE)
 $(built_aar): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest)
-$(built_aar): PRIVATE_CLASSES_JAR := $(LOCAL_BUILT_MODULE)
+$(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) : $(LOCAL_BUILT_MODULE)
+$(built_aar) : $(full_classes_jar) $(full_android_manifest)
 	@echo "target AAR:  $(PRIVATE_MODULE) ($@)"
 	$(hide) rm -rf $(dir $@)aar && mkdir -p $(dir $@)aar/res
 	$(hide) cp $(PRIVATE_ANDROID_MANIFEST) $(dir $@)aar/AndroidManifest.xml
@@ -150,7 +189,6 @@
 
 # Register the aar file.
 ALL_MODULES.$(LOCAL_MODULE).AAR := $(built_aar)
-
 endif  # need_compile_res
 
 # Reset internal variables.
diff --git a/core/static_library_internal.mk b/core/static_library_internal.mk
index 2b49046..6da6a75 100644
--- a/core/static_library_internal.mk
+++ b/core/static_library_internal.mk
@@ -23,3 +23,18 @@
 $(LOCAL_BUILT_MODULE) : $(built_whole_libraries)
 $(LOCAL_BUILT_MODULE) : $(all_objects)
 	$(transform-o-to-static-lib)
+
+gcno_suffix := .gcnodir
+
+built_whole_gcno_libraries := \
+    $(foreach lib,$(my_whole_static_libraries), \
+      $(call intermediates-dir-for, \
+        STATIC_LIBRARIES,$(lib),$(my_kind),,$(LOCAL_2ND_ARCH_VAR_PREFIX), \
+        $(my_host_cross))/$(lib)$(gcno_suffix))
+
+GCNO_ARCHIVE := $(LOCAL_MODULE)$(gcno_suffix)
+
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_OBJECTS := $(strip $(LOCAL_GCNO_FILES))
+$(intermediates)/$(GCNO_ARCHIVE) : PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(strip $(built_whole_gcno_libraries))
+$(intermediates)/$(GCNO_ARCHIVE) : $(LOCAL_GCNO_FILES) $(built_whole_gcno_libraries)
+	$(transform-o-to-static-lib)
diff --git a/core/target_test_internal.mk b/core/target_test_internal.mk
index 1a22510..2e65218 100644
--- a/core/target_test_internal.mk
+++ b/core/target_test_internal.mk
@@ -8,13 +8,13 @@
     LOCAL_STATIC_LIBRARIES += libgtest_main libgtest
 else
     ifneq (,$(filter c++_%,$(LOCAL_NDK_STL_VARIANT)))
-        my_ndk_gtest_suffix := _libcxx
+        my_ndk_gtest_suffix := _c++
     else ifneq ($(filter stlport_,$(LOCAL_NDK_STL_VARIANT)),)
-        my_ndk_gtest_suffix :=
+        my_ndk_gtest_suffix := _stlport
     else ifneq ($(filter gnustl_,$(LOCAL_NDK_STL_VARIANT)),)
         my_ndk_gtest_suffix := _gnustl
     else # system STL, use stlport
-        my_ndk_gtest_suffix :=
+        my_ndk_gtest_suffix := _stlport
     endif
     LOCAL_STATIC_LIBRARIES += \
         libgtest_main_ndk$(my_ndk_gtest_suffix) \
diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk
index 683a075..3975d20 100644
--- a/core/tasks/apicheck.mk
+++ b/core/tasks/apicheck.mk
@@ -129,4 +129,37 @@
 	@echo Copying system-removed.txt
 	$(hide) $(ACP) $(INTERNAL_PLATFORM_SYSTEM_REMOVED_API_FILE) frameworks/base/api/system-removed.txt
 
+#####################Check Test API#####################
+.PHONY: check-test-api
+checkapi : check-test-api
+
+# Check that the Test API we're building hasn't changed from the not-yet-released
+# SDK version. Note that we don't check that we haven't broken the previous
+# SDK's API because the test API is meant only for CTS which is always
+# associated with the current release.
+$(eval $(call check-api, \
+    checktestapi-current, \
+    frameworks/base/api/test-current.txt, \
+    $(INTERNAL_PLATFORM_TEST_API_FILE), \
+    frameworks/base/api/test-removed.txt, \
+    $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE), \
+    -error 2 -error 3 -error 4 -error 5 -error 6 \
+    -error 7 -error 8 -error 9 -error 10 -error 11 -error 12 -error 13 -error 14 -error 15 \
+    -error 16 -error 17 -error 18 -error 19 -error 20 -error 21 -error 23 -error 24 \
+    -error 25 -error 26 -error 27, \
+    cat $(BUILD_SYSTEM)/apicheck_msg_current.txt, \
+    check-test-api, \
+    $(call doc-timestamp-for,test-api-stubs) \
+    ))
+
+.PHONY: update-test-api
+update-api : update-test-api
+
+update-test-api: $(INTERNAL_PLATFORM_TEST_API_FILE) | $(ACP)
+	@echo Copying test-current.txt
+	$(hide) $(ACP) $(INTERNAL_PLATFORM_TEST_API_FILE) frameworks/base/api/test-current.txt
+	@echo Copying test-removed.txt
+	$(hide) $(ACP) $(INTERNAL_PLATFORM_TEST_REMOVED_API_FILE) frameworks/base/api/test-removed.txt
+
+
 endif
diff --git a/core/tasks/cts.mk b/core/tasks/cts.mk
index d0b077a..fdd9591 100644
--- a/core/tasks/cts.mk
+++ b/core/tasks/cts.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 The Android Open Source Project
+# Copyright (C) 2015 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.
@@ -12,387 +12,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cts_dir := $(HOST_OUT)/cts
-cts_tools_src_dir := cts/tools
+test_suite_name := cts
+test_suite_tradefed := cts-tradefed
+test_suite_dynamic_config := cts/tools/cts-tradefed/DynamicConfig.xml
+test_suite_readme := cts/tools/cts-tradefed/README
 
-cts_name := android-cts
-
-JUNIT_HOST_JAR := $(HOST_OUT_JAVA_LIBRARIES)/junit.jar
-HOSTTESTLIB_JAR := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar
-TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar
-CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/cts-tradefed.jar
-CTS_TF_EXEC_PATH ?= $(HOST_OUT_EXECUTABLES)/cts-tradefed
-CTS_TF_README_PATH := $(cts_tools_src_dir)/tradefed-host/README
-
-VMTESTSTF_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,vm-tests-tf,HOST)
-VMTESTSTF_JAR := $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar
-
-# The list of test packages that core-tests (libcore/Android.mk)
-# is split into.
-CTS_CORE_CASE_LIST := \
-	android.core.tests.libcore.package.dalvik \
-	android.core.tests.libcore.package.com \
-	android.core.tests.libcore.package.conscrypt \
-	android.core.tests.libcore.package.sun \
-	android.core.tests.libcore.package.tests \
-	android.core.tests.libcore.package.org \
-	android.core.tests.libcore.package.libcore \
-	android.core.tests.libcore.package.jsr166 \
-	android.core.tests.libcore.package.harmony_annotation \
-	android.core.tests.libcore.package.harmony_java_io \
-	android.core.tests.libcore.package.harmony_java_lang \
-	android.core.tests.libcore.package.harmony_java_math \
-	android.core.tests.libcore.package.harmony_java_net \
-	android.core.tests.libcore.package.harmony_java_nio \
-	android.core.tests.libcore.package.harmony_java_text \
-	android.core.tests.libcore.package.harmony_java_util \
-	android.core.tests.libcore.package.harmony_javax_security \
-	android.core.tests.libcore.package.okhttp \
-	android.core.tests.runner
-
-# Additional CTS packages for code under libcore
-CTS_CORE_CASE_LIST += \
-	android.core.tests.libcore.package.tzdata
-
-# The list of test packages that apache-harmony-tests (external/apache-harmony/Android.mk)
-# is split into.
-CTS_CORE_CASE_LIST += \
-	android.core.tests.libcore.package.harmony_beans \
-	android.core.tests.libcore.package.harmony_logging \
-	android.core.tests.libcore.package.harmony_prefs \
-	android.core.tests.libcore.package.harmony_sql
-
-
-CTS_TEST_JAR_LIST := \
-	cts-junit \
-	CtsJdwp \
-	cts-testng \
-	CtsLibcoreOj
-
-# Depend on the full package paths rather than the phony targets to avoid
-# rebuilding the packages every time.
-CTS_CORE_CASES := $(foreach pkg,$(CTS_CORE_CASE_LIST),$(call intermediates-dir-for,APPS,$(pkg))/package.apk)
-CTS_TEST_JAR_FILES := $(foreach c,$(CTS_TEST_JAR_LIST),$(call intermediates-dir-for,JAVA_LIBRARIES,$(c))/javalib.jar)
-
--include cts/CtsTestCaseList.mk
-
-# A module may have mutliple installed files (e.g. split apks)
-CTS_CASE_LIST_APKS :=
-$(foreach m, $(CTS_TEST_CASE_LIST),\
-  $(foreach fp, $(ALL_MODULES.$(m).BUILT_INSTALLED),\
-    $(eval pair := $(subst :,$(space),$(fp)))\
-    $(eval CTS_CASE_LIST_APKS += $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))))\
-$(foreach m, $(CTS_CORE_CASE_LIST),\
-  $(foreach fp, $(ALL_MODULES.$(m).BUILT_INSTALLED),\
-    $(eval pair := $(subst :,$(space),$(fp)))\
-    $(eval built := $(word 1,$(pair)))\
-    $(eval installed := $(CTS_TESTCASES_OUT)/$(notdir $(word 2,$(pair))))\
-    $(eval $(call copy-one-file, $(built), $(installed)))\
-    $(eval CTS_CASE_LIST_APKS += $(installed))))
-
-CTS_CASE_LIST_JARS :=
-$(foreach m, $(CTS_TEST_JAR_LIST),\
-  $(eval CTS_CASE_LIST_JARS += $(CTS_TESTCASES_OUT)/$(m).jar))
-
-CTS_SHARED_LIBS :=
-
-DEFAULT_TEST_PLAN := $(cts_dir)/$(cts_name)/resource/plans
-$(cts_dir)/all_cts_files_stamp: $(CTS_CORE_CASES) $(CTS_TEST_JAR_FILES) $(CTS_TEST_CASES) $(CTS_CASE_LIST_APKS) $(CTS_CASE_LIST_JARS) $(JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(VMTESTSTF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(ADDITIONAL_TF_JARS) $(ACP) $(CTS_SHARED_LIBS)
-
-# Make necessary directory for CTS
-	$(hide) mkdir -p $(TMP_DIR)
-	$(hide) mkdir -p $(PRIVATE_DIR)/docs
-	$(hide) mkdir -p $(PRIVATE_DIR)/tools
-	$(hide) mkdir -p $(PRIVATE_DIR)/repository/testcases
-	$(hide) mkdir -p $(PRIVATE_DIR)/repository/plans
-# Copy executable and JARs to CTS directory
-	$(hide) $(ACP) -fp $(VMTESTSTF_JAR) $(CTS_TESTCASES_OUT)
-	$(hide) $(ACP) -fp $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(ADDITIONAL_TF_JARS) $(CTS_TF_README_PATH) $(PRIVATE_DIR)/tools
-	$(hide) $(call copy-files-with-structure, $(CTS_SHARED_LIBS),$(HOST_OUT)/,$(PRIVATE_DIR))
-	$(hide) touch $@
-
-# Generate the test descriptions for the core-tests
-# Parameters:
-# $1 : The output file where the description should be written (without the '.xml' extension)
-# $2 : The AndroidManifest.xml corresponding to the test package
-# $3 : The jar file name on PRIVATE_CLASSPATH containing junit tests to search for
-# $4 : The package prefix of classes to include, possible empty
-# $5 : The architecture of the current build
-# $6 : The directory containing vogar expectations files
-# $7 : The Android.mk corresponding to the test package (required for host-side tests only)
-define generate-core-test-description
-@echo "Generate core-test description ("$(notdir $(1))")"
-$(hide) java -Xmx256M \
-	-Xbootclasspath/a:$(PRIVATE_CLASSPATH):$(JUNIT_HOST_JAR) \
-	-classpath $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar:$(HOST_JDK_TOOLS_JAR) \
-	$(PRIVATE_PARAMS) CollectAllTests $(1) $(2) $(3) "$(4)" $(5) $(6) $(7)
-endef
-
-OJ_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-oj,,COMMON)
-CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)
-CONSCRYPT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt,,COMMON)
-BOUNCYCASTLE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,bouncycastle,,COMMON)
-APACHEXML_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-xml,,COMMON)
-OKHTTP_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-nojarjar,,COMMON)
-OKHTTPTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp-tests-nojarjar,,COMMON)
-OKHTTP_REPACKAGED_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,okhttp,,COMMON)
-APACHEHARMONYTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,apache-harmony-tests,,COMMON)
-SQLITEJDBC_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,sqlite-jdbc,,COMMON)
-JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON)
-CORETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-tests,,COMMON)
-JSR166TESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,jsr166-tests,,COMMON)
-CONSCRYPTTESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,conscrypt-tests,,COMMON)
-TZDATAUPDATETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,tzdata_update-tests,,COMMON)
-
-GEN_CLASSPATH := \
-    $(OJ_INTERMEDIATES)/classes.jar:$(CORE_INTERMEDIATES)/classes.jar:$(CONSCRYPT_INTERMEDIATES)/classes.jar:$(BOUNCYCASTLE_INTERMEDIATES)/classes.jar:$(APACHEXML_INTERMEDIATES)/classes.jar:$(APACHEHARMONYTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_INTERMEDIATES)/classes.jar:$(OKHTTPTESTS_INTERMEDIATES)/classes.jar:$(OKHTTP_REPACKAGED_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(SQLITEJDBC_INTERMEDIATES)/javalib.jar:$(CORETESTS_INTERMEDIATES)/javalib.jar:$(JSR166TESTS_INTERMEDIATES)/javalib.jar:$(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar:$(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar
-
-CTS_CORE_XMLS := \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml \
-	$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata.xml \
-
-$(CTS_CORE_XMLS): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH)
-# Why does this depend on javalib.jar instead of classes.jar?  Because
-# even though the tool will operate on the classes.jar files, the
-# build system requires that dependencies use javalib.jar.  If
-# javalib.jar is up-to-date, then classes.jar is as well.  Depending
-# on classes.jar will build the files incorrectly.
-CTS_CORE_XMLS_DEPS := $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_INTERMEDIATES)/javalib.jar $(OKHTTPTESTS_INTERMEDIATES)/javalib.jar $(OKHTTP_REPACKAGED_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar $(JSR166TESTS_INTERMEDIATES)/javalib.jar $(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar $(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar build/core/tasks/cts.mk | $(ACP)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik,\
-		cts/tests/core/libcore/dalvik/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,dalvik,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com,\
-		cts/tests/core/libcore/com/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,com,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.conscrypt,\
-		cts/tests/core/libcore/conscrypt/AndroidManifest.xml,\
-		$(CONSCRYPTTESTS_INTERMEDIATES)/javalib.jar,,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun,\
-		cts/tests/core/libcore/sun/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,sun,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests,\
-		cts/tests/core/libcore/tests/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,tests,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org,\
-		cts/tests/core/libcore/org/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,\
-		org.w3c.domts:\
-		org.apache.harmony.security.tests:\
-		org.apache.harmony.nio.tests:\
-		org.apache.harmony.crypto.tests:\
-		org.apache.harmony.regex.tests:\
-		org.apache.harmony.luni.tests:\
-		org.apache.harmony.tests.internal.net.www.protocol:\
-		org.apache.harmony.tests.javax.net:\
-		org.json,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore,\
-		cts/tests/core/libcore/libcore/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,libcore,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.jsr166,\
-		cts/tests/core/libcore/jsr166/AndroidManifest.xml,\
-		$(JSR166TESTS_INTERMEDIATES)/javalib.jar,jsr166,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_annotation,\
-		cts/tests/core/libcore/harmony_annotation/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.annotation.tests,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_io,\
-		cts/tests/core/libcore/harmony_java_io/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.io,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_lang,\
-		cts/tests/core/libcore/harmony_java_lang/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.lang,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_math,\
-		cts/tests/core/libcore/harmony_java_math/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.math,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_net,\
-		cts/tests/core/libcore/harmony_java_net/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.net,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_nio,\
-		cts/tests/core/libcore/harmony_java_nio/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.nio,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_text,\
-		cts/tests/core/libcore/harmony_java_text/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.text,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_java_util,\
-		cts/tests/core/libcore/harmony_java_util/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.java.util,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_javax_security,\
-		cts/tests/core/libcore/harmony_javax_security/AndroidManifest.xml,\
-		$(CORETESTS_INTERMEDIATES)/javalib.jar,org.apache.harmony.tests.javax.security,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_beans,\
-		cts/tests/core/libcore/harmony_beans/AndroidManifest.xml,\
-		$(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.beans,\
-		$(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_logging,\
-		cts/tests/core/libcore/harmony_logging/AndroidManifest.xml,\
-		$(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.logging,\
-		$(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_prefs,\
-		cts/tests/core/libcore/harmony_prefs/AndroidManifest.xml,\
-		$(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.prefs,\
-		$(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.harmony_sql,\
-		cts/tests/core/libcore/harmony_sql/AndroidManifest.xml,\
-		$(APACHEHARMONYTESTS_INTERMEDIATES)/javalib.jar,com.android.org.apache.harmony.sql,\
-		$(TARGET_ARCH),libcore/expectations external/apache-harmony/Android.mk)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.okhttp,\
-		cts/tests/core/libcore/okhttp/AndroidManifest.xml,\
-		$(OKHTTPTESTS_INTERMEDIATES)/javalib.jar,,\
-		$(TARGET_ARCH),libcore/expectations)
-
-$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata.xml: $(CTS_CORE_XMLS_DEPS)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tzdata,\
-		cts/tests/core/libcore/tzdata/AndroidManifest.xml,\
-		$(TZDATAUPDATETESTS_INTERMEDIATES)/javalib.jar,,\
-		$(TARGET_ARCH),libcore/expectations)
-
-# ----- Generate the test descriptions for the vm-tests-tf -----
-#
-CORE_VM_TEST_TF_DESC := $(CTS_TESTCASES_OUT)/android.core.vm-tests-tf.xml
-
-# core tests only needed to get hold of junit-framework-classes
-OJ_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-oj,,COMMON)
-CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-libart,,COMMON)
-JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON)
-
-GEN_CLASSPATH := $(OJ_INTERMEDIATES)/classes.jar:$(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTSTF_JAR):$(TF_JAR)
-
-$(CORE_VM_TEST_TF_DESC): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH)
-# Please see big comment above on why this line depends on javalib.jar instead of classes.jar
-$(CORE_VM_TEST_TF_DESC): $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(JUNIT_HOST_JAR) $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTSTF_JAR) | $(ACP)
-	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.vm-tests-tf,\
-		cts/tests/vm-tests-tf/AndroidManifest.xml,\
-		$(VMTESTSTF_JAR),"",\
-		$(TARGET_ARCH),\
-		libcore/expectations,\
-		cts/tools/vm-tests-tf/Android.mk)
-
-# Generate the default test plan for User.
-# Usage: buildCts.py <testRoot> <ctsOutputDir> <tempDir> <androidRootDir> <docletPath>
-
-$(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_tools_src_dir)/utils/buildCts.py $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC)
-	$(hide) $(cts_tools_src_dir)/utils/buildCts.py cts/tests/tests/ $(PRIVATE_DIR) $(TMP_DIR) \
-		$(TOP) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar
-	$(hide) mkdir -p $(dir $@) && touch $@
-
-# Package CTS and clean up.
-#
-# TODO:
-#   Pack cts.bat into the same zip file as well. See http://buganizer/issue?id=1656821 for more details
-INTERNAL_CTS_TARGET := $(cts_dir)/$(cts_name).zip
-$(INTERNAL_CTS_TARGET): PRIVATE_NAME := $(cts_name)
-$(INTERNAL_CTS_TARGET): PRIVATE_CTS_DIR := $(cts_dir)
-$(INTERNAL_CTS_TARGET): PRIVATE_DIR := $(cts_dir)/$(cts_name)
-$(INTERNAL_CTS_TARGET): TMP_DIR := $(cts_dir)/temp
-$(INTERNAL_CTS_TARGET): $(cts_dir)/all_cts_files_stamp $(DEFAULT_TEST_PLAN)
-	$(hide) echo "Package CTS: $@"
-	$(hide) cd $(dir $@) && zip -rqX $(notdir $@) $(PRIVATE_NAME)
+include $(BUILD_SYSTEM)/tasks/tools/compatibility.mk
 
 .PHONY: cts
-cts: $(INTERNAL_CTS_TARGET) adb
-$(call dist-for-goals,cts,$(INTERNAL_CTS_TARGET))
+cts: $(compatibility_zip)
+$(call dist-for-goals, cts, $(compatibility_zip))
+
+.PHONY: cts_v2
+cts_v2: cts
diff --git a/core/tasks/module-info.mk b/core/tasks/module-info.mk
new file mode 100644
index 0000000..e9b2ac7
--- /dev/null
+++ b/core/tasks/module-info.mk
@@ -0,0 +1,24 @@
+# Print a list of the modules that could be built
+
+MODULE_INFO_JSON := $(PRODUCT_OUT)/module-info.json
+
+$(MODULE_INFO_JSON):
+	@echo Generating $@
+	$(hide) echo -ne '{\n ' > $@
+	$(hide) echo -ne $(foreach m, $(sort $(ALL_MODULES)), \
+		' "$(m)": {' \
+			'"class": [$(foreach w,$(sort $(ALL_MODULES.$(m).CLASS)),"$(w)", )], ' \
+			'"path": [$(foreach w,$(sort $(ALL_MODULES.$(m).PATH)),"$(w)", )], ' \
+			'"tags": [$(foreach w,$(sort $(ALL_MODULES.$(m).TAGS)),"$(w)", )], ' \
+			'"installed": [$(foreach w,$(sort $(ALL_MODULES.$(m).INSTALLED)),"$(w)", )], ' \
+			'},\n' \
+	 ) | sed -e 's/, *\]/]/g' -e 's/, *\}/ }/g' -e '$$s/,$$//' >> $@
+	$(hide) echo '}' >> $@
+
+
+# If ONE_SHOT_MAKEFILE is set, our view of the world is smaller, so don't
+# rewrite the file in that came.
+ifndef ONE_SHOT_MAKEFILE
+files: $(MODULE_INFO_JSON)
+endif
+
diff --git a/core/tasks/tools/compatibility.mk b/core/tasks/tools/compatibility.mk
new file mode 100644
index 0000000..d8f900e
--- /dev/null
+++ b/core/tasks/tools/compatibility.mk
@@ -0,0 +1,52 @@
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Package up a compatibility test suite in a zip file.
+#
+# Input variables:
+#   test_suite_name: the name of this test suite eg. cts
+#   test_suite_tradefed: the name of this test suite's tradefed wrapper
+#   test_suite_dynamic_config: the path to this test suite's dynamic configuration file
+#   test_suite_readme: the path to a README file for this test suite
+# Output variables:
+#   compatibility_zip: the path to the output zip file.
+
+out_dir := $(HOST_OUT)/$(test_suite_name)/android-$(test_suite_name)
+test_artifacts := $(COMPATIBILITY.$(test_suite_name).FILES)
+test_tools := $(HOST_OUT_JAVA_LIBRARIES)/hosttestlib.jar \
+  $(HOST_OUT_JAVA_LIBRARIES)/tradefed-prebuilt.jar \
+  $(HOST_OUT_JAVA_LIBRARIES)/compatibility-host-util.jar \
+  $(HOST_OUT_JAVA_LIBRARIES)/$(test_suite_tradefed).jar \
+  $(HOST_OUT_EXECUTABLES)/$(test_suite_tradefed) \
+  $(test_suite_readme)
+
+compatibility_zip := $(out_dir).zip
+$(compatibility_zip): PRIVATE_NAME := android-$(test_suite_name)
+$(compatibility_zip): PRIVATE_OUT_DIR := $(out_dir)
+$(compatibility_zip): PRIVATE_TOOLS := $(test_tools)
+$(compatibility_zip): PRIVATE_SUITE_NAME := $(test_suite_name)
+$(compatibility_zip): PRIVATE_DYNAMIC_CONFIG := $(test_suite_dynamic_config)
+$(compatibility_zip): $(test_artifacts) $(test_tools) $(test_suite_dynamic_config) | $(ADB) $(ACP)
+# Make dir structure
+	$(hide) mkdir -p $(PRIVATE_OUT_DIR)/tools $(PRIVATE_OUT_DIR)/testcases
+# Copy tools
+	$(hide) $(ACP) -fp $(PRIVATE_TOOLS) $(PRIVATE_OUT_DIR)/tools
+	$(if $(PRIVATE_DYNAMIC_CONFIG),$(hide) $(ACP) -fp $(PRIVATE_DYNAMIC_CONFIG) $(PRIVATE_OUT_DIR)/testcases/$(PRIVATE_SUITE_NAME).dynamic)
+	$(hide) cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME)
+
+# Reset all input variables
+test_suite_name :=
+test_suite_tradefed :=
+test_suite_dynamic_config :=
+test_suite_readme :=
diff --git a/core/tasks/vts.mk b/core/tasks/vts.mk
new file mode 100644
index 0000000..507f22e
--- /dev/null
+++ b/core/tasks/vts.mk
@@ -0,0 +1,23 @@
+# 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.
+
+test_suite_name := vts
+test_suite_tradefed := vts-tradefed
+test_suite_readme := test/vts/README.md
+
+include $(BUILD_SYSTEM)/tasks/tools/compatibility.mk
+
+.PHONY: vts
+vts: $(compatibility_zip)
+$(call dist-for-goals, vts, $(compatibility_zip))
diff --git a/core/version_defaults.mk b/core/version_defaults.mk
index 099b38d..5dffcac 100644
--- a/core/version_defaults.mk
+++ b/core/version_defaults.mk
@@ -43,7 +43,7 @@
   # 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 := 6.0.1
+  PLATFORM_VERSION := 7.0
 endif
 
 ifeq "" "$(PLATFORM_SDK_VERSION)"
@@ -55,7 +55,7 @@
   # 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 := 23
+  PLATFORM_SDK_VERSION := 24
 endif
 
 ifeq "" "$(PLATFORM_JACK_MIN_SDK_VERSION)"
@@ -110,10 +110,10 @@
 
 ifeq "" "$(PLATFORM_SECURITY_PATCH)"
   # Used to indicate the security patch that has been applied to the device.
-  # Can be an arbitrary string, but must be a single word.
+  # Must be of the form "YYYY-MM-DD" on production devices.
   #
   # If there is no $PLATFORM_SECURITY_PATCH set, keep it empty.
-  PLATFORM_SECURITY_PATCH := 2016-03-01
+  PLATFORM_SECURITY_PATCH := 2016-08-05
 endif
 
 ifeq "" "$(PLATFORM_BASE_OS)"
diff --git a/envsetup.sh b/envsetup.sh
index 53b4a22..e919891 100644
--- a/envsetup.sh
+++ b/envsetup.sh
@@ -827,22 +827,23 @@
             DIR=${DIR#./}
             DIR=${DIR%/}
             if [ -f $DIR/Android.mk -o -f $DIR/Android.bp ]; then
-                if [ "$DIR_MODULES" = "" ]; then
-                    MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$DIR"
-                    GET_INSTALL_PATHS="$GET_INSTALL_PATHS GET-INSTALL-PATH-IN-$DIR"
-                else
-                    MODULES="$MODULES $DIR_MODULES"
-                fi
                 local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '`
                 local TO_CHOP=`expr $TO_CHOP + 1`
                 local START=`PWD= /bin/pwd`
-                local MFILE=`echo $START | cut -c${TO_CHOP}-`
-                if [ "$MFILE" = "" ] ; then
-                    MFILE=$DIR/Android.mk
+                local MDIR=`echo $START | cut -c${TO_CHOP}-`
+                if [ "$MDIR" = "" ] ; then
+                    MDIR=$DIR
                 else
-                    MFILE=$MFILE/$DIR/Android.mk
+                    MDIR=$MDIR/$DIR
                 fi
-                MAKEFILE="$MAKEFILE $MFILE"
+                MDIR=${MDIR%/.}
+                if [ "$DIR_MODULES" = "" ]; then
+                    MODULES_IN_PATHS="$MODULES_IN_PATHS MODULES-IN-$MDIR"
+                    GET_INSTALL_PATHS="$GET_INSTALL_PATHS GET-INSTALL-PATH-IN-$MDIR"
+                else
+                    MODULES="$MODULES $DIR_MODULES"
+                fi
+                MAKEFILE="$MAKEFILE $MDIR/Android.mk"
             else
                 case $DIR in
                   showcommands | snod | dist | *=*) ARGS="$ARGS $DIR";;
@@ -885,8 +886,10 @@
       echo "Couldn't locate the top of the tree.  Try setting TOP."
       return 1
     fi
-    local MY_PWD=`PWD= /bin/pwd|sed 's:'$T'/::'`
-    local MODULES_IN_PATHS=MODULES-IN-$MY_PWD
+    local M=$(findmakefile)
+    # Remove the path to top as the makefilepath needs to be relative
+    local M=`echo $M|sed 's:'$T'/::'`
+    local MODULES_IN_PATHS=MODULES-IN-$(dirname ${M})
     # Convert "/" to "-".
     MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
     $DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
@@ -1165,7 +1168,7 @@
     Darwin)
         function sgrep()
         {
-            find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl)' \
+            find -E . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.(c|h|cc|cpp|S|java|xml|sh|mk|aidl|vts)' \
                 -exec grep --color -n "$@" {} +
         }
 
@@ -1173,7 +1176,7 @@
     *)
         function sgrep()
         {
-            find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\)' \
+            find . -name .repo -prune -o -name .git -prune -o  -type f -iregex '.*\.\(c\|h\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
                 -exec grep --color -n "$@" {} +
         }
         ;;
diff --git a/target/board/generic/BoardConfig.mk b/target/board/generic/BoardConfig.mk
index 4e5504e..325b0ce 100644
--- a/target/board/generic/BoardConfig.mk
+++ b/target/board/generic/BoardConfig.mk
@@ -68,7 +68,7 @@
 VSYNC_EVENT_PHASE_OFFSET_NS := 0
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1610612736
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192  # 1.75 GB
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/board/generic/sepolicy/bootanim.te b/target/board/generic/sepolicy/bootanim.te
index d6506e1..b4b1eef 100644
--- a/target/board/generic/sepolicy/bootanim.te
+++ b/target/board/generic/sepolicy/bootanim.te
@@ -1,2 +1,4 @@
 allow bootanim self:process execmem;
 allow bootanim ashmem_device:chr_file execute;
+
+set_prop(bootanim, qemu_prop)
diff --git a/target/board/generic/sepolicy/file_contexts b/target/board/generic/sepolicy/file_contexts
index e704a8e..e8d32f7 100644
--- a/target/board/generic/sepolicy/file_contexts
+++ b/target/board/generic/sepolicy/file_contexts
@@ -1,6 +1,13 @@
+# goldfish
 /dev/block/mtdblock0         u:object_r:system_block_device:s0
 /dev/block/mtdblock1         u:object_r:userdata_block_device:s0
 /dev/block/mtdblock2         u:object_r:cache_block_device:s0
+
+# ranchu
+/dev/block/vda               u:object_r:system_block_device:s0
+/dev/block/vdb               u:object_r:cache_block_device:s0
+/dev/block/vdc               u:object_r:userdata_block_device:s0
+
 /dev/goldfish_pipe           u:object_r:qemu_device:s0
 /dev/qemu_.*                 u:object_r:qemu_device:s0
 /dev/socket/qemud            u:object_r:qemud_socket:s0
diff --git a/target/board/generic/sepolicy/surfaceflinger.te b/target/board/generic/sepolicy/surfaceflinger.te
index 4c35469..e03d07e 100644
--- a/target/board/generic/sepolicy/surfaceflinger.te
+++ b/target/board/generic/sepolicy/surfaceflinger.te
@@ -1,2 +1,4 @@
 allow surfaceflinger self:process execmem;
 allow surfaceflinger ashmem_device:chr_file execute;
+
+set_prop(surfaceflinger, qemu_prop)
diff --git a/target/board/generic/sepolicy/zygote.te b/target/board/generic/sepolicy/zygote.te
new file mode 100644
index 0000000..a90f02b
--- /dev/null
+++ b/target/board/generic/sepolicy/zygote.te
@@ -0,0 +1 @@
+set_prop(zygote, qemu_prop)
diff --git a/target/board/generic_arm64/BoardConfig.mk b/target/board/generic_arm64/BoardConfig.mk
index b757da1..02d0a6f 100644
--- a/target/board/generic_arm64/BoardConfig.mk
+++ b/target/board/generic_arm64/BoardConfig.mk
@@ -76,7 +76,7 @@
 USE_OPENGL_RENDERER := true
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1610612736
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192  # 1.75 GB
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/board/generic_mips/BoardConfig.mk b/target/board/generic_mips/BoardConfig.mk
index 76a2ef4..1152105 100644
--- a/target/board/generic_mips/BoardConfig.mk
+++ b/target/board/generic_mips/BoardConfig.mk
@@ -53,7 +53,7 @@
 USE_OPENGL_RENDERER := true
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1342177280
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192  # 1.75 GB
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 734003200
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/board/generic_mips64/BoardConfig.mk b/target/board/generic_mips64/BoardConfig.mk
index 8e8a68b..ed9c9b3 100644
--- a/target/board/generic_mips64/BoardConfig.mk
+++ b/target/board/generic_mips64/BoardConfig.mk
@@ -31,7 +31,10 @@
 TARGET_2ND_ARCH := mips
 ifeq (,$(TARGET_2ND_ARCH_VARIANT))
 ifeq ($(TARGET_ARCH_VARIANT),mips64r6)
-TARGET_2ND_ARCH_VARIANT :=  mips32r6
+# Imgtec builds use 32r6 arch variant with Imgtec-maintained prebuilts/ndk library:
+# TARGET_2ND_ARCH_VARIANT := mips32r6
+# Aosp builds lack full set of mips32r6 NDK prebuilts, so use 32r2 abi:
+TARGET_2ND_ARCH_VARIANT :=  mips32r2-fp
 else
 TARGET_2ND_ARCH_VARIANT :=  mips32r2-fp
 endif
@@ -65,7 +68,7 @@
 USE_OPENGL_RENDERER := true
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1342177280  # 1.25 GB swag, 20% more than before
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192  # 1.75 GB
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 1610612736  # 1.5 GB, lots of space for running tests
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/board/generic_x86/BoardConfig.mk b/target/board/generic_x86/BoardConfig.mk
index b54f6f0..50ecb98 100644
--- a/target/board/generic_x86/BoardConfig.mk
+++ b/target/board/generic_x86/BoardConfig.mk
@@ -32,7 +32,7 @@
 USE_OPENGL_RENDERER := true
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1342177280  # 1.25 GB
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1610612736
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/board/generic_x86_64/BoardConfig.mk b/target/board/generic_x86_64/BoardConfig.mk
index 0946243..6958ba5 100755
--- a/target/board/generic_x86_64/BoardConfig.mk
+++ b/target/board/generic_x86_64/BoardConfig.mk
@@ -38,7 +38,7 @@
 USE_OPENGL_RENDERER := true
 
 TARGET_USERIMAGES_USE_EXT4 := true
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1342177280  # 1.25 GB
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192  # 1.75 GB
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800
 BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
 BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
diff --git a/target/product/aosp_arm64.mk b/target/product/aosp_arm64.mk
index 6232295..98afe5f 100644
--- a/target/product/aosp_arm64.mk
+++ b/target/product/aosp_arm64.mk
@@ -21,8 +21,6 @@
 
 # This is for enabling ethernet support for ranchu.
 # Consider removing this after RIL support is provided in ranchu.
-# Having this permission file on the target requires additional
-# dhcpcd_eth0 service defined in the init.ranchu.rc.
 PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
diff --git a/target/product/aosp_mips64.mk b/target/product/aosp_mips64.mk
index d485677..f606858 100644
--- a/target/product/aosp_mips64.mk
+++ b/target/product/aosp_mips64.mk
@@ -21,8 +21,6 @@
 
 # This is for enabling ethernet support for ranchu.
 # Consider removing this after RIL support is provided in ranchu.
-# Having this permission file on the target requires additional
-# dhcpcd_eth0 service defined in the init.ranchu.rc.
 PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
diff --git a/target/product/aosp_x86_64.mk b/target/product/aosp_x86_64.mk
index 6c01e5a..4006346 100644
--- a/target/product/aosp_x86_64.mk
+++ b/target/product/aosp_x86_64.mk
@@ -25,8 +25,6 @@
 
 # This is for enabling ethernet support for ranchu.
 # Consider removing this after RIL support is provided in ranchu.
-# Having this permission file on the target requires additional
-# dhcpcd_eth0 service defined in the init.ranchu.rc.
 PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
diff --git a/target/product/base.mk b/target/product/base.mk
index 4c49e86..4d70664 100644
--- a/target/product/base.mk
+++ b/target/product/base.mk
@@ -26,12 +26,13 @@
     android.test.runner \
     app_process \
     applypatch \
+    audioserver \
     blkid \
     bmgr \
     bugreport \
+    bugreportz \
+    cameraserver \
     content \
-    dhcpcd \
-    dhcpcd-run-hooks \
     dnsmasq \
     dpm \
     framework \
@@ -50,6 +51,7 @@
     libbundlewrapper \
     libcamera_client \
     libcameraservice \
+    libcamera2ndk \
     libdl \
     libdrmclearkeyplugin \
     libeffectproxy \
@@ -94,10 +96,14 @@
     libvisualizer \
     libvorbisidec \
     libmediandk \
+    libvulkan \
     libwifi-service \
     media \
     media_cmd \
+    mediadrmserver \
     mediaserver \
+    mediacodec \
+    mediaextractor \
     monkey \
     mtpd \
     ndc \
diff --git a/target/product/core.mk b/target/product/core.mk
index 065474d..75cf649 100644
--- a/target/product/core.mk
+++ b/target/product/core.mk
@@ -22,6 +22,7 @@
 
 PRODUCT_PACKAGES += \
     BasicDreams \
+    BlockedNumberProvider \
     BookmarkProvider \
     Browser2 \
     Calendar \
@@ -42,10 +43,12 @@
     LatinIME \
     Launcher2 \
     ManagedProvisioning \
+    MtpDocumentsProvider \
     PicoTts \
     PacProcessor \
     libpac \
     PrintSpooler \
+    PrintRecommendationService \
     ProxyHandler \
     QuickSearchBox \
     Settings \
diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk
index 0d31bf5..e008640 100644
--- a/target/product/core_minimal.mk
+++ b/target/product/core_minimal.mk
@@ -24,13 +24,18 @@
 
 PRODUCT_PACKAGES += \
     BackupRestoreConfirmation \
+    CtsShimPrebuilt \
+    CtsShimPrivPrebuilt \
     DownloadProvider \
+    ExtShared \
+    ExtServices \
     HTMLViewer \
     MediaProvider \
     PackageInstaller \
     SettingsProvider \
     Shell \
     StatementService \
+    WallpaperBackup \
     bcc \
     bu \
     com.android.future.usb.accessory \
@@ -120,5 +125,30 @@
 PRODUCT_COPY_FILES += \
     system/core/rootdir/etc/public.libraries.android.txt:system/etc/public.libraries.txt
 
+# Different dexopt types for different package update/install times.
+# On eng builds, make "boot" reasons do pure JIT for faster turnaround.
+ifeq (eng,$(TARGET_BUILD_VARIANT))
+    PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+        pm.dexopt.first-boot=verify-at-runtime \
+        pm.dexopt.boot=verify-at-runtime
+else
+    PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+        pm.dexopt.first-boot=interpret-only \
+        pm.dexopt.boot=verify-profile
+endif
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+    pm.dexopt.install=interpret-only \
+    pm.dexopt.bg-dexopt=speed-profile \
+    pm.dexopt.ab-ota=speed-profile \
+    pm.dexopt.nsys-library=speed \
+    pm.dexopt.shared-apk=speed \
+    pm.dexopt.forced-dexopt=speed \
+    pm.dexopt.core-app=speed
+
+
+# Enable boot.oat filtering of compiled classes to reduce boot.oat size. b/28026683
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\
+    frameworks/base/compiled-classes-phone:system/etc/compiled-classes)
+
 $(call inherit-product, $(SRC_TARGET_DIR)/product/runtime_libart.mk)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk)
diff --git a/target/product/core_tiny.mk b/target/product/core_tiny.mk
index 2758851..ea70454 100644
--- a/target/product/core_tiny.mk
+++ b/target/product/core_tiny.mk
@@ -37,9 +37,14 @@
 
 PRODUCT_PACKAGES += \
     BackupRestoreConfirmation \
+    CtsShimPrebuilt \
+    CtsShimPrivPrebuilt \
     DefaultContainerService \
+    ExtShared \
+    ExtServices \
     SettingsProvider \
     Shell \
+    WallpaperBackup \
     bcc \
     bu \
     com.android.location.provider \
@@ -108,6 +113,26 @@
 PRODUCT_PROPERTY_OVERRIDES += \
     ro.carrier=unknown
 
+# Different dexopt types for different package update/install times.
+# On eng builds, make "boot" reasons do pure JIT for faster turnaround.
+ifeq (eng,$(TARGET_BUILD_VARIANT))
+    PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+        pm.dexopt.first-boot=verify-at-runtime \
+        pm.dexopt.boot=verify-at-runtime
+else
+    PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+        pm.dexopt.first-boot=interpret-only \
+        pm.dexopt.boot=verify-profile
+endif
+PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
+    pm.dexopt.install=interpret-only \
+    pm.dexopt.bg-dexopt=speed-profile \
+    pm.dexopt.ab-ota=speed-profile \
+    pm.dexopt.nsys-library=speed \
+    pm.dexopt.shared-apk=speed \
+    pm.dexopt.forced-dexopt=speed \
+    pm.dexopt.core-app=speed
+
 $(call inherit-product, $(SRC_TARGET_DIR)/product/runtime_libart.mk)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk)
 $(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk)
diff --git a/target/product/embedded.mk b/target/product/embedded.mk
index 71456dc..5faf24f 100644
--- a/target/product/embedded.mk
+++ b/target/product/embedded.mk
@@ -23,6 +23,7 @@
     atrace \
     bootanimation \
     bootstat \
+    cmd \
     debuggerd \
     dumpstate \
     dumpsys \
@@ -31,6 +32,7 @@
     grep \
     gzip \
     healthd \
+    hwservicemanager \
     init \
     init.environ.rc \
     init.rc \
diff --git a/target/product/emulator.mk b/target/product/emulator.mk
index acc7a98..b08a28a 100644
--- a/target/product/emulator.mk
+++ b/target/product/emulator.mk
@@ -39,8 +39,11 @@
     qemud \
     camera.goldfish \
     camera.goldfish.jpeg \
+    camera.ranchu \
+    camera.ranchu.jpeg \
     lights.goldfish \
     gps.goldfish \
+    gps.ranchu \
     fingerprint.goldfish \
     sensors.goldfish \
     audio.primary.goldfish \
@@ -51,11 +54,15 @@
     sensors.ranchu
 
 PRODUCT_COPY_FILES += \
-    frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml \
     device/generic/goldfish/fstab.goldfish:root/fstab.goldfish \
     device/generic/goldfish/init.goldfish.rc:root/init.goldfish.rc \
     device/generic/goldfish/init.goldfish.sh:system/etc/init.goldfish.sh \
     device/generic/goldfish/ueventd.goldfish.rc:root/ueventd.goldfish.rc \
     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/ueventd.ranchu.rc:root/ueventd.ranchu.rc \
+    frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml
+
+PRODUCT_PACKAGE_OVERLAYS := device/generic/goldfish/overlay
+
+PRODUCT_CHARACTERISTICS := emulator
diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk
index f6ccd2a..5c48358 100644
--- a/target/product/generic_no_telephony.mk
+++ b/target/product/generic_no_telephony.mk
@@ -27,6 +27,7 @@
     OneTimeInitializer \
     Provision \
     SystemUI \
+    EasterEgg \
     WallpaperCropper
 
 PRODUCT_PACKAGES += \
diff --git a/target/product/languages_full.mk b/target/product/languages_full.mk
index 9d80b0e..98d8c3c 100644
--- a/target/product/languages_full.mk
+++ b/target/product/languages_full.mk
@@ -21,4 +21,4 @@
 
 # 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 rm_CH 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 hi_IN 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
+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
diff --git a/target/product/runtime_libart.mk b/target/product/runtime_libart.mk
index 85c5b1e..5fd4d7e 100644
--- a/target/product/runtime_libart.mk
+++ b/target/product/runtime_libart.mk
@@ -57,3 +57,6 @@
     dalvik.vm.dex2oat-Xms=64m \
     dalvik.vm.dex2oat-Xmx=512m \
     ro.dalvik.vm.native.bridge=0 \
+    dalvik.vm.usejit=true \
+    dalvik.vm.usejitprofiles=true \
+    dalvik.vm.appimageformat=lz4
diff --git a/target/product/sdk_base.mk b/target/product/sdk_base.mk
index 73c2524..fa257ae 100644
--- a/target/product/sdk_base.mk
+++ b/target/product/sdk_base.mk
@@ -21,7 +21,6 @@
 	CubeLiveWallpapers \
 	CustomLocale \
 	Development \
-	DevelopmentSettings \
 	Dialer \
 	EmulatorSmokeTests \
 	Fallback \
@@ -45,6 +44,7 @@
 	SoftKeyboard \
 	sqlite3 \
 	SystemUI \
+	EasterEgg \
 	WidgetPreview
 
 # Define the host tools and libs that are parts of the SDK.
@@ -61,8 +61,10 @@
 
 PRODUCT_COPY_FILES := \
 	device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \
+	device/sample/etc/old-apns-conf.xml:system/etc/old-apns-conf.xml \
 	frameworks/base/data/sounds/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
 	frameworks/base/data/sounds/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
+	frameworks/base/data/sounds/effects/VideoStop.ogg:system/media/audio/ui/VideoStop.ogg \
 	device/generic/goldfish/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \
 	device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \
 	frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \
@@ -71,6 +73,7 @@
 	device/generic/goldfish/camera/media_codecs.xml:system/etc/media_codecs.xml \
 	frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \
 	frameworks/native/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml \
+	frameworks/native/data/etc/android.hardware.fingerprint.xml:system/etc/permissions/android.hardware.fingerprint.xml \
 	frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf \
 	hardware/libhardware_legacy/audio/audio_policy.conf:system/etc/audio_policy.conf
 
diff --git a/target/product/sdk_phone_arm64.mk b/target/product/sdk_phone_arm64.mk
index 1d13b9e..a689475 100644
--- a/target/product/sdk_phone_arm64.mk
+++ b/target/product/sdk_phone_arm64.mk
@@ -23,6 +23,12 @@
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_arm64/device.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_arm64
diff --git a/target/product/sdk_phone_armv7.mk b/target/product/sdk_phone_armv7.mk
index a0fa049..ebdd0e7 100644
--- a/target/product/sdk_phone_armv7.mk
+++ b/target/product/sdk_phone_armv7.mk
@@ -16,6 +16,12 @@
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_armv7
diff --git a/target/product/sdk_phone_mips.mk b/target/product/sdk_phone_mips.mk
index d7217a0..1cc2fe4 100644
--- a/target/product/sdk_phone_mips.mk
+++ b/target/product/sdk_phone_mips.mk
@@ -21,6 +21,12 @@
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_mips
diff --git a/target/product/sdk_phone_mips64.mk b/target/product/sdk_phone_mips64.mk
index 8ddcb58..e45d71b 100644
--- a/target/product/sdk_phone_mips64.mk
+++ b/target/product/sdk_phone_mips64.mk
@@ -22,6 +22,12 @@
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_mips64
diff --git a/target/product/sdk_phone_x86.mk b/target/product/sdk_phone_x86.mk
index a58d26f..01c2e83 100644
--- a/target/product/sdk_phone_x86.mk
+++ b/target/product/sdk_phone_x86.mk
@@ -21,6 +21,12 @@
 
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_x86
diff --git a/target/product/sdk_phone_x86_64.mk b/target/product/sdk_phone_x86_64.mk
index c39b274..c3bc5e9 100644
--- a/target/product/sdk_phone_x86_64.mk
+++ b/target/product/sdk_phone_x86_64.mk
@@ -22,6 +22,12 @@
 $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_base.mk)
 
+# AOSP emulator images build the AOSP messaging app.
+# Google API images override with the Google API app.
+# See vendor/google/products/sdk_google_phone_*.mk
+PRODUCT_PACKAGES += \
+    messaging
+
 # Overrides
 PRODUCT_BRAND := Android
 PRODUCT_NAME := sdk_phone_x86_64
diff --git a/target/product/telephony.mk b/target/product/telephony.mk
index 919d024..e840ba1 100644
--- a/target/product/telephony.mk
+++ b/target/product/telephony.mk
@@ -21,6 +21,8 @@
     CarrierConfig \
     Dialer \
     CallLogBackup \
+    CellBroadcastReceiver \
+    EmergencyInfo \
     rild
 
 PRODUCT_COPY_FILES := \
diff --git a/tools/check_link_type.py b/tools/check_link_type.py
new file mode 100755
index 0000000..40754ad
--- /dev/null
+++ b/tools/check_link_type.py
@@ -0,0 +1,80 @@
+#!/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.
+
+"""Utility to verify modules link against acceptable module types"""
+
+from __future__ import print_function
+import argparse
+import os
+import sys
+
+WARNING_MSG = ('\033[1m%(makefile)s: \033[35mwarning:\033[0m\033[1m '
+    '%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
+    '\033[0m')
+ERROR_MSG = ('\033[1m%(makefile)s: \033[31merror:\033[0m\033[1m '
+    '%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
+    '\033[0m')
+
+def parse_args():
+    """Parse commandline arguments."""
+    parser = argparse.ArgumentParser(description='Check link types')
+    parser.add_argument('--makefile', help='Makefile defining module')
+    parser.add_argument('--module', help='The module being checked')
+    parser.add_argument('--type', help='The link type of module')
+    parser.add_argument('--allowed', help='Allow deps to use these types',
+                        action='append', default=[], metavar='TYPE')
+    parser.add_argument('--warn', help='Warn if deps use these types',
+                        action='append', default=[], metavar='TYPE')
+    parser.add_argument('deps', help='The dependencies to check',
+                        metavar='DEP', nargs='*')
+    return parser.parse_args()
+
+def print_msg(msg, args, dep_name, dep_type):
+    """Print a warning or error message"""
+    print(msg % {
+          "makefile": args.makefile,
+          "module": args.module,
+          "type": args.type,
+          "dep_name": dep_name,
+          "dep_type": dep_type}, file=sys.stderr)
+
+def main():
+    """Program entry point."""
+    args = parse_args()
+
+    failed = False
+    for dep in args.deps:
+        dep_name = os.path.basename(os.path.dirname(dep))
+        if dep_name.endswith('_intermediates'):
+            dep_name = dep_name[:len(dep_name)-len('_intermediates')]
+
+        with open(dep, 'r') as dep_file:
+            dep_types = dep_file.read().strip().split(' ')
+
+        for dep_type in dep_types:
+            if dep_type in args.allowed:
+                continue
+            if dep_type in args.warn:
+                print_msg(WARNING_MSG, args, dep_name, dep_type)
+            else:
+                print_msg(ERROR_MSG, args, dep_name, dep_type)
+                failed = True
+
+    if failed:
+        sys.exit(1)
+
+if __name__ == '__main__':
+    main()
diff --git a/tools/diff_package_overlays.py b/tools/diff_package_overlays.py
deleted file mode 100755
index 0e2c773..0000000
--- a/tools/diff_package_overlays.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (C) 2012 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""
-Prints to stdout the package names that have overlay changes between
-current_overlays.txt and previous_overlays.txt.
-
-Usage: diff_package_overlays.py <current_packages.txt> <current_overlays.txt> <previous_overlays.txt>
-current_packages.txt contains all package names separated by space in the current build.
-This script modfies current_packages.txt if necessary: if there is a package in
-previous_overlays.txt but absent from current_packages.txt, we copy that line
-from previous_overlays.txt over to current_packages.txt. Usually that means we
-just don't care that package in the current build (for example we are switching
-from a full build to a partial build with mm/mmm), and we should carry on the
-previous overlay config so current_overlays.txt always reflects the current
-status of the entire tree.
-
-Format of current_overlays.txt and previous_overlays.txt:
-  <package_name> <resource_overlay> [resource_overlay ...]
-  <package_name> <resource_overlay> [resource_overlay ...]
-  ...
-"""
-
-import sys
-
-def main(argv):
-  if len(argv) != 4:
-    print >> sys.stderr, __doc__
-    sys.exit(1)
-
-  f = open(argv[1])
-  all_packages = set(f.read().split())
-  f.close()
-
-  def load_overlay_config(filename):
-    f = open(filename)
-    result = {}
-    for line in f:
-      line = line.strip()
-      if not line or line.startswith("#"):
-        continue
-      words = line.split()
-      result[words[0]] = " ".join(words[1:])
-    f.close()
-    return result
-
-  current_overlays = load_overlay_config(argv[2])
-  previous_overlays = load_overlay_config(argv[3])
-
-  result = []
-  carryon = []
-  for p in current_overlays:
-    if p not in previous_overlays:
-      result.append(p)
-    elif current_overlays[p] != previous_overlays[p]:
-      result.append(p)
-  for p in previous_overlays:
-    if p not in current_overlays:
-      if p in all_packages:
-        # overlay changed
-        result.append(p)
-      else:
-        # we don't build p in the current build.
-        carryon.append(p)
-
-  # Add carryon to the current overlay config file.
-  if carryon:
-    f = open(argv[2], "a")
-    for p in carryon:
-      f.write(p + " " + previous_overlays[p] + "\n")
-    f.close()
-
-  # Print out the package names that have overlay change.
-  for r in result:
-    print r
-
-if __name__ == "__main__":
-  main(sys.argv)
diff --git a/tools/droiddoc/templates-ndk/assets/css/default.css b/tools/droiddoc/templates-ndk/assets/css/default.css
index f411d93..036c0eb 100644
--- a/tools/droiddoc/templates-ndk/assets/css/default.css
+++ b/tools/droiddoc/templates-ndk/assets/css/default.css
@@ -4217,7 +4217,7 @@
 }
 
 /* offset the <a name=""> tags to account for sticky nav */
-body.reference a[name] {
+body.reference a[name]:empty {
   visibility: hidden;
   display: block;
   position: relative;
diff --git a/tools/droiddoc/templates-ndk/sdkpage.cs b/tools/droiddoc/templates-ndk/sdkpage.cs
index 817ac47..ffad465 100644
--- a/tools/droiddoc/templates-ndk/sdkpage.cs
+++ b/tools/droiddoc/templates-ndk/sdkpage.cs
@@ -80,13 +80,13 @@
       <th>Platform</th>
       <th>Package</th>
       <th style="white-space:nowrap">Size (Bytes)</th>
-      <th>MD5 Checksum</th>
+      <th>SHA1 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>
+     href="http://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>
@@ -94,7 +94,7 @@
  <!-- <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>
+     href="http://dl.google.com/android/repository/<?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>
@@ -103,7 +103,7 @@
     <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>
+     href="http://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>
@@ -111,7 +111,7 @@
  <!--  <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>
+     href="http://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>
@@ -120,7 +120,7 @@
     <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>
+     href="http://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>
@@ -128,7 +128,7 @@
  <!--  <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>
+     href="http://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>
@@ -136,7 +136,7 @@
     <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>
+     href="http://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>
@@ -144,24 +144,15 @@
  <!--  <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>
+     href="http://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>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>
+     href="http://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>
@@ -170,7 +161,7 @@
     <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>
+     href="http://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>
@@ -178,7 +169,7 @@
   <!--  <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>
+     href="http://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>
diff --git a/tools/droiddoc/templates-sdk-dev/assets/css/default.css b/tools/droiddoc/templates-sdk-dev/assets/css/default.css
index cc4dce7..11bbacf 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/css/default.css
+++ b/tools/droiddoc/templates-sdk-dev/assets/css/default.css
@@ -17,18 +17,33 @@
   height: 100%;
   margin: 0;
   padding: 0;
-  background-color:#F9F9F9;
+  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: #222;
-  font: 14px/19px Roboto, sans-serif;
+  color: #515151;
+  color: rgba(0, 0, 0, .68);
+  font: 14px/24px Roboto, sans-serif;
   font-weight: 400;
   letter-spacing:.1;
-  padding:0 10px; }
+  padding: 0 20px;
+}
+
+@media (max-width: 719px) {
+  html {
+    /* Disable accidental horizontal overflow. */
+    overflow-x: hidden;
+  }
+
+  body {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+}
 
 #page-container {
   width: 940px;
@@ -77,20 +92,6 @@
   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;
 }
@@ -98,44 +99,266 @@
 #devdoc-nav.fixed {
   position: fixed;
   margin:0;
-  top: 65px; /* sticky-header height + 20px gutter */
+  top: 84px; /* sticky-header height + 20px gutter */
 }
 
-#devdoc-nav span.small {
-  font-size:12px;
-  font-weight:normal;
+.dac-devdoc-toggle {
+  cursor: pointer;
+  padding: 8px 0;
+}
+
+.scroll-pane {
+  /* Match height of fixed parent. */
+  height: 100%;
 }
 
 #content {
   width: 760px;
   float: left; }
 
-a:hover,
-acronym:hover {
-  color: #7aa1b0 !important; }
 
-a:focus,
-a:active {
-  color: #33b5e5 !important; }
+/***** 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;
+  font-weight: 300;
+  margin: 0;
+  padding: 24px 0 12px;
+}
+h1.short {
+  padding-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: 0;
+  padding: 12px 0 16px;
+}
+h3 {
+  font-size: 24px;
+  line-height: 32px;
+  font-weight: 400;
+  margin: 0;
+  padding: 8px 0 12px;
+}
+h4 {
+  font-size: 18px;
+  line-height: 24px;
+  margin: 0;
+  padding: 4px 0 8px;
+  font-weight: 500;
+}
+h5, h6 {
+  font-size: 16px;
+  line-height: 24px;
+  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: 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;
+}
+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, Monaco, Courier, monospace;
+  -webkit-font-smoothing: subpixel-antialiased;
+  -moz-osx-font-smoothing: auto;
+}
+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;
 }
 
-img {
-  border: none; }
 #jd-content img {
   margin-bottom:15px;
 }
 
-ul {
-  margin: 0;
-  padding: 0; }
-
-strong {
-  font-weight: 500; }
-
 em {
   font-style: italic; }
 
@@ -155,6 +378,7 @@
 
 /* disclosures mixin */
 /* content layout */
+/* This grid is deprecated in favor of .cols and .col-X */
 .layout-content-row {
   display: inline-block;
   margin-bottom: 10px; }
@@ -168,7 +392,7 @@
     margin-left: 0; }
   .layout-content-col h3,
   .layout-content-col h4 {
-    margin-top:0; }
+    padding-top:0; }
 
 .layout-content-col.span-1 {
   width: 40px; }
@@ -257,161 +481,6 @@
 .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 {
-      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: 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 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:#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; }
-
-#nav.samples-nav li li li {
-  font-size:13px;
-}
-#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;
@@ -423,25 +492,19 @@
 
 /* content header */
 .content-header {
-  height: 30px;
-  margin:36px 0 23px;  /* same as h1 */
-  padding:0 0 10px;}  /* same as h1 */
+  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-header h1 {
-  margin:0;
-  padding:0;
-  width: 700px;
-}
-.content-header > div:first-child {
-  height:1px; /* set fixed height for the header div to ensure the
-                  next/prev links align with toc on training classes */
-}
-
 .content-footer {
-  border-top: 1px solid #ccc;
   margin-top: 10px;
   padding-top:10px;
   width:100%; }
@@ -453,7 +516,7 @@
   margin-right:0;
 }
 .content-footer.wrap {
-  width:940px;
+  max-width:940px;
 }
 .content-footer .plus-container {
   margin:5px 0 0;
@@ -467,19 +530,17 @@
 }
 
 .content-header .paging-links {
-  margin-top:-25px;
+  position: absolute;
+  right: 0;
+  top: 8px;
+  width: 220px;
 }
 .paging-links {
   position: relative;
-  height:30px; }
-  .paging-links a {
-    position: absolute; }
+  min-height:30px; }
   .paging-links a,
   .training-nav-top a {
-    color: #555555;
-    text-decoration: none;
-    text-transform: uppercase; }
-    .paging-links .prev-page-link:before,
+    text-decoration: none; }
     .training-nav-top .prev-page-link:before,
     a.back-link:before {
       content: '';
@@ -488,18 +549,9 @@
       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: 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%;
@@ -512,25 +564,30 @@
     .next-page-link.inline:after {
       content: none; }
 
-  .content-footer .paging-links .next-page-link {
+  .content-footer {
     left:0;
   }
 
   .training-nav-top a {
+    border-bottom:0;
+    box-sizing: border-box;
+    color: inherit;
     display:block;
     float:left;
-    width:122px;
-    height:28px;
-    padding: 8px;
-    line-height:28px;
+    padding:10px 0;
+    line-height:30px;
     text-align:center;
-    border:1px solid #DADADA;
-    border-bottom:0;
+    width: 50%;
+  }
+
+  .training-nav-top a.prev-page-link {
+    padding-left: 15px;
+    text-align: left;
   }
 
   .training-nav-top a.next-page-link {
-    border-left:0;
-    width:123px;
+    padding-right: 15px;
+    text-align: right;
   }
 
   .paging-links a.disabled,
@@ -548,40 +605,54 @@
 
   .training-nav-top a.start-class-link,
   .training-nav-top a.start-course-link {
-    width:262px;
-  }
-
-  .paging-links a.start-class-link {
     width:100%;
   }
 
   /* list of classes on course landing page */
   ol.class-list {
-    list-style:none;
-    margin-left:0;
+    counter-reset: class;
+    list-style: none;
+    margin: 60px 0 0;
   }
   ol.class-list>li {
-    margin:0 0 15px;
-    padding:5px 0 0;
-    overflow:hidden;
-    border-top:1px solid #ccc;
+    box-shadow: 0px 2px 5px 0 rgba(0, 0, 0, 0.26);
+    margin: 0 0 20px;
+    overflow: hidden;
   }
-  ol.class-list li a.title {
-    font-size:16px;
-    margin:0;
-    clear:left;
-    display:block;
-    height:32px;
-    padding:0 4px;
+  ol.class-list .title {
+    background: #00bcd4;
+    color: #fff;
+    display: block;
+    font-size: 20px;
+    font-weight: 500;
+    height: 32px;
+    padding: 52px 16px 12px;
+    position: relative;
   }
-  ol.class-list li a.title h2 {
-    color:inherit;
-    margin:0 0 10px;
+  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;
+    padding:0 0 10px;
     display:block;
     float:left;
     width:675px;
   }
-  ol.class-list li a.title span {
+  ol.class-list .title span {
     display:none;
     float:left;
     font-size:18px;
@@ -590,40 +661,71 @@
     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 {
+  ol.class-list .description {
+    box-sizing: border-box;
     float:left;
     display:block;
-    width:250px;
     margin:0;
+    padding: 16px 10px 16px 16px;
+    width: 50%;
   }
-  ol.class-list li p.description.article {
+  ol.class-list .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;
+    box-sizing: border-box;
+    float: left;
+    list-style: none;
+    margin: 0;
+    padding: 16px 16px 16px 10px;
+    width: 50%;
   }
-  ol.class-list div.lessons li {
-    margin:0 0 6px;
-    line-height:16px;
+  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;
+    }
   }
 
 
@@ -641,7 +743,7 @@
 }
 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;
 }
@@ -669,7 +771,7 @@
 }
 ul#title-tabs li a:hover,
 ul#title-tabs li a:active {
-  color:#93C !important;
+  color:#039BE5 !important;
 }
 
 
@@ -722,7 +824,7 @@
     animation-timing-function: ease-out; }
 
 .design ol h4 {
-  margin-bottom:0;
+  padding-bottom:0;
 }
 .design ol {
   counter-reset: item; }
@@ -798,46 +900,6 @@
   .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
@@ -1071,233 +1133,6 @@
 
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/***** 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: 34px;
-    margin: 36px 0 27px;
-    padding:0 0 10px;
-    font-weight:300;
-}
-h1, h2 {
-    line-height: 30px;
-}
-h1.short {
-  margin-right:320px;
-}
-h1.short {
-  margin-right:320px;
-}
-h1.super {
-    font-size: 37px;
-}
-h2 {
-    color:#333;
-    font-size: 26px;
-    margin: 32px 0 20px;
-    padding:0;
-    font-weight:300;
-}
-h3 {
-    color:#333;
-    font-size: 21px;
-    font-weight:400;
-    margin:21px 0 14px 0;
-}
-h3, h4 {
-    line-height: 21px;
-}
-h4 {
-  font-size: 18px;
-  margin: 12px 0;
-  font-weight:500;
-}
-h5 {
-  font-size: 14px;
-}
-h5, h6 {
-  margin: 5px 0;
-}
-h6 {
-  font-size: 12px;
-}
-hr { /* applied to the bottom of h2 elements */
-  height: 1px;
-  margin: 3px 0 12px;
-  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,
-dd pre,
-dd ul,
-dd ol,
-dd dl {
-  margin-top:10px;
-}
-li p,
-li pre,
-li ul,
-li ol,
-li dl {
-  margin-top:5px;
-  margin-bottom:5px;
-}
-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/1.5 monospace;
-}
-code {
-    font-weight:bold;
-    font: 13px/14px monospace;
-}
-
-legend {
-    display: none;
-}
-a:link, a:visited, .link-color {
-  color: #258aaf;
-  text-decoration: none;
-}
-a:focus, a:hover, a:active {
-  color: #33B5E5;
-  text-decoration: none;
-}
-a.white {
-  color: #fff;
-  text-decoration:underline;
-}
-a.white:hover, a.white:active {
-  color: #ccc !important;
-}
-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
 */
@@ -1439,7 +1274,7 @@
 
   /* 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 */
@@ -1468,430 +1303,23 @@
 }
 
 /* =============================================================================
-   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 {
-  margin: 0;
-  padding: 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;
-}
-.about a.selected {
-    color: #9933CC;
-}
-.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 {
+.training-nav-top {
+  border:1px solid #e5e5e5;
+  border-width: 1px 1px 0;
+  bottom: -56px;
+  box-sizing: border-box;
   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;
+  right: 0;
+  width: 280px;
 }
 
-.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-top {
-  position:relative;
-  top:73px;
-}
-
-.training-nav-bottom {
   padding:0 0 20px;
 }
 
@@ -1904,33 +1332,38 @@
 }
 
 #tb-wrapper {
-  margin:51px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */
+  margin:56px 0 0 20px; /* negative top-margin to counter the content-header bottom margin */
 }
 
 #tb,
 #qv {
-  font-size:13px;
-  line-height:18px;
-  width:238px;
-  border:1px solid #ccc;
-  float:right;
+  border: 1px solid #e5e5e5;
+  box-sizing: border-box;
+  float: right;
+  line-height: 16px;
+  padding: 5px 0;
+  width: 240px;
 }
 
 #tb {
-  width:278px;
+  width:280px;
 }
 
 #tb h2,
 #qv h2 {
-  margin:10px 15px;
-  padding:0;
-  text-transform:uppercase;
-  border-bottom:1px solid gainsboro;
+  border-top: 1px solid #e5e5e5;
+  color: inherit;
+  font-size: 16px;
+  line-height: 24px;
+  margin: 15px 0 4px;
+  padding: 10px 15px 0;
 }
 
-#tb *,
-#qv * {
-  font-size:inherit;
+#tb h2:first-child,
+#qv h2:first-child {
+  border-top: 0;
+  padding-top: 0;
+  margin-top: 10px;
 }
 
 #tb .download-box,
@@ -1942,7 +1375,28 @@
 #qv .download-box .filename {
   font-size:11px;
   margin:4px 4px 10px;
-  color:#666;
+}
+
+@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;
+  }
 }
 
 
@@ -1959,9 +1413,10 @@
   width:226px;
   font-size:13px;
   line-height:18px;
-  border-left:4px solid #99CC00;
+  border-left:3px solid #96ca7c;
+  border-left-color: rgba(106, 179, 68, .7); /* #6ab344 * 70% */
   float:right;
-  padding:0 0 0 10px;
+  padding:0 0 0 20px;
   margin:0 0 1em 20px;
 }
 
@@ -1970,7 +1425,7 @@
 .sidebox h4,
 .sidebox h5 {
   font-weight:bold;
-  margin:0 0 10px;
+  padding: 0 0 10px;
   line-height: 16px;
 }
 
@@ -1985,7 +1440,15 @@
 #tb ol,
 #tb ul,
 #qv ul {
-  margin:0 15px 10px 35px;
+  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 {
@@ -2005,11 +1468,7 @@
 #qv ul ul,
 .sidebox ol ol,
 .sidebox ul ul {
-  margin-bottom:0;
-}
-
-#qv ol ol {
-  margin:3px 0 3px 15px;
+  margin: 8px 0;
 }
 
 .sidebox p,
@@ -2025,7 +1484,7 @@
 
 
 h3.rel-resources {
-margin:1.25em auto;
+  padding:1.25em auto;
 }
 
 /* --------------------------------------------------------------------------
@@ -2145,7 +1604,6 @@
     border-radius: 2px;
     margin: 10px 0;
     padding: 20px;
-  color: #666;
     position: relative;
   background: #f9f9f9;
 }
@@ -2202,7 +1660,7 @@
 
 div.sdk-terms h3,
 div.sdk-terms h2 {
-  margin:0;
+  padding: 0;
 }
 
 div#sdk-terms-form {
@@ -2225,6 +1683,46 @@
   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; }
@@ -2276,8 +1774,7 @@
   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;
 }
@@ -2288,8 +1785,7 @@
 #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; }
@@ -2297,10 +1793,7 @@
   #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;
@@ -2330,77 +1823,6 @@
   cursor:pointer;
 }
 
-
-/* nav tree */
-#side-nav, #swapper,
-#nav-tree, #tree-list {
-  overflow:hidden;
-  margin-left:0;
-}
-
-#devdoc-nav {
-  overflow:visible !important; /* To keep the "to top" button visible */
-}
-
-#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;
@@ -2423,7 +1845,7 @@
 }
 #doc-header h1 {
   line-height: 0;
-  margin-bottom: 15px;
+  padding-bottom: 15px;
 }
 #api-info-block {
   float: right;
@@ -2443,7 +1865,7 @@
   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;
@@ -2475,10 +1897,11 @@
   -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;
@@ -2768,34 +2191,7 @@
 }*/
 
 /* --------------------------------------------------------------------------
-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
+Misc and article typography
 */
 
 
@@ -2842,27 +2238,121 @@
 
 p.img-caption {
   margin: -10px 0 20px;
-  font-size:13px;
-  color:#666;
+  font-size: 13px;
 }
 
-div.figure,
-div.figure-right {
-  float:right;
-  clear:right;
-  margin:10px 0 0 0;
-  padding:0 0 0 20px;
+/* 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 */
 }
 
-div.figure-left {
-  float:left;
-  clear:left;
-  margin:10px 0 0 0;
-  padding:0 20px 0 0;
+.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;
@@ -2871,50 +2361,46 @@
 p.table-caption {
   margin: 0 0 4px 0;
   font-size:13px;
-  color:#666;
 }
 
 p.code-caption {
   margin-bottom: 4px;
   font: 12px/1.5 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;
+  padding: 0 0 0 20px;
+  border-left: 3px solid;
+  margin: 16px 0;
 }
 
 p.note, div.note {
-  border-color: #258AAF;
+  border-color: #4eb9ed;
+  border-color: rgba(3, 155, 229, .7); /* #039be5 * 70% */
 }
 
 p.caution, div.caution {
-  border-color: #FF8800;
+  border-color: #ffbc4c;
+  border-color: rgba(255, 160, 0, .7); /* #ffa000 * 70% */
 }
 
 p.warning, div.warning {
-  border-color: #ff4443;
+  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 {
@@ -2925,6 +2411,17 @@
   margin-bottom:0;
 }
 
+.summary-table {
+  background-color:#eceff1;
+  padding:1em;
+  margin-bottom:1.5em;
+}
+
+.summary-table h5 {
+  line-height:1em;
+  font-size:.98em;
+}
+
 body.about blockquote {
   display:block;
   float:right;
@@ -2965,8 +2462,7 @@
 a.notice-developers-video,
 a.notice-developers,
 a.notice-designers-video,
-a.notice-designers,
-a.notice-designers-material {
+a.notice-designers {
   float:right;
   clear:right;
   width:238px;
@@ -2977,15 +2473,13 @@
 a.notice-developers-video.wide,
 a.notice-developers.wide,
 a.notice-designers-video.wide,
-a.notice-designers.wide,
-a.notice-designers-material.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,
-a.notice-designers-material div {
+a.notice-designers div {
   min-height:40px;
   background:url('../images/styles/notice-developers@2x.png') no-repeat 10px 10px;
   background-size:40px 40px;
@@ -3003,42 +2497,34 @@
   background:url('../images/styles/notice-developers-video@2x.png') no-repeat 10px 10px;
   background-size:40px 40px;
 }
-a.notice-designers-material div {
-  background:url('../images/styles/notice-designers-material@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,
-a.notice-designers-material: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,
-a.notice-designers-material h3 {
+a.notice-designers h3 {
   font-size:13px;
   line-height:18px;
   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,
 a.notice-designers-video p,
-a.notice-designers p,
-a.notice-designers-material 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,
-a.notice-designers-material.left {
+a.notice-designers.left {
   margin-left:0;
   float:left;
 }
@@ -3180,7 +2666,7 @@
   z-index:99;
   width:450px;
   position:fixed;
-  margin:50px 0;
+  margin:80px 0;
   padding:4em 4em 3em;
   background:#FFF;
   border:1px solid #999;
@@ -3368,8 +2854,7 @@
 
 .feature-box h4,
 .dialog h4 {
-    margin: 15px 18px 10px;
-    padding:0;
+    padding: 15px 18px 10px;
 }
 
 .feature-box p,
@@ -3446,36 +2931,31 @@
   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%;
+  max-width:300px;
   font-size: 12px;
   line-height:14px;
 }
@@ -3490,12 +2970,17 @@
 }
 
 /* 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 {
@@ -3505,23 +2990,13 @@
   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;
@@ -3531,11 +3006,10 @@
 }
 
 /* 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 */
@@ -3543,11 +3017,6 @@
   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;
@@ -3568,7 +3037,9 @@
 
 .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;
 }
 
 
@@ -3637,13 +3108,9 @@
   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 {
@@ -3653,7 +3120,7 @@
 /* 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;
 }
 
@@ -3676,6 +3143,7 @@
   font-style:italic;
 }
 
+
 /* Inline api level indicator for methods */
 div.api-level {
   font-size:.8em;
@@ -3683,7 +3151,7 @@
   color:#999;
   float:right;
   padding:0 8px 0;
-  margin-top:-30px;
+  margin-top:-35px;
 }
 
 table.jd-tagtable td,
@@ -3695,426 +3163,8 @@
   color:inherit;
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* SEARCH FILTER */
-
-.menu-container {
-  position:relative;
-}
-#search_autocomplete {
-  font-weight:normal;
-}
-
-.search_filtered_wrapper.reference {
-  width: 193px;
-  float: right;
-}
-.search_filtered_wrapper.docs {
-  width:875px;
-  float: left;
-  position:absolute;
-  top:26px;
-  right:66px;
-}
-.suggest-card {
-  position:relative;
-  width:170px;
-  min-height:90px;
-  padding:5px;
-  border: solid 1px #C5C5C5;
-  background: white;
-  top: 15px;
-  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 {
-  position:absolute;
-  z-index:999;
-  min-width:171px; /* +padding and border makes this match input width */
-  min-height:93px; /* add 3px because this has 1 not 4px top border */
-  width:auto;
-  top:41px;
-  margin:0;
-}
-.suggest-card.develop {
-  z-index:997;
-  border-top: solid 4px #F80;
-  float:right;
-}
-.suggest-card.design {
-  z-index:996;
-  border-top: solid 4px #33b5e5;
-  float:right;
-}
-.suggest-card.distribute {
-  z-index:995;
-  border-top: solid 4px #9C0;
-  float:right;
-}
-.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: 0 0 5px;
-  padding: 0;
-}
-.search_filtered .jd-selected {
-  background:#efefef;
-  cursor:pointer;
-}
-.search_filtered .jd-selected,
-.search_filtered .jd-selected a {
-    color:#09C !important;
-}
-
-.no-display {
-  display: none;
-}
-
-.search_filtered li.jd-autocomplete {
-  font-size: 0.81em;
-  border: none;
-  margin: 0 0 2px;
-  padding: 0;
-  line-height:1.5em;
-}
-
-.search_filtered li a {
-  padding:0 5px;
-  color:#222 !important;
-  display:inline-block;
-  line-height:12px;
-}
-
-.search_filtered li.header {
-  font-weight:bold;
-  color:#444;
-  border: none;
-  margin: 8px 0 2px;
-  padding:1px 5px;
-  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;
-}
-
-.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;
-}
-
-
-
-
-
 /************ STICKY NAV BAR ******************/
 
-#header-wrapper {
-  background: #f9f9f9;
-  margin: 0 -10px 0 -10px;
-  padding: 31px 10px 0px 10px;
-  position: relative;
-}
-#header-wrapper #nav-x div.wrap {
-  max-width: 940px;
-  height: 38px;
-}
-#header-wrapper #nav-x ul.nav-x li {
-  margin-right: 31px !important;
-  margin-top: 5px;
-  margin-bottom: 0px;
-  height: 30px;
-}
-#header-wrapper #nav-x > div.wrap ul.nav-x li.active  {
-  color: #669900;
-  border-bottom: 3px solid #669900;
-}
-#header-wrapper #nav-x > div.wrap ul.nav-x li.active a {
-  color: #669900;
-}
-#header-wrapper #nav-x > div.wrap ul.nav-x a {
-  font-size: 14.5px;
-}
-#header-wrapper .developer-console-btn {
-  float: right;
-  background: #fefefe;
-  border-radius: 4px;
-  padding: 8px 14px;
-  box-shadow: 1px 1px 0px #7a7a7a;
-  font-size: 14px;
-  margin-top: -6px;
-  cursor: pointer;
-  color: #464646;
-  margin-right: 20px;
-}
-/* not currently used */
-#header-wrapper .shadow {
-  width: 1034px;
-  height: 4px;
-  position: absolute;
-  left: 50%;
-  margin-left: -517px;
-  bottom: -4px;
-  background-image: url(../images/header-shadow.png);
-}
-
 #context {
   clear: both;
   padding-top: 14px;
@@ -4158,78 +3208,8 @@
   display: none;
 }
 
-/* Sticky Nav overrides */
-.sticky-menu {
-  position: fixed;
-  width: 940px;
-  height: 0px;
-  z-index: 51;
-  top: 12px;
-}
-#sticky-header {
-  display: none;
-  padding: 0 10px;
-  position: fixed;
-  background: #f9f9f9;
-  top: 0px;
-  left: 0px;
-  right: 0px;
-  height: 45px;
-  box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.1);
-  border-bottom: 1px solid #a5c43a;
-  z-index: 50;
-}
-#sticky-header.design {
-  border-bottom: 1px solid #33b5e5;
-}
-#sticky-header.develop {
-  border-bottom: 1px solid #F80;
-}
-#sticky-header.distribute {
-  border-bottom: 1px solid #9C0;
-}
-#sticky-header.about {
-  border-bottom: 1px solid #9933CC;
-}
-#sticky-header > div {
-  overflow: hidden;
-  *zoom: 1;
-  width: 940px;
-  margin: 0 auto;
-  clear: both;
-  padding-top: 9px;
-}
-#sticky-header > div .logo {
-  float: left;
-  width: 26px;
-  height: 25px;
-  background: url(../images/dac_logo.png);
-  background-image: -webkit-image-set(url(../images/dac_logo.png) 1x, url(../images/dac_logo@2x.png) 2x);
-  z-index: 52;
-  position: relative;
-}
-#sticky-header > div .top {
-  float: left;
-  width: 38px;
-  height: 38px;
-  position: relative;
-  background: url(../images/styles/gototop.png);
-  z-index: 52;
-}
-#sticky-header > div .breadcrumb {
-  float: left;
-  padding: 0 0 0 10px;
-  border-left: 1px solid #d2d2d2;
-  line-height: 24px;
-  font-size: 14px;
-  position: relative;
-  top: 0px;
-  z-index: 52;
-}
-
 /* offset the <a name=""> tags to account for sticky nav */
-body.reference a[name],
-div.renderscript a[name] {
+body.reference a[name]:empty {
   visibility: hidden;
   display: block;
   position: relative;
@@ -4237,76 +3217,6 @@
 }
 
 
-}
-
-
-
-
-
-
-
-/*********** PREVIOUSLY dac-styles.css ***************/
-
-
-#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 {
-  float:left;
-}
-
-#header .logo {
-  margin-top: -6px;
-  margin-left: 0px;
-  margin-bottom:0px;
-  width: 160px;
-  padding-right:10px;
-}
-
-
-#header-wrap .logo.landing-logo {
-  width:220px;
-  margin:0;
-  padding:0;
-  margin-bottom:22px;
-}
-#header-wrap .logo.landing-logo img {
-  padding:0 0 0 10px;
-}
-
-.search {
-  height:25px;
-  margin-top: -3px;
-  margin-bottom: 0px;
-}
-
-
-
 /* Quicknav */
 .btn-quicknav {
   width:20px;
@@ -4344,17 +3254,6 @@
   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;
@@ -4440,105 +3339,6 @@
 
 }
 
-/* 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;
@@ -4691,9 +3491,9 @@
   height:12px;
   text-indent:-8000px;
   list-style:none;
-  margin: 0 2px;
+  margin: 0 3px;
   border-radius:6px;
-  background-color:#ccc;
+  background-color:#ddd;
   cursor:pointer;
         -webkit-transition:color .5s ease-in;
         -moz-transition:color .5s ease-in;
@@ -4701,13 +3501,13 @@
         transition:color .5s ease-in;
 }
 .slideshow-container .pagination ul li:hover {
-  background-color:#999;
+  background-color:#bbb;
 }
 .slideshow-container .pagination ul li.active {
-  background-color:#33b5e5;
+  background-color:#6ab344;
 }
 .slideshow-container .pagination ul li.active:hover {
-  background-color:#33b5e5;
+  background-color:#6ab344;
 }
 .slideshow-container ul li {
   display:inline;
@@ -4716,7 +3516,7 @@
 
 
 #landing h1 {
-  margin:17px 0 20px 0 !important;
+  padding:17px 0 20px 0 !important;
 }
 
 a.download-sdk {
@@ -4727,27 +3527,14 @@
     padding-bottom:0px;
 }
 
-#nav-x {
-  padding-top: 13px;
-}
-
-#nav-x .wrap {
-  min-height:32px;
-}
-
-#nav-x .wrap,
 #searchResults.wrap {
     max-width:940px;
-    border-bottom:1px solid #CCC;
+    border-bottom:1px solid #e5e5e5;
 }
 
 #searchResults.wrap #leftSearchControl {
   min-height:700px
 }
-.nav-x {
-    margin-left:0;
-    margin-bottom:0;
-}
 
 
 
@@ -4817,7 +3604,7 @@
 }
 
 .jspDrag {
-  background: #bbb;
+  background: #ccc;
   position: relative;
   top: 0;
   left: 0;
@@ -4925,7 +3712,7 @@
 }
 .slideshow-develop .content-right h2 {
   padding:0;
-  margin-bottom:10px;
+  padding-bottom:10px;
   border:none;
   font-size:24px;
 }
@@ -5018,7 +3805,7 @@
 .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;
@@ -5060,7 +3847,7 @@
   display:none;
   margin: -1px auto 0;
   position: relative;
-  width: 940px;
+  max-width: 940px;
   height: 0px;
 }
 #player-frame {
@@ -5072,6 +3859,22 @@
   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;
+}
 
 
 
@@ -5100,7 +3903,7 @@
   margin-bottom:0;
 }
 .landing-banner h1 {
-  margin-top:16px;
+  padding-top:16px;
   padding-bottom:24px;
 }
 .landing-docs,
@@ -5114,7 +3917,7 @@
   color:#555;
   text-transform:uppercase;
   border-bottom:1px solid #CCC;
-  margin:0 0 20px;
+  padding:0 0 20px;
 }
 .landing-docs a {
   color:#333 !important;
@@ -5126,7 +3929,7 @@
 }
 
 .landing-docs .normal-links a {
-  color:#258aaf !important;
+  color:#039BE5 !important;
 }
 
 .plusone {
@@ -5155,8 +3958,7 @@
   color:#555;
   text-transform:uppercase;
   border-bottom:none;
-  margin:0 0 1em;
-  padding:5px 0 0;
+  padding:5px 0 1em;
 }
 
 
@@ -5233,7 +4035,7 @@
   float: left;
   width: 100%;
   text-align: center;
-  color: #09c !important;
+  color: #039BE5 !important;
 }
 .home-sections ul li a {
   font-weight: bold;
@@ -5250,9 +4052,6 @@
 .home-sections ul li.last {
   margin-right: 0px;
 }
-.fullpage #footer {
-  margin-top: -40px;
-}
 
 /************ DISTRIBUTE PAGES ******************/
 
@@ -5267,8 +4066,7 @@
   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;
 }
 
@@ -5281,1241 +4079,6 @@
   clear: both;
 }
 
-.border-img {
-  border: 1px solid #CCC;
-}
-
-.center-img {
-  margin: auto;
-  text-align: center;
-}
-.center-img img {
-  margin-bottom: 15px;
-}
-
-.figure img, .border-img {
-  margin-bottom: 15px;
-}
-
-/************ RESOURCE CARDS ******************/
-
-/* Resource cards, 12, 13, 16-col */
-
-/* Basic card-styling with shadow */
-.resource-card {
-  border-radius: 1px;
-  box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.12);
-  background: #fefefe;
-}
-
-/* Styling for background image including tinting and section icons in stacks */
-.card-bg {
-  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.2);
-  -webkit-transition: opacity 0.5s;
-  -moz-transition: opacity 0.5s;
-  -o-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;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  overflow: hidden;
-  background: #fefefe;
-  padding: 4px 12px 6px 12px;
-}
-.card-info .section {
-  text-transform: uppercase;
-  color: #898989;
-  font-size: 12px;
-  margin-bottom: 1px;
-}
-.card-info .title {
-  color: #363636;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  padding-bottom: 5px;
-  margin-bottom: -2px;
-  font-size: 16px;
-}
-.card-info .description {
-  overflow: hidden;
-}
-.card-info .description .text {
-  color: #464646;
-  font: 13px/15px Roboto Condensed;
-  overflow: hidden;
-  width:100%;
-}
-.card-info .description .util {
-  position: absolute;
-  right: 5px;
-  bottom: 70px; /*-2px;*/
-  opacity: 0;
-  -webkit-transition: opacity 0.5s;
-  -moz-transition: opacity 0.5s;
-  -o-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%;
-}
-.resource-card-6x6 .card-info .description .teddddddxt {
- float:left;
-  position:relative;
-  margin-left:0;
-}
-.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;
-  -webkit-box-sizing: content-box;
-  -moz-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: -moz-linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white);
-  background: -o-linear-gradient(to right, rgba(255, 255, 255, 0), white 65%, white);
-  background: -ms-linear-gradient(to right, 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;
-}
-
-/* Flow Layout */
-.resource-flow-layout {
-  display: inline-block;
-}
-.resource-flow-layout .resource-card, .resource-flow-layout .resource-card-stack {
-  float: left;
-  position: relative;
-}
-.resource-flow-layout .resource-card-stack > .resource-card {
-  margin-right: 0px !important;
-}
-.resource-flow-layout:after {
-  content: ".";
-  display: block;
-  height: 0;
-  position:relative;
-  clear: both;
-  visibility: hidden;
-}
-.resource-card:hover {
-  cursor: pointer;
-}
-.static .resource-card:hover {
-  cursor: auto;
-}
-.resource-card:hover .card-bg:after {
-  opacity: 0;
-}
-/* disabled to make way for fade/ellipsis truncation,
-   and the plusone moves up.
-.resource-card:hover .card-info .description .text {
-  padding-right: 70px;
-} */
-.resource-card:hover .card-info .description .util {
-  opacity: 1;
-}
-
-/* Carousel Layout */
-/* Carousel styles for landing page */
-.resource-carousel-layout {
-  margin: 20px 0 20px 0;
-  position: relative;
-  overflow: hidden;
-}
-.resource-carousel-layout .slideshow-prev, .resource-carousel-layout .slideshow-next {
-  display: none;
-}
-.resource-carousel-layout .pagination {
-  bottom: 0px;
-}
-.resource-carousel-layout .frame li {
-  position: relative;
-}
-.resource-carousel-layout .frame li .card-bg {
-  height: 300px;
-}
-.resource-carousel-layout .frame li .card-info {
-  padding: 7px 15px 0px 15px;
-  top: 300px;
-}
-.resource-carousel-layout .frame li .card-info .section {
-  font-size: 13px;
-  margin-bottom: 7px;
-}
-.resource-carousel-layout .frame li .card-info .title {
-  font-size: 25px;
-  margin-bottom: 2px;
-}
-.resource-carousel-layout .frame li .card-info .description {
-  font-family: 15px/16px Roboto Condensed, sans-serif;
-}
-.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;
-}
-.resource-stack-layout .resource-card-stack {
-  float: left;
-  position: relative;
-}
-.resource-stack-layout .resource-card {
-  margin-bottom: 20px;
-  display: block;
-  position: relative;
-}
-.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:link, .resource-stack-layout .section-card-menu .card-info ul li a:visited, .resource-stack-layout .section-card-menu .card-info ul li a:active, .resource-stack-layout .section-card-menu .card-info ul li a:hover {
-  color: #363636 !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;
-  -moz-transition: opacity 0.5s;
-  -o-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;
-  -moz-transition: max-height 0.5s, opacity 1s;
-  -o-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;
-  -moz-transition: opacity 0.25s;
-  -o-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;
-  -moz-transition: max-height 0.5s, opacity 0.5s;
-  -o-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;
-}
-
-/* Generate the flow layout styles for a 3-column 16-col span */
-.resource-flow-layout.col-16 {
-  margin: 0 -14px 0 0;
-  width: 954px;
-}
-.resource-flow-layout.col-16 .resource-card, .resource-flow-layout.col-16 .resource-card-stack {
-  margin: 0 14px 20px 0;
-}
-.resource-flow-layout.col-16 .resource-card-row-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-16 .resource-card-col-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-16 .resource-card-3x6 {
-  width: 145px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-3x12 {
-  width: 145px;
-  height: 588px;
-}
-.resource-flow-layout.col-16 .resource-card-3x18 {
-  width: 145px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-6x6 {
-  width: 304px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-6x12 {
-  width: 304px;
-  height: 588px;
-}
-.resource-flow-layout.col-16 .resource-card-6x18 {
-  width: 304px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-9x6 {
-  width: 463px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-9x12 {
-  width: 463px;
-  height: 588px;
-}
-.resource-flow-layout.col-16 .resource-card-9x18 {
-  width: 463px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-12x6 {
-  width: 622px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-12x12 {
-  width: 622px;
-  height: 588px;
-}
-.resource-flow-layout.col-16 .resource-card-12x18 {
-  width: 622px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-15x6 {
-  width: 781px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-15x12 {
-  width: 781px;
-  height: 588px;
-}
-.resource-flow-layout.col-16 .resource-card-15x18 {
-  width: 781px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-18x6 {
-  width: 940px;
-  height: 284px;
-}
-.resource-flow-layout.col-16 .resource-card-18x12 {
-  width: 940px;
-  height: 420px;
-}
-.resource-flow-layout.col-16 .resource-card-18x18 {
-  width: 940px;
-  height: 892px;
-}
-.resource-flow-layout.col-16 .resource-card-3x2 {
-  width: 145px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-3x2x3 {
-  width: 145px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-3x3 {
-  width: 145px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-3x3x2 {
-  width: 145px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-16 .resource-card-6x2 {
-  width: 304px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-6x2x3 {
-  width: 304px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-6x3 {
-  width: 304px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-6x3x2 {
-  width: 304px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-16 .resource-card-9x2 {
-  width: 463px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-9x2x3 {
-  width: 463px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-9x3 {
-  width: 463px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-9x3x2 {
-  width: 463px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-16 .resource-card-12x2 {
-  width: 622px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-12x2x3 {
-  width: 622px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-12x3 {
-  width: 622px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-12x3x2 {
-  width: 622px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-16 .resource-card-15x2 {
-  width: 781px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-15x2x3 {
-  width: 781px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-15x3 {
-  width: 781px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-15x3x2 {
-  width: 781px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-16 .resource-card-18x2 {
-  width: 940px;
-  height: 95px;
-}
-.resource-flow-layout.col-16 .resource-card-18x2x3 {
-  width: 940px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-16 .resource-card-18x3 {
-  width: 940px;
-  height: 142px;
-}
-.resource-flow-layout.col-16 .resource-card-18x3x2 {
-  width: 940px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-
-/* Generate the flow layout styles for a 3-column 16-col span */
-.resource-flow-layout.col-12 {
-  margin: 0 -14px 0 0;
-  width: 714px;
-}
-
-.resource-flow-layout.col-12 .resource-card, .resource-flow-layout.col-12 .resource-card-stack {
-  margin: 0 14px 20px 0;
-}
-.resource-flow-layout.col-12 .resource-card-row-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-12 .resource-card-col-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-12 .resource-card-3x6 {
-  width: 105px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-3x12 {
-  width: 105px;
-  height: 588px;
-}
-.resource-flow-layout.col-12 .resource-card-3x18 {
-  width: 105px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-6x6 {
-  width: 224px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-6x12 {
-  width: 224px;
-  height: 588px;
-}
-.resource-flow-layout.col-12 .resource-card-6x18 {
-  width: 224px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-9x6 {
-  width: 343px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-9x12 {
-  width: 343px;
-  height: 588px;
-}
-.resource-flow-layout.col-12 .resource-card-9x18 {
-  width: 343px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-12x6 {
-  width: 462px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-12x12 {
-  width: 462px;
-  height: 588px;
-}
-.resource-flow-layout.col-12 .resource-card-12x18 {
-  width: 462px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-15x6 {
-  width: 581px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-15x12 {
-  width: 581px;
-  height: 588px;
-}
-.resource-flow-layout.col-12 .resource-card-15x18 {
-  width: 581px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-18x6 {
-  width: 700px;
-  height: 284px;
-}
-.resource-flow-layout.col-12 .resource-card-18x12 {
-  width: 700px;
-  height: 420px;
-}
-.resource-flow-layout.col-12 .resource-card-18x18 {
-  width: 700px;
-  height: 892px;
-}
-.resource-flow-layout.col-12 .resource-card-3x2 {
-  width: 105px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-3x2x3 {
-  width: 105px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-3x3 {
-  width: 105px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-3x3x2 {
-  width: 105px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-12 .resource-card-6x2 {
-  width: 224px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-6x2x3 {
-  width: 224px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-6x3 {
-  width: 224px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-6x3x2 {
-  width: 224px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-12 .resource-card-9x2 {
-  width: 343px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-9x2x3 {
-  width: 343px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-9x3 {
-  width: 343px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-9x3x2 {
-  width: 343px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-12 .resource-card-12x2 {
-  width: 462px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-12x2x3 {
-  width: 462px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-12x3 {
-  width: 462px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-12x3x2 {
-  width: 462px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-12 .resource-card-15x2 {
-  width: 581px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-15x2x3 {
-  width: 581px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-15x3 {
-  width: 581px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-15x3x2 {
-  width: 581px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-12 .resource-card-18x2 {
-  width: 700px;
-  height: 95px;
-}
-.resource-flow-layout.col-12 .resource-card-18x2x3 {
-  width: 700px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-12 .resource-card-18x3 {
-  width: 700px;
-  height: 142px;
-}
-.resource-flow-layout.col-12 .resource-card-18x3x2 {
-  width: 700px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-
-/* Generate the flow layout styles for a 3-column 13-col span */
-
-.resource-flow-layout.col-13 {
-  margin: 0 -14px 0 0;
-  width: 774px;
-}
-.resource-flow-layout.col-13 .resource-card, .resource-flow-layout.col-13 .resource-card-stack {
-  margin: 0 14px 20px 0;
-}
-.resource-flow-layout.col-13 .resource-card-row-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-13 .resource-card-col-stack-last {
-  margin-bottom: 0px !important;
-}
-.resource-flow-layout.col-13 .resource-card-3x6 {
-  width: 115px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-3x12 {
-  width: 115px;
-  height: 588px;
-}
-.resource-flow-layout.col-13 .resource-card-3x18 {
-  width: 115px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-6x6 {
-  width: 244px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-6x12 {
-  width: 244px;
-  height: 588px;
-}
-.resource-flow-layout.col-13 .resource-card-6x18 {
-  width: 244px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-9x6 {
-  width: 373px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-9x12 {
-  width: 373px;
-  height: 588px;
-}
-.resource-flow-layout.col-13 .resource-card-9x18 {
-  width: 373px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-12x6 {
-  width: 502px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-12x12 {
-  width: 502px;
-  height: 588px;
-}
-.resource-flow-layout.col-13 .resource-card-12x18 {
-  width: 502px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-15x6 {
-  width: 631px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-15x12 {
-  width: 631px;
-  height: 588px;
-}
-.resource-flow-layout.col-13 .resource-card-15x18 {
-  width: 631px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-18x6 {
-  width: 760px;
-  height: 284px;
-}
-.resource-flow-layout.col-13 .resource-card-18x12 {
-  width: 760px;
-  height: 420px;
-}
-.resource-flow-layout.col-13 .resource-card-18x18 {
-  width: 760px;
-  height: 892px;
-}
-.resource-flow-layout.col-13 .resource-card-3x2 {
-  width: 115px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-3x2x3 {
-  width: 115px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-3x3 {
-  width: 115px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-3x3x2 {
-  width: 115px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-13 .resource-card-6x2 {
-  width: 244px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-6x2x3 {
-  width: 244px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-6x3 {
-  width: 244px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-6x3x2 {
-  width: 244px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-13 .resource-card-9x2 {
-  width: 373px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-9x2x3 {
-  width: 373px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-9x3 {
-  width: 373px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-9x3x2 {
-  width: 373px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-13 .resource-card-12x2 {
-  width: 502px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-12x2x3 {
-  width: 502px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-12x3 {
-  width: 502px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-12x3x2 {
-  width: 502px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-13 .resource-card-15x2 {
-  width: 631px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-15x2x3 {
-  width: 631px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-15x3 {
-  width: 631px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-15x3x2 {
-  width: 631px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-.resource-flow-layout.col-13 .resource-card-18x2 {
-  width: 760px;
-  height: 95px;
-}
-.resource-flow-layout.col-13 .resource-card-18x2x3 {
-  width: 760px;
-  height: 90px;
-  margin-bottom: 7px;
-}
-.resource-flow-layout.col-13 .resource-card-18x3 {
-  width: 760px;
-  height: 142px;
-}
-.resource-flow-layout.col-13 .resource-card-18x3x2 {
-  width: 760px;
-  height: 138px;
-  margin-bottom: 8px;
-}
-
-/*
-  The following are styles for cards in the flowlayout above, styled by the number of rows they span
-*/
-/* Single row items, might be simpler to just apply a class */
-.resource-card-3x6 > .card-bg, .resource-card-6x6 > .card-bg, .resource-card-9x6 > .card-bg, .resource-card-12x6 > .card-bg, .resource-card-15x6 > .card-bg, .resource-card-18x6 > .card-bg {
-  height: 192px;
-}
-.resource-card-3x6 > .card-info, .resource-card-6x6 > .card-info, .resource-card-9x6 > .card-info, .resource-card-12x6 > .card-info, .resource-card-15x6 > .card-info, .resource-card-18x6 > .card-info {
-  padding: 4px 12px 6px 12px;
-  top: 192px;
-}
-.resource-card-3x6 > .card-info .section, .resource-card-6x6 > .card-info .section, .resource-card-9x6 > .card-info .section, .resource-card-12x6 > .card-info .section, .resource-card-15x6 > .card-info .section, .resource-card-18x6 > .card-info .section {
-  font-size: 12px;
-  margin-bottom: 1px;
-}
-.resource-card-3x6 > .card-info .title, .resource-card-6x6 > .card-info .title, .resource-card-9x6 > .card-info .title, .resource-card-12x6 > .card-info .title, .resource-card-15x6 > .card-info .title, .resource-card-18x6 > .card-info .title {
-  font-size: 16px;
-  margin-bottom: -2px;
-}
-.resource-card-3x6 > .card-info .description, .resource-card-6x6 > .card-info .description, .resource-card-9x6 > .card-info .description, .resource-card-12x6 > .card-info .description, .resource-card-15x6 > .card-info .description, .resource-card-18x6 > .card-info .description {
-  font-size: 13px;
-  line-height: 15px;
-}
-.resource-card-3x6 > .card-info .description .text, .resource-card-6x6 > .card-info .description .text, .resource-card-9x6 > .card-info .description .text, .resource-card-12x6 > .card-info .description .text, .resource-card-15x6 > .card-info .description .text, .resource-card-18x6 > .card-info .description .text {
-  height: 30px;
-}
-
-/* Double row items */
-.resource-card-3x12 > .card-bg, .resource-card-6x12 > .card-bg, .resource-card-9x12 > .card-bg, .resource-card-12x12 > .card-bg, .resource-card-15x12 > .card-bg, .resource-card-18x12 > .card-bg {
-  height: 320px;
-}
-.resource-card-3x12 > .card-info, .resource-card-6x12 > .card-info, .resource-card-9x12 > .card-info, .resource-card-12x12 > .card-info, .resource-card-15x12 > .card-info, .resource-card-18x12 > .card-info {
-  padding: 4px 12px 6px 12px;
-  top: 320px;
-}
-.resource-card-3x12 > .card-info .section, .resource-card-6x12 > .card-info .section, .resource-card-9x12 > .card-info .section, .resource-card-12x12 > .card-info .section, .resource-card-15x12 > .card-info .section, .resource-card-18x12 > .card-info .section {
-  font-size: 12px;
-  margin-bottom: 1px;
-}
-.resource-card-3x12 > .card-info .title, .resource-card-6x12 > .card-info .title, .resource-card-9x12 > .card-info .title, .resource-card-12x12 > .card-info .title, .resource-card-15x12 > .card-info .title, .resource-card-18x12 > .card-info .title {
-  font-size: 16px;
-  margin-bottom: -2px;
-  white-space: normal;
-}
-.resource-card-3x12 > .card-info .description, .resource-card-6x12 > .card-info .description, .resource-card-9x12 > .card-info .description, .resource-card-12x12 > .card-info .description, .resource-card-15x12 > .card-info .description, .resource-card-18x12 > .card-info .description {
-  font-size: 13px;
-  line-height: 15px;
-}
-
-/* 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 {
-  left: 90px;
-  padding: 4px 12px 4px 12px;
-  height: 80px;
-  overflow: hidden;
-}
-.resource-card-3x2 > .card-info .section, .resource-card-6x2 > .card-info .section, .resource-card-6x3 > .card-info .section, .resource-card-9x2 > .card-info .section, .resource-card-12x2 > .card-info .section, .resource-card-15x2 > .card-info .section, .resource-card-18x2 > .card-info .section {
-  font-size: 12px;
-  margin-bottom: 1px;
-  /* display: none; */
-}
-.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 {
-  font-size: 16px;
-  margin-bottom: -2px;
-  white-space: normal;
-  overflow: visible;
-  text-overflow: ellipsis;
-}
-.resource-card-3x2 > .card-info .title:after, .resource-card-6x2 > .card-info .title:after, .resource-card-9x2 > .card-info .title:after, .resource-card-12x2 > .card-info .title:after, .resource-card-15x2 > .card-info .title:after, .resource-card-18x2 > .card-info .title:after {
-  /* content: url(../images/link-out.png); */
-  display: block;
-}
-.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;
-}
-
-
-/* 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 > .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 {
-  left: 90px;
-  padding: 4px 12px 0px 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 {
-  font-size: 12px;
-  margin-bottom: 1px;
-  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 {
-  font-size: 16px;
-  margin-bottom: -2px;
-  white-space: normal;
-  overflow: visible;
-}
-.resource-card-3x3 > .card-info .description .text, .resource-card-6x3 > .card-info .description .text, .resource-card-9x3 > .card-info .description .text, .resource-card-12x3 > .card-info .description .text, .resource-card-15x3 > .card-info .description .text, .resource-card-18x3 > .card-info .description .text {
-  font-size: 12px;
-  line-height: 15px;
-  padding-right: 0px !important;
-  height: 80px;
-}
-.resource-card-3x3 > .card-info .description .util, .resource-card-6x3 > .card-info .description .util, .resource-card-9x3 > .card-info .description .util, .resource-card-12x3 > .card-info .description .util, .resource-card-15x3 > .card-info .description .util, .resource-card-18x3 > .card-info .description .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" and puts the title above a hairline rule. */
-.landing .card-info .section, .resource-flow-layout.col-16.landing .resource-card-9x6 .card-info .section {
-  display:none;
-}
-.landing  .card-info .title {
-  color: #898989;
-  font-size: 17px;
-  line-height: 24px;
-  margin-bottom: 6px;
-  border-bottom: 1px solid #959595;
-  padding-bottom: 0px;
-}
-.landing .card-info .description {
-  font-size: 13px;
-  line-height: 15px;
-}
-.landing .card-info .description .text {
-height:30px;
-}
-.landing .resource-card-6x6 > .card-info .description .util, .landing .resource-card-9x6 > .card-info .description .util {
-  bottom:2px;
-}
-/*
-  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;
-}
-
-
 
 /**
  * UTILITIES
@@ -6542,11 +4105,13 @@
  */
 
 .landing-h1 {
-  font-weight: 100;
-  font-size: 60px;
-  line-height: 78px;
+  color: #44555d;
+  font-weight: 300;
+  font-size: 56px;
+  line-height: 80px;
   text-align: center;
   letter-spacing: -1px;
+  padding-bottom: 6px;
 }
 
 .landing-pre-h1 {
@@ -6557,11 +4122,11 @@
   text-align: center;
   letter-spacing: -1px;
   text-transform: uppercase;
-
 }
 
 .landing-h1.hero {
   text-align: left;
+  color: #fff;
 }
 
 .landing-h2 {
@@ -6572,10 +4137,10 @@
 }
 
 .landing-subhead {
-  color: #999999;
+  color: #78868d;
   font-size: 20px;
-  line-height: 28px;
-  font-weight:300;
+  font-weight: 300;
+  line-height: 32px;
   text-align: center;
 }
 .landing-subhead.hero {
@@ -6612,23 +4177,21 @@
  * LAYOUT
  */
 
-#body-content,
-.fullpage,
-#jd-content,
-.jd-descr,
-.landing-body-content {
-  height: 100%;
-}
-
 .landing-section {
-  padding: 80px 10px 80px;
-  width: 100%;
-  margin-left: -10px;
+  background: #eceff1;
+  clear: both;
+  padding: 80px 20px 80px;
+  margin: 0 -20px;
   text-rendering: optimizeLegibility;
 }
 
-#extending-android-to-wearables {
-  padding-top: 30px;
+@media (max-width: 719px) {
+  .landing-section {
+    margin-left: -10px;
+    margin-right: -10px;
+    padding-left: 10px;
+    padding-right: 10px;
+  }
 }
 
 .landing-short-section {
@@ -6636,7 +4199,7 @@
 }
 
 .landing-gray-background {
-  background-color: #e9e9e9;
+  background-color: #b0bec5;
 }
 
 .landing-white-background {
@@ -6648,24 +4211,19 @@
   background-color: hsl(8, 70%, 54%);
 }
 
-.landing-subhead-red {
+.landing-red-background .landing-h1 {
+  color: white;
+}
+
+.landing-red-background .landing-subhead {
   color: hsl(8, 71%, 84%);
   text-align: left;
 }
 
-.landing-subhead-red p {
-  margin-top: 20px;
-}
-
-.landing-hero-container {
-  height: 100%;
-}
-
 
 .preview-hero {
-  height: calc(100% - 110px);
+  height: calc(100vh - 128px);
   min-height: 504px;
-  margin-top: -5px;
   padding-top: 0;
   padding-bottom: 0;
   background-image: url(../../preview/images/hero.jpg);
@@ -6677,9 +4235,8 @@
 }
 
 .wear-hero {
-  height: calc(100% - 110px);
+  height: calc(100vh - 128px);
   min-height: 504px;
-  margin-top: -5px;
   padding-top: 0;
   padding-bottom: 0;
   background-image: url(../../wear/images/hero.jpg);
@@ -6691,9 +4248,8 @@
 }
 
 .tv-hero {
-  height: calc(100% - 110px);
+  height: calc(100vh - 128px);
   min-height: 504px;
-  margin-top: -5px;
   padding-top: 0;
   padding-bottom: 0;
   background-image: url(../../tv/images/hero.jpg);
@@ -6705,9 +4261,8 @@
 }
 
 .auto-hero {
-  height: calc(100% - 110px);
+  height: calc(100vh - 128px);
   min-height: 504px;
-  margin-top: -5px;
   padding-top: 0;
   padding-bottom: 0;
   background-image: url(../../auto/images/hero.jpg);
@@ -6720,16 +4275,16 @@
 
 .landing-hero-scrim {
   background: black;
-  opacity: .2;
-  position: absolute;
-  width: 100%;
   height: 100%;
-  margin-left: -10px;
+  left: 0;
+  position: absolute;
+  opacity: .2;
+  width: 100%;
 }
 
 .landing-hero-wrap {
   margin: 0 auto;
-  width: 940px;
+  max-width: 940px;
   clear: both;
   height: 100%;
   position: relative;
@@ -6748,56 +4303,6 @@
   line-height: 24px;
 }
 
-.landing-button {
-  white-space: nowrap;
-  display: inline-block;
-  padding: 16px 32px;
-  font-size: 18px;
-  font-weight: 500;
-  line-height: 24px;
-  cursor: pointer;
-  color: white;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-       -o-user-select: none;
-  user-select: none;
-  -webkit-transition: .2s background-color ease-in-out;
-     -moz-transition: .2s background-color ease-in-out;
-       -o-transition: .2s background-color ease-in-out;
-  transition: .2s background-color ease-in-out;
-}
-
-.landing-primary {
-  background-color: hsl(8, 70%, 44%);
-  color: #f8f8f8;
-}
-
-.landing-button.landing-primary:hover {
-  background-color: hsl(8, 70%, 36%);
-}
-
-.landing-button.landing-primary:active {
-  background-color: hsl(8, 70%, 30%);
-}
-
-.landing-button.landing-secondary {
-  background-color: #2faddb;
-}
-
-.landing-button.landing-secondary:hover {
-  background-color: #09c;
-}
-
-.landing-button.landing-secondary:active {
-  background-color: #3990ab;
-}
-
-a.landing-button,
-a.landing-button:hover,
-a.landing-button:visited {
-  color: white !important;
-}
-
 .landing-video-link {
   white-space: nowrap;
   display: inline-block;
@@ -6916,17 +4421,6 @@
   margin-bottom: 20px;
 }
 
-.col-3-wide {
-  display: inline;
-  float: left;
-  margin-left: 10px;
-  margin-right: 10px;
-}
-
-.col-3-wide {
-  width: 302px;
-}
-
 /**
  * ANIMATION
  */
@@ -6953,86 +4447,6 @@
 }
 
 
-
-/**
- * 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 {
-  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");
-}
-
 /******************
 Styles for d.a.c/index:
 *******************/
@@ -7041,8 +4455,7 @@
 
 /* Generic full screen carousel styling to be used across pages. */
 .fullscreen-carousel {
-  margin: 0 -10px;
-  width: 100%;
+  margin: 0 -20px;
   overflow: hidden;
   position: relative;
 }
@@ -7074,14 +4487,13 @@
   font-size: 60px;
   line-height: 68px;
   letter-spacing: -1px;
-  margin-top: 0;
+  padding-top: 0;
 }
 
 .fullscreen-carousel .hero p {
   font-weight: 300;
   font-size: 18px;
   line-height: 24px;
-  -webkit-font-smoothing: antialiased;
 }
 
 .fullscreen-carousel .hero .hero-bg {
@@ -7214,82 +4626,6 @@
   margin-bottom: 26px;
 }
 
-
-
-
-
-/*
-   Styles for the entity link used in the actions bar and in the cta of
-   the resources that appear in the tab carousel.
-*/
-.actions-bar a:after,
-.resource .cta:after {
-  content: '›';
-  font-weight: 400;
-  font-size: 22px;
-  left: 5px;
-  line-height: 1;
-  position: relative;
-  top: 1px;
-  transition: left 190ms ease-out;
-}
-
-.actions-bar a:hover:after,
-.resource .cta:hover:after {
-  left: 10px;
-}
-
-
-
-
-/*
-  Styles for the actions bar.
-*/
-.actions-bar {
-  background: #9acd00;
-  margin: 0 -10px;
-  text-align: center;
-}
-
-.actions-bar .actions {
-  padding: 30px 0 30px;
-  text-align: justify;
-  font-size: 0.1px;
-  line-height: 0.1px;
-  margin: 0 10px 0 0;
-}
-
-.actions-bar .actions:after {
-  content: '';
-  width: 100%;
-  display: inline-block;
-}
-
-.actions-bar .actions > div {
-  display: inline-block;
-}
-
-.actions-bar a {
-  font-size: 21px;
-  line-height: 27px;
-  color: #fff;
-  font-weight: 300;
-  -webkit-font-smoothing: antialiased;
-}
-
-.actions-bar a:after {
-  top: 0px;
-  font-size: 22px;
-}
-
-.actions-bar a:hover {
-  color: #fff !important;
-}
-
-
-
-
-
 /*
   Specific styles for new home page layout of the carousels.
 */
@@ -7450,3 +4786,5156 @@
 .resource-card-6x2 > .card-bg.helpouts-card-bg:after {
   display:none;
 }
+
+#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;
+  }
+}
+
+@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;
+}
+
+@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;
+}
+
+/**
+ * Hide from browsers/screenreaders on all sizes.
+ */
+.dac-hidden {
+  display: none !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;
+  line-height: 65px;
+  padding-left: 4px;
+  position: absolute;
+  opacity: .6;
+  text-align: center;
+  -webkit-transition: opacity .5s;
+          transition: opacity .5s;
+  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;
+    left: 50%;
+    margin-left: -35px;
+    top: 50px; }
+
+/* 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: 23px;
+    margin-bottom: 7px;
+    max-height: 46px;
+    overflow: hidden;
+    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: 23px;
+    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: 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 {
+  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: 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; }
+    .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; }
+
+/* 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;
+  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; }
+  .dac-button.dac-raised.dac-primary:active, .landing-secondary:active, .button:active {
+    background-color: #0277bd; }
+  .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-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, .dac-button-social {
+  background: #fff;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.26);
+  border-radius: 50%;
+  height: 36px;
+  line-height: 36px;
+  margin: 0;
+  min-width: 0;
+  overflow: hidden;
+  padding: 0;
+  vertical-align: middle;
+  width: 36px; }
+  .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-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-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;
+  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, .dac-footer-getnews > .dac-button-social {
+    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; }
+  .dac-fullscreen-mode .wrap {
+    max-width: none; }
+
+.dac-full-screen-mode .dac-search-open .wrap {
+  max-width: 940px;
+}
+
+.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: 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 {
+    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.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-] {
+  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 {
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.07);
+  box-sizing: border-box;
+  background: #6ab344;
+  height: 64px;
+  margin: 0;
+  left: 0;
+  position: fixed;
+  right: 0;
+  top: 0;
+  -webkit-transition: background 200ms;
+  transition: background 200ms;
+  z-index: 61;
+}
+
+.dac-ndk {
+  background: #00bcd4;
+}
+
+.dac-studio {
+  background: #424242;
+}
+
+.dac-search-mode .dac-header {
+  background: #b0bec5;
+  -webkit-transition: background 200ms;
+  transition: background 200ms;
+}
+
+.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 {
+  display: block;
+  font-size: 20px;
+  font-weight: 400;
+  float: left;
+  letter-spacing: .3px;
+  line-height: 36px;
+  opacity: 1;
+  padding: 13px 48px 15px 0;
+}
+
+.dac-header-logo, .dac-header-logo:hover, .dac-header-logo:focus {
+  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 {
+  margin-right: 5px;
+  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
+     in Studio docs, when header tabs are visible */
+  body.studio .dac-nav-back-button {
+    display:none;
+  }
+  body.studio .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 {
+  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-radius: 3px;
+  box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.2);
+  float: right;
+  font-size: 14px;
+  font-weight: 500;
+  line-height: 28px;
+  margin: 13px 13px 12px 24px;
+  opacity: 1;
+  padding: 4px 10px;
+  position: relative;
+  text-transform: uppercase;
+  -webkit-transition: box-shadow .2s;
+  transition: box-shadow .2s;
+  z-index: 60;
+}
+
+@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: #fff;
+}
+
+.dac-header-console-btn:hover {
+  box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.3);
+}
+
+.dac-header-console-btn:focus {
+  background: rgba(63, 81, 181, 0.1);
+  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 {
+    text-align: center;
+  }
+
+  .dac-header-logo {
+    border-right: 0;
+    display: inline-block;
+    margin-right: 0;
+    float: none;
+    padding-left: 0;
+    padding-right: 0;
+  }
+
+  .dac-header-console-btn {
+    display: none;
+  }
+}
+
+/* Header Breadcrumbs component */
+.dac-header-crumbs {
+  list-style-type: none;
+  margin: 23px 0 -13px 0;
+  display: inline-block;
+}
+
+body.studio .dac-header-crumbs {
+  display:none;
+}
+
+.dac-header-crumbs.dac-has-content {
+  opacity: 1;
+}
+
+.dac-header-crumbs-item {
+  float: left;
+  position: relative;
+  margin: 0;
+  padding: 0;
+}
+
+.dac-header-crumbs-item i, .dac-header-crumbs-item .dac-nav-link-forward {
+  display: none;
+}
+
+.dac-header-crumbs-item:before {
+  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 {
+  content: none;
+}
+
+.dac-header-crumbs-link {
+  display: block;
+  font-size: 16px;
+  line-height: 32px;
+  padding: 0 20px 0 0;
+}
+
+.dac-header-crumbs-link, .dac-header-crumbs-link:hover, .dac-header-crumbs-link:focus {
+  color: #666;
+}
+
+.dac-header-crumbs-link:focus {
+  outline: 0;
+  text-decoration: underline;
+}
+
+.dac-header-crumbs-link.current {
+  font-weight: 400;
+}
+
+/* Header site search component */
+.dac-header-search {
+  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-inner {
+  margin: 0 auto;
+  max-width: 940px;
+  position: relative;
+  width: 100%;
+}
+
+@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-search-mode .dac-header-search-inner::after {
+    opacity: 0;
+    -webkit-transform: scaleX(0);
+    -ms-transform: scaleX(0);
+    transform: scaleX(0);
+  }
+}
+
+.dac-header-search-icon {
+  left: 8px;
+  pointer-events: none;
+  position: absolute;
+  top: 18px;
+}
+
+.dac-header-search-input {
+  background: #77be53;
+  border-radius: 3px;
+  border: none;
+  box-sizing: border-box;
+  color: #fff;
+  font-size: 14px;
+  font-weight: 600;
+  margin: 13px 0;
+  padding: 9px 36px 10px;
+  -webkit-transition: background 200ms, color 200ms;
+  transition: background 200ms, color 200ms;
+  width: 100%;
+}
+
+.dac-studio .dac-header-search {
+  right:150px;
+}
+.dac-studio .dac-header-search-input {
+  background: rgba(255, 255, 255, 0.3);
+}
+
+.dac-header-search-close, .dac-header-search-clear {
+  background: none;
+  border: none;
+  cursor: pointer;
+  font-size: 0;
+  outline: none;
+  position: absolute;
+  margin: 0;
+}
+
+.dac-header-search-clear {
+  display: inline-block;
+  opacity: .4;
+  padding: 8px;
+  top: 15px;
+  right: 0;
+}
+
+.dac-header-search-clear:hover, .dac-header-search-clear:focus {
+  opacity: .8;
+}
+
+.dac-header-search-close {
+  left: -45px;
+  top: 20px;
+  -webkit-transform: translateX(45px);
+  -ms-transform: translateX(45px);
+  transform: translateX(45px);
+  visibility: hidden;
+}
+
+.dac-header-search ::-webkit-input-placeholder {
+  color: #fff;
+  font-weight: 300;
+  -webkit-transition: color 200ms;
+  transition: color 200ms;
+}
+
+.dac-header-search :-moz-placeholder {
+  color: #fff;
+  font-weight: 300;
+  transition: color 200ms;
+}
+
+.dac-header-search ::-moz-placeholder {
+  color: #fff;
+  font-weight: 300;
+  transition: color 200ms;
+}
+
+.dac-header-search :-ms-input-placeholder {
+  color: #fff;
+  font-weight: 300;
+  transition: color 200ms;
+}
+
+.dac-header-search-input:focus {
+  outline: 0;
+}
+
+.dac-search-mode .dac-header-search {
+  width: 940px;
+  right: 50%;
+  margin-right: -470px;
+}
+
+.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-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-search-mode .dac-header-search .dac-header-search-icon {
+  left: 23px;
+}
+
+.dac-search-mode .dac-header-search .dac-header-search-input {
+  background: #fff;
+  border-radius: 0;
+  font-size: 18px;
+  color: #666;
+  padding-left: 55px;
+  margin-top: 11px;
+}
+
+.dac-search-mode .dac-header-search ::-webkit-input-placeholder {
+  color: #505050;
+}
+
+.dac-search-mode .dac-header-search :-moz-placeholder {
+  color: #505050;
+}
+
+.dac-search-mode .dac-header-search ::-moz-placeholder {
+  color: #505050;
+}
+
+.dac-search-mode .dac-header-search :-ms-input-placeholder {
+  color: #505050;
+}
+
+@media (min-width: 720px) and (max-width: 979px) {
+  .dac-header-search {
+    right: 20px;
+    width: 200px;
+    -webkit-transition: left 200ms, right 200ms, width 200ms;
+    transition: left 200ms, right 200ms, width 200ms;
+  }
+
+  .dac-search-mode .dac-header-search {
+    left: 60px;
+    right: 0;
+    width: 100%;
+  }
+
+  .dac-search-mode .dac-header-search .dac-header-search-inner {
+    margin: 0;
+    width: calc(100% - 60px - 10px);
+  }
+
+  .dac-header-search-close {
+    left: -42px;
+  }
+}
+
+@media (max-width: 719px) {
+  .dac-header-search {
+    bottom: 0;
+    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;
+  }
+
+  .dac-header-search-input {
+    background: none;
+    cursor: pointer;
+    opacity: 0;
+  }
+
+  .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-search-mode .dac-header-search .dac-header-search-inner {
+    margin: 0;
+    width: calc(100% - 60px - 10px);
+  }
+
+  .dac-search-mode .dac-header-search .dac-header-search-input {
+    opacity: 1;
+  }
+}
+
+.highlighted em {
+  color: #333;
+  font-style: normal;
+  font-weight: 700;
+}
+
+.card-info .title.highlighted {
+  color: #666;
+}
+
+/* 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-animating .dac-nav-sidebar {
+  -webkit-transition: -webkit-transform .3s;
+  transition: transform .3s;
+}
+
+.dac-nav-open .dac-nav-sidebar {
+  -webkit-transform: translate(0, 0);
+  -ms-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+
+.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 .dac-swap-section {
+  -webkit-transition-duration: .3s;
+  transition-duration: .3s;
+}
+
+.dac-nav-back {
+  margin-top: -3px;
+  margin-right: 10px;
+}
+
+.dac-nav-fullscreen {
+  background: transparent;
+  border: none;
+  bottom: 100%;
+  cursor: pointer;
+  display: none;
+  opacity: .8;
+  outline: none;
+  padding: 20px 15px;
+  position: absolute;
+  right: 0;
+}
+
+@media (min-width: 980px) {
+  .dac-nav-fullscreen {
+    display: inline-block;
+  }
+}
+
+.dac-nav-fullscreen:hover {
+  opacity: 1;
+}
+
+.dac-nav-sub-slider {
+  cursor: pointer;
+  opacity: .5;
+  position: absolute;
+  right: 7px;
+  top: 5px;
+}
+
+.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-nav-back-button, .dac-nav-back-button:hover, .dac-nav-back-button:active {
+  color: rgba(255, 255, 255, 0.7);
+}
+
+.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-nav-logo {
+  font-size: 20px;
+  font-weight: 300;
+  letter-spacing: .3px;
+  line-height: 36px;
+  margin: 0;
+  padding: 14px 24px;
+}
+
+.dac-nav-logo, .dac-nav-logo:hover, .dac-nav-logo:focus {
+  color: #444;
+}
+
+.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-nav-list::-webkit-scrollbar {
+  width: 4px;
+  height: 4px;
+}
+
+.dac-nav-list::-webkit-scrollbar-thumb {
+  background: #b7baba;
+}
+
+.dac-nav-list::-webkit-scrollbar-track {
+  background: #e5e8e9;
+}
+
+.dac-nav-secondary {
+  margin: 0;
+}
+
+.dac-nav-item {
+  list-style-type: none;
+  margin: 0 0 10px;
+  position: relative;
+}
+
+.dac-nav-secondary .dac-nav-item {
+  margin-bottom: 0;
+}
+
+.dac-nav-head {
+  display: block;
+  font-size: 16px;
+  font-weight: 300;
+  letter-spacing: .24px;
+  line-height: 32px;
+  margin-bottom: 20px;
+  margin-top: 0;
+}
+
+.dac-nav-dimmer {
+  background: #000;
+  display: block;
+  height: 100%;
+  left: 0;
+  opacity: 0;
+  position: fixed;
+  top: 0;
+  -webkit-transform: translateZ(0);
+  transform: translateZ(0);
+  visibility: hidden;
+  width: 100%;
+  z-index: 60;
+}
+
+.dac-nav-animating .dac-nav-dimmer {
+  -webkit-transition: visibility 0s linear .3s, opacity .3s linear;
+  transition: visibility 0s linear .3s, opacity .3s linear;
+}
+
+.dac-nav-open .dac-nav-dimmer {
+  opacity: .8;
+  -webkit-transition-delay: 0s;
+  transition-delay: 0s;
+  visibility: visible;
+}
+
+@media (min-width: 980px) {
+  .dac-nav-dimmer {
+    display: none;
+  }
+}
+
+.dac-nav-hamburger {
+  display: inline-block;
+  float: left;
+  height: 15px;
+  padding: 22px 20px;
+  width: 18px;
+}
+
+@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;
+  height: 2px;
+  margin: 3px 0 0;
+  opacity: .5;
+  width: 100%;
+}
+
+.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-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-nav-hamburger-top, .dac-nav-hamburger-mid, .dac-nav-hamburger-bot {
+    background: #fff;
+    opacity: 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-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-nav-link {
+  color: #444;
+  display: block;
+  font-size: 18px;
+  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-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-secondary .dac-nav-link {
+  font-size: 12px;
+  font-weight: 400;
+  padding-left: 40px;
+}
+
+.dac-nav-link.selected {
+  background: rgba(63, 81, 181, 0.1);
+  color: #039bef;
+  position: relative;
+}
+
+.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;
+}
+
+.dac-nav-link-forward > .dac-nav-forward {
+  opacity: .7;
+  vertical-align: -3px;
+}
+
+.dac-nav-sub {
+  bottom: 0;
+  left: 0;
+  position: absolute !important;
+  top: 65px !important;
+  right: 0;
+  z-index: 1;
+}
+
+#body-content {
+  padding-top: 64px;
+}
+
+.dac-nav-animating #body-content {
+  -webkit-transition: padding .3s;
+  transition: padding .3s;
+}
+
+@media (min-width: 980px) {
+  .dac-nav-open #body-content {
+    padding-left: 250px;
+  }
+
+  /* Do not show nav toggle for Studio on large screens */
+  body.studio .dac-nav-toggle {
+    display:none;
+  }
+  body.studio .dac-header-logo {
+    padding-left:20px;
+  }
+  /* And if the page has no subcomponent, don't show left nav at all */
+  body.studio.None .dac-nav {
+    display: none;
+  }
+  body.studio.None #body-content {
+    padding-left:0;
+  }
+}
+
+.dac-nav-open {
+  overflow: hidden;
+}
+
+@media (min-width: 980px) {
+  .dac-nav-open {
+    overflow: visible;
+  }
+}
+
+#devdoc-nav {
+  height: 100%;
+}
+
+.dac-reference-nav {
+  height: calc(100% - 36px);
+  overflow: hidden;
+  position: relative;
+}
+
+.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-reference-nav-list::-webkit-scrollbar {
+  width: 4px;
+  height: 4px;
+}
+
+.dac-reference-nav-list::-webkit-scrollbar-thumb {
+  background: #9da4a7;
+}
+
+.dac-reference-nav-list::-webkit-scrollbar-track {
+  background: #c4cdd1;
+}
+
+.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: 13px;
+  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-reference-nav-toggle.dac-closed::before {
+  -webkit-transform: scaleY(-1);
+  -ms-transform: scaleY(-1);
+  transform: scaleY(-1);
+}
+
+/* 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;
+  -webkit-transition: background-color .1s;
+  transition: background-color .1s;
+}
+
+#nav .nav-section-header.empty {
+  padding: 0;
+}
+
+#nav .nav-section-header.empty::after {
+  display: none;
+}
+
+#nav .nav-section-header:after {
+  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: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 .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: '';
+  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, .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;
+}
+
+@media (max-width: 719px) {
+  .dac-hero-cta {
+    line-height: 28px;
+  }
+}
+
+.dac-hero-figure {
+  text-align: center;
+}
+
+/* Android Studio download page */
+section#features {
+  padding-top:0;
+}
+.wrap.feature {
+  margin:80px auto;
+}
+.dac-section-links.feature-more {
+  margin-top:-20px;
+}
+.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 */
+  .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-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-custom-search-load-more:hover {
+  opacity: 0.7;
+}
+
+.dac-custom-search-no-results {
+  color: #999;
+}
+
+.dac-search-hero {
+  font-size: 16px;
+  padding: 50px 0 14px 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;
+}
+
+.dac-nav-animating .dac-search-results {
+  -webkit-transition: opacity 100ms, padding .3s;
+  transition: opacity 100ms, padding .3s;
+}
+
+.dac-search-results * {
+  box-sizing: border-box;
+}
+
+.dac-search-open .dac-search-results {
+  opacity: 1;
+  visibility: visible;
+}
+
+.dac-search-results-content {
+  background: #eceff1;
+  margin: 0 -10px;
+  padding: 0 10px;
+}
+
+.dac-search-results-for {
+  margin-bottom: -5px;
+  overflow: hidden;
+  padding-top: 5px;
+}
+
+.dac-search-results-for span {
+  color: #039bef;
+}
+
+.dac-search-mode .dac-search-results-for {
+  display: none;
+}
+
+.dac-search-results-history {
+  background: #eceff1;
+  min-height: 100%;
+  margin: 0 -10px;
+  padding: 0 10px;
+}
+
+.dac-search-results-hero {
+  padding-top: 20px;
+}
+
+.dac-search-results-metadata {
+  padding-bottom: 40px;
+}
+
+#dac-search-results-reference {
+  float:right;
+  z-index:999;
+}
+
+@media (max-width: 719px) {
+  #dac-search-results-reference {
+    float:none;
+  }
+}
+
+.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-search-results-reference .namespace {
+  color: #666;
+}
+
+.dac-search-results-reference.is-expanded {
+  height: auto;
+}
+
+.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-search-results-reference-header:first-child {
+  padding-top: 0;
+}
+
+.dac-search-results-reference-entry {
+  margin: 0;
+}
+
+.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;
+}
+
+ul.dac-search-results-reference {
+list-style: none;
+}
+
+ul.dac-search-results-reference li[data-toggle="show-more"] {
+  cursor:pointer;
+}
+
+ul.dac-search-results-reference.is-expanded li[data-toggle="show-more"] {
+  display:none;
+}
+
+.dac-search-results-reference-entry a:hover {
+  background-color: #eceff1;
+}
+
+.dac-search-results-reference-entry em {
+  font-style: normal;
+  font-weight: 700;
+}
+
+.dac-search-results-reference-entry-empty {
+  color: #999;
+  font-size: 0.81em;
+  margin: 0;
+  padding: 2px 12px 14px;
+}
+
+.dac-search-results-resources {
+  margin: 0;
+}
+
+.dac-search-results-resources .resource-card {
+  border-right: 2px solid #999;
+}
+
+.dac-search-results-resources .resource-card-about {
+  border-right: 2px solid #6ab344;
+}
+
+.dac-search-results-resources .resource-card-about .section {
+  color: #6ab344;
+}
+
+.dac-search-results-resources .resource-card-develop {
+  border-right: 2px solid #ff7043;
+}
+
+.dac-search-results-resources .resource-card-develop .section {
+  color: #ff7043;
+}
+
+.dac-search-results-resources .resource-card-design {
+  border-right: 2px solid #00bcd4;
+}
+
+.dac-search-results-resources .resource-card-design .section {
+  color: #00bcd4;
+}
+
+.dac-search-results-resources .resource-card-distribute {
+  border-right: 2px solid #afb42b;
+}
+
+.dac-search-results-resources .resource-card-distribute .section {
+  color: #afb42b;
+}
+
+@media (max-width: 719px) {
+  .dac-search-results-reference.no-results {
+    display: none;
+  }
+}
+
+@media (min-width: 980px) {
+  .dac-nav-open.dac-search-open .dac-search-results {
+    padding-left: 260px;
+  }
+
+  .dac-search-mode.dac-search-open .dac-search-results {
+    padding-left: 10px;
+  }
+}
+
+.dac-selected {
+  color: #039bef !important;
+}
+
+.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 {
+  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: #b3b3b3;
+  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: #d8dfe2;
+}
+
+.dac-gray-dark.dac-hero, .dac-gray-dark.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, .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-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;
+}
+
+.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: #b3b3b3;
+  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.dac-slim {
+  padding-bottom: 0;
+  padding-top: 0;
+}
+
+.dac-section-title {
+  text-align: center;
+  padding-bottom: 40px;
+  padding-top: 0;
+}
+
+.dac-section-subtitle {
+  font-size: 16px;
+  padding-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 {
+  cursor: pointer;
+  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, .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(/assets/images/sprite.png);
+  display: inline-block;
+  vertical-align: middle; }
+  @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(/assets/images/sprite@2x.png);
+      background-size: 36px 883px; } }
+
+.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, .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; }
+
+.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, .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, .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, .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-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, .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-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, .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, .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-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-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-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-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-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-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-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-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; }
+
+.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-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-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-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, .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, .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, .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, 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: 1px; }
+    .dac-toast-close-btn:hover, .dac-toast-close-btn:focus, .dac-toast-close-btn:active {
+      outline: none;
+      opacity: 1; }
+  .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; }
+
+.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-tab-item.dac-active .dac-tab-arrow {
+  -webkit-transform: scaleY(-1);
+      -ms-transform: scaleY(-1);
+          transform: scaleY(-1); }
+
+.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; } }
+
+/**
+ * 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) {
+  .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; }
+
+/**
+ * Hide from browsers/screenreaders on all sizes.
+ */
+.dac-hidden {
+  display: none !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;
+}
+
+.Video {
+  display: none;
+}
+
+.Video-overlay {
+  background-color: rgba(0, 0, 0, 0.8);
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 9999;
+}
+
+.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;
+  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;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.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;
+}
+
+.Video-button:hover {
+  opacity: 0.8;
+}
+
+.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;
+  }
+
+  .Video--picture-in-picture .Video-container {
+    top: auto;
+    left: auto;
+    bottom: 20px;
+    right: 20px;
+    width: 40%;
+    max-width: 420px;
+    height: auto;
+  }
+
+  .Video--picture-in-picture .Video-button--picture-in-picture {
+    background-position: 0px -409px;
+    height: 24px;
+    width: 24px;
+  }
+
+  .Video--picture-in-picture .Video-frame {
+    padding-bottom: 56.25%;
+  }
+
+  .Video-button--picture-in-picture {
+    display: inline-block;
+  }
+}
+
+a.video-shadowbox-button.white {
+  padding: 16px 42px 16px 8px;
+  font-size: 18px;
+  font-weight: 500;
+  line-height: 24px;
+  color: #fff;
+  text-decoration: none;
+}
+
+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;
+  }
+
+  .wide-table table {
+    display: inline-table;
+    margin-right: 0;
+  }
+}
+
+/* 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;
+}
+
+@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%;
+  }
+}
+
+.paging-links .start-class-link {
+  padding: 36px 0;
+}
+
+.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) {
+  .paging-links .prev-page-link {
+    display: none;
+  }
+}
+
+.paging-links .next-page-link, .paging-links .next-class-link {
+  text-align: right;
+}
+
+.paging-links .next-page-link .page-link-caption, .paging-links .next-class-link .page-link-caption {
+  right: 0;
+}
+
+.paging-links .next-page-link:before, .paging-links .next-class-link:before {
+  content: '';
+  right: -24px;
+  position: absolute;
+  bottom: 41px;
+}
+
+.paging-links .start-class-link:after {
+  content: '';
+  right: -12px;
+  position: relative;
+  bottom: 3px;
+}
+
+.paging-links .page-link-caption {
+  position: absolute;
+  top: 26px;
+  font-size: 14px;
+  font-weight: 700;
+  opacity: 0.54;
+}
+
+#tb li:before,
+#qv li:before {
+  background-position: 0px -669px;
+  height: 24px;
+  width: 24px;
+  content: '';
+  left: -8px;
+  opacity: .7;
+  position: absolute;
+  top: -4px;
+}
+
+/** CSS Fixes for DevSite (akassay@) */
+.dac-button-social,
+.dac-fab:not('.dac-scroll-button') {
+  position: relative;
+}
+
+.dac-button-social .dac-sprite,
+.dac-fab .dac-sprite,
+.play-button .dac-sprite {
+  margin-top: -7px;
+  position: relative;
+  top: 50%;
+}
+
+.dac-fab .dac-sprite.dac-arrow-down-gray {
+  margin-top: -3px;
+}
+
+.dac-button-social .dac-sprite.dac-gplus {
+  margin-top: -17px;
+}
+
+.play-button .dac-sprite {
+  margin-top: -10px;
+}
+
+.dac-nav-link-forward {
+  padding: 9px 0;
+}
diff --git a/tools/droiddoc/templates-sdk-dev/assets/css/fullscreen.css b/tools/droiddoc/templates-sdk-dev/assets/css/fullscreen.css
index 7912e34..0f108e0 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/css/fullscreen.css
+++ b/tools/droiddoc/templates-sdk-dev/assets/css/fullscreen.css
@@ -14,195 +14,7 @@
 */
 
 @media screen, projection, print {
-.full {
-	padding: 2.5em 0;
-	border-top: solid 1px #ddd;
-	border-bottom: solid 1px #ddd;
-	background: #f7f7f7;	
+  .wrap {
+    max-width: none;
+  }
 }
-.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%;
-}
-
-#header-wrapper #nav-x div.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 */
-}
-
-#sticky-header {
-  padding: 0 20px;
-}
-
-#sticky-header > div {
-  width: 100%;
-}
-
-.sticky-menu {
-  width:100%;
-  left:-20px;
-}
-
-.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-sdk-dev/assets/images/android_logo.png b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo.png
new file mode 100644
index 0000000..53f59c6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/android_logo@2x.png b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo@2x.png
new file mode 100644
index 0000000..85b9211
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk.png b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk.png
new file mode 100644
index 0000000..3f39f4d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk@2x.png b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk@2x.png
new file mode 100644
index 0000000..8081ac5
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/android_logo_ndk@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/home/android_m_hero_1200.jpg b/tools/droiddoc/templates-sdk-dev/assets/images/home/android_m_hero_1200.jpg
new file mode 100644
index 0000000..6b79295
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/home/android_m_hero_1200.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/resource-card-default-android.jpg b/tools/droiddoc/templates-sdk-dev/assets/images/resource-card-default-android.jpg
index 8050744..398030f 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/images/resource-card-default-android.jpg
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/resource-card-default-android.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/sprite-2x.png b/tools/droiddoc/templates-sdk-dev/assets/images/sprite-2x.png
new file mode 100644
index 0000000..185b7e8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/sprite-2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/sprite.png b/tools/droiddoc/templates-sdk-dev/assets/images/sprite.png
new file mode 100644
index 0000000..562b23c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/sprite.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/sprite@2x.png b/tools/droiddoc/templates-sdk-dev/assets/images/sprite@2x.png
new file mode 100644
index 0000000..2019e02
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/assets/images/sprite@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/js/android_3p-bundle.js b/tools/droiddoc/templates-sdk-dev/assets/js/android_3p-bundle.js
index a67b5b0..70d6c2f 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/js/android_3p-bundle.js
+++ b/tools/droiddoc/templates-sdk-dev/assets/js/android_3p-bundle.js
@@ -2763,4 +2763,10 @@
 * 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-dev/assets/js/docs.js b/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
index 7f4be4e..efcc363 100644
--- a/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
+++ b/tools/droiddoc/templates-sdk-dev/assets/js/docs.js
@@ -1,16 +1,9 @@
-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));
 
 // Ensure that all ajax getScript() requests allow caching
 $.ajaxSetup({
@@ -21,133 +14,12 @@
 
 $(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) {
-      $('#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
-  $('.scroll-pane').jScrollPane( {verticalGutter:0} );
-
-  // add HRs below all H2s (except for a few other h2 variants)
-  $('h2').not('#qv h2')
-         .not('#tb h2')
-         .not('.sidebox h2')
-         .not('#devdoc-nav h2')
-         .not('h2.norule').css({marginBottom:0})
-         .after('<hr/>');
-
-  // set up the search close button
-  $('.search .close').click(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 quicknav
-  var quicknav_open = false;
-  $("#btn-quicknav").click(function() {
-    if (quicknav_open) {
-      $(this).removeClass('active');
-      quicknav_open = false;
-      collapse();
-    } else {
-      $(this).addClass('active');
-      quicknav_open = true;
-      expand();
-    }
-  })
-
-  var expand = function() {
-   $('#header-wrap').addClass('quicknav');
-   $('#quicknav').stop().show().animate({opacity:'1'});
-  }
-
-  var collapse = function() {
-    $('#quicknav').stop().animate({opacity:'0'}, 100, function() {
-      $(this).hide();
-      $('#header-wrap').removeClass('quicknav');
-    });
-  }
-
-
-  //Set up search
-  $("#search_autocomplete").focus(function() {
-    $("#search-container").addClass('active');
-  })
-  $("#search-container").mouseover(function() {
-    $("#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 = devsite ?
+      location.href.replace(location.hash, '') : 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 /
+    pagePath = pagePath.substr(pagePath.indexOf("/", 6)); // start after intl/ to get last /
   }
 
   if (pagePath.indexOf(SITE_ROOT) == 0) {
@@ -178,82 +50,10 @@
     // Otherwise the page path is already an absolute URL
   }
 
-  // Highlight the header tabs...
-  // highlight Design tab
-  if ($("body").hasClass("design")) {
-    $("#header li.design a").addClass("selected");
-    $("#sticky-header").addClass("design");
-
-  // highlight About tabs
-  } else if ($("body").hasClass("about")) {
-    var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
-    if (rootDir == "about") {
-      $("#nav-x li.about a").addClass("selected");
-    } else if (rootDir == "wear") {
-      $("#nav-x li.wear a").addClass("selected");
-    } else if (rootDir == "tv") {
-      $("#nav-x li.tv a").addClass("selected");
-    } else if (rootDir == "auto") {
-      $("#nav-x li.auto a").addClass("selected");
-    }
-  // highlight Develop tab
-  } else if ($("body").hasClass("develop") || $("body").hasClass("google")) {
-    $("#header li.develop a").addClass("selected");
-    $("#sticky-header").addClass("develop");
-    // In Develop docs, also highlight appropriate sub-tab
-    var rootDir = pagePathOriginal.substring(1,pagePathOriginal.indexOf('/', 1));
-    if (rootDir == "training") {
-      $("#nav-x li.training a").addClass("selected");
-    } else if (rootDir == "guide") {
-      $("#nav-x li.guide a").addClass("selected");
-    } else if (rootDir == "reference") {
-      // If the root is reference, but page is also part of Google Services, select Google
-      if ($("body").hasClass("google")) {
-        $("#nav-x li.google a").addClass("selected");
-      } else {
-        $("#nav-x li.reference a").addClass("selected");
-      }
-    } else if ((rootDir == "tools") || (rootDir == "sdk")) {
-      $("#nav-x li.tools a").addClass("selected");
-    } else if ($("body").hasClass("google")) {
-      $("#nav-x li.google a").addClass("selected");
-    } else if ($("body").hasClass("samples")) {
-      $("#nav-x li.samples a").addClass("selected");
-    }
-
-  // highlight Distribute tab
-  } else if ($("body").hasClass("distribute")) {
-    $("#header li.distribute a").addClass("selected");
-    $("#sticky-header").addClass("distribute");
-
-    var baseFrag = pagePathOriginal.indexOf('/', 1) + 1;
-    var secondFrag = pagePathOriginal.substring(baseFrag, pagePathOriginal.indexOf('/', baseFrag));
-    if (secondFrag == "users") {
-      $("#nav-x li.users a").addClass("selected");
-    } else if (secondFrag == "engage") {
-      $("#nav-x li.engage a").addClass("selected");
-    } else if (secondFrag == "monetize") {
-      $("#nav-x li.monetize a").addClass("selected");
-    } else if (secondFrag == "analyze") {
-      $("#nav-x li.analyze a").addClass("selected");
-    } else if (secondFrag == "tools") {
-      $("#nav-x li.disttools a").addClass("selected");
-    } else if (secondFrag == "stories") {
-      $("#nav-x li.stories a").addClass("selected");
-    } else if (secondFrag == "essentials") {
-      $("#nav-x li.essentials a").addClass("selected");
-    } else if (secondFrag == "googleplay") {
-      $("#nav-x li.googleplay a").addClass("selected");
-    }
-  } else if ($("body").hasClass("about")) {
-    $("#sticky-header").addClass("about");
-  }
-
   // 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 + '"]');
@@ -282,8 +82,8 @@
 
       // 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 = [];
       }
     }
@@ -298,7 +98,7 @@
       $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)
@@ -322,7 +122,7 @@
           $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();
@@ -341,22 +141,27 @@
       }
     } 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
+      $('.content-footer .prev-page-link').append($prevLink.html());
+      $('.content-footer .next-page-link').append($nextLink.html());
     }
 
     if (!startClass && $prevLink.length) {
@@ -370,8 +175,6 @@
 
   }
 
-
-
   // 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');
@@ -392,14 +195,13 @@
 
     var $olClasses  = $('<ol class="class-list"></ol>');
     var $liClass;
-    var $imgIcon;
     var $h2Title;
     var $pSummary;
     var $olLessons;
     var $liLesson;
     $classLinks.each(function(index) {
-      $liClass  = $('<li></li>');
-      $h2Title  = $('<a class="title" href="'+$(this).attr('href')+'"><h2>' + $(this).html()+'</h2><span></span></a>');
+      $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>');
@@ -407,57 +209,24 @@
       $lessons = $(this).closest('li').find('ul li a');
 
       if ($lessons.length) {
-        $imgIcon = $('<img src="'+toRoot+'assets/images/resource-tutorial.png" '
-            + ' width="64" height="64" alt=""/>');
         $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 {
-        $imgIcon = $('<img src="'+toRoot+'assets/images/resource-article.png" '
-            + ' width="64" height="64" alt=""/>');
         $pSummary.addClass('article');
       }
 
-      $liClass.append($h2Title).append($imgIcon).append($pSummary).append($olLessons);
+      $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;
-    var stylesheet = $('link[rel="stylesheet"][class="fullscreen"]');
-    setNavBarLeftPos(); // 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
-    if (sticky) {
-      if ((stylesheet.attr("disabled") == "disabled") || stylesheet.length == 0) {
-        updateSideNavPosition();
-      } else {
-        updateSidenavFullscreenWidth();
-      }
-    }
-    resizeNav();
-  });
-
-
-  var navBarLeftPos;
-  if ($('#devdoc-nav').length) {
-    setNavBarLeftPos();
-  }
-
-
   // 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();
   });
@@ -495,234 +264,41 @@
   $('h2').click(function() {
     var id = $(this).attr('id');
     if (id) {
-      document.location.hash = 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);
-
-
-  // Revise the sidenav widths to make room for the scrollbar
-  // which avoids the visible width from changing each time the bar appears
-  var $sidenav = $("#side-nav");
-  var sidenav_width = parseInt($sidenav.innerWidth());
-
-  $("#devdoc-nav  #nav").css("width", sidenav_width - 4 + "px"); // 4px is scrollbar width
-
-
-  $(".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 */
+      /* 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 */
+      /* 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();
-      });
+      section.children('ul').slideDown(250);
     }
   });
 
@@ -735,28 +311,6 @@
   });
 }
 
-
-/** Create the list of breadcrumb links in the sticky header */
-function buildBreadcrumbs() {
-  var $breadcrumbUl =  $("#sticky-header ul.breadcrumb");
-  // Add the secondary horizontal nav item, if provided
-  var $selectedSecondNav = $("div#nav-x ul.nav-x a.selected").clone().removeClass("selected");
-  if ($selectedSecondNav.length) {
-    $breadcrumbUl.prepend($("<li>").append($selectedSecondNav))
-  }
-  // Add the primary horizontal nav
-  var $selectedFirstNav = $("div#header-wrap ul.nav-x a.selected").clone().removeClass("selected");
-  // If there's no header nav item, use the logo link and title from alt text
-  if ($selectedFirstNav.length < 1) {
-    $selectedFirstNav = $("<a>")
-        .attr('href', $("div#header .logo a").attr('href'))
-        .text($("div#header .logo img").attr('alt'));
-  }
-  $breadcrumbUl.prepend($("<li>").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)
@@ -772,6 +326,8 @@
   }
 
   var $selListItem;
+  var breadcrumb = [];
+
   if ($selNavLink.length) {
     // Find this page's <li> in sidenav and set selected
     $selListItem = $selNavLink.closest('li');
@@ -781,8 +337,20 @@
     $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() {
@@ -790,56 +358,6 @@
   $('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);
-  setNavBarLeftPos();
-  resizeNav(delay);
-  updateSideNavPosition();
-  setTimeout(initSidenavHeightResize,delay);
-}
-
-
-function setNavBarLeftPos() {
-  navBarLeftPos = $('#body-content').offset().left;
-}
-
-
-function updateSideNavPosition() {
-  var newLeft = $(window).scrollLeft() - navBarLeftPos;
-  $('#devdoc-nav').css({left: -newLeft});
-  $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('margin-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
@@ -849,192 +367,23 @@
   isMobile = true;
 }
 
-
 $(document).ready(function() {
   $("pre:not(.no-pretty-print)").addClass("prettyprint");
   prettyPrint();
 });
 
-
-
-
-/* ######### RESIZE THE SIDENAV HEIGHT ########## */
-
-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('margin-top')) || parseInt($nav.css('top'))) + 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 ($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) { setTimeout(reInitScrollbars,300); 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) {
-  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;
-    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) {
@@ -1051,104 +400,16 @@
 }
 
 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() - $('#sticky-header').outerHeight();
-}
-
-/*
- * Displays sticky nav bar on pages when dac header scrolls out of view
- */
-$(window).scroll(function(event) {
-
-  setStickyTop();
-  var hiding = false;
-  var $stickyEl = $('#sticky-header');
-  var $menuEl = $('.menu-container');
-  // Exit if there's no sidenav
-  if ($('#side-nav').length == 0) return;
-  // 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;
-  }
-
-  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;
-  }
-  // 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)) {
-    updateSideNavPosition();
-    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;
-    hiding = true;
-    // make the sidenav static again
-    $('#devdoc-nav')
-        .removeClass('fixed')
-        .css({'width':'auto','margin':''})
-        .prependTo('#side-nav');
-    // delay hide the sticky
-    $menuEl.removeClass('sticky-menu');
-    $stickyEl.fadeOut(250);
-    hiding = false;
-
-    // update the sidenaav position for side scrolling
-    updateSideNavPosition();
-  } else if (!sticky && shouldBeSticky) {
-    sticky = true;
-    $stickyEl.fadeIn(10);
-    $menuEl.addClass('sticky-menu');
-
-    // make the sidenav fixed
-    var width = $('#devdoc-nav').width();
-    $('#devdoc-nav')
-        .addClass('fixed')
-        .css({'width':width+'px'})
-        .prependTo('#body-content');
-
-    // update the sidenaav position for side scrolling
-    updateSideNavPosition();
-
-  } else if (hiding && top < 15) {
-    $menuEl.removeClass('sticky-menu');
-    $stickyEl.hide();
-    hiding = false;
-  }
-  resizeNav(250); // pass true in order to delay the scrollbar re-initialization for performance
-});
-
 /*
  * Manages secion card states and nav resize to conclude loading
  */
@@ -1158,7 +419,7 @@
     // 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'});
@@ -1168,25 +429,8 @@
 
 })();
 
-
-
-
-
-
-
-
-
-
-
-
-
-
 /*      MISC LIBRARY FUNCTIONS     */
 
-
-
-
-
 function toggle(obj, slide) {
   var ul = $("ul:first", obj);
   var li = ul.parent();
@@ -1207,7 +451,6 @@
   }
 }
 
-
 function buildToggleLists() {
   $(".toggle-list").each(
     function(i) {
@@ -1216,12 +459,10 @@
     });
 }
 
-
-
 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
@@ -1229,207 +470,47 @@
     $("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) {
-  var $links = $("#devdoc-nav,#header,#nav-x,.training-nav-top,.content-footer").find("a["+lang+"-lang]");
-  $links.each(function(i){ // for each link with a translation
-    var $link = $(this);
-    if (lang != "en") { // No need to worry about English, because a language change invokes new request
-      // 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);
+  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");
+    $(".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");
+      $(".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')) {
+function toggleExpandable(link, id) {
+  if ($(id).is(':visible')) {
     $(id).slideUp();
     $(link).removeClass('expanded');
   } else {
@@ -1443,10 +524,6 @@
   $(ids).prev('h4').find('a.expandable').removeClass('expanded');
 }
 
-
-
-
-
 /*
  *  Slideshow 1.0
  *  Used on /index.html and /develop/index.html for carousel
@@ -1486,169 +563,164 @@
  *
  */
 
- (function($) {
- $.fn.dacSlideshow = function(o) {
+(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
+    //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 || {});
+    }, o || {});
 
-     //Set up a carousel for each
-     return this.each(function() {
+    //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 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;
+      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"});
+      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;
+      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));
+      li.css({width: li.width(), height: li.height()});
+      ul.css(sizeCss, ulSize + "px").css(animCss, -(curr * liSize));
 
-         div.css(sizeCss, divSize+"px");
+      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);
-             }
-         }
+      //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)
+      //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();
+      //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 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');
-         }
+      function pauseRotateTimer() {
+        clearInterval(timer);
+        $(o.btnPause).addClass('paused');
+      }
 
-         //Go to an item
-         function go(to) {
-             if(!running) {
+      //Go to an item
+      function go(to) {
+        if (!running) {
 
-                 if(to<0) {
-                    to = itemLength-1;
-                 } else if (to>itemLength-1) {
-                    to = 0;
-                 }
-                 curr = to;
+          if (to < 0) {
+            to = itemLength - 1;
+          } else if (to > itemLength - 1) {
+            to = 0;
+          }
+          curr = to;
 
-                 running = true;
+          running = true;
 
-                 ul.animate(
-                     animCss == "left" ? { left: -(curr*liSize) } : { top: -(curr*liSize) } , o.speed, o.easing,
+          ul.animate(
+              animCss == "left" ? {left: -(curr * liSize)} : {top: -(curr * liSize)} , o.speed, o.easing,
                      function() {
-                         running = false;
+                       running = false;
                      }
                  );
 
-                 $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
-                 $( (curr-o.scroll<0 && o.btnPrev)
-                     ||
-                    (curr+o.scroll > itemLength && o.btnNext)
-                     ||
-                    []
-                  ).addClass("disabled");
+          $(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');
 
-                 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');
+  };
 
-             }
-             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);
-
+})(jQuery);
 
 /*
  *  dacSlideshow 1.0
@@ -1687,1099 +759,68 @@
  *  pagination: whether or not to include dotted pagination
  *
  */
- (function($) {
- $.fn.dacTabbedList = function(o) {
+(function($) {
+  $.fn.dacTabbedList = function(o) {
 
-     //Options - see above
-     o = $.extend({
-         speed : 250,
-         easing: null,
-         nav_id: null,
-         frame_id: null
-     }, 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() {
+    //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 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) {
+      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);
-
-
-
-
-
-/* ######################################################## */
-/* ################  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.dummy').show();
-      $('.suggest-card.reference').show();
-      var listIndex = 0; // list index position
-
-      // reset the lists
-      $(".search_filtered_wrapper.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();
-      $('.suggest-card.dummy').hide();
-    }
-
-    // ########### JD DOC RESULTS #############
-    if (gDocsMatches.length > 0) {
-        // reset the lists
-        $(".search_filtered_wrapper.docs 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 {
-      $('.search_filtered_wrapper.docs .suggest-card:not(.dummy)').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) {
-          // Regex to match only the beginning of a word
-          var textRegex = new RegExp("\\b" + text.toLowerCase(), "g");
-
-
-          // 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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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().match(textRegex)) {
-                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;
+  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');
+  };
 
-    // 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;");
-}
-
-
-
-
-
-
+})(jQuery);
 
 /* ######################################################## */
 /* #################  JAVADOC REFERENCE ################### */
@@ -2787,14 +828,13 @@
 
 /* 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)) {
+  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()
-      });
+    });
   }
 }
 
@@ -2802,45 +842,6 @@
 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));
@@ -2854,15 +855,15 @@
     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)
+  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);
+  var selectedLevelItem = $("#apiLevelSelector option[value='" + userApiLevel + "']").get(0);
+  selectedLevelItem.setAttribute('selected', true);
 }
 
 function changeApiLevel() {
@@ -2875,30 +876,29 @@
   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>");
+    $("#naMessage").show().html("<div><p><strong>This API" +
+              " 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);
+  var apis = $(".api", context);
   apis.each(function(i) {
     var obj = $(this);
     var className = obj.attr("class");
-    var apiLevelIndex = className.lastIndexOf("-")+1;
+    var apiLevelIndex = className.lastIndexOf("-") + 1;
     var apiLevelEndIndex = className.indexOf(" ", apiLevelIndex);
     apiLevelEndIndex = apiLevelEndIndex != -1 ? apiLevelEndIndex : className.length;
     var apiLevel = className.substring(apiLevelIndex, apiLevelEndIndex);
@@ -2911,241 +911,30 @@
     var selectedLevelNum = parseInt(selectedLevel)
     var apiLevelNum = parseInt(apiLevel);
     if (isNaN(apiLevelNum)) {
-        apiLevelNum = maxLevel;
+      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");
+      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)
-{
+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");
@@ -3157,8 +946,7 @@
   get_google_node(me, me.node);
 }
 
-function new_google_node(me, mom, text, link, children_data, api_level)
-{
+function new_google_node(me, mom, text, link, children_data, api_level) {
   var node = new Object();
   var child;
   node.children = Array();
@@ -3176,28 +964,25 @@
 
   mom.get_children_ul().appendChild(node.li);
 
-
-  if(link) {
+  if (link) {
     child = document.createElement("a");
 
-  }
-  else {
+  } else {
     child = document.createElement("span");
     child.className = "tree-list-subtitle";
 
   }
   if (children_data != null) {
-    node.li.className="nav-section";
+    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 {
+  } else {
     node.li.appendChild(child);
   }
-  if(link) {
+  if (link) {
     child.href = me.toroot + link;
   }
   node.label = document.createTextNode(text);
@@ -3208,27 +993,21 @@
   return node;
 }
 
-function get_google_node(me, mom)
-{
+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"){
+    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]);
+    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
 
@@ -3238,9 +1017,8 @@
 var NODE_TAGS = 3;
 var NODE_CHILDREN = 4;
 
-function init_google_navtree2(navtree_id, data)
-{
-  var $containerUl = $("#"+navtree_id);
+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));
@@ -3249,23 +1027,22 @@
   // Make all third-generation list items 'sticky' to prevent them from collapsing
   $containerUl.find('li li li.nav-section').addClass('sticky');
 
-  initExpandableNavItems("#"+navtree_id);
+  initExpandableNavItems("#" + navtree_id);
 }
 
-function new_google_node2(node_data)
-{
+function new_google_node2(node_data) {
   var linkText = node_data[NODE_NAME];
-  if(linkText.match("^"+"com.google.android")=="com.google.android"){
+  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>');
+    $a = $('<a href="' + toRoot + node_data[NODE_HREF] + '" title="' + linkText + '" >' +
+        linkText + '</a>');
   } else {
-    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >'
-        + linkText + '/</a>');
+    $a = $('<a href="#" onclick="return false;" title="' + linkText + '" >' +
+        linkText + '/</a>');
   }
   var $childUl = $('<ul>');
   if (node_data[NODE_CHILDREN] != null) {
@@ -3284,16 +1061,6 @@
   return $li;
 }
 
-
-
-
-
-
-
-
-
-
-
 function showGoogleRefTree() {
   init_default_google_navtree(toRoot);
   init_default_gcm_navtree(toRoot);
@@ -3302,49 +1069,22 @@
 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();
-      }
+    // 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();
-          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();
-          }
-      }
+    // when the file is loaded, initialize the tree
+    if (jqxhr.status === 200) {
+      init_google_navtree("gcm-tree-list", toroot, GCM_NAVTREE_DATA);
+      highlightSidenav();
+    }
   });
 }
 
@@ -3356,25 +1096,25 @@
  *                '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;
+  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)
@@ -3386,12 +1126,12 @@
   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 ) {
+  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) ) {
+  } else if ((expand == null && a.text() == "[Collapse]") || (expand == false)) {
     expandos.each(function(i) {
       toggleInherited(this, false);
     });
@@ -3428,25 +1168,19 @@
   $("#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
+$(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 */
@@ -3470,40 +1204,39 @@
     // highlight the line when hovering on the number
     $("#codesample-line-numbers a.number").mouseover(function() {
       var id = $(this).attr('href');
-      $(id).css('background','#e7e7e7');
+      $(id).css('background', '#e7e7e7');
     });
     $("#codesample-line-numbers a.number").mouseout(function() {
       var id = $(this).attr('href');
-      $(id).css('background','none');
+      $(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;} );
+$(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);
-    }
+  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() {
@@ -3514,16 +1247,14 @@
   $selectedLi = $("#nav li.selected");
 
   $selectedLi.children("ul").children("li").each(function() {
-      var $li = $("<li>").append($(this).find("a").first().clone());
-      $ul.append($li);
+    var $li = $("<li>").append($(this).find("a").first().clone());
+    $ul.append($li);
   });
 
   $("#samples").append($ul);
 
 }
 
-
-
 /* ########################################################## */
 /* ###################  RESOURCE CARDS  ##################### */
 /* ########################################################## */
@@ -3532,93 +1263,93 @@
     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() {
-    $('.resource-widget').each(function() {
-      initResourceWidget(this);
-    });
+    // Need to initialize hero carousel before other sections for dedupe
+    // to work correctly.
+    $('[data-carousel-query]').dacCarouselQuery();
 
-    /* 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 15px line height.
-    var lineHeight = 15;
-    $('.card-info .text').ellipsisfade(lineHeight);
+    // Iterate over all instances and initialize a resource widget.
+    $('.resource-widget').resourceWidget();
   });
 
-  /*
-    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');
-
-    // find size of widget by pulling out its class name
-    var sizeCols = 1;
-    var m = $widget.get(0).className.match(/\bcol-(\d+)\b/);
-    if (m) {
-      sizeCols = parseInt(m[1], 10);
-    }
-
-    var opts = {
-      cardSizes: ($widget.data('cardsizes') || '').split(','),
-      maxResults: parseInt($widget.data('maxresults') || '100', 10),
-      itemsPerPage: $widget.data('itemsperpage'),
-      sortOrder: $widget.data('sortorder'),
-      query: $widget.data('query'),
-      section: $widget.data('section'),
-      sizeCols: sizeCols,
+  $.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: $widget.data('resourcestyle') || 'card',
-      stackSort: $widget.data('stacksort') || 'true'
+      resourceStyle: this.data('resourcestyle') || 'card',
+      stackSort: this.data('stacksort') || 'true',
+      // For filter based resources
+      allowDuplicates: this.data('allow-duplicates') || 'false'
     };
+  };
 
-    // run the search for the set of resources to show
+  $.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;
+  }
 
-    var resources = buildResourceList(opts);
+  /*
+   * 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) {
-      /* 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*/);
+      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 = true; //always show plusone on carousel
+    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 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);
+        .decorateResourceCard(resources[i], plusone);
 
       $('<li>').css(css)
           .append($card)
@@ -3634,7 +1365,7 @@
       btnPrev: '.slideshow-prev',
       btnNext: '.slideshow-next'
     });
-  };
+  }
 
   /* Initializes a Resource Card Stack Widget (column-based layout)
      Modified by LFL 6/6/14
@@ -3642,11 +1373,10 @@
   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 = true; //by default show plusone on section cards
+    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')
@@ -3657,21 +1387,21 @@
 
     // Extract any subsections that are actually resource cards
     if (sections) {
-      for (var i = 0; i < sections.length; ++i) {
+      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]
+              .decorateResourceCard(sections[i].resource, plusone)[0]
           );
 
         } else {
           cards.push(
             $('<div>')
               .addClass('resource-card section-card-menu')
-              .decorateResourceSection(sections[i],plusone)[0]
+              .decorateResourceSection(sections[i], plusone)[0]
           );
         }
       }
@@ -3679,7 +1409,7 @@
 
     cards = cards.concat(sectionResources);
 
-    for (var i = 0; i < resources.length; ++i) {
+    for (i = 0; i < resources.length; ++i) {
       var $card = createResourceElement(resources[i], opts);
 
       if (opts.resourceStyle.indexOf('related') > -1) {
@@ -3689,8 +1419,8 @@
       cards.push($card[0]);
     }
 
-    if (opts.stackSort != 'false') {
-      for (var i = 0; i < cards.length; ++i) {
+    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();
@@ -3707,8 +1437,7 @@
         $stacks[minIndex].append($(cards[i]));
       }
     }
-
-  };
+  }
 
   /*
     Create a resource card using the given resource object and a list of html
@@ -3721,7 +1450,7 @@
     // 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') {
+    if (opts.resourceStyle === 'generic') {
       $el = $('<div>')
         .addClass('resource')
         .attr('href', cleanUrl(resource.url))
@@ -3738,21 +1467,63 @@
     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();
-    var cardSizes = opts.cardSizes || ['6x6'];
-    var i = 0, j = 0;
-    var plusone = true; // by default show plusone on resource cards
+    // We'll be doing our own modifications to opts.
+    opts = $.extend({}, opts);
 
-    while (i < resources.length) {
+    $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+$/,'');
-      // Some card sizes do not get a plusone button, such as where space is constrained
-      // or for cards commonly embedded in docs (to improve overall page speed).
-      plusone = !((cardSize == "6x2") || (cardSize == "6x3") ||
-                  (cardSize == "9x2") || (cardSize == "9x3") ||
-                  (cardSize == "12x2") || (cardSize == "12x3"));
+      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+)/);
@@ -3762,8 +1533,8 @@
       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($widget);
+        $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
@@ -3773,11 +1544,11 @@
         var $card = createResourceElement(resources[i], opts, plusone);
 
         $card.addClass('resource-card-' + cardSize +
-          ' resource-card-' + resource.type);
+          ' resource-card-' + resource.type.toLowerCase());
 
         if (isStack) {
           $card.addClass('resource-card-' + isStack[1] + 'x' + isStack[2]);
-          if (++stackCount == parseInt(isStack[3])) {
+          if (++stackCount === parseInt(isStack[3])) {
             $card.addClass('resource-card-row-stack-last');
             stackCount = 0;
           }
@@ -3785,10 +1556,49 @@
           stackCount = 0;
         }
 
-        $card.appendTo($stackDiv || $widget);
+        $card.appendTo($stackDiv || column);
 
-      } while (++i < resources.length && stackCount > 0);
+      } while (++i < max && stackCount > 0);
+
+      // Record number of pages viewed in analytics.
+      if (!firstPage) {
+        var clicks = Math.ceil((i - initialResults) / opts.itemsPerPage);
+        ga('send', '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);
+
+    ga('send', '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. */
@@ -3799,134 +1609,7 @@
     return [];
   }
 
-  function buildResourceList(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++) {
-        // console.log(resources[j].title);
-        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 !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)
-  {
+  function cleanUrl(url) {
     if (url && url.indexOf('//') === -1) {
       url = toRoot + url;
     }
@@ -3934,53 +1617,16 @@
     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;
-  }
+  // 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.
@@ -4009,10 +1655,10 @@
     return $description;
   }
 
-
   /* Simple jquery function to create dom for a standard resource card */
-  $.fn.decorateResourceCard = function(resource,plusone) {
-    var section = resource.group || resource.type;
+  $.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';
 
@@ -4020,6 +1666,12 @@
       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') + ')')
@@ -4027,7 +1679,8 @@
 
     $('<div>').addClass('card-info' + (!resource.summary ? ' empty-desc' : ''))
       .append($('<div>').addClass('section').text(section))
-      .append($('<div>').addClass('title').html(resource.title))
+      .append($('<div>').addClass('title' + (resource.title_highlighted ? ' highlighted' : ''))
+        .html(resource.title_highlighted || resource.title))
       .append(buildResourceCardDescription(resource, plusone))
       .appendTo(this);
 
@@ -4035,7 +1688,7 @@
   };
 
   /* Simple jquery function to create dom for a resource section card (menu) */
-  $.fn.decorateResourceSection = function(section,plusone) {
+  $.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;
@@ -4113,9 +1766,6 @@
     return this;
   };
 
-
-
-
   /* Render other types of resource styles that are not cards. */
   $.fn.decorateResource = function(resource, opts) {
     var imgUrl = resource.image ||
@@ -4134,7 +1784,7 @@
       $('<div>').addClass('image')
         .css('background-image', 'url(' + imgUrl + ')'),
       $('<div>').addClass('info').append(
-        $('<h4>').addClass('title').html(resource.title),
+        $('<h4>').addClass('title').html(resource.title_highlighted || resource.title),
         $('<p>').addClass('summary').html(resource.summary),
         $('<a>').attr('href', linkUrl).addClass('cta').html('Learn More')
       )
@@ -4144,31 +1794,6 @@
   };
 })(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).height();
-                remainingHeight = remainingHeight - h;
-              }
-            });
-
-            adjustedRemainingHeight = ((remainingHeight)/lineHeight>>0)*lineHeight
-            $this.parent().css({'height': adjustedRemainingHeight});
-            $this.css({'height': "auto"});
-        });
-
-        return this;
-    };
-}) (jQuery);
-
 /*
   Fullscreen Carousel
 
@@ -4259,10 +1884,6 @@
   }
 })();
 
-
-
-
-
 /*
   Tab Carousel
 
@@ -4354,3 +1975,4584 @@
     }
   }
 })();
+
+/**
+ * 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 {
+      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 = 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);
+    }
+    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;
+        }
+      }.bind(this));
+    };
+
+    return {
+      getReader: function() {
+        if (!reader) {
+          reader = new BlogReader();
+        }
+        return reader;
+      }
+    };
+  })();
+
+  var blogReader = BlogReader.getReader();
+
+  function wrapLinkWithReader(e) {
+    var el = $(e.currentTarget);
+    if (el.hasClass('dac-modal-header-open')) {
+      return;
+    }
+
+    // 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;
+      }
+
+      // Setup the first time it's used
+      if (!blogReader.doneSetup) {
+        blogReader.setup();
+      }
+
+      e.preventDefault();
+      blogReader.showPost(blogName, postPath);
+    }
+  }
+
+  $(document).on('click.blog-reader', 'a[href*="blogspot.com/"]', wrapLinkWithReader);
+})(jQuery, window);
+
+(function($) {
+  $.fn.debounce = function(func, wait, immediate) {
+    var timeout;
+
+    return function() {
+      var context = this;
+      var args = arguments;
+
+      var later = function() {
+        timeout = null;
+        if (!immediate) {
+          func.apply(context, args);
+        }
+      };
+
+      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;
+  };
+
+  /* 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);
+
+/* Filter */
+(function($) {
+  'use strict';
+
+  /**
+   * 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>';
+
+  /**
+   * 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);
+  };
+
+  /**
+   * Initialize a Filter component.
+   */
+  Filter.prototype.init = function() {
+    this.containerEl_ = $(this.options.filter);
+
+    // Setup data settings
+    this.data_ = {};
+    this.data_.chips = {};
+    this.data_.options = this.containerEl_.widgetOptions();
+    this.data_.all = window.metadata.query(this.data_.options);
+
+    // 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];
+  };
+
+  /**
+   * 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));
+  };
+
+  /**
+   * 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;
+
+      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));
+      }
+
+      item.append(checkbox);
+    });
+
+    this.chipsEl_.append(chips);
+  };
+
+  /**
+   * 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;
+        }
+      }
+    });
+
+    return [types, tags, categories];
+  };
+
+  /**
+   * 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;
+      }
+
+      for (var tagIndex = 0; shouldAddResource && tagIndex < tags.length; tagIndex++) {
+        tag = tags[tagIndex];
+        shouldAddResource = resource.tags.indexOf(tag) > -1;
+      }
+
+      if (shouldAddResource) {
+        resources.push(resource);
+      }
+    }
+
+    return resources;
+  };
+
+  /**
+   * 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);
+  };
+
+  /**
+   * Handle filter item state change.
+   * @param {Event} event - Change event
+   * @private
+   */
+  Filter.prototype.toggleCheckboxHandler_ = function(event) {
+    this.changeStateForCheckbox(event.currentTarget);
+  };
+
+  /**
+   * Redraw resource view based on new state.
+   * @param checkbox
+   */
+  Filter.prototype.changeStateForCheckbox = function(checkbox) {
+    var item = $(checkbox).parent();
+
+    if (checkbox.checked) {
+      this.chipsEl_.append(this.chipForItem(item));
+      ga('send', 'event', 'Filters', 'Check', $(checkbox).val());
+    } else {
+      item.data('chip.dac-filter').remove();
+      this.addToItemValue(item, -1);
+      ga('send', 'event', 'Filters', 'Uncheck', $(checkbox).val());
+    }
+
+    this.draw_(this.filteredResources());
+  };
+
+  /**
+   * jQuery plugin
+   */
+  $.fn.dacFilter = function() {
+    return this.each(function() {
+      var el = $(this);
+      new Filter(el, el.data());
+    });
+  };
+
+  /**
+   * Data Attribute API
+   */
+  $(function() {
+    $('[data-filter]').dacFilter();
+  });
+})(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);
+
+(function($) {
+  'use strict';
+
+  /**
+   * @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;
+    }
+
+    // Cache navigation resources
+    this.selected = $(selected);
+    this.selectedParent = this.selected.closest('.dac-nav-secondary').siblings('a');
+
+    // Build the breadcrumb list.
+    this.init();
+  }
+
+  Crumbs.DEFAULTS_ = {
+    container: '.dac-header-crumbs',
+    crumbItem: $('<li class="dac-header-crumbs-item">'),
+    linkClass: 'dac-header-crumbs-link'
+  };
+
+  Crumbs.prototype.init = function() {
+    Crumbs.buildCrumbForLink(this.selected.clone()).appendTo(this.el);
+
+    if (this.selectedParent.length) {
+      Crumbs.buildCrumbForLink(this.selectedParent.clone()).prependTo(this.el);
+    }
+
+    // Reveal the breadcrumbs
+    this.el.addClass('dac-has-content');
+  };
+
+  /**
+   * Build a HTML structure for a breadcrumb.
+   * @param {string} link
+   * @return {jQuery}
+   */
+  Crumbs.buildCrumbForLink = function(link) {
+    link.find('br').replaceWith(' ');
+
+    var crumbLink = $('<a>')
+      .attr('class', Crumbs.DEFAULTS_.linkClass)
+      .attr('href', link.attr('href'))
+      .text(link.text());
+
+    return Crumbs.DEFAULTS_.crumbItem.clone().append(crumbLink);
+  };
+
+  /**
+   * jQuery plugin
+   */
+  $.fn.dacCrumbs = function(options) {
+    return this.each(function() {
+      new Crumbs(this, options);
+    });
+  };
+})(jQuery);
+
+(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();
+  }
+
+  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));
+  };
+
+  SearchInput.prototype.setActiveState = function() {
+    var that = this;
+
+    this.clear.addClass(this.options.hiddenClass);
+    this.body.addClass(this.options.searchModeClass);
+    this.checkInputValue();
+
+    // Set icon to black after background has faded to white.
+    setTimeout(function() {
+      that.icon.addClass(that.options.activeIconClass);
+    }, this.options.transitionDuration);
+  };
+
+  SearchInput.prototype.unsetActiveStateHandler_ = function(event) {
+    event.preventDefault();
+    this.unsetActiveState();
+  };
+
+  SearchInput.prototype.unsetActiveState = function() {
+    this.icon.removeClass(this.options.activeIconClass);
+    this.clear.addClass(this.options.hiddenClass);
+    this.body.removeClass(this.options.searchModeClass);
+  };
+
+  SearchInput.prototype.clearInput = function(event) {
+    event.preventDefault();
+    this.input.val('');
+    this.clear.addClass(this.options.hiddenClass);
+  };
+
+  SearchInput.prototype.checkInputValue = function() {
+    if (this.input.val().length) {
+      this.clear.removeClass(this.options.hiddenClass);
+    } else {
+      this.clear.addClass(this.options.hiddenClass);
+    }
+  };
+
+  /**
+   * 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);
+
+/* global METADATA */
+(function($) {
+  function DacCarouselQuery(el) {
+    el = $(el);
+
+    var opts = el.data();
+    opts.maxResults = parseInt(opts.maxResults || '100', 10);
+    opts.query = opts.carouselQuery;
+    var resources = window.metadata.query(opts);
+
+    el.empty();
+    $(resources).each(function() {
+      var resource = $.extend({}, this, METADATA.carousel[this.url]);
+      el.dacHero(resource);
+    });
+
+    // Pagination element.
+    el.append('<div class="dac-hero-carousel-pagination"><div class="wrap" data-carousel-pagination>');
+
+    el.dacCarousel();
+  }
+
+  // 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);
+
+/* global toRoot */
+
+(function($) {
+  // Ordering matters
+  var TAG_MAP = [
+    {from: 'developerstory', to: 'Android Developer Story'},
+    {from: 'googleplay', to: 'Google Play'}
+  ];
+
+  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">');
+
+    // inline image column
+    var rightCol = $('<div class="col-1of2 col-push-1of2 dac-hero-figure">')
+      .appendTo(cols);
+
+    if ((!fullBleed || isSearch) && 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());
+    el.append(slide);
+  }
+
+  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.dacHero = function(resource, isSearch) {
+    return this.each(function() {
+      var el = $(this);
+      return new DacHero(el, resource, isSearch);
+    });
+  };
+})(jQuery);
+
+(function($) {
+  'use strict';
+
+  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);
+
+    // 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;
+    }
+
+    // Rename query
+    this.el.data('query', this.el.data('history-query'));
+
+    // jQuery method to populate cards.
+    this.el.resourceWidget();
+  }
+
+  /**
+   * Fetch from localStorage an array of visted pages
+   * @returns {Array}
+   */
+  function getVisitedPages() {
+    var visited = localStorage.getItem('visited-pages');
+    return visited ? JSON.parse(visited) : [];
+  }
+
+  /**
+   * 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};
+  }
+
+  /**
+   * Add current page to back of visited array, increase hit count by 1.
+   */
+  function addCurrectPage() {
+    var path = location.pathname;
+
+    // Do not track frontpage visits.
+    if (path === '/' || path === '/index.html') {return;}
+
+    var pages = getVisitedPages();
+    var page = getPageForPath(pages, path);
+
+    // New page visits have no hit count.
+    page.hit = ~~page.hit + 1;
+
+    // Most recently visted pages are located at the end of the visited array.
+    pages.push(page);
+
+    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)));
+      }
+    });
+  };
+
+  $(function() {
+    $('[data-history-query]').dacHistoryQuery();
+    // Do not block page rendering.
+    setTimeout(addCurrectPage, 0);
+  });
+})(jQuery);
+
+/* ############################################ */
+/* ##########     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;
+  }
+}
+
+function changeLangPref(targetLang, submit) {
+  window.writeCookie('pref_lang', targetLang, null);
+//DD
+  $('#language').find('option[value="' + targetLang + '"]').attr('selected', true);
+  //  #######  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 (window.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);
+    }
+  }
+}
+// Redundant usage to appease jshint.
+window.changeLangPref = changeLangPref;
+
+(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'
+  ];
+
+  /**
+   * 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 localeTarget = locale;
+    if (window.devsite) {
+      if (getQueryVariable('hl')) {
+        var target = getQueryVariable('hl');
+        if (!(target === 0) || (LANGUAGES.indexOf(target) === -1)) {
+          localeTarget = target;
+        }
+      }
+    } else {
+      if (location.pathname.substring(0,6) == "/intl/") {
+        var target = location.pathname.split('/')[2];
+        if (!(target === 0) || (LANGUAGES.indexOf(target) === -1)) {
+          localeTarget = target;
+        }
+      }
+    }
+
+    return localeTarget;
+  })();
+
+  /**
+   * Global function shims for backwards compatibility
+   */
+  window.changeNavLang = function() {
+    // Already done.
+  };
+
+  window.loadLangPref = function() {
+    // Languages pref already loaded.
+  };
+
+  window.getLangPref = function() {
+    return locale;
+  };
+
+  window.getLangTarget = function() {
+    return localeTarget;
+  };
+
+  // Expose polyglot instance for advanced localization.
+  var polyglot = window.polyglot = new window.Polyglot({
+    locale: locale,
+    phrases: PHRASES
+  });
+
+  // When DOM is ready.
+  $(function() {
+    // Mark current locale in language picker.
+    $('#language').find('option[value="' + locale + '"]').attr('selected', true);
+
+    $('html').dacTranslate().on('dac:domchange', function(e) {
+      $(e.target).dacTranslate();
+    });
+  });
+
+  $.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'));
+      });
+    }
+
+    // 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';
+
+  function Modal(el, options) {
+    this.el = $(el);
+    this.options = $.extend({}, options);
+    this.isOpen = false;
+
+    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));
+
+    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;
+    // 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();
+    }
+  };
+
+  Modal.prototype.open_ = function() {
+    this.el.addClass('dac-active');
+    $('body').addClass('dac-modal-open');
+    this.isOpen = true;
+  };
+
+  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');
+  }
+
+  /**
+   * 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) {
+      $(location.hash + '[data-modal-toggle]').trigger('click');
+    }
+
+    if (window.getLangTarget() !== window.getLangPref()) {
+          $('#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;");
+    }
+  });
+})(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'
+  };
+
+  /**
+   * Event listener for toggling fullscreen mode
+   * @param {MouseEvent} event
+   * @private
+   */
+  Fullscreen.prototype.toggleHandler_ = function(event) {
+    event.stopPropagation();
+    this.toggle(!this.isFullscreen, true);
+  };
+
+  /**
+   * 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);
+  };
+
+  /**
+   * 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_();
+  };
+
+  /**
+   * jQuery plugin
+   */
+  $.fn.dacFullscreen = function() {
+    return this.each(function() {
+      new Fullscreen($(this));
+    });
+  };
+})(jQuery);
+
+(function($) {
+  'use strict';
+
+  /**
+   * @param {HTMLElement} selected - The link that is selected in the nav.
+   * @constructor
+   */
+  function HeaderTabs(selected) {
+
+    // Don't highlight any tabs on the index page
+    if (location.pathname === '/index.html' || location.pathname === '/') {
+      //return;
+    }
+
+    this.selected = $(selected);
+    this.selectedParent = this.selected.closest('.dac-nav-secondary').siblings('a');
+    this.links = $('.dac-header-tabs a');
+
+    this.selectActiveTab();
+  }
+
+  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);
+    });
+  };
+})(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)
+    .on('click', swap_);
+
+  /**
+   * @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')
+  }
+
+  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);
+
+    updateStore(icon);
+  }
+
+  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', handleSubNavToggle_);
+
+  }
+
+  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;
+
+      // TODO: Should read from localStorage
+      var visible = body.hasClass(landingPageClass) || expanded;
+
+      icon.data('sub-navigation.dac', subNav);
+      icon.toggleClass('dac-expand-less-black', visible);
+      icon.toggleClass('dac-expand-more-black', !visible);
+      subNav.toggle(visible);
+    };
+  }
+
+  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));
+    });
+  };
+})(jQuery);
+
+/* global NAVTREE_DATA */
+(function($) {
+  /**
+   * Build the reference navigation with namespace dropdowns.
+   * @param {jQuery} el - The DOM element.
+   */
+  function buildReferenceNav(el) {
+    var namespaceList = el.find('[data-reference-namespaces]');
+    var resources = el.find('[data-reference-resources]');
+    var selected = namespaceList.find('.selected');
+
+    // Links should be toggleable.
+    namespaceList.find('a').addClass('dac-reference-nav-toggle dac-closed');
+
+    // Load in all resources
+    $.getScript('/navtree_data.js', 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);
+
+    // Currently viewing Overview
+    if (location.pathname === overview.attr('href')) {
+      overview.parent().addClass('selected');
+    }
+
+    // Open currently selected resource
+    var listsToOpen = selected.children().eq(1);
+    listsToOpen = listsToOpen.add(listsToOpen.find('.selected').parent()).show();
+
+    // Mark dropdowns as open
+    listsToOpen.prev().removeClass('dac-closed');
+
+    // Scroll into view
+    namespaceList.scrollIntoView(selected);
+  }
+
+  /**
+   * Handles the toggling of resources.
+   * @param {Event} event
+   */
+  function toggleResourcesHandler(event) {
+    event.preventDefault();
+    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());
+    }
+
+    el.toggleClass('dac-closed').next().slideToggle(200);
+  }
+
+  /**
+   * @param {String} namespace
+   * @returns {Array} namespace data
+   */
+  function getDataForNamespace(namespace) {
+    var namespaceData = NAVTREE_DATA.filter(function(data) {
+      return data[0] === namespace;
+    });
+
+    return namespaceData.length ? namespaceData[0][2] : [];
+  }
+
+  /**
+   * 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>';
+  }
+
+  /**
+   * 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>';
+  }
+
+  /**
+   * Build a resources view
+   * @param {Array} data
+   * @returns {jQuery} resources in an unordered list.
+   */
+  function buildResourcesViewForData(data) {
+    return $('<ul>' + data.map(buildResourceList).join('') + '</ul>');
+  }
+
+  /**
+   * 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')
+        .addClass('dac-reference-nav-toggle dac-closed')
+        .on('click', toggleResourcesHandler)
+      .end()
+        .add(resources.find('ul'))
+        .addClass('dac-reference-nav-resources')
+      .end()
+        .appendTo(view);
+
+    return overview;
+  }
+
+  /**
+   * jQuery plugin
+   */
+  $.fn.dacReferenceNav = function() {
+    return this.each(function() {
+      buildReferenceNav($(this));
+    });
+  };
+})(jQuery);
+
+/** 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;
+    }
+
+    // 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));
+    }
+  }
+};
+
+(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('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('studio')) {
+      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')) {
+      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 ((urlSegments[1] === 'tools') || (urlSegments[1] === 'sdk')) {
+        selected = subNavEl.find('li.tools > 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);
+
+(function($) {
+  'use strict';
+
+  /**
+   * 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));
+  }
+
+  ToggleNav.BREAKPOINT_ = 980;
+
+  /**
+   * Open on correct sizes
+   */
+  function toggleSidebarVisibility(body) {
+    var wasClosed = ('' + localStorage.getItem('navigation-open')) === 'false';
+
+    if (wasClosed) {
+      body.removeClass(ToggleNav.DEFAULTS_.activeClass);
+    } else if (window.innerWidth >= ToggleNav.BREAKPOINT_) {
+      body.addClass(ToggleNav.DEFAULTS_.activeClass);
+    } else {
+      body.removeClass(ToggleNav.DEFAULTS_.activeClass);
+    }
+  }
+
+  /**
+   * ToggleNav Default Settings
+   * @type {{body: boolean, dimmer: string, navigation: string, activeClass: string}}
+   * @private
+   */
+  ToggleNav.DEFAULTS_ = {
+    body: true,
+    dimmer: '.dac-nav-dimmer',
+    animatingClass: 'dac-nav-animating',
+    navigation: '[data-dac-nav]',
+    activeClass: 'dac-nav-open'
+  };
+
+  /**
+   * The actual toggle logic.
+   * @param {Event} event
+   * @private
+   */
+  ToggleNav.prototype.clickHandler_ = function(event) {
+    event.preventDefault();
+    var animatingClass = this.options.animatingClass;
+    var body = this.body;
+
+    body.addClass(animatingClass);
+    body.toggleClass(this.options.activeClass);
+
+    setTimeout(function() {
+      body.removeClass(animatingClass);
+    }, this.navigation_.transitionDuration());
+
+    if (window.innerWidth >= ToggleNav.BREAKPOINT_) {
+      localStorage.setItem('navigation-open', body.hasClass(this.options.activeClass));
+    }
+  };
+
+  /**
+   * jQuery plugin
+   * @param  {object} options - Override default options.
+   */
+  $.fn.dacToggleMobileNav = function() {
+    return this.each(function() {
+      var el = $(this);
+      new ToggleNav(el, el.data());
+    });
+  };
+
+  $.fn.dacSidebarToggle = function(body) {
+    toggleSidebarVisibility(body);
+    $(window).on('resize', toggleSidebarVisibility.bind(null, body));
+  };
+
+  /**
+   * Data Attribute API
+   */
+  $(function() {
+    $('[data-dac-toggle-nav]').dacToggleMobileNav();
+  });
+})(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.el.find('[data-newsletter-language]').val(window.polyglot.t('newsletter.languageVal'));
+    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);
+
+/* 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);
+  }
+
+  /**
+   * 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 map;
+  }
+
+  /**
+   * 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];
+    }
+  }
+
+  /**
+   * 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);
+      }
+
+      // 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);
+        }
+      }
+
+      // Index by category.
+      var category = res.category;
+      if (category) {
+        byCategory[category] = byCategory[category] || [];
+        byCategory[category].push(res);
+      }
+
+      // 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);
+  }
+
+  return function() {
+    // Only once.
+    if (METADATA.all) { return; }
+
+    // Get current language.
+    var locale = getLangPref();
+
+    // Merge english resources.
+    METADATA.all = mergeArrays(
+      METADATA.en.about,
+      METADATA.en.design,
+      METADATA.en.distribute,
+      METADATA.en.develop,
+      YOUTUBE_RESOURCES,
+      BLOGGER_RESOURCES,
+      METADATA.en.extras
+    );
+
+    // Merge local language resources.
+    if (locale !== 'en' && METADATA[locale]) {
+      METADATA.all = mergeArrays(
+        METADATA.all,
+        METADATA[locale].about,
+        METADATA[locale].design,
+        METADATA[locale].distribute,
+        METADATA[locale].develop,
+        METADATA[locale].extras
+      );
+    }
+
+    mergeMetadataMap('collections', locale);
+    mergeMetadataMap('searchHeroCollections', locale);
+    mergeMetadataMap('carousel', locale);
+
+    // Create query indicies for resources.
+    createIndices(METADATA.all, locale);
+
+    // Reference metadata.
+    METADATA.androidReference = window.DATA;
+    METADATA.googleReference = mergeArrays(window.GMS_DATA, window.GCM_DATA);
+  };
+})();
+
+/* 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];
+
+      // 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;
+      }
+    }
+
+    return results;
+  }
+
+  function filterResources(clauses, removeDuplicates, map) {
+    return function(resource) {
+      var resourceIsAllowed = true;
+
+      // References must be defined.
+      if (resource === undefined) {
+        return;
+      }
+
+      // Get canonical (localized) version of resource if possible.
+      resource = METADATA.byUrl[resource.baseUrl] || METADATA.byUrl[resource.url] || resource;
+
+      // Filter out resources already used
+      if (removeDuplicates) {
+        resourceIsAllowed = !map[resource.index];
+      }
+
+      // Must fulfill all criteria
+      if (clauses.length > 0) {
+        resourceIsAllowed = resourceIsAllowed && doesResourceMatchClauses(resource, clauses);
+      }
+
+      // Mark resource as used.
+      if (resourceIsAllowed) {
+        map[resource.index] = 1;
+      }
+
+      return resourceIsAllowed && resource;
+    };
+  }
+
+  function filterEmpty(resource) {
+    return resource;
+  }
+
+  function sortResultsByKey(key) {
+    var desc = key.charAt(0) === '-';
+
+    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 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 = METADATA.hasType[clauses[i].value];
+          break;
+        case 'tag':
+          map = METADATA.hasTag[clauses[i].value];
+          break;
+      }
+
+      if (!map || (!!clauses[i].negative ? map[resource.index] : !map[resource.index])) {
+        return clauses[i].negative;
+      }
+    }
+
+    return true;
+  }
+
+  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;
+  }
+
+  return buildResourceList;
+})(jQuery);
+
+/* global METADATA, getLangPref */
+
+window.metadata.search = (function() {
+  'use strict';
+
+  var currentLang = getLangPref();
+
+  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;
+  }
+
+  function findResourceMatches(query) {
+    var results = [];
+
+    // 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
+            }
+          }
+        }
+
+        // Check if query matches doc title
+        if (s.title.toLowerCase().match(queryRegex)) {
+          matched = true;
+          s.matched_title = 1;
+        }
+
+        // Remember the doc if it matches either
+        if (matched) {
+          results.push(s);
+        }
+      }
+
+      // Improve the current results
+      results = lookupBetterResult(results);
+
+      // Rank/sort all the matched pages
+      rankAutocompleteDocResults(results);
+
+      return results;
+    }
+  }
+
+  // Replaces a match with another resource by url, if it exists.
+  function lookupReplacementByUrl(match, url) {
+    var replacement = METADATA.byUrl[url];
+
+    // Replacement resource does not exists.
+    if (!replacement) { return; }
+
+    replacement.matched_title = Math.max(replacement.matched_title, match.matched_title);
+    replacement.matched_tag = Math.max(replacement.matched_tag, match.matched_tag);
+
+    return replacement;
+  }
+
+  // Find the localized version of a page if it exists.
+  function lookupLocalizedVersion(match) {
+    return METADATA.byUrl[match.baseUrl] || METADATA.byUrl[match.url];
+  }
+
+  // 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; }
+
+    var indexUrl = match.url.replace(/[^\/]+$/, 'index.html');
+    return lookupReplacementByUrl(match, indexUrl);
+  }
+
+  // Find related results which are a better match for the user.
+  function lookupBetterResult(matches) {
+    var newMatches = [];
+
+    matches = matches.filter(function(match) {
+      var newMatch = match;
+      newMatch = lookupTutorialIndex(newMatch) || newMatch;
+      newMatch = lookupLocalizedVersion(newMatch) || newMatch;
+
+      if (newMatch !== match) {
+        newMatches.push(newMatch);
+      }
+
+      return newMatch === match;
+    });
+
+    return toUnique(newMatches.concat(matches));
+  }
+
+  /* Order the jd doc result list based on match quality */
+  function rankAutocompleteDocResults(matches) {
+    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;
+      }
+
+      if (match.lang === currentLang) {
+        score *= 5;
+      }
+
+      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.title < b.title) ? -1 : 1;
+      }
+
+      return n;
+    });
+  }
+
+  /* Order the result list based on match quality */
+  function rankAutocompleteApiResults(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;
+      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);
+        }
+      }
+
+      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;
+    });
+  }
+
+  // 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';
+
+  /**
+   * 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: '.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.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);
+
+/* global getLangPref */
+(function($) {
+  var LANG;
+
+  function getSearchLang() {
+    if (!LANG) {
+      LANG = getLangPref();
+
+      // Fix zh-cn to be zh-CN.
+      LANG = LANG.replace(/-\w+/, function(m) { return m.toUpperCase(); });
+    }
+    return LANG;
+  }
+
+  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)'
+    };
+
+    return $.get('https://content.googleapis.com/customsearch/v1?' +  $.param(searchParams));
+  }
+
+  function renderResults(el, results, searchAppliance) {
+    var referenceResults = searchAppliance.getReferenceResults();
+    if (!results.items) {
+      el.append($('<div>').text('No results'));
+      return;
+    }
+
+    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;
+        }
+      });
+
+      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';
+
+        var entry = $('<div>').addClass('dac-custom-search-entry 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 + ')')));
+        }
+
+        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)));
+
+        el.append(entry);
+      }
+    }
+
+    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);
+        });
+
+      el.append(loadMoreButton);
+    }
+  };
+
+  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');
+
+    loadMoreButton.text('Loading more...');
+
+    customSearch(query, start).then(function(results) {
+      loadMoreButton.remove();
+      renderResults(el, results, searchAppliance);
+    });
+  }
+
+  $.fn.customSearch = function(query, searchAppliance) {
+    var el = $(this);
+
+    customSearch(query).then(function(results) {
+      el.empty();
+      renderResults(el, results, searchAppliance);
+    });
+  };
+})(jQuery);
+
+/* global METADATA */
+
+(function($) {
+  $.fn.dacSearchRenderHero = function(resources, query) {
+    var el = $(this);
+    el.empty();
+
+    var resource = METADATA.searchHeroCollections[query];
+
+    if (resource) {
+      el.dacHero(resource, true);
+      el.show();
+
+      return true;
+    } else {
+      el.hide();
+    }
+  };
+})(jQuery);
+
+(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 ROW_COUNT_COLLAPSED = 20;
+  var ROW_COUNT_EXPANDED = 40;
+  var ROW_COUNT_GOOGLE_COLLAPSED = 1;
+  var ROW_COUNT_GOOGLE_EXPANDED = 8;
+
+  function onSuggestionClick(e) {
+    var normalClick = e.which === 1 && !e.ctrlKey && !e.shiftKey && !e.metaKey;
+    if (normalClick) {
+      e.preventDefault();
+    }
+
+    // When user clicks a suggested document, track it
+    var url = $(e.currentTarget).attr('href');
+    ga('send', 'event', 'Suggestion Click', 'clicked: ' + url,
+        'query: ' + $('#search_autocomplete').val().toLowerCase(),
+        {hitCallback: function() {
+          if (normalClick) {
+            document.location = url;
+          }
+        }});
+  }
+
+  function buildLink(match) {
+    var link = $('<a>').attr('href', window.toRoot + match.link);
+
+    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);
+
+    link.html(newLink);
+    return link;
+  }
+
+  function buildSuggestion(match, query) {
+    var li = $('<li>').addClass('dac-search-results-reference-entry');
+
+    var link = buildLink(match);
+    link.highlightMatches(query);
+    li.append(link);
+    return li[0];
+  }
+
+  function buildResults(results, query) {
+    return results.map(function(match) {
+      return buildSuggestion(match, query);
+    });
+  }
+
+  function renderAndroidResults(list, gMatches, query) {
+    list.empty();
+
+    var header = $('<li class="dac-search-results-reference-header">android</li>');
+    list.append(header);
+
+    if (gMatches.length > 0) {
+      list.removeClass('no-results');
+
+      var resources = buildResults(gMatches, query);
+      list.append(resources);
+      return true;
+    } else {
+      list.append('<li class="dac-search-results-reference-entry-empty">No results</li>');
+    }
+  }
+
+  function renderGoogleDocsResults(list, gGoogleMatches, query) {
+    list = $('.suggest-card.reference ul');
+
+    if (gGoogleMatches.length > 0) {
+      list.append('<li class="dac-search-results-reference-header">in Google Services</li>');
+
+      var resources = buildResults(gGoogleMatches, query);
+      list.append(resources);
+
+      return true;
+    }
+  }
+
+  function renderResults(referenceCard, results, query, expanded) {
+    var list = referenceCard.find('ul');
+    list.toggleClass('is-expanded', !!expanded);
+
+    // 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);
+
+    if (googleCount > 0) {
+      // If there are google results, reserve space for its header.
+      googleCount++;
+    }
+
+    var androidCount = Math.max(0, total - googleCount);
+    if (androidCount === 0) {
+      // Reserve space for "No reference results"
+      googleCount--;
+    }
+
+    renderAndroidResults(list, results.android.slice(0, androidCount), query);
+    renderGoogleDocsResults(list, results.docs.slice(0, googleCount - 1), query);
+
+    var totalResults = results.android.length + results.docs.length;
+    if (totalResults === 0) {
+      list.addClass('no-results');
+    }
+
+    // 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));
+  }
+
+  function onToggleMore(e) {
+    var link = $(e.currentTarget);
+    var referenceCard = $('.suggest-card.reference');
+    var data = referenceCard.data('searchreferences.dac');
+
+    if (util.matchesMedia('mobile')) { return; }
+
+    renderResults(referenceCard, data.results, data.query, link.data('toggle') === 'show-more');
+  }
+
+  $(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);
+
+(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;
+  };
+})(jQuery);
+
+/*global metadata */
+
+(function($, metadata) {
+  'use strict';
+
+  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.currQueryReferenceResults = {};
+  }
+
+  Search.prototype.init = function() {
+    if (!devsite && this.checkRedirectToIndex()) { return; }
+
+    this.searchHistory = window.dacStore('search-history');
+
+    this.searchInput.focus(this.onSearchChanged.bind(this));
+    this.searchInput.keydown(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));
+
+    $(window).on('popstate', this.onPopState.bind(this));
+    $(window).hashchange(this.onHashChange.bind(this));
+    this.onHashChange();
+  };
+
+  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;
+    }
+  };
+
+  Search.prototype.handleKeyboardShortcut = function(event) {
+    // Close (esc)
+    if (event.which === 27) {
+      this.searchClose.trigger('click');
+      event.preventDefault();
+    }
+
+    // Previous result (up arrow)
+    if (event.which === 38) {
+      this.previousResult();
+      event.preventDefault();
+    }
+
+    // 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.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');
+      }
+    }
+  };
+
+  Search.prototype.previousResult = function() {
+    this.goToResult(-1);
+  };
+
+  Search.prototype.nextResult = function() {
+    this.goToResult(1);
+  };
+
+  Search.prototype.navigateToResult = function() {
+    var query = this.getQuery();
+    var selectedLink = this.searchResults.find('.dac-selected');
+
+    if (selectedLink.length) {
+      selectedLink[0].click();
+    } else {
+      this.searchHistory.push(query);
+      this.addQueryToUrl(query);
+
+      var isMobileOrTablet = typeof window.orientation !== 'undefined';
+
+      if (isMobileOrTablet) {
+        this.searchInput.blur();
+      }
+    }
+  };
+
+  Search.prototype.onHashChange = function() {
+    var query = this.getUrlQuery();
+    if (query != null && query !== this.getQuery()) {
+      this.searchInput.val(query);
+      this.onSearchChanged();
+    }
+  };
+
+  Search.prototype.clear = function() {
+    this.searchInput.val('');
+    window.location.hash = '';
+    this.onSearchChanged();
+    this.searchInput.focus();
+  };
+
+  Search.prototype.close = function() {
+    this.removeQueryFromUrl();
+    this.searchInput.blur();
+    this.hideOverlay();
+  };
+
+  Search.prototype.getUrlQuery = function() {
+    var queryMatch = location.hash.match(/q=(.*)&?/);
+    return queryMatch && queryMatch[1] && decodeURI(queryMatch[1]);
+  };
+
+  Search.prototype.getQuery = function() {
+    return this.searchInput.val().replace(/(^ +)|( +$)/g, '');
+  };
+
+  Search.prototype.getReferenceResults = function() {
+    return this.currQueryReferenceResults;
+  };
+
+  Search.prototype.onSearchChanged = function() {
+    var query = this.getQuery();
+
+    this.showOverlay();
+    this.render(query);
+  };
+
+  Search.prototype.render = function(query) {
+    if (this.lastQuery === query) { return; }
+
+    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();
+  };
+
+  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;
+      }
+    }
+  };
+
+  Search.prototype.onPopState = function() {
+    if (!this.getUrlQuery()) {
+      this.hideOverlay();
+      this.searchHeader.unsetActiveState();
+    }
+  };
+
+  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.body.addClass('dac-modal-open dac-search-open');
+  };
+
+  Search.prototype.hideOverlay = function() {
+    this.body.removeClass('dac-modal-open dac-search-open');
+  };
+
+  $(document).on('ready.aranja', function() {
+    var search = new Search();
+    search.init();
+  });
+})(jQuery, metadata);
+
+window.dacStore = (function(window) {
+  /**
+   * 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.
+   */
+  var Store = function(name, maxSize) {
+    var content = [];
+
+    var hasLocalStorage = !!window.localStorage;
+
+    if (hasLocalStorage) {
+      try {
+        content = JSON.parse(window.localStorage.getItem(name) || []);
+      } catch (e) {
+        // Store contains invalid data
+        window.localStorage.removeItem(name);
+      }
+    }
+
+    function push(item) {
+      if (content[0] === item) {
+        return;
+      }
+
+      content.unshift(item);
+
+      if (maxSize) {
+        content.splice(maxSize, content.length);
+      }
+
+      if (hasLocalStorage) {
+        window.localStorage.setItem(name, JSON.stringify(content));
+      }
+    }
+
+    function all() {
+      // Return a copy
+      return content.slice();
+    }
+
+    return {
+      push: push,
+      all: all
+    };
+  };
+
+  var stores = {
+    'search-history': new Store('search-history', 3)
+  };
+
+  /**
+   * Get a named persistent store.
+   * @param  {string} name
+   * @return {Store}
+   */
+  return function getStore(name) {
+    return stores[name];
+  };
+})(window);
+
+(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.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', this.swap.bind(this));
+  }
+
+  /**
+   * SwapContent's default settings.
+   * @type {{activeClass: string, container: string, transitionSpeed: number}}
+   * @private
+   */
+  SwapContent.DEFAULTS_ = {
+    activeClass: 'dac-active',
+    container: '[data-swap-container]',
+    dynamic: 'true',
+    swapButton: '[data-swap-button]',
+    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() {
+    this.containers.each(function(index, container) {
+      container = $(container);
+
+      if (!this.options.dynamic) {
+        container.children().toggleClass(this.options.activeClass);
+        this.complete.bind(this);
+        return;
+      }
+
+      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);
+
+/* 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 + '">' +
+      '<i class="dac-sprite dac-close-black"></i>' +
+    '</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);
+  }
+
+  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({
+          transitionDuration: '0s',
+          maxHeight: contentHeight + 'px'
+        })
+        .resolveStyles()
+        .css('transitionDuration', '');
+    }
+
+    // Transition to new state
+    $el.css('maxHeight', targetHeight);
+
+    // Reset maxHeight to css value after transition.
+    setTimeout(function() {
+      $el.css({
+          transitionDuration: '0s',
+          maxHeight: ''
+        })
+        .resolveStyles()
+        .css('transitionDuration', '');
+    }, 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);
+
+(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) {
+          ga('send', 'event', 'Videos', 'Resume', videoId);
+        } else {
+          // track the start playing event so we know from which page the video was selected
+          ga('send', '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) {
+        ga('send', 'event', 'Videos', 'Paused', videoId, currentTime);
+        this.mPlayerPaused = true;
+      }
+
+      // Video finished, send video ID and video elapsed time
+      if (event.data === YT.PlayerState.ENDED) {
+        ga('send', 'event', 'Videos', 'Finished', videoId, 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-dev/body_tag.cs b/tools/droiddoc/templates-sdk-dev/body_tag.cs
new file mode 100644
index 0000000..5761b71
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/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-dev/class.cs b/tools/droiddoc/templates-sdk-dev/class.cs
index 47e826b..dee7a4c 100644
--- a/tools/droiddoc/templates-sdk-dev/class.cs
+++ b/tools/droiddoc/templates-sdk-dev/class.cs
@@ -1,263 +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" ?>
+<?cs
+####################
+# MACRO FUNCTION USED ONLY IN THIS TEMPLATE TO GENERATE API REFERENCE
+# FIRST, THE FUNCTIONS FOR THE SUMMARY AT THE TOP OF THE PAGE
+####################
+?>
 
-<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) || subcount(class.annotationdocumentation) ?>
-<h2>Class Overview</h2>
-<?cs if:subcount(class.descr) ?><p itemprop="articleBody"><?cs call:tag_list(class.descr) ?></p><?cs /if ?>
-<?cs if:subcount(class.annotationdocumentation) ?><?cs each:annodoc = class.annotationdocumentation?>
-<p><?cs var:annodoc.text ?></p>
-<?cs /each?><?cs /if?>
-<?cs /if ?>
-
-<?cs call:see_also_tags(class.seeAlso) ?>
-</div><!-- jd-descr -->
-
-
-<?cs # summary macros ?>
-
-<?cs def:write_method_summary(methods, included) ?>
+<?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) || subcount(method.showAnnotations) ?>
-          <div class="jd-descrdiv">
-            <?cs if:subcount(method.shortDescr) || subcount(method.annotationdocumentation) ?><?cs call:short_descr(method)?><?cs /if?>
-            <?cs call:show_annotations_list(method) ?>
-          </div>
-        <?cs /if ?>
-  </td></tr>
-<?cs set:count = count + #1 ?>
+  <?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 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>
@@ -266,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 # end macros ?>
+<?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 ?>
 
-<div class="jd-descr">
-<?cs # make sure there's a summary view to display ?>
+<?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) ?>
+
+<?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
@@ -303,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 ?>
 
@@ -323,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">
@@ -350,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 ?>
@@ -377,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">
+  <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 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>
+  </td></tr>
 <?cs /if ?>
 <?cs /each ?>
 </table>
@@ -404,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 ?>
@@ -413,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">
+  <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 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>
+  </td></tr>
 <?cs /if ?>
 <?cs /each ?>
 </table>
@@ -440,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 ?>
@@ -448,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 ?>
@@ -456,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 ?>
@@ -464,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 ?>
@@ -473,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>
@@ -503,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 ?>
 
@@ -615,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 ?>
 
@@ -623,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 ?>
 
@@ -631,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 ?>
 
@@ -639,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 ?>
 
@@ -647,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 ?>
 
@@ -655,27 +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><!-- 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> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
 <?cs include:"trailer.cs" ?>
-
+<?cs /if ?>
 </body>
 </html>
diff --git a/tools/droiddoc/templates-sdk-dev/classes.cs b/tools/droiddoc/templates-sdk-dev/classes.cs
index 405892d..007b57e 100644
--- a/tools/droiddoc/templates-sdk-dev/classes.cs
+++ b/tools/droiddoc/templates-sdk-dev/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,11 +36,34 @@
 </table>
 <?cs /each ?>
 
+<?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 jd-content -->
-</div><!-- end doc-content -->
-
 <?cs include:"trailer.cs" ?>
-
+<?cs /if ?>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/tools/droiddoc/templates-sdk-dev/components/masthead.cs b/tools/droiddoc/templates-sdk-dev/components/masthead.cs
index d48ea29..b105b52 100644
--- a/tools/droiddoc/templates-sdk-dev/components/masthead.cs
+++ b/tools/droiddoc/templates-sdk-dev/components/masthead.cs
@@ -1,374 +1,294 @@
 <?cs def:custom_masthead() ?>
-<?cs if:preview ?>
-  <?cs call:preview_masthead() ?>
-<?cs else ?>
-<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 id="header"><?cs call:butter_bar() ?>
-      <div class="wrap" id="header-wrap">
-        <div class="col-3 logo">
-          <a href="<?cs var:toroot ?>index.html">
-            <img src="<?cs var:toroot ?>assets/images/dac_logo.png"
-                srcset="<?cs var:toroot ?>assets/images/dac_logo@2x.png 2x"
-                width="123" height="25" alt="Android Developers" />
-          </a>
-          <div class="btn-quicknav" id="btn-quicknav">
-            <a href="#" class="arrow-inactive">Quicknav</a>
-            <a href="#" class="arrow-active">Quicknav</a>
-          </div>
-        </div>
-        <ul class="nav-x col-9">
-            <li class="design">
-              <a 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="develop"><a 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 class="distribute last"><a 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></li>
-        </ul>
+    <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">
+            <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" 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"
+              srcset="<?cs var:toroot ?>assets/images/android_logo@2x.png 2x"
+              width="32" height="36" alt="Android" /> Developers
+          </a><?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
+        ?><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 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 ?>
 
         <?cs # ADD SEARCH AND MENU ?>
+        <?cs if:!ndk ?>
         <?cs call:header_search_widget() ?>
-
-
-        <!-- Expanded quicknav -->
-        <div id="quicknav" class="col-13">
-          <ul>
-            <li class="about">
-              <ul>
-                <li><a href="<?cs var:toroot ?>about/index.html">About</a></li>
-                <li><a href="<?cs var:toroot ?>wear/index.html">Wear</a></li>
-                <li><a href="<?cs var:toroot ?>tv/index.html">TV</a></li>
-                <li><a href="<?cs var:toroot ?>auto/index.html">Auto</a></li>
-              </ul>
-            </li>
-            <li class="design">
-              <ul>
-                <li><a href="<?cs var:toroot ?>design/index.html">Get Started</a></li>
-                <li><a href="<?cs var:toroot ?>design/devices.html">Devices</a></li>
-                <li><a href="<?cs var:toroot ?>design/style/index.html">Style</a></li>
-                <li><a href="<?cs var:toroot ?>design/patterns/index.html">Patterns</a></li>
-                <li><a href="<?cs var:toroot ?>design/building-blocks/index.html">Building Blocks</a></li>
-                <li><a href="<?cs var:toroot ?>design/downloads/index.html">Downloads</a></li>
-                <li><a href="<?cs var:toroot ?>design/videos/index.html">Videos</a></li>
-              </ul>
-            </li>
-            <li class="develop">
-              <ul>
-                <li><a 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><a 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><a 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><a 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><a href="<?cs var:toroot ?>google/index.html">Google Services</a>
-                </li>
-                <?cs if:android.hasSamples ?>
-                  <li><a href="<?cs var:toroot ?>samples/index.html">Samples</a>
-                  </li>
-                <?cs /if ?>
-              </ul>
-            </li>
-            <li class="distribute last">
-              <ul>
-                <li><a href="<?cs var:toroot ?>distribute/googleplay/index.html">Google Play</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/essentials/index.html">Essentials</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/users/index.html">Get Users</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/engage/index.html">Engage &amp; Retain</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/monetize/index.html">Monetize</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/analyze/index.html">Analyze</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/tools/index.html">Tools &amp; Reference</a></li>
-                <li><a href="<?cs var:toroot ?>distribute/stories/index.html">Developer Stories</a></li>
-              </ul>
-            </li>
-          </ul>
-        </div><!-- /Expanded quicknav -->
+        <?cs /if ?>
       </div><!-- end header-wrap.wrap -->
     </div><!-- end header -->
-
-  <?cs if:about || wear || tv || auto ?>
-    <!-- Secondary x-nav -->
-    <div id="nav-x">
-        <div class="wrap">
-            <ul class="nav-x col-9 about" style="width:100%">
-                <li class="about"><a href="<?cs var:toroot ?>about/index.html"
-                  >About</a></li>
-                <li class="wear"><a href="<?cs var:toroot ?>wear/index.html"
-                  >Wear</a></li>
-                <li class="tv"><a href="<?cs var:toroot ?>tv/index.html"
-                  >TV</a></li>
-                <li class="auto"><a href="<?cs var:toroot ?>auto/index.html"
-                  >Auto</a></li>
-            </ul>
-        </div>
-    </div>
-    <!-- /Sendondary x-nav ABOUT -->
-
-
-
-  <?cs elif:training || guide || reference || tools || develop || google || samples ?>
-    <!-- Secondary x-nav -->
-    <div id="nav-x">
-        <div class="wrap" style="position:relative;z-index:1">
-
-        <?cs if:reference ?>
-
-        <?cs /if ?>
-
-            <ul class="nav-x col-9 develop" style="width:100%">
-                <li class="training"><a 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="guide"><a 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="reference"><a 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="tools"><a 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="google"><a href="<?cs var:toroot ?>google/index.html"
-                  >Google Services</a>
-                </li>
-                <?cs if:android.hasSamples ?>
-                  <li class="samples"><a href="<?cs var:toroot ?>samples/index.html"
-                    >Samples</a>
-                  </li>
-                <?cs /if ?>
-            </ul>
-        </div>
-    </div>
-    <!-- /Sendondary x-nav DEVELOP -->
-
-  <?cs elif:distribute || googleplay || essentials || users || engage || monetize || analyze ||  disttools || stories ?>
-    <!-- Secondary distribute x-nav -->
-    <div id="nav-x">
-        <div class="wrap">
-            <ul class="nav-x distribute">
-                <li class="googleplay"><a href="<?cs var:toroot ?>distribute/googleplay/index.html"
-                  >Google Play</a></li>
-                <li class="essentials"><a href="<?cs var:toroot ?>distribute/essentials/index.html"
-                  >Essentials</a></li>
-                <li class="users"><a href="<?cs var:toroot ?>distribute/users/index.html"
-                  >Get Users</a></li>
-                <li class="engage"><a href="<?cs var:toroot ?>distribute/engage/index.html"
-                  >Engage &amp; Retain</a></li>
-                <li class="monetize"><a href="<?cs var:toroot ?>distribute/monetize/index.html"
-                  >Monetize</a>
-                </li>
-                <li class="analyze"><a href="<?cs var:toroot ?>distribute/analyze/index.html"
-                  >Analyze</a>
-                </li>
-                <li class="disttools"><a href="<?cs var:toroot ?>distribute/tools/index.html"
-                  >Tools</a>
-                </li>
-                <li class="stories"><a href="<?cs var:toroot ?>distribute/stories/index.html"
-                  >Stories</a>
-                </li>
-            </ul>
-            <a href="https://play.google.com/apps/publish/" class="developer-console-btn">Developer Console</a>
-        </div> <!-- /Secondary distribute x-nav -->
-    </div>
-    <!-- /Sendondary x-nav DISTRIBUTE -->
-  <?cs /if ?>
-
-    <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 -->
 
-  <div id="sticky-header">
-    <div>
-      <a class="logo" href="#top"></a>
-      <a class="top" href="#top"></a>
-      <ul class="breadcrumb">
-        <?cs # More <li> elements added here with javascript ?>
-        <?cs if:!section.landing ?><li class="current"><?cs var:page.title ?></li><?cs
-        /if ?>
+  <?cs if:ndk ?>
+  <!-- NDK Navigation-->
+  <nav class="dac-nav">
+    <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
+
+    <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 指南"
+           zh-cn-lang="API 指南"
+           ru-lang="Руководства по API"
+           ko-lang="API 가이드"
+           ja-lang="API ガイド"
+           es-lang="Guías de la API">Guides</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>
+      <li class="dac-nav-item samples">
+        <a class="dac-nav-link" href="<?cs var:toroot ?>ndk/samples/index.html"
+           >Samples</a>
+      </li>
+      <li class="dac-nav-item downloads">
+        <a class="dac-nav-link" href="<?cs var:toroot ?>ndk/downloads/index.html"
+           >Downloads</a>
+      </li>
       </ul>
     </div>
-  </div>
-
-<?cs /if ?><?cs # end if/else !devsite ?>
-<?cs /if ?><?cs # end if/else preview ?><?cs
-/def ?>
-
-<?cs def:preview_masthead() ?>
-<a name="top"></a>
+                       </div>
+  </nav>
+  <!-- end NDK navigation-->
 
 
-<!-- Header -->
-<div id="header-wrapper">
-  <div id="header"><?cs call:butter_bar() ?>
-    <div class="wrap" id="header-wrap">
-      <div class="col_3 logo landing-logo" style="width:240px">
-        <a href="<?cs var:toroot ?>preview/index.html">
-          <img src="<?cs var:toroot ?>assets/images/android.png" height="25" alt="Android"
-            style="margin:-3px 0 0" />
-        </a>
-      </div>
-      <div class="col-8" style="margin:0"><h1 style="margin: 4px 0 0 0px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:27px;">M Developer Preview</h1></div>
 
-      <?cs # ADD SEARCH AND MENU ?>
-      <?cs call:header_search_widget() ?>
+  <?cs else ?>
+  <!-- Navigation-->
+  <nav class="dac-nav">
+    <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
 
-    </div><!-- end header-wrap -->
-  </div><!-- /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 -->
-
-<div id="sticky-header">
-  <div>
-    <a class="logo" href="#top"></a>
-    <a class="top" href="#top"></a>
-    <ul class="breadcrumb">
-      <?cs # More <li> elements added here with javascript ?>
-      <?cs if:!section.landing ?><li class="current"><?cs var:page.title ?></li><?cs
-      /if ?>
-    </ul>
-  </div>
-</div>
-
-  <?cs
-/def ?>
-
-
-<?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 {version_number} SDK will be available on {Month} {Day}!
-        </a>
+    <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 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/marshmallow/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>
       </div>
     </div>
+  </nav>
+  <!-- end navigation-->
+  <?cs /if ?>
+
+<!-- Nav Setup -->
+<script>$('[data-dac-nav]').dacNav();</script>
+
+<?cs
+/def ?><?cs # end custom_masthead() ?>
+
+
+<?cs def:toast() ?>
+
+  <?cs # (UN)COMMENT TO TOGGLE VISIBILITY
+
+  <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>
 
 ?>
 
diff --git a/tools/droiddoc/templates-sdk-dev/customizations.cs b/tools/droiddoc/templates-sdk-dev/customizations.cs
index c8c88cc..44ae239 100644
--- a/tools/droiddoc/templates-sdk-dev/customizations.cs
+++ b/tools/droiddoc/templates-sdk-dev/customizations.cs
@@ -1,337 +1,33 @@
-<?cs 
-def:fullpage() ?>
+<?cs def:body_content_wrap_start() ?>
+  <div class="wrap clearfix" id="body-content">
+<?cs /def ?>
+
+<?cs def:fullpage() ?>
   <div id="body-content">
-<?cs /def ?>
-<?cs 
-def:sdk_nav() ?>
-  <div class="wrap clearfix" id="body-content">
-    <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs 
-        include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?>
-
-
-      </div>
-    </div> <!-- end side-nav -->
-<?cs /def ?><?cs
-
-def:no_nav() ?>
-  <div class="wrap clearfix" id="body-content">
-<?cs /def ?><?cs
-
-def:tools_nav() ?>
-  <div class="wrap clearfix" id="body-content">
-    <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs 
-        include:"../../../../frameworks/base/docs/html/tools/tools_toc.cs" ?>
-        
-        
-      </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="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-
-<?cs 
-        include:"../../../../frameworks/base/docs/html/training/training_toc.cs" ?>
-        
-
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/googleplay/googleplay_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/essentials/essentials_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/users/users_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/engage/engage_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/analyze/analyze_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/monetize/monetize_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/tools/disttools_toc.cs" ?>
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-<?cs include:"../../../../frameworks/base/docs/html/distribute/stories/stories_toc.cs" ?>
-      </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="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs 
-        include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?>
-        
-
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-
-<?cs
-        include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?>
-       
-
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs
-        include:"../../../../frameworks/base/docs/html/distribute/distribute_toc.cs" ?>
-        
-
-      </div>
-    </div> <!-- end side-nav -->
-    <script>
-      $(document).ready(function() {
-        scrollIntoView("devdoc-nav");
-        });
-    </script>
+    <div>
 <?cs /def ?>
 
-<?cs
-def:samples_nav() ?>
-  <div class="wrap clearfix" id="body-content">
-    <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
+<?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>
 
-<?cs
-        include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?>
+  <script>$('[data-fullscreen]').dacFullscreen();</script>
+  <!-- End: Fullscreen toggler -->
 
-      </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
-def:google_nav() ?>
-  <div class="wrap clearfix" id="body-content">
-    <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs
-        include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?>
-        
-
-      </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="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs
-        include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?>
-        
-
-      </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="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-
-<?cs
-        include:"../../../../frameworks/base/docs/html/wear/wear_toc.cs" ?>
-
-
-      </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="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
-      <div id="devdoc-nav" class="scroll-pane">
-        <?cs
-          include:"../../../../frameworks/base/docs/html/preview/preview_toc.cs" ?>
-      </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="col-4" 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() -->
@@ -339,277 +35,211 @@
           </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 
+        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 class="dac-reference-nav" data-reference-tree>
+        <ul class="dac-reference-nav-list" data-reference-namespaces>
+          <?cs call:package_link_list(docs.packages) ?>
+        </ul>
 
-            </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>
+        <?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
-def:header_search_widget() ?>
-<div class="menu-container">
-  <div class="moremenu">
-    <div id="more-btn"></div>
-  </div>
-  <div class="morehover" id="moremenu">
-    <div class="top"></div>
-    <div class="mid">
-      <div class="header">Links</div>
-      <ul>
-        <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
-        <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
-        <li><a href="<?cs var:toroot ?>about/index.html">About Android</a></li>
-      </ul>
-      <div class="header">Android Sites</div>
-      <ul>
-        <li><a href="http://www.android.com">Android.com</a></li>
-        <li class="active"><a>Android Developers</a></li>
-        <li><a href="http://source.android.com">Android Open Source Project</a></li>
-      </ul>
+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 -->
+<?cs /def ?>
 
-      <?cs # Include language switcher only in online docs ?>
-      <?cs if:android.whichdoc == "online" ?>
-        <div class="header">Language</div>
-          <div id="language" class="locales">
-            <select name="language" onChange="changeLangPref(this.value, true)">
-                <option value="en">English</option>
-                <option value="es">Español</option>
-                <option value="ja">日本語</option>
-                <option value="ko">한국어</option>
-                <option value="ru">Русский</option>
-                <option value="zh-cn">中文(简体)</option>
-                <option value="zh-tw">中文(繁體)</option>
-            </select>
+<?cs def:header_search_widget() ?>
+  <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="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>
+  </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>
-        <script type="text/javascript">
-          <!--
-          loadLangPref();
-            //-->
-        </script>
+
+          <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 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:custom_left_nav() ?>
+  <?cs if:(!fullpage && !nonavpage) || forcelocalnav ?>
+    <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>
+    <div class="dac-nav-sub dac-swap-section dac-right dac-active" itemscope itemtype="http://schema.org/SiteNavigationElement">
+      <?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 ?>
-      <?cs # End of lang switcher ?>
-      <br class="clearfix" />
-    </div><!-- end 'mid' -->
-    <div class="bottom"></div>
-  </div><!-- end 'moremenu' -->
-
-  <div class="search" id="search-container">
-    <div class="search-inner">
-      <div id="search-btn"></div>
-      <div class="left"></div>
-      <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 ?>')" />
-      </form>
-      <div class="right"></div>
-      <a class="close hide">close</a>
-      <div class="left"></div>
-      <div class="right"></div>
-    </div><!-- end search-inner -->
-  </div><!-- end search-container -->
-
-  <div class="search_filtered_wrapper reference">
-    <div class="suggest-card reference no-display">
-      <ul class="search_filtered">
-      </ul>
     </div>
-  </div>
-
-  <div class="search_filtered_wrapper docs">
-    <div class="suggest-card dummy no-display">&nbsp;</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>
-</div><!-- end menu-container (search and menu widget) -->
+  <?cs /if ?>
 <?cs /def ?>
 
-
-
-<?cs 
-def:custom_left_nav() ?><?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: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
-  elif:preview ?><?cs
-    call:preview_nav() ?><?cs
-  else ?><?cs
-    call:default_left_nav() ?> <?cs
-  /if ?><?cs
-/def ?>
-
-<?cs # appears at the bottom of every page ?><?cs 
-def:custom_cc_copyright() ?>
-  Except as noted, this content is 
+<?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() ?>
-  <p>
-    <a href="<?cs var:toroot ?>about/index.html">About Android</a>&nbsp;&nbsp;|&nbsp;
-    <a href="<?cs var:toroot ?>legal.html">Legal</a>&nbsp;&nbsp;|&nbsp;
-    <a href="<?cs var:toroot ?>support.html">Support</a>
-  </p><?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>
+  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/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 ?>
diff --git a/tools/droiddoc/templates-sdk-dev/designpage.cs b/tools/droiddoc/templates-sdk-dev/designpage.cs
index 2be179d..d75ce0a 100644
--- a/tools/droiddoc/templates-sdk-dev/designpage.cs
+++ b/tools/droiddoc/templates-sdk-dev/designpage.cs
@@ -37,17 +37,11 @@
 
 <?cs if:header.hide ?>
 <?cs else ?>
-<div class="layout-content-row content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
-  <div class="layout-content-col span-9">
+<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>
-  <div class="paging-links layout-content-col span-4" 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 ?>
 
@@ -55,9 +49,9 @@
 
 <?cs if:footer.hide ?>
 <?cs else ?>
-<div class="layout-content-row content-footer" itemscope itemtype="http://schema.org/SiteNavigationElement">
-  <div class="paging-links layout-content-col span-9">&nbsp;</div>
-  <div class="paging-links layout-content-col span-4">
+<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>
diff --git a/tools/droiddoc/templates-sdk-dev/docpage.cs b/tools/droiddoc/templates-sdk-dev/docpage.cs
index 83b1199..0f1d4e0 100644
--- a/tools/droiddoc/templates-sdk-dev/docpage.cs
+++ b/tools/droiddoc/templates-sdk-dev/docpage.cs
@@ -4,46 +4,63 @@
 <?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:(guide||develop||training||reference||tools||sdk||samples) ?>develop<?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
-  elif:(distribute||googleplay||essentials||users||engage||monetize||disttools||stories)
-    ?>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
-  elif:(about||wear||tv||auto) ?>about<?cs
-  elif:design ?>design<?cs
-/if ?><?cs
-if:page.trainingcourse ?> trainingcourse<?cs
+    if:reference ?> reference<?cs /if ?><?cs
+    if:downloads ?> downloads<?cs /if ?><?cs
+  else ?><?cs
+    if:(guide||develop||training||reference||tools||sdk||google||samples) ?>develop<?cs
+      if:guide ?> guide<?cs /if ?><?cs
+      if:samples ?> samples<?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:(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||monetize||disttools) && !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 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="layout-content-row content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>">
-    <div class="layout-content-col <?cs if:training ?>span-7<?cs else ?>span-9<?cs /if ?>">
+  <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 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 ?>
-    </div>
     <?cs if:training ?>
-      <div class="training-nav-top layout-content-col span-5" itemscope itemtype="http://schema.org/SiteNavigationElement">
+      <div class="training-nav-top" itemscope itemtype="http://schema.org/SiteNavigationElement">
         <a href="#" class="prev-page-link hide"
             zh-tw-lang="上一堂課"
             zh-cn-lang="上一课"
@@ -70,7 +87,7 @@
             >Get started</a>
       </div>
     <?cs elif:!page.trainingcourse ?>
-      <div class="paging-links layout-content-col span-4" itemscope itemtype="http://schema.org/SiteNavigationElement">
+      <?cs # <div class="paging-linkss" itemscope itemtype="http://schema.org/SiteNavigationElement">
         <a href="#" class="prev-page-link hide"
             zh-tw-lang="上一堂課"
             zh-cn-lang="上一课"
@@ -87,7 +104,7 @@
             ja-lang="次へ"
             es-lang="Siguiente"
             >Next</a>
-      </div>
+      </div> ?>
     <?cs /if ?><?cs # end if training ?>
   </div>
   <?cs /if ?><?cs # end if header.hide ?>
@@ -103,34 +120,34 @@
   <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:(!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="col-6">
-          <img src="<?cs var:toroot ?><?cs var:page.landing.image ?>" alt="" />
-        </div>
-        <div class="col-6">
+        <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 ?>
+        <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>
@@ -145,21 +162,63 @@
   <?cs /if ?>
 <?cs /if ?><?cs # end if design ?>
 
+  <?cs 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 ?>
   <div id="jd-content">
-
-
     <div class="jd-descr" itemprop="articleBody">
+    <?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) ?>
     </div>
 
+    <?cs if:!fullscreen && (design||training||walkthru) && !page.landing && !page.trainingcourse
+      && !footer.hide && !devsite?>
       <div class="content-footer <?cs
-                    if:fullpage ?>wrap<?cs
-                    else ?>layout-content-row<?cs /if ?>"
+                    if:fullpage ?>wrap<?cs /if ?>"
                     itemscope itemtype="http://schema.org/SiteNavigationElement">
-        <?cs if:!fullscreen ?>
-        <div class="paging-links layout-content-col col-10">
-          <?cs if:(design||training||walkthru) && !page.landing && !page.trainingcourse && !footer.hide ?>
+          <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="下一课"
@@ -167,7 +226,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="开始"
@@ -176,31 +236,18 @@
                 ja-lang="開始する"
                 es-lang="Empezar"
                 >Get started</a>
-            <a href="#" class="next-class-link hide">Next class</a>
-          <?cs /if ?>
-        </div>
-        <div class="layout-content-col plus-container col-2" >
-          <?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 ?>
+            <a href="#" class="next-class-link hide">
+              <span class="page-link-caption">Next class</span>
+            </a>
+          </div>
       </div>
+    <?cs /if ?>
 
   </div> <!-- end jd-content -->
 
+<?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" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_lists_unified.js?v=9" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_extras.js?v=11" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_collections.js?v=12" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_tag_helpers.js?v=5" type="text/javascript"></script>
-
+<?cs /if ?>
 </body>
 </html>
-
-
-
diff --git a/tools/droiddoc/templates-sdk-dev/footer.cs b/tools/droiddoc/templates-sdk-dev/footer.cs
index b609d3b..af34a1a 100644
--- a/tools/droiddoc/templates-sdk-dev/footer.cs
+++ b/tools/droiddoc/templates-sdk-dev/footer.cs
@@ -1,20 +1,219 @@
-<div id="footer" class="wrap" <?cs if:fullpage ?>style="width:940px"<?cs /if ?>>
-        
-<?cs if:reference ?>
-  <div id="copyright">
-    <?cs call:custom_copyright() ?>
+<?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" 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="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-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>
+
+    <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/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>
+      <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 id="build_info">
-    <?cs call:custom_buildinfo() ?>
+</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">
+        <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" 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" 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" 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" 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" 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" 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>
+                  </div>
+                </div>
+              </fieldset>
+              <fieldset class="dac-form-fieldset">
+                <div class="cols">
+                  <div class="col-1of2 newsletter-leftCol">
+                    <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" 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" 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" data-t="newsletter.business.both">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"><span data-t="newsletter.confirmMailingList"></span><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"><span data-t="newsletter.privacyPolicy" data-t-html></span><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" data-t="newsletter.successDetails"></p>
+          </div>
+        </section>
+      </div>
+    </div>
   </div>
-<?cs elif:!hide_license_footer ?>
-  <div id="copyright">
-    <?cs call:custom_cc_copyright() ?>
+</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>
-<?cs /if ?>
-<?cs if:!no_footer_links ?>
-  <div id="footerlinks">
-    <?cs call:custom_footerlinks() ?>
-  </div>
-<?cs /if ?>
-</div> <!-- end footer -->
\ No newline at end of file
+</div>
+<!-- end langreset modal -->
diff --git a/tools/droiddoc/templates-sdk-dev/head_tag.cs b/tools/droiddoc/templates-sdk-dev/head_tag.cs
index 9f79f54..52ad968 100644
--- a/tools/droiddoc/templates-sdk-dev/head_tag.cs
+++ b/tools/droiddoc/templates-sdk-dev/head_tag.cs
@@ -1,34 +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 ?>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=<?cs
-  if:page.viewport_width ?><?cs
-    var:page.viewport_width ?><?cs
-  else ?>device-width<?cs /if ?>" />
+    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) ?>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) ?><?cs
+          if:libraries ?>libraries<?cs
+          elif:instantapps ?>instantapps<?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) ?>/topic<?cs
+            if:libraries ?>/libraries<?cs
+            elif:instantapps ?>/instant-apps<?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 ?>/disttools<?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 ?>
+
+    <?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 ?><?cs
+    # END if/else devsite ?>
 <?cs
-  if:page.metaDescription ?>
-<meta name="Description" content="<?cs var:page.metaDescription ?>"><?cs
-  /if ?>
+  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">
 <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" />
+<?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</title>
-
+  /if ?>Android Developers
+<?cs /if ?><?cs
+# END if/else devsite ?></title>
+<?cs
+  if:page.metaDescription ?>
+<meta name="description" content="<?cs var:page.metaDescription ?>"><?cs
+  /if ?>
+<?cs
+  if:!devsite ?>
 <!-- STYLESHEETS -->
 <link rel="stylesheet"
 href="<?cs
@@ -38,22 +165,16 @@
 if:android.whichdoc != 'online' ?>http:<?cs
 /if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
   title="roboto">
-<link href="<?cs var:toroot ?>assets/css/default.css?v=5" 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 ?>
+<?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=16" rel="stylesheet" type="text/css">
 
 <!-- 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
+<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 ?>
@@ -61,15 +182,9 @@
   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=3" 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(){
@@ -82,5 +197,6 @@
   ga('send', 'pageview');
   ga('universal.send', 'pageview'); // Send page view for new tracker.
 </script>
-
+<?cs /if ?><?cs
+# END if/else !devsite ?>
 </head>
diff --git a/tools/droiddoc/templates-sdk-dev/header.cs b/tools/droiddoc/templates-sdk-dev/header.cs
index e8301be..8c67138 100644
--- a/tools/droiddoc/templates-sdk-dev/header.cs
+++ b/tools/droiddoc/templates-sdk-dev/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 ?>
diff --git a/tools/droiddoc/templates-sdk-dev/jd_lists_unified.cs b/tools/droiddoc/templates-sdk-dev/jd_lists_unified.cs
index 417a5c1..4a6f4f7 100644
--- a/tools/droiddoc/templates-sdk-dev/jd_lists_unified.cs
+++ b/tools/droiddoc/templates-sdk-dev/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-dev/lists.cs b/tools/droiddoc/templates-sdk-dev/lists.cs
new file mode 100644
index 0000000..ede8c43
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/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-dev/macros_override.cs b/tools/droiddoc/templates-sdk-dev/macros_override.cs
index 0a94598..5b92fe3 100644
--- a/tools/droiddoc/templates-sdk-dev/macros_override.cs
+++ b/tools/droiddoc/templates-sdk-dev/macros_override.cs
@@ -33,4 +33,19 @@
       <?cs set:count = count + #1 ?>
     <?cs /each ?>
   </table>
-<?cs /def ?>
\ No newline at end of file
+<?cs /def ?>
+
+<?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-dev/nosidenavpage.cs b/tools/droiddoc/templates-sdk-dev/nosidenavpage.cs
index 8e59693..61754f0 100644
--- a/tools/droiddoc/templates-sdk-dev/nosidenavpage.cs
+++ b/tools/droiddoc/templates-sdk-dev/nosidenavpage.cs
@@ -11,6 +11,7 @@
 <?cs call:custom_masthead() ?>
 
 <div id="body-content">
+<div>
 <div id="doc-content" style="position:relative;">
 
 <?cs call:tag_list(root.descr) ?>
diff --git a/tools/droiddoc/templates-sdk-dev/package.cs b/tools/droiddoc/templates-sdk-dev/package.cs
index 2225565..d3efdda 100644
--- a/tools/droiddoc/templates-sdk-dev/package.cs
+++ b/tools/droiddoc/templates-sdk-dev/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,11 +30,35 @@
 <?cs call:class_table("Exceptions", package.exceptions) ?>
 <?cs call:class_table("Errors", package.errors) ?>
 
+</div><!-- end apilevel -->
+
+<?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 jd-content -->
-</div><!-- doc-content -->
-
 <?cs include:"trailer.cs" ?>
-
+<?cs /if ?>
 </body>
 </html>
diff --git a/tools/droiddoc/templates-sdk-dev/packages.cs b/tools/droiddoc/templates-sdk-dev/packages.cs
index 5056d3a..3fcfb81 100644
--- a/tools/droiddoc/templates-sdk-dev/packages.cs
+++ b/tools/droiddoc/templates-sdk-dev/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,11 +21,33 @@
 <?cs /each ?>
 </table>
 
+<?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 jd-content -->
-</div> <!-- end doc-content -->
-
 <?cs include:"trailer.cs" ?>
-
+<?cs /if ?>
 </body>
 </html>
diff --git a/tools/droiddoc/templates-sdk-dev/page_info.cs b/tools/droiddoc/templates-sdk-dev/page_info.cs
new file mode 100644
index 0000000..fad1274
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/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-dev/sample.cs b/tools/droiddoc/templates-sdk-dev/sample.cs
index 32a0788..2c5b9d2 100644
--- a/tools/droiddoc/templates-sdk-dev/sample.cs
+++ b/tools/droiddoc/templates-sdk-dev/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 ?>
@@ -92,9 +87,9 @@
 
       <div class="content-footer <?cs
                     if:fullpage ?>wrap<?cs
-                    else ?>layout-content-row<?cs /if ?>"
+                    else ?>cols<?cs /if ?>"
                     itemscope itemtype="http://schema.org/SiteNavigationElement">
-        <div class="layout-content-col <?cs
+        <div class="<?cs
                     if:fullpage ?>col-16<?cs
                     elif:training||guide ?>col-8<?cs
                     else ?>col-9<?cs /if ?>" style="padding-top:4px">
@@ -103,7 +98,7 @@
           <?cs /if ?>
         </div>
         <?cs if:!fullscreen ?>
-        <div class="paging-links layout-content-col col-4">
+        <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="上一堂課"
@@ -128,24 +123,17 @@
 
       <?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="layout-content-row content-footer next-class" style="display:none" itemscope itemtype="http://schema.org/SiteNavigationElement">
+      <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" ?>
+  <?cs if:!devsite ?>
+  <?cs include:"footer.cs" ?>
+  <?cs include:"trailer.cs" ?>
+  <?cs /if ?>
 
 </body>
 </html>
-
-
-
-
-
-
-
diff --git a/tools/droiddoc/templates-sdk-dev/sampleindex.cs b/tools/droiddoc/templates-sdk-dev/sampleindex.cs
index 1bacb53..db648ff 100644
--- a/tools/droiddoc/templates-sdk-dev/sampleindex.cs
+++ b/tools/droiddoc/templates-sdk-dev/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">
@@ -82,9 +77,9 @@
 <?cs /if ?><?cs # end if/else online docs ?>
       <div class="content-footer <?cs
                     if:fullpage ?>wrap<?cs
-                    else ?>layout-content-row<?cs /if ?>"
+                    else ?>cols<?cs /if ?>"
                     itemscope itemtype="http://schema.org/SiteNavigationElement">
-        <div class="layout-content-col <?cs
+        <div class="<?cs
                     if:fullpage ?>col-16<?cs
                     elif:training||guide ?>col-8<?cs
                     else ?>col-9<?cs /if ?>" style="padding-top:4px">
@@ -93,7 +88,7 @@
           <?cs /if ?>
         </div>
         <?cs if:!fullscreen ?>
-        <div class="paging-links layout-content-col col-4">
+        <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="上一堂課"
@@ -118,7 +113,7 @@
 
       <?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="layout-content-row content-footer next-class" style="display:none" itemscope itemtype="http://schema.org/SiteNavigationElement">
+      <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 ?>
@@ -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-dev/samples_navtree_data.cs b/tools/droiddoc/templates-sdk-dev/samples_navtree_data.cs
index 24ac7b7..b9b4214 100644
--- a/tools/droiddoc/templates-sdk-dev/samples_navtree_data.cs
+++ b/tools/droiddoc/templates-sdk-dev/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-dev/sdkpage.cs b/tools/droiddoc/templates-sdk-dev/sdkpage.cs
index 817ac47..1785fa0 100644
--- a/tools/droiddoc/templates-sdk-dev/sdkpage.cs
+++ b/tools/droiddoc/templates-sdk-dev/sdkpage.cs
@@ -1,5 +1,6 @@
 <?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>
@@ -45,7 +46,7 @@
 #
 ?>
 
-<?cs if:header.hide ?><?cs else ?>
+<?cs if:(header.hide||devsite)?><?cs else ?>
 <h1 itemprop="name"><?cs var:page.title ?></h1>
 <?cs /if ?>
   <div id="jd-content" itemprop="description">
@@ -80,109 +81,44 @@
       <th>Platform</th>
       <th>Package</th>
       <th style="white-space:nowrap">Size (Bytes)</th>
-      <th>MD5 Checksum</th>
+      <th>SHA1 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>
+  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
+     href="http://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)"
-     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>
+  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
+     href="http://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)"
-     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> -->
   <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>
- <!--  <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>
+  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
+     href="http://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)"
-     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>
+  <a onClick="return onDownload(this)" data-modal-toggle="ndk_tos"
+     href="http://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)"
-     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>
 
@@ -190,16 +126,13 @@
   <?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'));
 
-    $("#tos").fadeIn('slow');
-
-    location.hash = "download";
     return false;
   }
 
@@ -212,25 +145,28 @@
     }
   }
 
-  function onDownloadNdkForRealz(link) {
+
+  function onDownloadForRealz(link) {
     if ($("input#agree").is(':checked')) {
-      $("#tos").fadeOut('slow');
-
-      $('html, body').animate({
-          scrollTop: $("#Installing").offset().top
-        }, 800, function() {
-          $("#Installing").click();
+      $("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 {
-      $("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();
@@ -262,155 +198,11 @@
 <?cs call:tag_list(root.descr) ?>
 
 
+<?cs #######  TODO: Remove this whole file from processing. ######## ?>
 
 
-<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)" 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)"
-    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)"
-    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)" 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)" 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 -->
-
-
-
-</div><!-- end col-13 for lower-half content -->
-
-
-
-
+<?cs ########  The Android Studio version of the download script ######### ?>
 <script>
-  if (location.hash == "#Requirements") {
-    $('.reqs').show();
-  } else if (location.hash == "#ExistingIDE") {
-	 $('.ide').show();
-  }
-
   var os;
   var bundlename;
   var $toolslink;
@@ -435,8 +227,10 @@
     $('#not-supported').hide();
 
     /* set up primary Android Studio download button */
-    $('.download-bundle-button').append(" <br/><span class='small'>for " + os + "</span>");
-    $('.download-bundle-button').click(function() {return onDownload(this,true,true);}).attr('href', bundlename);
+    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() { onDownload(this,true,true);}).attr('href', bundlename);
   }
 
 
@@ -450,12 +244,13 @@
     }
 
     $("#downloadForRealz").attr('bundle', bundle);
-    $("a#downloadForRealz").attr("name", $(link).attr('href'));
+    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'));
+    }
 
-    $("#tos").show();
-    $("#landing").hide();
-
-    location.hash = "top";
     return false;
   }
 
@@ -483,28 +278,27 @@
 
   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);
-      });
+      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 {
-      $("label#agreeLabel").parent().stop().animate({color: "#258AAF"}, 200,
-        function() {$("label#agreeLabel").parent().stop().animate({color: "#222"}, 200)}
-      );
       return false;
     }
   }
@@ -519,7 +313,7 @@
 
 
 
-</div><!-- end the wrapper used for relative/absolute positions  -->
+
 <?cs # THIS DIV WAS OPENED IN INDEX.JD ?>
 
 
@@ -561,13 +355,21 @@
 
 </div><!-- end jd-content -->
 
-<?cs if:!sdk.redirect ?>
+<?cs if:!sdk.redirect && !devsite ?>
 <?cs include:"footer.cs" ?>
 <?cs /if ?>
 
 </div><!-- end g-unit -->
 
 <?cs include:"trailer.cs" ?>
+<?cs if:!devsite ?>
+<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>
+<?cs /if ?><!--end !devsite -->
+
 
 <!-- Start of Tag -->
 <script type="text/javascript">
@@ -581,6 +383,3 @@
 <!-- End of Tag -->
 </body>
 </html>
-
-
-
diff --git a/tools/droiddoc/templates-sdk-dev/trailer.cs b/tools/droiddoc/templates-sdk-dev/trailer.cs
index 337f8d3..2050475 100644
--- a/tools/droiddoc/templates-sdk-dev/trailer.cs
+++ b/tools/droiddoc/templates-sdk-dev/trailer.cs
@@ -1,3 +1,7 @@
+<?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 ?>
@@ -18,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-dev/yaml_navtree.cs b/tools/droiddoc/templates-sdk-dev/yaml_navtree.cs
new file mode 100644
index 0000000..e5a6404
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-dev/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/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt b/tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt
new file mode 100644
index 0000000..66a0f18
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/GPL-LICENSE.txt
@@ -0,0 +1,278 @@
+       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
new file mode 100644
index 0000000..e84328b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/LICENSE.txt
@@ -0,0 +1,20 @@
+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
new file mode 100644
index 0000000..cd610f7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/android-developer-docs.css
@@ -0,0 +1,2768 @@
+/* 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
new file mode 100644
index 0000000..d12852a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/css/default.css
@@ -0,0 +1,8877 @@
+/* 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 empty <a name=""> tags to account for sticky nav */
+body.reference a[name]:empty {
+  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,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAFuklEQVR42u2dXWgcVRSAV9LWtBBTTZVWUhNqEQtq1QeroDRKFRFsROqTYPuo+JCiIoJKFC0USqlUfCiowRcfrBgVUUElefAPkW5T8aeaGn9aRbFsjP0x2cx8PuRMvFxmdjeb2Z17Z8+B85DsZPbO+eaec3/OPSkABdXsVI2gABSAqgJQAKoKQAGoKgAFoKoAFICqAlAAqgpAAai6DqDRAiwDeoFtwB7gPaAInABKwKToCWAMeB/YDdwJrAWWNLh9+QMAXABsBQ4A3wFTwAxQBmaBAAhjNJDPy3L938BXwAvArUCHAkh+kCXAVcA+YBw4bRg7MngtkgTlDPA98CywHmhTAP8/xCbgVeAvMZZpwDQllN7xB/AysKGlAQAXAvuBkzW85UVgCBgENlfQQbmuWAXELPAnsAvoaikAQBtwh/j3coLhS2LIfqCzzu/plL8fkvvFgZiR4L2lHrfkHQBgpQTFUwmGnwC212v0KjC2y/3jQPwDPA+05xYAcBHwubx1YZzhC02QBBBRbxgBzssdAOBy4JgRZE0ZTPuNr7FHDCbEhqNAd24AAN0yUbID7QSwsZChABut3hANXY8Bq70HIMb/Ocb4w81+66v0hmGrN0QQ1ngLQJYRvpWHMWWo4KDIaMnuCcVKgdlZAGL8t2J8vpPGrwChDLyWBMFlAA8D0z4ZvwKEs8D93gCQEc9Jy/jFgkdizaRDGUSs8wXAu1bQLQE9ngHosWbPAXDQeQAypT9rBd3+gociyxi2K9riLABZUj5iuZ6RgsciM2OzFxw2A7JrAO6VwGtKTwpG+Anoy9AVmb3gDHCPcwCAFcChRox6jPu9CazMeFQUAKNRL3AJwE2yopjq228BQPZ/d2bcCyaBTa4BeNGa8Q6naIA4GQWubiKEYWvBbp8zAGQt5VfL/fQ3GEAkTzXDLVkjokA2k5a7AuA2GaLNj/tTfvhq0pQgbcwLQtlQusYVALtlzSR191MjADNI9zbJDZWBR10BMGr5/4GMADQ0SAMDlht62xUAxy0AmzMEEMnhtIO0ZF2YAH5wITd0hQw/5wE04M1bjDyXZpC2hqMlYGnWAHqBf40APOEYgChI35VSWyasWfGqrAH0WVkOIw4CSC1IG2tDoSy7XJE1gPs8ArDoIG0BmJGk30wBDHgGYFFBOgbAtqwB7GxxAHerC8rOBU0Dt2gQzjYIb8gawDor+6HVhqFdrkzEwhabiAVOTMSkUb+06FLEUVfWgj5q0cW4g64AeNo66ZLlcnTDNmesBN4y8KArAG6QU42ttCEzBVzpCoAO4EfLDeV5SzIEvgHaXdqUP2BlQud1Ux55zj2uZUX02cPRnKalRLmu17qYmPWF5YbymJgVAh8Ay5wCII3ZEZOYm6fURGT2u9X43Mnk3CDHybmfmRVYXExPv9nKEcpLejqSC3SjdY2TBzTesHqB7wc0onTEV2KucxLApXKkJy9HlAI5anuJFwCkYQ/EuCJfD+mdBnYkXOssgHY53un7MdVZ4CVgqVcADAhjMafkfTioHc14P04yvvMApIEXy5F/+7S8y6UKolPyR4BVVf7Wi2IdawwIPhTrmAW+rmZ8bwBIQ7vloXwoVzNWS6UUrwAYy9YfOlqwKZDkgneA5Qu4l3cly84F9sqGhislywLmaozuYoGFXr0DII1ukxP1hxJ6QzR7HqLxRfumZaRzXZ3f4XXZyi7gCeB3kqsnzs+kSb9s5XHgMeD8RTxDLgq3rmeuYuFvNYCoR8wqujNi+L3UWBcu9wAMt3QZ8LiMlk5RuU50teq6kcEDgTolveIRYHUQBOek1O5cFu/ukLz7/ZJgNSm+OirebWpgaPS7slxfAr4EngGuX8jopqUBxGzyrAVuB54EXgc+lV4yLhO8cfn5E+ZqUD8kBu9sQvv0Hzj4rmoEBaAAVBWAAlBVAApAVQEoAFUFoABUFYACUFUACkC1CfofXVRJocowZVYAAAAASUVORK5CYII=);
+  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 <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:
+*******************/
+
+
+
+/* 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
new file mode 100644
index 0000000..0f108e0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/css/fullscreen.css
@@ -0,0 +1,20 @@
+
+/* =============================================================================
+   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
new file mode 100644
index 0000000..3ba8486
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/design/default.js
@@ -0,0 +1,188 @@
+$(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 <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').each(function() {
+    var $target = $(this);
+    var $tooltip = $('<div>')
+        .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 <h2> 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
new file mode 100644
index 0000000..30a8f62
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android-developers-logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android.png
new file mode 100644
index 0000000..4040f3f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo.png
new file mode 100644
index 0000000..5f19215
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo@2x.png
new file mode 100644
index 0000000..04132cc
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo@2x.png
Binary files differ
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
new file mode 100644
index 0000000..3f39f4d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk@2x.png
new file mode 100644
index 0000000..8081ac5
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android_logo_ndk@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png b/tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png
new file mode 100644
index 0000000..6390a2d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/android_wrench.png
Binary files differ
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
new file mode 100644
index 0000000..5fdfaa3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left-develop.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png
new file mode 100644
index 0000000..43afec8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-left.png
Binary files differ
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
new file mode 100644
index 0000000..c86f1f3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right-develop.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png
new file mode 100644
index 0000000..6f7d6db
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow-right.png
Binary files differ
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
new file mode 100755
index 0000000..58c248a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_down.png
Binary files differ
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
new file mode 100755
index 0000000..7d0f38e
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_bluelink_up.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_off.jpg
new file mode 100755
index 0000000..fd32a64
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_off.jpg
Binary files differ
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
new file mode 100755
index 0000000..143184b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_left_on.jpg
Binary files differ
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
new file mode 100755
index 0000000..17d2efe
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_off.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_on.jpg
new file mode 100755
index 0000000..baa2af1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrow_right_on.jpg
Binary files differ
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
new file mode 100644
index 0000000..a2a91ed
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/arrows-up-down.png
Binary files differ
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
new file mode 100755
index 0000000..a6d6f0e
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_community_leftDiv.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_fade.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_fade.jpg
new file mode 100755
index 0000000..c6c70b6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_fade.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg
new file mode 100644
index 0000000..884f8f5
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_gradient.jpg
Binary files differ
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
new file mode 100755
index 0000000..84437e7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_images_sprite.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png
new file mode 100755
index 0000000..7cf0cb9
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/bg_logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/blog-default.png b/tools/droiddoc/templates-sdk-refonly/assets/images/blog-default.png
new file mode 100644
index 0000000..f8ab6c3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/blog-default.png
Binary files differ
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
new file mode 100644
index 0000000..5223ac3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient-tab.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient.png b/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient.png
new file mode 100755
index 0000000..9d59855
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/body-gradient.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png b/tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png
new file mode 100644
index 0000000..407a318
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/breadcrumb.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png
new file mode 100644
index 0000000..1b0d7f1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey.png
Binary files differ
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
new file mode 100644
index 0000000..1355507
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/close-grey_2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png
new file mode 100644
index 0000000..ef02018
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/close-white.png
Binary files differ
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
new file mode 100644
index 0000000..9b9c41d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/close-white_2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/close.png b/tools/droiddoc/templates-sdk-refonly/assets/images/close.png
new file mode 100644
index 0000000..6ae3391
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/close.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo.png
new file mode 100644
index 0000000..0f11044
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo.png
Binary files differ
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
new file mode 100644
index 0000000..0f2784d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/dac_logo@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png
new file mode 100755
index 0000000..08122ee
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/developers-logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-generic.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-generic.png
new file mode 100644
index 0000000..1802457
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/file-generic.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png
new file mode 100644
index 0000000..d3aec46
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/file-image.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png
new file mode 100644
index 0000000..ec85e4b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/file-java.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png
new file mode 100644
index 0000000..332d066
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/file-manifest.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/file-xml.png b/tools/droiddoc/templates-sdk-refonly/assets/images/file-xml.png
new file mode 100644
index 0000000..3dd21b6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/file-xml.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/folder.png b/tools/droiddoc/templates-sdk-refonly/assets/images/folder.png
new file mode 100644
index 0000000..44c6100
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/folder.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png b/tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png
new file mode 100644
index 0000000..01f971c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/fullscreen.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/grad-rule-qv.png b/tools/droiddoc/templates-sdk-refonly/assets/images/grad-rule-qv.png
new file mode 100644
index 0000000..bae2d18
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/grad-rule-qv.png
Binary files differ
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
new file mode 100644
index 0000000..3c04f24
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/Android_Dev_Lab_l.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png
new file mode 100644
index 0000000..82ce918
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GDC2011.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_large.png
new file mode 100644
index 0000000..72d54ad
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_large.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_small.png
new file mode 100644
index 0000000..3da1699
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/GTV_icon_small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo-2011.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo-2011.png
new file mode 100644
index 0000000..4a28447
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo-2011.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo.png
new file mode 100644
index 0000000..65334c8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/IO-logo.png
Binary files differ
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
new file mode 100644
index 0000000..0b101a4
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_l.png
Binary files differ
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
new file mode 100644
index 0000000..0d36bdb
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/adc2_s.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_adc.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_adc.png
new file mode 100644
index 0000000..9fe7f8f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_adc.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_m_hero_1200.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_m_hero_1200.jpg
new file mode 100644
index 0000000..6b79295
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/android_m_hero_1200.jpg
Binary files differ
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
new file mode 100755
index 0000000..91485ff
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_announcement.png
Binary files differ
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
new file mode 100755
index 0000000..dacd401
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_bottom.jpg
Binary files differ
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
new file mode 100755
index 0000000..5ce5e30
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel.png
Binary files differ
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
new file mode 100755
index 0000000..c577e02
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_board.png
Binary files differ
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
new file mode 100755
index 0000000..aa224ad
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/bg_home_carousel_wheel.png
Binary files differ
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
new file mode 100755
index 0000000..e98c942
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/carousel_buttons_sprite.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-large.png
new file mode 100644
index 0000000..0db0f6c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-large.png
Binary files differ
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
new file mode 100644
index 0000000..e10bfa9
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/devphone-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/donut-android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/donut-android.png
new file mode 100755
index 0000000..6aba06b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/donut-android.png
Binary files differ
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
new file mode 100644
index 0000000..d476ce9
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/eclair-android.png
Binary files differ
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
new file mode 100644
index 0000000..c63f7f0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/froyo-android.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/gdc-logo.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/gdc-logo.png
new file mode 100644
index 0000000..5fb53fb
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/gdc-logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png
new file mode 100644
index 0000000..8399d84
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/gingerdroid.png
Binary files differ
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
new file mode 100644
index 0000000..5bb7d7a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus-small.png
Binary files differ
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
new file mode 100644
index 0000000..90871e1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/google-plus.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/honeycomb-android.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/honeycomb-android.png
new file mode 100644
index 0000000..6cc5031
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/honeycomb-android.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-about.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-about.png
new file mode 100644
index 0000000..8339762
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-about.png
Binary files differ
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
new file mode 100644
index 0000000..0d31cdf
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-design.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-develop.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-develop.png
new file mode 100644
index 0000000..e02b20f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-develop.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-distribute.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-distribute.png
new file mode 100644
index 0000000..4824072
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/icon-distribute.png
Binary files differ
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
new file mode 100644
index 0000000..be62ca8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/ics-android.png
Binary files differ
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
new file mode 100755
index 0000000..986053c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-large.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-small.png
new file mode 100755
index 0000000..3a22549
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/io-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-large.png
new file mode 100644
index 0000000..b26f65a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-large.png
Binary files differ
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
new file mode 100644
index 0000000..cc5f1fa
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/maps-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-large.png
new file mode 100644
index 0000000..069fee7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-large.png
Binary files differ
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
new file mode 100644
index 0000000..fa1201c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/market-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-large.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-large.png
new file mode 100644
index 0000000..315a1bf
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-large.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-small.png
new file mode 100644
index 0000000..0f1670d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/home/sdk-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_main.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_main.jpg
new file mode 100755
index 0000000..f7a0a2f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_main.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_side.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_side.jpg
new file mode 100755
index 0000000..6667476
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/hr_gray_side.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg
new file mode 100755
index 0000000..1aa12b6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_contribute.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_design.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_design.png
new file mode 100644
index 0000000..c12907c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_design.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg
new file mode 100755
index 0000000..f8c1165
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download2.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download2.jpg
new file mode 100755
index 0000000..c0af7a2
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_download2.jpg
Binary files differ
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
new file mode 100644
index 0000000..9362c8f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_guidelines_logo.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg
new file mode 100644
index 0000000..0fbb197
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_market.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png
new file mode 100644
index 0000000..6cd03a3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_more.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png
new file mode 100644
index 0000000..8bfdc7b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_play.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_robot.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_robot.jpg
new file mode 100755
index 0000000..ca0fd39
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_robot.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png
new file mode 100644
index 0000000..ee90a12
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_search.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/icon_world.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_world.jpg
new file mode 100755
index 0000000..65b8fa6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/icon_world.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg
new file mode 100755
index 0000000..fd32a64
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/left_off.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg
new file mode 100755
index 0000000..143184b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/left_on.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png b/tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png
new file mode 100644
index 0000000..aa55f9a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/link-out.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/locale.png b/tools/droiddoc/templates-sdk-refonly/assets/images/locale.png
new file mode 100644
index 0000000..de3aae7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/locale.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg
new file mode 100755
index 0000000..e743f86
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/logo_breadcrumbz.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png
new file mode 100644
index 0000000..632546a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/more_bottom.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png
new file mode 100644
index 0000000..f2fcbfc
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/more_check.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png
new file mode 100644
index 0000000..99bc999
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/more_mid.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/more_top.png b/tools/droiddoc/templates-sdk-refonly/assets/images/more_top.png
new file mode 100644
index 0000000..8ead1d3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/more_top.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png b/tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png
new file mode 100755
index 0000000..12bb1fb
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/open_source.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/play-circle-grey.png b/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/play-circle-grey.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/play-circle-grey_2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey_2x.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/play-circle-grey_2x.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-grey_2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/play-circle-white.png b/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/play-circle-white.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/play-circle-white_2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white_2x.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/play-circle-white_2x.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/play-circle-white_2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png b/tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png
new file mode 100644
index 0000000..fe0da3d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/preliminary.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/preview.png b/tools/droiddoc/templates-sdk-refonly/assets/images/preview.png
new file mode 100644
index 0000000..e5856db
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/preview.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_arrow.png b/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_arrow.png
new file mode 100644
index 0000000..697ac82
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_arrow.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_btn_bg.png b/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_btn_bg.png
new file mode 100644
index 0000000..b80c9a8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/quicknav_btn_bg.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif
new file mode 100755
index 0000000..f748097
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif
new file mode 100755
index 0000000..e45d0c5
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-e2.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif
new file mode 100755
index 0000000..6196616
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-eg.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif
new file mode 100755
index 0000000..7f6a4eb
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.gif
new file mode 100755
index 0000000..99e869c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png
new file mode 100644
index 0000000..f3a6d2d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-s2.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-sg.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-sg.gif
new file mode 100755
index 0000000..b4bea10
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resizable-sg.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png
new file mode 100644
index 0000000..416493f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-article.png
Binary files differ
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
new file mode 100644
index 0000000..7273275
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-article.png
Binary files differ
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
new file mode 100644
index 0000000..59b6b68
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-sample.png
Binary files differ
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
new file mode 100644
index 0000000..c32e89a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-tutorial.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-video.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-video.png
new file mode 100644
index 0000000..59d46a0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-big-video.png
Binary files differ
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
new file mode 100644
index 0000000..398030f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-card-default-android.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png
new file mode 100644
index 0000000..f7a411c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-sample.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png
new file mode 100644
index 0000000..10a14fe
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-tutorial.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png
new file mode 100644
index 0000000..8fd5cae
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/resource-video.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/right_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/right_off.jpg
new file mode 100755
index 0000000..17d2efe
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/right_off.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/right_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/right_on.jpg
new file mode 100755
index 0000000..baa2af1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/right_on.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png
new file mode 100644
index 0000000..eab9920
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/sidenav-rule.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg
new file mode 100755
index 0000000..6d75be1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_1.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_2.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_2.jpg
new file mode 100755
index 0000000..aa994c2
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_2.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg
new file mode 100755
index 0000000..b04deb3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_3.jpg
Binary files differ
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
new file mode 100755
index 0000000..a992e92
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_1.jpg
Binary files differ
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
new file mode 100755
index 0000000..9af63f4
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_2.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_3.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_3.jpg
new file mode 100755
index 0000000..fcf236c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_large_3.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_off.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_off.jpg
new file mode 100755
index 0000000..5971227
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_off.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/slide_on.jpg b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_on.jpg
new file mode 100755
index 0000000..7ca3577
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/slide_on.jpg
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/spacer.gif b/tools/droiddoc/templates-sdk-refonly/assets/images/spacer.gif
new file mode 100755
index 0000000..f96b355
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/spacer.gif
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png
new file mode 100644
index 0000000..185b7e8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite-2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png
new file mode 100644
index 0000000..7fef43e
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/sprite.png
Binary files differ
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
new file mode 100644
index 0000000..46d6a50
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/stack-arrow-right.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/callout.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/callout.png
new file mode 100644
index 0000000..5d49f34
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/callout.png
Binary files differ
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
new file mode 100644
index 0000000..bab6aca
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span13.png
Binary files differ
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
new file mode 100644
index 0000000..cb180bf
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_land_span8.png
Binary files differ
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
new file mode 100644
index 0000000..bdccc2f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span5.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span9.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span9.png
new file mode 100644
index 0000000..5e0135b
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_galaxynexus_blank_port_span9.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus4_blank_port_432.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus4_blank_port_432.png
new file mode 100644
index 0000000..9d41aa3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus4_blank_port_432.png
Binary files differ
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
new file mode 100644
index 0000000..5d37121
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_land_span13.png
Binary files differ
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
new file mode 100644
index 0000000..df35117
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_nexus5_blank_port_span5.png
Binary files differ
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
new file mode 100644
index 0000000..077a7e6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square_small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square_small.png
new file mode 100644
index 0000000..e7e1540
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/device_wear_square_small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_down.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_down.png
new file mode 100644
index 0000000..6a0a8ee
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_down.png
Binary files differ
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
new file mode 100644
index 0000000..e887b2a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_left.png
Binary files differ
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
new file mode 100644
index 0000000..ced7fa4
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_right.png
Binary files differ
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
new file mode 100644
index 0000000..ddd4ec9
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/disclosure_up.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png
new file mode 100644
index 0000000..5f09a29
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/gototop.png
Binary files differ
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
new file mode 100644
index 0000000..3c2dc1a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35.png
Binary files differ
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
new file mode 100644
index 0000000..e34be2e
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/helpouts-logo-35_2x.png
Binary files differ
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
new file mode 100644
index 0000000..30e4cc7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_action.png
Binary files differ
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
new file mode 100644
index 0000000..afebe1c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_good.png
Binary files differ
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
new file mode 100644
index 0000000..7cfb5c5
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_movie_inline.png
Binary files differ
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
new file mode 100644
index 0000000..003b876
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_phone_tablet.png
Binary files differ
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
new file mode 100644
index 0000000..9d868b3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_use.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_web.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_web.png
new file mode 100644
index 0000000..0848e3c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_web.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_wrong.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_wrong.png
new file mode 100644
index 0000000..b7d04ce
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/ico_wrong.png
Binary files differ
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
new file mode 100644
index 0000000..eea3485
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video@2x.png
new file mode 100644
index 0000000..a5fdae3
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers-video@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/styles/notice-designers-material.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/styles/notice-designers-material.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-dev/assets/images/styles/notice-designers-material@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers@2x.png
similarity index 100%
rename from tools/droiddoc/templates-sdk-dev/assets/images/styles/notice-designers-material@2x.png
rename to tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-designers@2x.png
Binary files differ
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
new file mode 100644
index 0000000..e9f8ed2
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video@2x.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video@2x.png
new file mode 100644
index 0000000..c067ac1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers-video@2x.png
Binary files differ
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
new file mode 100644
index 0000000..a29c31a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers.png
Binary files differ
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
new file mode 100644
index 0000000..d42f537
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/notice-developers@2x.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/styles/open_new_page.png b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/open_new_page.png
new file mode 100644
index 0000000..6197e3a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/styles/open_new_page.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed-small.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed-small.png
new file mode 100644
index 0000000..002364a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png
new file mode 100644
index 0000000..40a68d9
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-closed.png
Binary files differ
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
new file mode 100644
index 0000000..e1eb784
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened-small.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png
new file mode 100644
index 0000000..789f5fa
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/triangle-opened.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png b/tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png
new file mode 100644
index 0000000..5ce1611
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/uiguidelines1.png
Binary files differ
diff --git a/tools/droiddoc/templates-sdk-refonly/assets/images/video-droid.png b/tools/droiddoc/templates-sdk-refonly/assets/images/video-droid.png
new file mode 100644
index 0000000..25163b6
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/images/video-droid.png
Binary files differ
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
new file mode 100644
index 0000000..a67b5b0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/js/android_3p-bundle.js
@@ -0,0 +1,2766 @@
+//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.
+ * <p>
+ *
+ * For a fairly comprehensive set of languages see the
+ * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
+ * 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.
+ * <p>
+ * Usage: <ol>
+ * <li> include this source file in an html page via
+ *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
+ * <li> define style rules.  See the example page for examples.
+ * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
+ *    {@code class=prettyprint.}
+ *    You can also use the (html deprecated) {@code <xmp>} 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
new file mode 100644
index 0000000..7c2af5d
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/js/docs.js
@@ -0,0 +1,5296 @@
+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
new file mode 100644
index 0000000..eef5ad7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/assets/js/prettify.js
@@ -0,0 +1,28 @@
+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
new file mode 100644
index 0000000..93fcf88
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/class.cs
@@ -0,0 +1,676 @@
+<?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
new file mode 100644
index 0000000..32966a0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/classes.cs
@@ -0,0 +1,54 @@
+<?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
new file mode 100644
index 0000000..f61d290
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/components/masthead.cs
@@ -0,0 +1,174 @@
+<?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
new file mode 100644
index 0000000..16469ac
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/customizations.cs
@@ -0,0 +1,620 @@
+<?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
new file mode 100644
index 0000000..9411b78
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/data.hdf
@@ -0,0 +1,4 @@
+template {
+    which = normal
+}
+
diff --git a/tools/droiddoc/templates-sdk-refonly/designpage.cs b/tools/droiddoc/templates-sdk-refonly/designpage.cs
new file mode 100644
index 0000000..b945a1c
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/designpage.cs
@@ -0,0 +1,108 @@
+<!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
new file mode 100644
index 0000000..0019dfc
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/docpage.cs
@@ -0,0 +1,203 @@
+<?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
new file mode 100644
index 0000000..666f594
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/footer.cs
@@ -0,0 +1,174 @@
+<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
new file mode 100644
index 0000000..6f33d88
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/gcm_navtree_data.cs
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..66b7d55
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/gms_navtree_data.cs
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..100b0bc
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/head_tag.cs
@@ -0,0 +1,101 @@
+<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
new file mode 100644
index 0000000..e8301be
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/header.cs
@@ -0,0 +1,3 @@
+<?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
new file mode 100644
index 0000000..38c9da8
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/header_tabs.cs
@@ -0,0 +1,2 @@
+
+<!-- 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
new file mode 100644
index 0000000..417a5c1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/jd_lists_unified.cs
@@ -0,0 +1 @@
+<?cs var:reference_tree ?>
diff --git a/tools/droiddoc/templates-sdk-refonly/macros_override.cs b/tools/droiddoc/templates-sdk-refonly/macros_override.cs
new file mode 100644
index 0000000..08c0de1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/macros_override.cs
@@ -0,0 +1,41 @@
+<?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
new file mode 100644
index 0000000..73aa199
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/navtree_data.cs
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..61754f0
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/nosidenavpage.cs
@@ -0,0 +1,28 @@
+<?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
new file mode 100644
index 0000000..72d5538
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/package.cs
@@ -0,0 +1,66 @@
+<?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
new file mode 100644
index 0000000..fe6a5aa
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/packages.cs
@@ -0,0 +1,46 @@
+<?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
new file mode 100644
index 0000000..7b4bf0f
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/sample.cs
@@ -0,0 +1,151 @@
+<?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
new file mode 100644
index 0000000..e62d3fe
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/sampleindex.cs
@@ -0,0 +1,136 @@
+<?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
new file mode 100644
index 0000000..24ac7b7
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/samples_navtree_data.cs
@@ -0,0 +1,3 @@
+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
new file mode 100644
index 0000000..9076387
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/sdkpage.cs
@@ -0,0 +1,588 @@
+<?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
new file mode 100644
index 0000000..4bf502a
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/timestamp.cs
@@ -0,0 +1 @@
+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
new file mode 100644
index 0000000..225b2c1
--- /dev/null
+++ b/tools/droiddoc/templates-sdk-refonly/trailer.cs
@@ -0,0 +1,21 @@
+</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 d493566..c71f4f4 100644
--- a/tools/droiddoc/templates-sdk/assets/css/default.css
+++ b/tools/droiddoc/templates-sdk/assets/css/default.css
@@ -732,7 +732,7 @@
     text-align:center;
     width: 50%;
   }
-  
+
   .training-nav-top a.prev-page-link {
     padding-left: 15px;
     text-align: left;
@@ -840,7 +840,7 @@
     margin: 0 0 6px;
     line-height: 16px;
   }
-  
+
   /* Class colors */
   ol.class-list li:nth-child(10n+1) .title {
     background: #00bcd4;
@@ -872,7 +872,7 @@
   ol.class-list li:nth-child(10n+10) .title {
     background: #7e57c2;
   }
-  
+
   @media (max-width: 719px) {
     ol.class-list ol,
     ol.class-list .description {
@@ -2628,6 +2628,20 @@
   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;
@@ -3330,7 +3344,7 @@
 h4.jd-details-title {
   font-size:1.15em;
   background-color: #E2E2E2;
-  margin:1.5em 0 .6em;
+  margin:4em 0 .6em;
   padding:3px 95px 3px 3px; /* room for api-level */
 }
 body.google h4.jd-details-title {
@@ -3808,15 +3822,14 @@
   display: none;
 }
 
-/* offset the <a name=""> tags to account for sticky nav */
-body.reference a[name] {
+/* offset the empty <a name=""> tags to account for sticky nav */
+body.reference a[name]:empty {
   visibility: hidden;
   display: block;
   position: relative;
   top: -56px;
 }
 
-
 /* Quicknav */
 .btn-quicknav {
   width:20px;
@@ -6362,9 +6375,13 @@
 .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;
+    color:#fff; }
   .dac-button.dac-raised.dac-primary:active, .landing-secondary:active, .button:active {
-    background-color: #0277bd; }
+    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; }
@@ -7769,6 +7786,20 @@
   text-align: center;
 }
 
+/* Android Studio download page */
+section#features {
+  padding-top:0;
+}
+.wrap.feature {
+  margin:80px auto;
+}
+.dac-section-links.feature-more {
+  margin-top:-20px;
+}
+.dac-toggle-content .wrap.feature {
+  margin-top:0;
+}
+
 @media (max-width: 719px) {
   .dac-hero-figure {
     height: 150px;
@@ -7778,6 +7809,17 @@
   .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-hero-carousel {
@@ -8497,12 +8539,12 @@
 $spritesheet: width height image $spritesheet-sprites;
 */
 .dac-sprite, #tb li:before, #qv li:before {
-  background-image: url(/assets/images/sprite.png);
+  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-image: url(../../assets/images/sprite-2x.png);
       background-size: 50% 50%; } }
 
 .dac-sprite.dac-auto-chevron {
@@ -8856,4 +8898,85 @@
   .dac-hero-cta.mprev {
   white-space:nowrap;
   }
-}
\ No newline at end of file
+}
+
+/** Custom search API styles */
+.dac-custom-search {
+  background: #fff;
+  margin: 0 -10px;
+  padding: 20px 10px;
+  z-index: 1;
+}
+
+.dac-custom-search-section-title {
+  color: #505050;
+}
+
+.dac-custom-search-entry {
+  margin-bottom: 36px;
+  margin-top: 24px;
+}
+
+.dac-custom-search-image {
+  background-size: cover;
+  height: 112px;
+}
+
+@media (max-width: 719px) {
+  .dac-custom-search-image {
+    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;
+}
+
+.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-custom-search-load-more:hover {
+  opacity: 0.7;
+}
+
+.dac-custom-search-no-results {
+  color: #999;
+}
diff --git a/tools/droiddoc/templates-sdk/assets/js/docs.js b/tools/droiddoc/templates-sdk/assets/js/docs.js
index d88c0e6..ee3ebee 100644
--- a/tools/droiddoc/templates-sdk/assets/js/docs.js
+++ b/tools/droiddoc/templates-sdk/assets/js/docs.js
@@ -985,7 +985,7 @@
     }
     // 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;
+    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
@@ -1328,7 +1328,7 @@
 function changeNavLang(lang) {
   if (lang === 'en') { return; }
 
-  var $links = $('a[' + lang + '-lang]');
+  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
@@ -1386,7 +1386,7 @@
     $(".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");
+                  + "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();
@@ -1394,7 +1394,7 @@
       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");
+                  + "assets/images/styles/disclosure_down.png");
     });
   }
   return false;
@@ -2546,14 +2546,15 @@
 }
 
 function submit_search() {
-  var query = document.getElementById('search_autocomplete').value;
+  var query = escapeHTML(document.getElementById('search_autocomplete').value);
   location.hash = 'q=' + query;
-  loadSearchResults();
+  searchControl.query = query;
+  searchControl.init();
+  searchControl.trackSearchRequest(query);
   $("#searchResults").slideDown('slow', setStickyTop);
   return false;
 }
 
-
 function hideResults() {
   $("#searchResults").slideUp('fast', setStickyTop);
   $("#search-close").addClass("hide");
@@ -2562,119 +2563,248 @@
   $("#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);
-  });
+  searchControl.reset();
 
   return false;
 }
 
-
-
 /* ########################################################## */
 /* ################  CUSTOM SEARCH ENGINE  ################## */
 /* ########################################################## */
+var searchControl = null;
+var dacsearch = dacsearch || {};
 
-var searchControl;
-google.load('search', '1', {"callback" : function() {
-            searchControl = new google.search.SearchControl();
-          } });
+/**
+ * The custom search engine API.
+ * @constructor
+ */
+dacsearch.CustomSearchEngine = function() {
+  /**
+   * The last response from Google CSE.
+   * @private {Object}
+   */
+  this.resultQuery_ = {};
 
-function loadSearchResults() {
-  document.getElementById("search_autocomplete").style.color = "#000";
+  /** @private {?Element} */
+  this.searchResultEl_ = null;
 
-  searchControl = new google.search.SearchControl();
+  /** @private {?Element} */
+  this.searchInputEl_ = null;
 
-  // 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"));
+  /** @private {string} */
+  this.query = '';
+};
 
-  // configure search result options
-  searchOptions = new google.search.SearcherOptions();
-  searchOptions.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
+/**
+ * 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_();
+};
 
-  // 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/");
+/**
+ * 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));
+};
 
-  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/");
+/**
+ * Resets the search control.
+ */
+dacsearch.CustomSearchEngine.prototype.reset = function() {
+  this.query = '';
+  this.searchInputEl_.off('keyup');
+  this.searchResultEl_.empty();
+  this.updateResultTitle_();
+};
 
-  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/");
+/**
+ * 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>");
+};
 
-  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);
+/**
+ * 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)'
+  };
 
-  // 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);
+  $.get(cseUrl + $.param(searchParams), function(data) {
+    this.resultQuery_ = data;
+    this.renderResults_(data);
+    this.updateResultTitle_(this.query);
+  }.bind(this));
+};
 
-  // 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();
-  });
+/**
+ * Renders the results.
+ * @private
+ */
+dacsearch.CustomSearchEngine.prototype.renderResults_ = function(results) {
+  var el = this.searchResultEl_;
 
-  // draw the search results box
-  searchControl.draw(document.getElementById("leftSearchControl"), drawOptions);
+  if (!results.items) {
+    el.append($('<div>').text('No results'));
+    return;
+  }
 
-  // get query and execute the search
-  searchControl.execute(decodeURI(getQuery(location.hash)));
+  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';
 
-  document.getElementById("search_autocomplete").focus();
-  addTabListeners();
-}
-// End of loadSearchResults
+    var entry = $('<div>').addClass('dac-custom-search-entry cols');
+
+    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 + ')')));
+    }
+
+    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());
+    });
+
+
+    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));
+
+    el.append(entry);
+  }
+
+  if ($('#dac-custom-search-load-more')) {
+    $('#dac-custom-search-load-more').remove();
+  }
+
+  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));
+
+    el.append(loadMoreButton);
+  }
+};
+
+
+/**
+ * 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);
+};
+
+
+/**
+ * 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);
+};
+
+
+/**
+ * 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);
+  };
+};
 
 
 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");
-    loadSearchResults();
   }
 }, true);
 
@@ -2703,7 +2833,7 @@
 
   // 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 ((location.hash.indexOf("q=") == -1) || (searchControl.query == "undefined")) {
     // If the results pane is open, close it.
     if (!$("#searchResults").is(":hidden")) {
       hideResults();
@@ -2712,65 +2842,11 @@
     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) {
@@ -3371,13 +3447,13 @@
     if ( (expand == null && a.hasClass("closed")) || expand ) {
         list.style.display = "none";
         summary.style.display = "block";
-        trigger.src = toRoot + "assets/images/triangle-opened.png";
+        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/triangle-closed.png";
+        trigger.src = toRoot + "assets/images/styles/disclosure_down.png";
         a.removeClass("opened");
         a.addClass("closed");
     }
@@ -3747,7 +3823,7 @@
 
     return $el;
   }
-  
+
   function createResponsiveFlowColumn(cardSize) {
     var cardWidth = parseInt(cardSize.match(/(\d+)/)[1], 10);
     var column = $('<div>').addClass('col-' + (cardWidth / 3) + 'of6');
@@ -3788,7 +3864,7 @@
 
       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
@@ -4868,6 +4944,11 @@
     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();
+    }
   };
 
   Modal.prototype.open_ = function() {
diff --git a/tools/droiddoc/templates-sdk/components/masthead.cs b/tools/droiddoc/templates-sdk/components/masthead.cs
index 838ddbe..e17612d 100644
--- a/tools/droiddoc/templates-sdk/components/masthead.cs
+++ b/tools/droiddoc/templates-sdk/components/masthead.cs
@@ -80,7 +80,7 @@
         <?cs call:header_search_widget() ?>
         <?cs /if ?>
 
-        <?cs if:ndk ?><a class="dac-header-console-btn" href="http://developer.android.com">
+        <?cs if:ndk ?><a class="dac-header-console-btn" href="//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>
@@ -140,7 +140,7 @@
   </nav>
   <!-- end NDK navigation-->
   <?cs else ?>
-  <!-- Navigation-->
+  <!-- Standard DAC Navigation-->
   <nav class="dac-nav">
     <div class="dac-nav-dimmer" data-dac-toggle-nav></div>
 
@@ -151,8 +151,32 @@
                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>
-      <li class="dac-nav-item home">
+      <?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">
@@ -228,8 +252,7 @@
           <?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><?cs /if ?>
           <li class="dac-nav-item preview">
             <a class="dac-nav-link" href="<?cs var:toroot ?>preview/index.html">Preview</a>
           </li>
@@ -262,7 +285,12 @@
             <a class="dac-nav-link" href="<?cs var:toroot ?>distribute/stories/index.html">Stories</a>
           </li>
         </ul>
-      </li>
+      </li><?cs
+      /if ?><?cs
+      #
+      # End if/else reference only docs
+      #
+      ?>
     </ul>
   </nav>
   <!-- end navigation-->
@@ -281,7 +309,7 @@
     <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">
+        <a href="//googleblog.blogspot.com/" id="butterbar-message">
           The Android 5.0 SDK will be available on October 17th!
         </a>
       </div>
diff --git a/tools/droiddoc/templates-sdk/customizations.cs b/tools/droiddoc/templates-sdk/customizations.cs
index aaef8ed..4cf5abb 100644
--- a/tools/droiddoc/templates-sdk/customizations.cs
+++ b/tools/droiddoc/templates-sdk/customizations.cs
@@ -10,7 +10,7 @@
   <div id="body-content">
     <div>
 <?cs /def ?>
-<?cs 
+<?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">
@@ -297,7 +297,7 @@
       </div>
       <script type="text/javascript">
        showGoogleRefTree();
-    
+
       </script>
     </div> <!-- end side-nav -->
     <script>
@@ -528,7 +528,7 @@
       call:fullpage() ?><?cs
     elif:nonavpage ?><?cs
       call:no_nav() ?><?cs
-    elif:guide || reference || samples || downloads ?><?cs      
+    elif:guide || reference || samples || downloads ?><?cs
       call:ndk_nav() ?><?cs
     else ?><?cs
       call:default_left_nav() ?> <?cs
@@ -585,7 +585,7 @@
 <?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/">
+  licensed under <a href="//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
@@ -594,7 +594,7 @@
 <?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>.
+  href="//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 ?>
diff --git a/tools/droiddoc/templates-sdk/designpage.cs b/tools/droiddoc/templates-sdk/designpage.cs
index b945a1c..d9c2681 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="http://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic">
+    <link rel="stylesheet" href="https://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">
+    <link rel="stylesheet" href="<?cs var:toroot ?>assets/design/default.css?v=19">
     <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>
+    <script src="<?cs var:toroot ?>assets/design/default.js?v=19"></script>
   </head>
   <body class="gc-documentation 
     <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs
@@ -70,16 +70,16 @@
 
         <p id="copyright">
           Except as noted, this content is licensed under
-          <a href="http://creativecommons.org/licenses/by/2.5/">
+          <a href="//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>.
+          <a href="//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>
+          <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>
         </p>
 
       </div>
diff --git a/tools/droiddoc/templates-sdk/docpage.cs b/tools/droiddoc/templates-sdk/docpage.cs
index 668105b..d41adaa 100644
--- a/tools/droiddoc/templates-sdk/docpage.cs
+++ b/tools/droiddoc/templates-sdk/docpage.cs
@@ -193,11 +193,11 @@
 </div><!-- end doc-content -->
 
 <?cs include:"trailer.cs" ?>
-  <script src="https://developer.android.com/ytblogger_lists_unified.js" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_lists_unified.js?v=15" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_extras.js?v=15" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_collections.js?v=15" type="text/javascript"></script>
-  <script src="<?cs var:toroot ?>jd_tag_helpers.js?v=15" type="text/javascript"></script>
+  <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>
 
 </body>
 </html>
diff --git a/tools/droiddoc/templates-sdk/footer.cs b/tools/droiddoc/templates-sdk/footer.cs
index 1ffee63..095c7fd 100644
--- a/tools/droiddoc/templates-sdk/footer.cs
+++ b/tools/droiddoc/templates-sdk/footer.cs
@@ -7,7 +7,7 @@
       </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="//android-developers.blogspot.com/">Blog</a>
           <a class="dac-footer-contact-link" href="/support.html">Support</a>
         </div>
         <div class="dac-footer-social">
@@ -44,10 +44,12 @@
         <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>
diff --git a/tools/droiddoc/templates-sdk/head_tag.cs b/tools/droiddoc/templates-sdk/head_tag.cs
index babb3c7..1dbb3c3 100644
--- a/tools/droiddoc/templates-sdk/head_tag.cs
+++ b/tools/droiddoc/templates-sdk/head_tag.cs
@@ -22,6 +22,17 @@
 <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
@@ -30,18 +41,18 @@
 <!-- STYLESHEETS -->
 <link rel="stylesheet"
 href="<?cs
-if:android.whichdoc != 'online' ?>http:<?cs
+if:android.whichdoc != 'online' ?>https:<?cs
 /if ?>//fonts.googleapis.com/css?family=Roboto+Condensed">
 <link rel="stylesheet" href="<?cs
-if:android.whichdoc != 'online' ?>http:<?cs
+if:android.whichdoc != 'online' ?>https:<?cs
 /if ?>//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
   title="roboto">
-<?cs 
+<?cs
   if:ndk ?><link rel="stylesheet" href="<?cs
-  if:android.whichdoc != 'online' ?>http:<?cs
+  if:android.whichdoc != 'online' ?>https:<?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=7" rel="stylesheet" type="text/css">
+<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 -->
@@ -50,7 +61,7 @@
 <?cs /if ?>
 
 <!-- JAVASCRIPT -->
-<script src="<?cs if:android.whichdoc != 'online' ?>http:<?cs /if ?>//www.google.com/jsapi" type="text/javascript"></script>
+<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
@@ -64,8 +75,9 @@
   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=6" type="text/javascript"></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
diff --git a/tools/droiddoc/templates-sdk/macros_override.cs b/tools/droiddoc/templates-sdk/macros_override.cs
index 0a94598..9d146b1 100644
--- a/tools/droiddoc/templates-sdk/macros_override.cs
+++ b/tools/droiddoc/templates-sdk/macros_override.cs
@@ -33,4 +33,12 @@
       <?cs set:count = count + #1 ?>
     <?cs /each ?>
   </table>
-<?cs /def ?>
\ No newline at end of file
+<?cs /def ?>
+
+<?cs def:doc_root_override() ?><?cs
+  if:referenceonly
+    ?>https://developer.android.com/<?cs
+  else ?><?cs
+    var:toroot ?><?cs
+  /if ?><?cs
+/def ?>
\ No newline at end of file
diff --git a/tools/droiddoc/templates-sdk/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs
index 47c2992..c6679a6 100644
--- a/tools/droiddoc/templates-sdk/sdkpage.cs
+++ b/tools/droiddoc/templates-sdk/sdkpage.cs
@@ -1,5 +1,6 @@
 <?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>
@@ -80,21 +81,21 @@
       <th>Platform</th>
       <th>Package</th>
       <th style="white-space:nowrap">Size (Bytes)</th>
-      <th>MD5 Checksum</th>
+      <th>SHA1 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>
+  <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)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.win32.legacy_download ?>"><?cs var:ndk.win32.legacy_download ?></a>
+  <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>
@@ -102,16 +103,16 @@
   <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>
+  <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)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.win64.legacy_download ?>"><?cs var:ndk.win64.legacy_download ?></a>
+  <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>
@@ -120,8 +121,8 @@
   <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>
+  <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>
@@ -129,41 +130,32 @@
  <!-- (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>
+  <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)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac64_download ?>"><?cs var:ndk.mac64_download ?></a>
+  <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)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.mac64.legacy_download ?>"><?cs var:ndk.mac64.legacy_download ?></a>
+  <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>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>
+  <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>
@@ -171,16 +163,16 @@
   <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>
+  <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)"
-     href="http://dl.google.com/android/ndk/<?cs var:ndk.linux64.legacy_download ?>"><?cs var:ndk.linux64.legacy_download ?></a>
+  <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>
@@ -192,16 +184,13 @@
   <?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'));
 
-    $("#tos").fadeIn('slow');
-
-    location.hash = "download";
     return false;
   }
 
@@ -214,25 +203,28 @@
     }
   }
 
-  function onDownloadNdkForRealz(link) {
+
+  function onDownloadForRealz(link) {
     if ($("input#agree").is(':checked')) {
-      $("#tos").fadeOut('slow');
-
-      $('html, body').animate({
-          scrollTop: $("#Installing").offset().top
-        }, 800, function() {
-          $("#Installing").click();
+      $("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 {
-      $("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();
@@ -264,153 +256,11 @@
 <?cs call:tag_list(root.descr) ?>
 
 
+<?cs #######  TODO: Remove this whole file from processing. ######## ?>
 
 
-<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 -->
-
-
-
-
-
+<?cs ########  The Android Studio version of the download script ######### ?>
 <script>
-
-  if (location.hash == "#Requirements") {
-    $('.reqs').show();
-  } else if (location.hash == "#ExistingIDE") {
-	 $('.ide').show();
-  }
-
   var os;
   var bundlename;
   var $toolslink;
@@ -435,7 +285,9 @@
     $('#not-supported').hide();
 
     /* set up primary Android Studio download button */
-    $('.download-bundle-button > .small').html(" for " + os);
+    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);
   }
 
@@ -453,13 +305,10 @@
     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'));
     }
 
-    $("#tos").show();
-    $("#landing").hide();
-
-    location.hash = "top";
     return false;
   }
 
@@ -487,22 +336,24 @@
 
   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);
-      });
+      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 {
@@ -520,7 +371,7 @@
 
 
 
-</div><!-- end the wrapper used for relative/absolute positions  -->
+
 <?cs # THIS DIV WAS OPENED IN INDEX.JD ?>
 
 
@@ -569,6 +420,11 @@
 </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">
diff --git a/tools/fat16copy.py b/tools/fat16copy.py
new file mode 100755
index 0000000..1dd15b7
--- /dev/null
+++ b/tools/fat16copy.py
@@ -0,0 +1,789 @@
+#!/usr/bin/env python
+#
+# Copyright 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 os
+import sys
+import struct
+
+FAT_TABLE_START = 0x200
+DEL_MARKER = 0xe5
+ESCAPE_DEL_MARKER = 0x05
+
+ATTRIBUTE_READ_ONLY = 0x1
+ATTRIBUTE_HIDDEN = 0x2
+ATTRIBUTE_SYSTEM = 0x4
+ATTRIBUTE_VOLUME_LABEL = 0x8
+ATTRIBUTE_SUBDIRECTORY = 0x10
+ATTRIBUTE_ARCHIVE = 0x20
+ATTRIBUTE_DEVICE = 0x40
+
+LFN_ATTRIBUTES = \
+    ATTRIBUTE_VOLUME_LABEL | \
+    ATTRIBUTE_SYSTEM | \
+    ATTRIBUTE_HIDDEN | \
+    ATTRIBUTE_READ_ONLY
+LFN_ATTRIBUTES_BYTE = struct.pack("B", LFN_ATTRIBUTES)
+
+MAX_CLUSTER_ID = 0x7FFF
+
+def read_le_short(f):
+  "Read a little-endian 2-byte integer from the given file-like object"
+  return struct.unpack("<H", f.read(2))[0]
+
+def read_le_long(f):
+  "Read a little-endian 4-byte integer from the given file-like object"
+  return struct.unpack("<L", f.read(4))[0]
+
+def read_byte(f):
+  "Read a 1-byte integer from the given file-like object"
+  return struct.unpack("B", f.read(1))[0]
+
+def skip_bytes(f, n):
+  "Fast-forward the given file-like object by n bytes"
+  f.seek(n, os.SEEK_CUR)
+
+def skip_short(f):
+  "Fast-forward the given file-like object 2 bytes"
+  skip_bytes(f, 2)
+
+def skip_byte(f):
+  "Fast-forward the given file-like object 1 byte"
+  skip_bytes(f, 1)
+
+def rewind_bytes(f, n):
+  "Rewind the given file-like object n bytes"
+  skip_bytes(f, -n)
+
+def rewind_short(f):
+  "Rewind the given file-like object 2 bytes"
+  rewind_bytes(f, 2)
+
+class fake_file(object):
+  """
+  Interface for python file-like objects that we use to manipulate the image.
+  Inheritors must have an idx member which indicates the file pointer, and a
+  size member which indicates the total file size.
+  """
+
+  def seek(self, amount, direction=0):
+    "Implementation of seek from python's file-like object interface."
+    if direction == os.SEEK_CUR:
+      self.idx += amount
+    elif direction == os.SEEK_END:
+      self.idx = self.size - amount
+    else:
+      self.idx = amount
+
+    if self.idx < 0:
+      self.idx = 0
+    if self.idx > self.size:
+      self.idx = self.size
+
+class fat_file(fake_file):
+  """
+  A file inside of our fat image. The file may or may not have a dentry, and
+  if it does this object knows nothing about it. All we see is a valid cluster
+  chain.
+  """
+
+  def __init__(self, fs, cluster, size=None):
+    """
+    fs: The fat() object for the image this file resides in.
+    cluster: The first cluster of data for this file.
+    size: The size of this file. If not given, we use the total length of the
+          cluster chain that starts from the cluster argument.
+    """
+    self.fs = fs
+    self.start_cluster = cluster
+    self.size = size
+
+    if self.size is None:
+      self.size = fs.get_chain_size(cluster)
+
+    self.idx = 0
+
+  def read(self, size):
+    "Read method for pythonic file-like interface."
+    if self.idx + size > self.size:
+      size = self.size - self.idx
+    got = self.fs.read_file(self.start_cluster, self.idx, size)
+    self.idx += len(got)
+    return got
+
+  def write(self, data):
+    "Write method for pythonic file-like interface."
+    self.fs.write_file(self.start_cluster, self.idx, data)
+    self.idx += len(data)
+
+    if self.idx > self.size:
+      self.size = self.idx
+
+def shorten(name, index):
+  """
+  Create a file short name from the given long name (with the extension already
+  removed). The index argument gives a disambiguating integer to work into the
+  name to avoid collisions.
+  """
+  name = "".join(name.split('.')).upper()
+  postfix = "~" + str(index)
+  return name[:8 - len(postfix)] + postfix
+
+class fat_dir(object):
+  "A directory in our fat filesystem."
+
+  def __init__(self, backing):
+    """
+    backing: A file-like object from which we can read dentry info. Should have
+    an fs member allowing us to get to the underlying image.
+    """
+    self.backing = backing
+    self.dentries = []
+    to_read = self.backing.size / 32
+
+    self.backing.seek(0)
+
+    while to_read > 0:
+      (dent, consumed) = self.backing.fs.read_dentry(self.backing)
+      to_read -= consumed
+
+      if dent:
+        self.dentries.append(dent)
+
+  def __str__(self):
+    return "\n".join([str(x) for x in self.dentries]) + "\n"
+
+  def add_dentry(self, attributes, shortname, ext, longname, first_cluster,
+      size):
+    """
+    Add a new dentry to this directory.
+    attributes: Attribute flags for this dentry. See the ATTRIBUTE_ constants
+                above.
+    shortname: Short name of this file. Up to 8 characters, no dots.
+    ext: Extension for this file. Up to 3 characters, no dots.
+    longname: The long name for this file, with extension. Largely unrestricted.
+    first_cluster: The first cluster in the cluster chain holding the contents
+                   of this file.
+    size: The size of this file. Set to 0 for subdirectories.
+    """
+    new_dentry = dentry(self.backing.fs, attributes, shortname, ext,
+        longname, first_cluster, size)
+    new_dentry.commit(self.backing)
+    self.dentries.append(new_dentry)
+    return new_dentry
+
+  def make_short_name(self, name):
+    """
+    Given a long file name, return an 8.3 short name as a tuple. Name will be
+    engineered not to collide with other such names in this folder.
+    """
+    parts = name.rsplit('.', 1)
+
+    if len(parts) == 1:
+      parts.append('')
+
+    name = parts[0]
+    ext = parts[1].upper()
+
+    index = 1
+    shortened = shorten(name, index)
+
+    for dent in self.dentries:
+      assert dent.longname != name, "File must not exist"
+      if dent.shortname == shortened:
+        index += 1
+        shortened = shorten(name, index)
+
+    if len(name) <= 8 and len(ext) <= 3 and not '.' in name:
+      return (name.upper().ljust(8), ext.ljust(3))
+
+    return (shortened.ljust(8), ext[:3].ljust(3))
+
+  def new_file(self, name, data=None):
+    """
+    Add a new regular file to this directory.
+    name: The name of the new file.
+    data: The contents of the new file. Given as a file-like object.
+    """
+    size = 0
+    if data:
+      data.seek(0, os.SEEK_END)
+      size = data.tell()
+
+    chunk = self.backing.fs.allocate(size or 1)
+    (shortname, ext) = self.make_short_name(name)
+    self.add_dentry(0, shortname, ext, name, chunk, size)
+
+    if data is None:
+      return
+
+    data_file = fat_file(self.backing.fs, chunk, size)
+    data.seek(0)
+    data_file.write(data.read())
+
+  def new_subdirectory(self, name):
+    """
+    Create a new subdirectory of this directory with the given name.
+    Returns a fat_dir().
+    """
+    chunk = self.backing.fs.allocate(1)
+    (shortname, ext) = self.make_short_name(name)
+    new_dentry = dentry(self.backing.fs, ATTRIBUTE_SUBDIRECTORY,
+        shortname, ext, name, chunk, 0)
+    new_dentry.commit(self.backing)
+    return new_dentry.open_directory()
+
+def lfn_checksum(name_data):
+  """
+  Given the characters of an 8.3 file name (concatenated *without* the dot),
+  Compute a one-byte checksum which needs to appear in corresponding long file
+  name entries.
+  """
+  assert len(name_data) == 11, "Name data should be exactly 11 characters"
+  name_data = struct.unpack("B" * 11, name_data)
+
+  result = 0
+
+  for char in name_data:
+    last_bit = (result & 1) << 7
+    result = (result >> 1) | last_bit
+    result += char
+    result = result & 0xFF
+
+  return struct.pack("B", result)
+
+class dentry(object):
+  "A directory entry"
+  def __init__(self, fs, attributes, shortname, ext, longname,
+      first_cluster, size):
+    """
+    fs: The fat() object for the image we're stored in.
+    attributes: The attribute flags for this dentry. See the ATTRIBUTE_ flags
+                above.
+    shortname: The short name stored in this dentry. Up to 8 characters, no
+               dots.
+    ext: The file extension stored in this dentry. Up to 3 characters, no
+         dots.
+    longname: The long file name stored in this dentry.
+    first_cluster: The first cluster in the cluster chain backing the file
+                   this dentry points to.
+    size: Size of the file this dentry points to. 0 for subdirectories.
+    """
+    self.fs = fs
+    self.attributes = attributes
+    self.shortname = shortname
+    self.ext = ext
+    self.longname = longname
+    self.first_cluster = first_cluster
+    self.size = size
+
+  def name(self):
+    "A friendly text file name for this dentry."
+    if self.longname:
+      return self.longname
+
+    if not self.ext or len(self.ext) == 0:
+      return self.shortname
+
+    return self.shortname + "." + self.ext
+
+  def __str__(self):
+    return self.name() + " (" + str(self.size) + \
+      " bytes @ " + str(self.first_cluster) + ")"
+
+  def is_directory(self):
+    "Return whether this dentry points to a directory."
+    return (self.attributes & ATTRIBUTE_SUBDIRECTORY) != 0
+
+  def open_file(self):
+    "Open the target of this dentry if it is a regular file."
+    assert not self.is_directory(), "Cannot open directory as file"
+    return fat_file(self.fs, self.first_cluster, self.size)
+
+  def open_directory(self):
+    "Open the target of this dentry if it is a directory."
+    assert self.is_directory(), "Cannot open file as directory"
+    return fat_dir(fat_file(self.fs, self.first_cluster))
+
+  def longname_records(self, checksum):
+    """
+    Get the longname records necessary to store this dentry's long name,
+    packed as a series of 32-byte strings.
+    """
+    if self.longname is None:
+      return []
+    if len(self.longname) == 0:
+      return []
+
+    encoded_long_name = self.longname.encode('utf-16-le')
+    long_name_padding = "\0" * (26 - (len(encoded_long_name) % 26))
+    padded_long_name = encoded_long_name + long_name_padding
+
+    chunks = [padded_long_name[i:i+26] for i in range(0,
+      len(padded_long_name), 26)]
+    records = []
+    sequence_number = 1
+
+    for c in chunks:
+      sequence_byte = struct.pack("B", sequence_number)
+      sequence_number += 1
+      record = sequence_byte + c[:10] + LFN_ATTRIBUTES_BYTE + "\0" + \
+          checksum + c[10:22] + "\0\0" + c[22:]
+      records.append(record)
+
+    last = records.pop()
+    last_seq = struct.unpack("B", last[0])[0]
+    last_seq = last_seq | 0x40
+    last = struct.pack("B", last_seq) + last[1:]
+    records.append(last)
+    records.reverse()
+
+    return records
+
+  def commit(self, f):
+    """
+    Write this dentry into the given file-like object,
+    which is assumed to contain a FAT directory.
+    """
+    f.seek(0)
+    padded_short_name = self.shortname.ljust(8)
+    padded_ext = self.ext.ljust(3)
+    name_data = padded_short_name + padded_ext
+    longname_record_data = self.longname_records(lfn_checksum(name_data))
+    record = struct.pack("<11sBBBHHHHHHHL",
+        name_data,
+        self.attributes,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        self.first_cluster,
+        self.size)
+    entry = "".join(longname_record_data + [record])
+
+    record_count = len(longname_record_data) + 1
+
+    found_count = 0
+
+    while True:
+      record = f.read(32)
+
+      if record is None or len(record) != 32:
+        break
+
+      marker = struct.unpack("B", record[0])[0]
+
+      if marker == DEL_MARKER or marker == 0:
+        found_count += 1
+
+        if found_count == record_count:
+          break
+      else:
+        found_count = 0
+
+    if found_count != record_count:
+      f.write("\0" * self.fs.bytes_per_cluster)
+      f.seek(-self.fs.bytes_per_cluster, os.SEEK_CUR)
+    else:
+      f.seek(-(record_count * 32), os.SEEK_CUR)
+    f.write(entry)
+
+class root_dentry_file(fake_file):
+  """
+  File-like object for the root directory. The root directory isn't stored in a
+  normal file, so we can't use a normal fat_file object to create a view of it.
+  """
+  def __init__(self, fs):
+    self.fs = fs
+    self.idx = 0
+    self.size = fs.root_entries * 32
+
+  def read(self, count):
+    f = self.fs.f
+    f.seek(self.fs.data_start() + self.idx)
+
+    if self.idx + count > self.size:
+      count = self.size - self.idx
+
+    ret = f.read(count)
+    self.idx += len(ret)
+    return ret
+
+  def write(self, data):
+    f = self.fs.f
+    f.seek(self.fs.data_start() + self.idx)
+
+    if self.idx + len(data) > self.size:
+      data = data[:self.size - self.idx]
+
+    f.write(data)
+    self.idx += len(data)
+    if self.idx > self.size:
+      self.size = self.idx
+
+class fat(object):
+  "A FAT image"
+
+  def __init__(self, path):
+    """
+    path: Path to an image file containing a FAT file system.
+    """
+    f = open(path, "r+b")
+
+    self.f = f
+
+    f.seek(0xb)
+    bytes_per_sector = read_le_short(f)
+    sectors_per_cluster = read_byte(f)
+
+    self.bytes_per_cluster = bytes_per_sector * sectors_per_cluster
+
+    reserved_sectors = read_le_short(f)
+    assert reserved_sectors == 1, \
+        "Can only handle FAT with 1 reserved sector"
+
+    fat_count = read_byte(f)
+    assert fat_count == 2, "Can only handle FAT with 2 tables"
+
+    self.root_entries = read_le_short(f)
+
+    skip_short(f) # Image size. Sort of. Useless field.
+    skip_byte(f) # Media type. We don't care.
+
+    self.fat_size = read_le_short(f) * bytes_per_sector
+    self.root = fat_dir(root_dentry_file(self))
+
+  def data_start(self):
+    """
+    Index of the first byte after the FAT tables.
+    """
+    return FAT_TABLE_START + self.fat_size * 2
+
+  def get_chain_size(self, head_cluster):
+    """
+    Return how many total bytes are in the cluster chain rooted at the given
+    cluster.
+    """
+    if head_cluster == 0:
+      return 0
+
+    f = self.f
+    f.seek(FAT_TABLE_START + head_cluster * 2)
+
+    cluster_count = 0
+
+    while head_cluster <= MAX_CLUSTER_ID:
+      cluster_count += 1
+      head_cluster = read_le_short(f)
+      f.seek(FAT_TABLE_START + head_cluster * 2)
+
+    return cluster_count * self.bytes_per_cluster
+
+  def read_dentry(self, f=None):
+    """
+    Read and decode a dentry from the given file-like object at its current
+    seek position.
+    """
+    f = f or self.f
+    attributes = None
+
+    consumed = 1
+
+    lfn_entries = {}
+
+    while True:
+      skip_bytes(f, 11)
+      attributes = read_byte(f)
+      rewind_bytes(f, 12)
+
+      if attributes & LFN_ATTRIBUTES != LFN_ATTRIBUTES:
+        break
+
+      consumed += 1
+
+      seq = read_byte(f)
+      chars = f.read(10)
+      skip_bytes(f, 3) # Various hackish nonsense
+      chars += f.read(12)
+      skip_short(f) # Lots more nonsense
+      chars += f.read(4)
+
+      chars = unicode(chars, "utf-16-le").encode("utf-8")
+
+      lfn_entries[seq] = chars
+
+    ind = read_byte(f)
+
+    if ind == 0 or ind == DEL_MARKER:
+      skip_bytes(f, 31)
+      return (None, consumed)
+
+    if ind == ESCAPE_DEL_MARKER:
+      ind = DEL_MARKER
+
+    ind = str(unichr(ind))
+
+    if ind == '.':
+      skip_bytes(f, 31)
+      return (None, consumed)
+
+    shortname = ind + f.read(7).rstrip()
+    ext = f.read(3).rstrip()
+    skip_bytes(f, 15) # Assorted flags, ctime/atime/mtime, etc.
+    first_cluster = read_le_short(f)
+    size = read_le_long(f)
+
+    lfn = lfn_entries.items()
+    lfn.sort(key=lambda x: x[0])
+    lfn = reduce(lambda x, y: x + y[1], lfn, "")
+
+    if len(lfn) == 0:
+      lfn = None
+    else:
+      lfn = lfn.split('\0', 1)[0]
+
+    return (dentry(self, attributes, shortname, ext, lfn, first_cluster,
+      size), consumed)
+
+  def read_file(self, head_cluster, start_byte, size):
+    """
+    Read from a given FAT file.
+    head_cluster: The first cluster in the file.
+    start_byte: How many bytes in to the file to begin the read.
+    size: How many bytes to read.
+    """
+    f = self.f
+
+    assert size >= 0, "Can't read a negative amount"
+    if size == 0:
+      return ""
+
+    got_data = ""
+
+    while True:
+      size_now = size
+      if start_byte + size > self.bytes_per_cluster:
+        size_now = self.bytes_per_cluster - start_byte
+
+      if start_byte < self.bytes_per_cluster:
+        size -= size_now
+
+        cluster_bytes_from_root = (head_cluster - 2) * \
+            self.bytes_per_cluster
+        bytes_from_root = cluster_bytes_from_root + start_byte
+        bytes_from_data_start = bytes_from_root + self.root_entries * 32
+
+        f.seek(self.data_start() + bytes_from_data_start)
+        line = f.read(size_now)
+        got_data += line
+
+        if size == 0:
+          return got_data
+
+      start_byte -= self.bytes_per_cluster
+
+      if start_byte < 0:
+        start_byte = 0
+
+      f.seek(FAT_TABLE_START + head_cluster * 2)
+      assert head_cluster <= MAX_CLUSTER_ID, "Out-of-bounds read"
+      head_cluster = read_le_short(f)
+      assert head_cluster > 0, "Read free cluster"
+
+    return got_data
+
+  def write_cluster_entry(self, entry):
+    """
+    Write a cluster entry to the FAT table. Assumes our backing file is already
+    seeked to the correct entry in the first FAT table.
+    """
+    f = self.f
+    f.write(struct.pack("<H", entry))
+    skip_bytes(f, self.fat_size - 2)
+    f.write(struct.pack("<H", entry))
+    rewind_bytes(f, self.fat_size)
+
+  def allocate(self, amount):
+    """
+    Allocate a new cluster chain big enough to hold at least the given amount
+    of bytes.
+    """
+    f = self.f
+    f.seek(FAT_TABLE_START + 4)
+
+    current = None
+    current_size = 0
+    free_zones = {}
+
+    pos = 2
+    while pos < self.fat_size / 2:
+      data = read_le_short(f)
+
+      if data == 0 and current is not None:
+        current_size += 1
+      elif data == 0:
+        current = pos
+        current_size = 1
+      elif current is not None:
+        free_zones[current] = current_size
+        current = None
+
+      pos += 1
+
+    if current is not None:
+      free_zones[current] = current_size
+
+    free_zones = free_zones.items()
+    free_zones.sort(key=lambda x: x[1])
+
+    grabbed_zones = []
+    grabbed = 0
+
+    while grabbed < amount and len(free_zones) > 0:
+      zone = free_zones.pop()
+      grabbed += zone[1] * self.bytes_per_cluster
+      grabbed_zones.append(zone)
+
+    if grabbed < amount:
+      return None
+
+    excess = (grabbed - amount) / self.bytes_per_cluster
+
+    grabbed_zones[-1] = (grabbed_zones[-1][0],
+        grabbed_zones[-1][1] - excess)
+
+    out = None
+    grabbed_zones.reverse()
+
+    for cluster, size in grabbed_zones:
+      entries = range(cluster + 1, cluster + size)
+      entries.append(out or 0xFFFF)
+      out = cluster
+      f.seek(FAT_TABLE_START + cluster * 2)
+      for entry in entries:
+        self.write_cluster_entry(entry)
+
+    return out
+
+  def extend_cluster(self, cluster, amount):
+    """
+    Given a cluster which is the *last* cluster in a chain, extend it to hold
+    at least `amount` more bytes.
+    """
+    return_cluster = None
+    f = self.f
+
+    position = FAT_TABLE_START + cluster * 2
+    f.seek(position)
+
+    assert read_le_short(f) == 0xFFFF, "Extending from middle of chain"
+    rewind_short(f)
+
+    while position + 2 < FAT_TABLE_START + self.fat_size and amount > 0:
+      skip_short(f)
+      got = read_le_short(f)
+      rewind_short(f)
+      rewind_short(f)
+
+      if got != 0:
+        break
+
+      cluster += 1
+      return_cluster = return_cluster or cluster
+      position += 2
+      self.write_cluster_entry(cluster)
+
+    if amount < 0:
+      self.write_cluster_entry(0xFFFF)
+      return return_cluster
+
+    new_chunk = self.allocate(amount)
+    f.seek(FAT_TABLE_START + cluster * 2)
+    self.write_cluster_entry(new_chunk)
+
+    return return_cluster or new_chunk
+
+  def write_file(self, head_cluster, start_byte, data):
+    """
+    Write to a given FAT file.
+
+    head_cluster: The first cluster in the file.
+    start_byte: How many bytes in to the file to begin the write.
+    data: The data to write.
+    """
+    f = self.f
+
+    while True:
+      if start_byte < self.bytes_per_cluster:
+        to_write = data[:self.bytes_per_cluster - start_byte]
+        data = data[self.bytes_per_cluster - start_byte:]
+
+        cluster_bytes_from_root = (head_cluster - 2) * \
+            self.bytes_per_cluster
+        bytes_from_root = cluster_bytes_from_root + start_byte
+        bytes_from_data_start = bytes_from_root + self.root_entries * 32
+
+        f.seek(self.data_start() + bytes_from_data_start)
+        f.write(to_write)
+
+        if len(data) == 0:
+          return
+
+      start_byte -= self.bytes_per_cluster
+
+      if start_byte < 0:
+        start_byte = 0
+
+      f.seek(FAT_TABLE_START + head_cluster * 2)
+      next_cluster = read_le_short(f)
+      if next_cluster > MAX_CLUSTER_ID:
+        head_cluster = self.extend_cluster(head_cluster, len(data))
+      else:
+        head_cluster = next_cluster
+      assert head_cluster > 0, "Cannot write free cluster"
+
+def add_item(directory, item):
+  """
+  Copy a file into the given FAT directory. If the path given is a directory,
+  copy recursively.
+  directory: fat_dir to copy the file in to
+  item: Path of local file to copy
+  """
+  if os.path.isdir(item):
+    base = os.path.basename(item)
+    if len(base) == 0:
+      base = os.path.basename(item[:-1])
+    sub = directory.new_subdirectory(base)
+    for next_item in os.listdir(item):
+      add_item(sub, os.path.join(item, next_item))
+  else:
+    with open(item, 'rb') as f:
+      directory.new_file(os.path.basename(item), f)
+
+if __name__ == "__main__":
+  if len(sys.argv) < 3:
+    print("Usage: fat16copy.py <image> <file> [<file> ...]")
+    print("Files are copied into the root of the image.")
+    print("Directories are copied recursively")
+    sys.exit(1)
+
+  root = fat(sys.argv[1]).root
+
+  for p in sys.argv[2:]:
+    add_item(root, p)
diff --git a/tools/kati_all_products.sh b/tools/kati_all_products.sh
new file mode 100755
index 0000000..4567dbd
--- /dev/null
+++ b/tools/kati_all_products.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -e
+
+cd $ANDROID_BUILD_TOP
+mkdir -p out.kati
+source build/envsetup.sh
+
+get_build_var all_named_products | sed "s/ /\n/g" | parallel "$@" --progress "(source build/envsetup.sh; lunch {}-eng && m -j OUT_DIR=out.kati/{} out.kati/{}/build-{}.ninja) >out.kati/log.{} 2>&1"
diff --git a/tools/makeparallel/makeparallel.cpp b/tools/makeparallel/makeparallel.cpp
index c70fa9a..4ae8f61 100644
--- a/tools/makeparallel/makeparallel.cpp
+++ b/tools/makeparallel/makeparallel.cpp
@@ -337,7 +337,29 @@
 
   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) {
@@ -361,9 +383,10 @@
   }
 
   // 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) {
diff --git a/tools/releasetools/add_img_to_target_files.py b/tools/releasetools/add_img_to_target_files.py
index 5730019..2e26514 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.
 """
 
 import sys
@@ -46,6 +70,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 AddSystem(output_zip, prefix="IMAGES/", recovery_img=None, boot_img=None):
@@ -71,19 +96,6 @@
   imgname = BuildSystem(OPTIONS.input_tmp, OPTIONS.info_dict,
                         block_list=block_list)
 
-  # If requested, calculate and add dm-verity integrity hashes and
-  # metadata to system.img.
-  if OPTIONS.info_dict.get("board_bvb_enable", None) == "true":
-    bvbtool = os.getenv('BVBTOOL') or "bvbtool"
-    cmd = [bvbtool, "add_image_hashes", "--image", imgname]
-    args = OPTIONS.info_dict.get("board_bvb_add_image_hashes_args", None)
-    if args and args.strip():
-      cmd.extend(shlex.split(args))
-    p = common.Run(cmd, stdout=subprocess.PIPE)
-    p.communicate()
-    assert p.returncode == 0, "bvbtool add_image_hashes of %s image failed" % (
-      os.path.basename(OPTIONS.input_tmp),)
-
   common.ZipWrite(output_zip, imgname, prefix + "system.img")
   common.ZipWrite(output_zip, block_list, prefix + "system.map")
   return imgname
@@ -226,6 +238,25 @@
   shutil.rmtree(temp_dir)
 
 
+def AddVBMeta(output_zip, boot_img_path, system_img_path, prefix="IMAGES/"):
+  """Create a VBMeta image and store it in output_zip."""
+  _, img_file_name = tempfile.mkstemp()
+  avbtool = os.getenv('AVBTOOL') or "avbtool"
+  cmd = [avbtool, "make_vbmeta_image",
+         "--output", img_file_name,
+         "--include_descriptors_from_image", boot_img_path,
+         "--include_descriptors_from_image", system_img_path,
+         "--generate_dm_verity_cmdline_from_hashtree", system_img_path]
+  common.AppendAVBSigningArgs(cmd)
+  args = OPTIONS.info_dict.get("board_avb_make_vbmeta_image_args", None)
+  if args and args.strip():
+    cmd.extend(shlex.split(args))
+  p = common.Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  p.communicate()
+  assert p.returncode == 0, "avbtool make_vbmeta_image failed"
+  common.ZipWrite(output_zip, img_file_name, prefix + "vbmeta.img")
+
+
 def AddPartitionTable(output_zip, prefix="IMAGES/"):
   """Create a partition table image and store it in output_zip."""
 
@@ -316,19 +347,11 @@
 
   common.ZipClose(input_zip)
   output_zip = zipfile.ZipFile(filename, "a",
-                               compression=zipfile.ZIP_DEFLATED)
+                               compression=zipfile.ZIP_DEFLATED,
+                               allowZip64=True)
 
   has_recovery = (OPTIONS.info_dict.get("no_recovery") != "true")
   system_root_image = (OPTIONS.info_dict.get("system_root_image", None) == "true")
-  board_bvb_enable = (OPTIONS.info_dict.get("board_bvb_enable", None) == "true")
-
-  # Brillo Verified Boot is incompatible with certain
-  # configurations. Explicitly check for these.
-  if board_bvb_enable:
-    assert not has_recovery, "has_recovery incompatible with bvb"
-    assert not system_root_image, "system_root_image incompatible with bvb"
-    assert not OPTIONS.rebuild_recovery, "rebuild_recovery incompatible with bvb"
-    assert not has_vendor, "VENDOR images currently incompatible with bvb"
 
   def banner(s):
     print "\n\n++++ " + s + " ++++\n\n"
@@ -342,17 +365,11 @@
       boot_image = common.GetBootableImage(
           "IMAGES/boot.img", "boot.img", OPTIONS.input_tmp, "BOOT")
   else:
-    if board_bvb_enable:
-      # With Brillo Verified Boot, we need to build system.img before
-      # boot.img since the latter includes the dm-verity root hash and
-      # salt for the former.
-      pass
-    else:
-      banner("boot")
-      boot_image = common.GetBootableImage(
+    banner("boot")
+    boot_image = common.GetBootableImage(
         "IMAGES/boot.img", "boot.img", OPTIONS.input_tmp, "BOOT")
-      if boot_image:
-        boot_image.AddToZip(output_zip)
+    if boot_image:
+      boot_image.AddToZip(output_zip)
 
   recovery_image = None
   if has_recovery:
@@ -373,25 +390,21 @@
   banner("system")
   system_img_path = AddSystem(
     output_zip, recovery_img=recovery_image, boot_img=boot_image)
-  if OPTIONS.info_dict.get("board_bvb_enable", None) == "true":
-    # If we're using Brillo Verified Boot, we can now build boot.img
-    # given that we have system.img.
-    banner("boot")
-    boot_image = common.GetBootableImage(
-      "IMAGES/boot.img", "boot.img", OPTIONS.input_tmp, "BOOT",
-      system_img_path=system_img_path)
-    if boot_image:
-      boot_image.AddToZip(output_zip)
   if has_vendor:
     banner("vendor")
     AddVendor(output_zip)
-  banner("userdata")
-  AddUserdata(output_zip)
-  banner("cache")
-  AddCache(output_zip)
+  if not OPTIONS.is_signing:
+    banner("userdata")
+    AddUserdata(output_zip)
+    banner("cache")
+    AddCache(output_zip)
   if OPTIONS.info_dict.get("board_bpt_enable", None) == "true":
     banner("partition-table")
     AddPartitionTable(output_zip)
+  if OPTIONS.info_dict.get("board_avb_enable", None) == "true":
+    banner("vbmeta")
+    boot_contents = boot_image.WriteToTemp()
+    AddVBMeta(output_zip, boot_contents.name, system_img_path)
 
   # For devices using A/B update, copy over images from RADIO/ and/or
   # VENDOR_IMAGES/ to IMAGES/ and make sure we have all the needed
@@ -437,6 +450,8 @@
       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:
@@ -448,6 +463,7 @@
       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 b5a8cf0..70bb4eb 100644
--- a/tools/releasetools/blockimgdiff.py
+++ b/tools/releasetools/blockimgdiff.py
@@ -342,6 +342,21 @@
     return ctx.hexdigest()
 
   def WriteTransfers(self, prefix):
+    def WriteTransfersZero(out, to_zero):
+      """Limit the number of blocks in command 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
+      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)
+      return total
+
     out = []
 
     total = 0
@@ -523,9 +538,8 @@
       elif xf.style == "zero":
         assert xf.tgt_ranges
         to_zero = xf.tgt_ranges.subtract(xf.src_ranges)
-        if to_zero:
-          out.append("%s %s\n" % (xf.style, to_zero.to_string_raw()))
-          total += to_zero.size()
+        assert WriteTransfersZero(out, to_zero) == to_zero.size()
+        total += to_zero.size()
       else:
         raise ValueError("unknown transfer style '%s'\n" % xf.style)
 
@@ -554,16 +568,27 @@
 
     # Zero out extended blocks as a workaround for bug 20881595.
     if self.tgt.extended:
-      out.append("zero %s\n" % (self.tgt.extended.to_string_raw(),))
+      assert (WriteTransfersZero(out, self.tgt.extended) ==
+              self.tgt.extended.size())
       total += self.tgt.extended.size()
 
     # We erase all the blocks on the partition that a) don't contain useful
-    # data in the new image and b) will not be touched by dm-verity.
+    # data in the new image; b) will not be touched by dm-verity. Out of those
+    # blocks, we erase the ones that won't be used in this update at the
+    # beginning of an update. The rest would be erased at the end. This is to
+    # work around the eMMC issue observed on some devices, which may otherwise
+    # get starving for clean blocks and thus fail the update. (b/28347095)
     all_tgt = RangeSet(data=(0, self.tgt.total_blocks))
     all_tgt_minus_extended = all_tgt.subtract(self.tgt.extended)
     new_dontcare = all_tgt_minus_extended.subtract(self.tgt.care_map)
-    if new_dontcare:
-      out.append("erase %s\n" % (new_dontcare.to_string_raw(),))
+
+    erase_first = new_dontcare.subtract(self.touched_src_ranges)
+    if erase_first:
+      out.insert(0, "erase %s\n" % (erase_first.to_string_raw(),))
+
+    erase_last = new_dontcare.subtract(erase_first)
+    if erase_last:
+      out.append("erase %s\n" % (erase_last.to_string_raw(),))
 
     out.insert(0, "%d\n" % (self.version,))   # format version number
     out.insert(1, "%d\n" % (total,))
@@ -670,10 +695,19 @@
     with open(prefix + ".new.dat", "wb") as new_f:
       for xf in self.transfers:
         if xf.style == "zero":
-          pass
+          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)))
+
         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" % (
+              tgt_size, tgt_size, 100.0, xf.style,
+              xf.tgt_name, str(xf.tgt_ranges)))
+
         elif xf.style == "diff":
           src = self.src.ReadRangeSet(xf.src_ranges)
           tgt = self.tgt.ReadRangeSet(xf.tgt_ranges)
@@ -700,6 +734,12 @@
             # These are identical; we don't need to generate a patch,
             # just issue copy commands on the device.
             xf.style = "move"
+            if xf.src_ranges != xf.tgt_ranges:
+              print("%10d %10d (%6.2f%%) %7s %s %s (from %s)" % (
+                  tgt_size, tgt_size, 100.0, xf.style,
+                  xf.tgt_name if xf.tgt_name == xf.src_name else (
+                      xf.tgt_name + " (from " + xf.src_name + ")"),
+                  str(xf.tgt_ranges), str(xf.src_ranges)))
           else:
             # For files in zip format (eg, APKs, JARs, etc.) we would
             # like to use imgdiff -z if possible (because it usually
@@ -747,10 +787,11 @@
           size = len(patch)
           with lock:
             patches[patchnum] = (patch, xf)
-            print("%10d %10d (%6.2f%%) %7s %s" % (
+            print("%10d %10d (%6.2f%%) %7s %s %s %s" % (
                 size, tgt_size, size * 100.0 / tgt_size, xf.style,
                 xf.tgt_name if xf.tgt_name == xf.src_name else (
-                    xf.tgt_name + " (from " + xf.src_name + ")")))
+                    xf.tgt_name + " (from " + xf.src_name + ")"),
+                str(xf.tgt_ranges), str(xf.src_ranges)))
 
       threads = [threading.Thread(target=diff_worker)
                  for _ in range(self.threads)]
@@ -1076,27 +1117,23 @@
   def FindTransfers(self):
     """Parse the file_map to generate all the transfers."""
 
-    def AddTransfer(tgt_name, src_name, tgt_ranges, src_ranges, style, by_id,
-                    split=False):
-      """Wrapper function for adding a Transfer().
+    def AddSplitTransfers(tgt_name, src_name, tgt_ranges, src_ranges,
+                          style, by_id):
+      """Add one or multiple Transfer()s by splitting large files.
 
       For BBOTA v3, we need to stash source blocks for resumable feature.
       However, with the growth of file size and the shrink of the cache
       partition source blocks are too large to be stashed. If a file occupies
-      too many blocks (greater than MAX_BLOCKS_PER_DIFF_TRANSFER), we split it
-      into smaller pieces by getting multiple Transfer()s.
+      too many blocks, we split it into smaller pieces by getting multiple
+      Transfer()s.
 
       The downside is that after splitting, we may increase the package size
       since the split pieces don't align well. According to our experiments,
       1/8 of the cache size as the per-piece limit appears to be optimal.
       Compared to the fixed 1024-block limit, it reduces the overall package
-      size by 30% volantis, and 20% for angler and bullhead."""
+      size by 30% for volantis, and 20% for angler and bullhead."""
 
-      # We care about diff transfers only.
-      if style != "diff" or not split:
-        Transfer(tgt_name, src_name, tgt_ranges, src_ranges, style, by_id)
-        return
-
+      # Possibly split large files into smaller chunks.
       pieces = 0
       cache_size = common.OPTIONS.cache_size
       split_threshold = 0.125
@@ -1132,6 +1169,74 @@
         Transfer(tgt_split_name, src_split_name, tgt_ranges, src_ranges, style,
                  by_id)
 
+    def AddTransfer(tgt_name, src_name, tgt_ranges, src_ranges, style, by_id,
+                    split=False):
+      """Wrapper function for adding a Transfer()."""
+
+      # We specialize diff transfers only (which covers bsdiff/imgdiff/move);
+      # otherwise add the Transfer() as is.
+      if style != "diff" or not split:
+        Transfer(tgt_name, src_name, tgt_ranges, src_ranges, style, by_id)
+        return
+
+      # Handle .odex files specially to analyze the block-wise difference. If
+      # most of the blocks are identical with only few changes (e.g. header),
+      # we will patch the changed blocks only. This avoids stashing unchanged
+      # blocks while patching. We limit the analysis to files without size
+      # changes only. This is to avoid sacrificing the OTA generation cost too
+      # much.
+      if (tgt_name.split(".")[-1].lower() == 'odex' and
+          tgt_ranges.size() == src_ranges.size()):
+
+        # 0.5 threshold can be further tuned. The tradeoff is: if only very
+        # few blocks remain identical, we lose the opportunity to use imgdiff
+        # that may have better compression ratio than bsdiff.
+        crop_threshold = 0.5
+
+        tgt_skipped = RangeSet()
+        src_skipped = RangeSet()
+        tgt_size = tgt_ranges.size()
+        tgt_changed = 0
+        for src_block, tgt_block in zip(src_ranges.next_item(),
+                                        tgt_ranges.next_item()):
+          src_rs = RangeSet(str(src_block))
+          tgt_rs = RangeSet(str(tgt_block))
+          if self.src.ReadRangeSet(src_rs) == self.tgt.ReadRangeSet(tgt_rs):
+            tgt_skipped = tgt_skipped.union(tgt_rs)
+            src_skipped = src_skipped.union(src_rs)
+          else:
+            tgt_changed += tgt_rs.size()
+
+          # Terminate early if no clear sign of benefits.
+          if tgt_changed > tgt_size * crop_threshold:
+            break
+
+        if tgt_changed < tgt_size * crop_threshold:
+          assert tgt_changed + tgt_skipped.size() == tgt_size
+          print('%10d %10d (%6.2f%%) %s' % (tgt_skipped.size(), tgt_size,
+                tgt_skipped.size() * 100.0 / tgt_size, tgt_name))
+          AddSplitTransfers(
+              "%s-skipped" % (tgt_name,),
+              "%s-skipped" % (src_name,),
+              tgt_skipped, src_skipped, style, by_id)
+
+          # Intentionally change the file extension to avoid being imgdiff'd as
+          # the files are no longer in their original format.
+          tgt_name = "%s-cropped" % (tgt_name,)
+          src_name = "%s-cropped" % (src_name,)
+          tgt_ranges = tgt_ranges.subtract(tgt_skipped)
+          src_ranges = src_ranges.subtract(src_skipped)
+
+          # Possibly having no changed blocks.
+          if not tgt_ranges:
+            return
+
+      # Add the transfer(s).
+      AddSplitTransfers(
+          tgt_name, src_name, tgt_ranges, src_ranges, style, by_id)
+
+    print("Finding transfers...")
+
     empty = RangeSet()
     for tgt_fn, tgt_ranges in self.tgt.file_map.items():
       if tgt_fn == "__ZERO":
diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
index 69b1ba8..50e81bf 100755
--- a/tools/releasetools/build_image.py
+++ b/tools/releasetools/build_image.py
@@ -27,6 +27,7 @@
 import sys
 import commands
 import common
+import shlex
 import shutil
 import sparse_img
 import tempfile
@@ -102,6 +103,51 @@
   simg = sparse_img.SparseImage(image_file, mode="r+b", build_map=False)
   simg.AppendFillChunk(0, blocks)
 
+def AVBCalcMaxImageSize(avbtool, partition_size, additional_args):
+  """Calculates max image size for a given partition size.
+
+  Args:
+    avbtool: String with path to avbtool.
+    partition_size: The size of the partition in question.
+    additional_args: Additional arguments to pass to 'avbtool
+      add_hashtree_image'.
+  Returns:
+    The maximum image size or 0 if an error occurred.
+  """
+  cmdline = "%s add_hashtree_footer " % avbtool
+  cmdline += "--partition_size %d " % partition_size
+  cmdline += "--calc_max_image_size "
+  cmdline += additional_args
+  (output, exit_code) = RunCommand(shlex.split(cmdline))
+  if exit_code != 0:
+    return 0
+  else:
+    return int(output)
+
+def AVBAddHashtree(image_path, avbtool, partition_size, partition_name,
+                   signing_args, additional_args):
+  """Adds dm-verity hashtree and AVB metadata to an image.
+
+  Args:
+    image_path: Path to image to modify.
+    avbtool: String with path to avbtool.
+    partition_size: The size of the partition in question.
+    partition_name: The name of the partition - will be embedded in metadata.
+    signing_args: Arguments for signing the image.
+    additional_args: Additional arguments to pass to 'avbtool
+      add_hashtree_image'.
+  Returns:
+    True if the operation succeeded.
+  """
+  cmdline = "%s add_hashtree_footer " % avbtool
+  cmdline += "--partition_size %d " % partition_size
+  cmdline += "--partition_name %s " % partition_name
+  cmdline += "--image %s " % image_path
+  cmdline += signing_args + " "
+  cmdline += additional_args
+  (_, exit_code) = RunCommand(shlex.split(cmdline))
+  return exit_code == 0
+
 def AdjustPartitionSizeForVerity(partition_size, fec_supported):
   """Modifies the provided partition size to account for the verity metadata.
 
@@ -109,7 +155,8 @@
   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:
@@ -121,27 +168,31 @@
 
   # 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)
+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:
@@ -204,7 +255,7 @@
 
 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
@@ -212,7 +263,7 @@
   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!"):
@@ -250,7 +301,7 @@
     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:
@@ -281,10 +332,17 @@
     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
@@ -292,6 +350,18 @@
   shutil.rmtree(tempdir_name, ignore_errors=True)
   return True
 
+def ConvertBlockMapToBaseFs(block_map_file):
+  fd, base_fs_file = tempfile.mkstemp(prefix="script_gen_",
+                                      suffix=".base_fs")
+  os.close(fd)
+
+  convert_command = ["blk_alloc_to_base_fs", block_map_file, base_fs_file]
+  (_, exit_code) = RunCommand(convert_command)
+  if exit_code != 0:
+    os.remove(base_fs_file)
+    return None
+  return base_fs_file
+
 def BuildImage(in_dir, prop_dict, out_file, target_out=None):
   """Build an image to out_file from in_dir with property prop_dict.
 
@@ -308,6 +378,7 @@
   # /system and the ramdisk, and can be mounted at the root of the file system.
   origin_in = in_dir
   fs_config = prop_dict.get("fs_config")
+  base_fs_file = None
   if (prop_dict.get("system_root_image") == "true"
       and prop_dict["mount_point"] == "system"):
     in_dir = tempfile.mkdtemp()
@@ -342,12 +413,25 @@
   # 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:
       return False
     prop_dict["partition_size"] = str(adjusted_size)
     prop_dict["original_partition_size"] = str(partition_size)
+    prop_dict["verity_size"] = str(verity_size)
+
+  # Adjust partition size for AVB.
+  if prop_dict.get("avb_enable") == "true":
+    avbtool = prop_dict.get("avb_avbtool")
+    partition_size = int(prop_dict.get("partition_size"))
+    additional_args = prop_dict["avb_add_hashtree_footer_args"]
+    max_image_size = AVBCalcMaxImageSize(avbtool, partition_size,
+                                         additional_args)
+    if max_image_size == 0:
+      return False
+    prop_dict["partition_size"] = str(max_image_size)
+    prop_dict["original_partition_size"] = str(partition_size)
 
   if fs_type.startswith("ext"):
     build_command = ["mkuserimg.sh"]
@@ -367,6 +451,11 @@
       build_command.extend(["-D", target_out])
     if "block_list" in prop_dict:
       build_command.extend(["-B", prop_dict["block_list"]])
+    if "base_fs_file" in prop_dict:
+      base_fs_file = ConvertBlockMapToBaseFs(prop_dict["base_fs_file"])
+      if base_fs_file is None:
+        return False
+      build_command.extend(["-d", base_fs_file])
     build_command.extend(["-L", prop_dict["mount_point"]])
     if "selinux_fc" in prop_dict:
       build_command.append(prop_dict["selinux_fc"])
@@ -382,10 +471,14 @@
       build_command.extend(["-C", fs_config])
     if "selinux_fc" in prop_dict:
       build_command.extend(["-c", prop_dict["selinux_fc"]])
+    if "block_list" in prop_dict:
+      build_command.extend(["-B", prop_dict["block_list"]])
     if "squashfs_compressor" in prop_dict:
       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_disable_4k_align" in prop_dict and prop_dict.get("squashfs_disable_4k_align") == "true":
+      build_command.extend(["-a"])
   elif fs_type.startswith("f2fs"):
     build_command = ["mkf2fsuserimg.sh"]
     build_command.extend([out_file, prop_dict["partition_size"]])
@@ -417,6 +510,8 @@
       shutil.rmtree(in_dir, ignore_errors=True)
       if fs_config:
         os.remove(fs_config)
+    if base_fs_file is not None:
+      os.remove(base_fs_file)
   if exit_code != 0:
     return False
 
@@ -460,6 +555,17 @@
     if not MakeVerityEnabledImage(out_file, verity_fec_supported, prop_dict):
       return False
 
+  # Add AVB hashtree and metadata.
+  if "avb_enable" in prop_dict:
+    avbtool = prop_dict.get("avb_avbtool")
+    original_partition_size = int(prop_dict.get("original_partition_size"))
+    partition_name = prop_dict["partition_name"]
+    signing_args = prop_dict["avb_signing_args"]
+    additional_args = prop_dict["avb_add_hashtree_footer_args"]
+    if not AVBAddHashtree(out_file, avbtool, original_partition_size,
+                          partition_name, signing_args, additional_args):
+      return False
+
   if run_fsck and prop_dict.get("skip_fsck") != "true":
     success, unsparse_image = UnsparseImage(out_file, replace=False)
     if not success:
@@ -500,7 +606,9 @@
       "verity",
       "verity_key",
       "verity_signer_cmd",
-      "verity_fec"
+      "verity_fec",
+      "avb_signing_args",
+      "avb_avbtool"
       )
   for p in common_props:
     copy_prop(p, p)
@@ -520,6 +628,11 @@
     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_disable_4k_align", "squashfs_disable_4k_align")
+    copy_prop("system_base_fs_file", "base_fs_file")
+    copy_prop("system_avb_enable", "avb_enable")
+    copy_prop("system_avb_add_hashtree_footer_args",
+              "avb_add_hashtree_footer_args")
   elif mount_point == "data":
     # Copy the generic fs type first, override with specific one if available.
     copy_prop("fs_type", "fs_type")
@@ -534,12 +647,19 @@
     copy_prop("vendor_journal_size", "journal_size")
     copy_prop("vendor_verity_block_device", "verity_block_device")
     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_disable_4k_align", "squashfs_disable_4k_align")
+    copy_prop("vendor_base_fs_file", "base_fs_file")
+    copy_prop("vendor_avb_enable", "avb_enable")
+    copy_prop("vendor_avb_add_hashtree_footer_args",
+              "avb_add_hashtree_footer_args")
   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")
-
+  d["partition_name"] = mount_point
   return d
 
 
diff --git a/tools/releasetools/check_ota_package_signature.py b/tools/releasetools/check_ota_package_signature.py
new file mode 100755
index 0000000..0da61b1
--- /dev/null
+++ b/tools/releasetools/check_ota_package_signature.py
@@ -0,0 +1,161 @@
+#!/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.
+
+"""
+Verify a given OTA package with the specifed certificate.
+"""
+
+from __future__ import print_function
+
+import argparse
+import common
+import re
+import subprocess
+import sys
+
+from hashlib import sha1
+from hashlib import sha256
+
+
+def cert_uses_sha256(cert):
+  """Check if the cert uses SHA-256 hashing algorithm."""
+
+  cmd = ['openssl', 'x509', '-text', '-noout', '-in', cert]
+  p1 = common.Run(cmd, stdout=subprocess.PIPE)
+  cert_dump, _ = p1.communicate()
+
+  algorithm = re.search(r'Signature Algorithm: ([a-zA-Z0-9]+)', cert_dump)
+  assert algorithm, "Failed to identify the signature algorithm."
+
+  assert not algorithm.group(1).startswith('ecdsa'), (
+      'This script doesn\'t support verifying ECDSA signed package yet.')
+
+  return algorithm.group(1).startswith('sha256')
+
+
+def verify_package(cert, package):
+  """Verify the given package with the certificate.
+
+  (Comments from bootable/recovery/verifier.cpp:)
+
+  An archive with a whole-file signature will end in six bytes:
+
+    (2-byte signature start) $ff $ff (2-byte comment size)
+
+  (As far as the ZIP format is concerned, these are part of the
+  archive comment.) We start by reading this footer, this tells
+  us how far back from the end we have to start reading to find
+  the whole comment.
+  """
+
+  print('Package: %s' % (package,))
+  print('Certificate: %s' % (cert,))
+
+  # Read in the package.
+  with open(package) as package_file:
+    package_bytes = package_file.read()
+
+  length = len(package_bytes)
+  assert length >= 6, "Not big enough to contain footer."
+
+  footer = [ord(x) for x in package_bytes[-6:]]
+  assert footer[2] == 0xff and footer[3] == 0xff, "Footer is wrong."
+
+  signature_start_from_end = (footer[1] << 8) + footer[0]
+  assert signature_start_from_end > 6, "Signature start is in the footer."
+
+  signature_start = length - signature_start_from_end
+
+  # Determine how much of the file is covered by the signature. This is
+  # everything except the signature data and length, which includes all of the
+  # EOCD except for the comment length field (2 bytes) and the comment data.
+  comment_len = (footer[5] << 8) + footer[4]
+  signed_len = length - comment_len - 2
+
+  print('Package length: %d' % (length,))
+  print('Comment length: %d' % (comment_len,))
+  print('Signed data length: %d' % (signed_len,))
+  print('Signature start: %d' % (signature_start,))
+
+  use_sha256 = cert_uses_sha256(cert)
+  print('Use SHA-256: %s' % (use_sha256,))
+
+  if use_sha256:
+    h = sha256()
+  else:
+    h = sha1()
+  h.update(package_bytes[:signed_len])
+  package_digest = h.hexdigest().lower()
+
+  print('Digest: %s\n' % (package_digest,))
+
+  # Get the signature from the input package.
+  signature = package_bytes[signature_start:-6]
+  sig_file = common.MakeTempFile(prefix='sig-', suffix='')
+  with open(sig_file, 'wb') as f:
+    f.write(signature)
+
+  # Parse the signature and get the hash.
+  cmd = ['openssl', 'asn1parse', '-inform', 'DER', '-in', sig_file]
+  p1 = common.Run(cmd, stdout=subprocess.PIPE)
+  sig, _ = p1.communicate()
+  assert p1.returncode == 0, "Failed to parse the signature."
+
+  digest_line = sig.strip().split('\n')[-1]
+  digest_string = digest_line.split(':')[3]
+  digest_file = common.MakeTempFile(prefix='digest-', suffix='')
+  with open(digest_file, 'wb') as f:
+    f.write(digest_string.decode('hex'))
+
+  # Verify the digest by outputing the decrypted result in ASN.1 structure.
+  decrypted_file = common.MakeTempFile(prefix='decrypted-', suffix='')
+  cmd = ['openssl', 'rsautl', '-verify', '-certin', '-inkey', cert,
+         '-in', digest_file, '-out', decrypted_file]
+  p1 = common.Run(cmd, stdout=subprocess.PIPE)
+  p1.communicate()
+  assert p1.returncode == 0, "Failed to run openssl rsautl -verify."
+
+  # Parse the output ASN.1 structure.
+  cmd = ['openssl', 'asn1parse', '-inform', 'DER', '-in', decrypted_file]
+  p1 = common.Run(cmd, stdout=subprocess.PIPE)
+  decrypted_output, _ = p1.communicate()
+  assert p1.returncode == 0, "Failed to parse the output."
+
+  digest_line = decrypted_output.strip().split('\n')[-1]
+  digest_string = digest_line.split(':')[3].lower()
+
+  # Verify that the two digest strings match.
+  assert package_digest == digest_string, "Verification failed."
+
+  # Verified successfully upon reaching here.
+  print('VERIFIED\n')
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('certificate', help='The certificate to be used.')
+  parser.add_argument('package', help='The OTA package to be verified.')
+  args = parser.parse_args()
+
+  verify_package(args.certificate, args.package)
+
+
+if __name__ == '__main__':
+  try:
+    main()
+  except AssertionError as err:
+    print('\n    ERROR: %s\n' % (err,))
+    sys.exit(1)
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index 8d9e855..fad6a5e 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -73,6 +73,33 @@
 # Values for "certificate" in apkcerts that mean special things.
 SPECIAL_CERT_STRINGS = ("PRESIGNED", "EXTERNAL")
 
+class ErrorCode(object):
+  """Define error_codes for failures that happen during the actual
+  update package installation.
+
+  Error codes 0-999 are reserved for failures before the package
+  installation (i.e. low battery, package verification failure).
+  Detailed code in 'bootable/recovery/error_code.h' """
+
+  SYSTEM_VERIFICATION_FAILURE = 1000
+  SYSTEM_UPDATE_FAILURE = 1001
+  SYSTEM_UNEXPECTED_CONTENTS = 1002
+  SYSTEM_NONZERO_CONTENTS = 1003
+  SYSTEM_RECOVER_FAILURE = 1004
+  VENDOR_VERIFICATION_FAILURE = 2000
+  VENDOR_UPDATE_FAILURE = 2001
+  VENDOR_UNEXPECTED_CONTENTS = 2002
+  VENDOR_NONZERO_CONTENTS = 2003
+  VENDOR_RECOVER_FAILURE = 2004
+  OEM_PROP_MISMATCH = 3000
+  FINGERPRINT_MISMATCH = 3001
+  THUMBPRINT_MISMATCH = 3002
+  OLDER_BUILD = 3003
+  DEVICE_MISMATCH = 3004
+  BAD_PATCH_FILE = 3005
+  INSUFFICIENT_CACHE_SPACE = 3006
+  TUNE_PARTITION_FAILURE = 3007
+  APPLY_PATCH_FAILURE = 3008
 
 class ExternalError(RuntimeError):
   pass
@@ -174,6 +201,27 @@
       d["ramdisk_fs_config"] = os.path.join(
           input_dir, "META", "root_filesystem_config.txt")
 
+    # Redirect {system,vendor}_base_fs_file.
+    if "system_base_fs_file" in d:
+      basename = os.path.basename(d["system_base_fs_file"])
+      system_base_fs_file = os.path.join(input_dir, "META", basename)
+      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,)
+        del d["system_base_fs_file"]
+
+    if "vendor_base_fs_file" in d:
+      basename = os.path.basename(d["vendor_base_fs_file"])
+      vendor_base_fs_file = os.path.join(input_dir, "META", basename)
+      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,)
+        del d["vendor_base_fs_file"]
+
   try:
     data = read_helper("META/imagesizes.txt")
     for line in data.split("\n"):
@@ -336,6 +384,16 @@
     print "%-25s = (%s) %s" % (k, type(v).__name__, v)
 
 
+def AppendAVBSigningArgs(cmd):
+  """Append signing arguments for avbtool."""
+  keypath = OPTIONS.info_dict.get("board_avb_key_path", None)
+  algorithm = OPTIONS.info_dict.get("board_avb_algorithm", None)
+  if not keypath or not algorithm:
+    algorithm = "SHA256_RSA4096"
+    keypath = "external/avb/test/data/testkey_rsa4096.pem"
+  cmd.extend(["--key", keypath, "--algorithm", algorithm])
+
+
 def _BuildBootableImage(sourcedir, fs_config_file, info_dict=None,
                         has_ramdisk=False):
   """Build a bootable image from the specified sourcedir.
@@ -455,111 +513,20 @@
     img_unsigned.close()
     img_keyblock.close()
 
-  img.seek(os.SEEK_SET, 0)
-  data = img.read()
-
-  if has_ramdisk:
-    ramdisk_img.close()
-  img.close()
-
-  return data
-
-
-def _BuildBvbBootableImage(sourcedir, fs_config_file, system_img_path,
-                           info_dict=None, has_ramdisk=False):
-  """Build a bootable image compatible with Brillo Verified Boot from the
-  specified sourcedir.
-
-  Take a kernel, cmdline, system image path, 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.
-  """
-
-  def make_ramdisk():
-    ramdisk_img = tempfile.NamedTemporaryFile()
-
-    if os.access(fs_config_file, os.F_OK):
-      cmd = ["mkbootfs", "-f", fs_config_file,
-             os.path.join(sourcedir, "RAMDISK")]
-    else:
-      cmd = ["mkbootfs", os.path.join(sourcedir, "RAMDISK")]
-    p1 = Run(cmd, stdout=subprocess.PIPE)
-    p2 = Run(["minigzip"], stdin=p1.stdout, stdout=ramdisk_img.file.fileno())
-
-    p2.wait()
-    p1.wait()
-    assert p1.returncode == 0, "mkbootfs of %s ramdisk failed" % (sourcedir,)
-    assert p2.returncode == 0, "minigzip of %s ramdisk failed" % (sourcedir,)
-
-    return ramdisk_img
-
-  if not os.access(os.path.join(sourcedir, "kernel"), os.F_OK):
-    return None
-
-  if has_ramdisk and not os.access(os.path.join(sourcedir, "RAMDISK"), os.F_OK):
-    return None
-
-  if info_dict is None:
-    info_dict = OPTIONS.info_dict
-
-  img = tempfile.NamedTemporaryFile()
-
-  if has_ramdisk:
-    ramdisk_img = make_ramdisk()
-
-  # use BVBTOOL from environ, or "bvbtool" if empty or not set
-  bvbtool = os.getenv('BVBTOOL') or "bvbtool"
-
-  # First, create boot.img.
-  cmd = [bvbtool, "make_boot_image"]
-
-  fn = os.path.join(sourcedir, "cmdline")
-  if os.access(fn, os.F_OK):
-    cmd.append("--kernel_cmdline")
-    cmd.append(open(fn).read().rstrip("\n"))
-
-  cmd.extend(["--kernel", os.path.join(sourcedir, "kernel")])
-
-  if has_ramdisk:
-    cmd.extend(["--initrd", ramdisk_img.name])
-
-  cmd.extend(["--rootfs_with_hashes", system_img_path])
-
-  args = info_dict.get("board_bvb_make_boot_image_args", None)
-  if args and args.strip():
-    cmd.extend(shlex.split(args))
-
-  rollback_index = info_dict.get("board_bvb_rollback_index", None)
-  if rollback_index and rollback_index.strip():
-    cmd.extend(["--rollback_index", rollback_index.strip()])
-
-  cmd.extend(["--output", img.name])
-
-  p = Run(cmd, stdout=subprocess.PIPE)
-  p.communicate()
-  assert p.returncode == 0, "bvbtool make_boot_image of %s image failed" % (
-      os.path.basename(sourcedir),)
-
-  # Then, sign boot.img.
-  cmd = [bvbtool, "sign_boot_image", "--image", img.name]
-
-  algorithm = info_dict.get("board_bvb_algorithm", None)
-  key_path = info_dict.get("board_bvb_key_path", None)
-  if algorithm and algorithm.strip() and key_path and key_path.strip():
-    cmd.extend(["--algorithm", algorithm, "--key", key_path])
-  else:
-    cmd.extend(["--algorithm", "SHA256_RSA4096"])
-    cmd.extend(["--key", "external/bvb/test/testkey_rsa4096.pem"])
-
-  args = info_dict.get("board_bvb_sign_boot_image_args", None)
-  if args and args.strip():
-    cmd.extend(shlex.split(args))
-
-  p = Run(cmd, stdout=subprocess.PIPE)
-  p.communicate()
-  assert p.returncode == 0, "bvbtool sign_boot_image of %s image failed" % (
-      os.path.basename(sourcedir),)
+  # AVB: if enabled, calculate and add hash to boot.img.
+  if info_dict.get("board_avb_enable", None) == "true":
+    avbtool = os.getenv('AVBTOOL') or "avbtool"
+    part_size = info_dict.get("boot_size", None)
+    cmd = [avbtool, "add_hash_footer", "--image", img.name,
+           "--partition_size", str(part_size), "--partition_name", "boot"]
+    AppendAVBSigningArgs(cmd)
+    args = info_dict.get("board_avb_boot_add_hash_footer_args", None)
+    if args and args.strip():
+      cmd.extend(shlex.split(args))
+    p = Run(cmd, stdout=subprocess.PIPE)
+    p.communicate()
+    assert p.returncode == 0, "avbtool add_hash_footer of %s failed" % (
+        os.path.basename(OPTIONS.input_tmp))
 
   img.seek(os.SEEK_SET, 0)
   data = img.read()
@@ -602,14 +569,9 @@
                  info_dict.get("recovery_as_boot") == "true")
 
   fs_config = "META/" + tree_subdir.lower() + "_filesystem_config.txt"
-  if info_dict.get("board_bvb_enable", None) == "true":
-    data = _BuildBvbBootableImage(os.path.join(unpack_dir, tree_subdir),
-                                  os.path.join(unpack_dir, fs_config),
-                                  system_img_path, info_dict, has_ramdisk)
-  else:
-    data = _BuildBootableImage(os.path.join(unpack_dir, tree_subdir),
-                               os.path.join(unpack_dir, fs_config),
-                               info_dict, has_ramdisk)
+  data = _BuildBootableImage(os.path.join(unpack_dir, tree_subdir),
+                             os.path.join(unpack_dir, fs_config),
+                             info_dict, has_ramdisk)
   if data:
     return File(name, data)
   return None
@@ -1513,15 +1475,19 @@
           script.AppendExtra('check_first_block("%s");' % (self.device,))
 
         # If version >= 4, try block recovery before abort update
+        if partition == "system":
+          code = ErrorCode.SYSTEM_RECOVER_FAILURE
+        else:
+          code = ErrorCode.VENDOR_RECOVER_FAILURE
         script.AppendExtra((
             'ifelse (block_image_recover("{device}", "{ranges}") && '
             'block_image_verify("{device}", '
             'package_extract_file("{partition}.transfer.list"), '
             '"{partition}.new.dat", "{partition}.patch.dat"), '
             'ui_print("{partition} recovered successfully."), '
-            'abort("{partition} partition fails to recover"));\n'
+            'abort("E{code}: {partition} partition fails to recover"));\n'
             'endif;').format(device=self.device, ranges=ranges_str,
-                             partition=partition))
+                             partition=partition, code=code))
 
       # Abort the OTA update. Note that the incremental OTA cannot be applied
       # even if it may match the checksum of the target partition.
@@ -1529,8 +1495,13 @@
       #    unconditionally and damage the partition.
       # b) If version >= 3, it won't even reach here.
       else:
-        script.AppendExtra(('abort("%s partition has unexpected contents");\n'
-                            'endif;') % (partition,))
+        if partition == "system":
+          code = ErrorCode.SYSTEM_VERIFICATION_FAILURE
+        else:
+          code = ErrorCode.VENDOR_VERIFICATION_FAILURE
+        script.AppendExtra((
+            'abort("E%d: %s partition has unexpected contents");\n'
+            'endif;') % (code, partition))
 
   def _WritePostInstallVerifyScript(self, script):
     partition = self.partition
@@ -1550,18 +1521,28 @@
                          self.device, ranges_str,
                          self._HashZeroBlocks(self.tgt.extended.size())))
       script.Print('Verified the updated %s image.' % (partition,))
+      if partition == "system":
+        code = ErrorCode.SYSTEM_NONZERO_CONTENTS
+      else:
+        code = ErrorCode.VENDOR_NONZERO_CONTENTS
       script.AppendExtra(
           'else\n'
-          '  abort("%s partition has unexpected non-zero contents after OTA '
-          'update");\n'
-          'endif;' % (partition,))
+          '  abort("E%d: %s partition has unexpected non-zero contents after '
+          'OTA update");\n'
+          'endif;' % (code, partition))
     else:
       script.Print('Verified the updated %s image.' % (partition,))
 
+    if partition == "system":
+      code = ErrorCode.SYSTEM_UNEXPECTED_CONTENTS
+    else:
+      code = ErrorCode.VENDOR_UNEXPECTED_CONTENTS
+
     script.AppendExtra(
         'else\n'
-        '  abort("%s partition has unexpected contents after OTA update");\n'
-        'endif;' % (partition,))
+        '  abort("E%d: %s partition has unexpected contents after OTA '
+        'update");\n'
+        'endif;' % (code, partition))
 
   def _WriteUpdate(self, script, output_zip):
     ZipWrite(output_zip,
@@ -1575,11 +1556,16 @@
              '{}.patch.dat'.format(self.partition),
              compress_type=zipfile.ZIP_STORED)
 
+    if self.partition == "system":
+      code = ErrorCode.SYSTEM_UPDATE_FAILURE
+    else:
+      code = ErrorCode.VENDOR_UPDATE_FAILURE
+
     call = ('block_image_update("{device}", '
             'package_extract_file("{partition}.transfer.list"), '
             '"{partition}.new.dat", "{partition}.patch.dat") ||\n'
-            '    abort("Failed to update {partition} image.");'.format(
-                device=self.device, partition=self.partition))
+            '  abort("E{code}: Failed to update {partition} image.");'.format(
+                device=self.device, partition=self.partition, code=code))
     script.AppendExtra(script.WordWrap(call))
 
   def _HashBlocks(self, source, ranges): # pylint: disable=no-self-use
diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py
index 5c67ba1..3028b2a 100644
--- a/tools/releasetools/edify_generator.py
+++ b/tools/releasetools/edify_generator.py
@@ -85,14 +85,17 @@
       raise ValueError("must specify the OEM value")
     if common.OPTIONS.oem_no_mount:
       cmd = ('getprop("{name}") == "{value}" || '
-             'abort("This package expects the value \\"{value}\\" for '
+             'abort("E{code}: This package expects the value \\"{value}\\" for '
              '\\"{name}\\"; this has value \\"" + '
-             'getprop("{name}") + "\\".");').format(name=name, value=value)
+             'getprop("{name}") + "\\".");').format(
+                 code=common.ErrorCode.OEM_PROP_MISMATCH,
+                 name=name, value=value)
     else:
       cmd = ('file_getprop("/oem/oem.prop", "{name}") == "{value}" || '
-             'abort("This package expects the value \\"{value}\\" for '
+             'abort("E{code}: This package expects the value \\"{value}\\" for '
              '\\"{name}\\" on the OEM partition; this has value \\"" + '
              'file_getprop("/oem/oem.prop", "{name}") + "\\".");').format(
+                 code=common.ErrorCode.OEM_PROP_MISMATCH,
                  name=name, value=value)
     self.script.append(cmd)
 
@@ -102,9 +105,9 @@
       raise ValueError("must specify some fingerprints")
     cmd = (' ||\n    '.join([('getprop("ro.build.fingerprint") == "%s"') % i
                              for i in fp]) +
-           ' ||\n    abort("Package expects build fingerprint of %s; this '
-           'device has " + getprop("ro.build.fingerprint") + ".");') % (
-               " or ".join(fp))
+           ' ||\n    abort("E%d: Package expects build fingerprint of %s; '
+           'this device has " + getprop("ro.build.fingerprint") + ".");') % (
+               common.ErrorCode.FINGERPRINT_MISMATCH, " or ".join(fp))
     self.script.append(cmd)
 
   def AssertSomeThumbprint(self, *fp):
@@ -113,9 +116,9 @@
       raise ValueError("must specify some thumbprints")
     cmd = (' ||\n    '.join([('getprop("ro.build.thumbprint") == "%s"') % i
                              for i in fp]) +
-           ' ||\n    abort("Package expects build thumbprint of %s; this '
+           ' ||\n    abort("E%d: Package expects build thumbprint of %s; this '
            'device has " + getprop("ro.build.thumbprint") + ".");') % (
-               " or ".join(fp))
+               common.ErrorCode.THUMBPRINT_MISMATCH, " or ".join(fp))
     self.script.append(cmd)
 
   def AssertFingerprintOrThumbprint(self, fp, tp):
@@ -134,16 +137,16 @@
     the given timestamp."""
     self.script.append(
         ('(!less_than_int(%s, getprop("ro.build.date.utc"))) || '
-         'abort("Can\'t install this package (%s) over newer '
+         'abort("E%d: Can\'t install this package (%s) over newer '
          'build (" + getprop("ro.build.date") + ").");') % (timestamp,
-                                                            timestamp_text))
+             common.ErrorCode.OLDER_BUILD, timestamp_text))
 
   def AssertDevice(self, device):
     """Assert that the device identifier is the given string."""
     cmd = ('getprop("ro.product.device") == "%s" || '
-           'abort("This package is for \\"%s\\" devices; '
+           'abort("E%d: This package is for \\"%s\\" devices; '
            'this is a \\"" + getprop("ro.product.device") + "\\".");') % (
-               device, device)
+               device, common.ErrorCode.DEVICE_MISMATCH, device)
     self.script.append(cmd)
 
   def AssertSomeBootloader(self, *bootloaders):
@@ -173,7 +176,8 @@
     self.script.append(
         'apply_patch_check("%s"' % (filename,) +
         "".join([', "%s"' % (i,) for i in sha1]) +
-        ') || abort("\\"%s\\" has unexpected contents.");' % (filename,))
+        ') || abort("E%d: \\"%s\\" has unexpected contents.");' % (
+            common.ErrorCode.BAD_PATCH_FILE, filename))
 
   def Verify(self, filename):
     """Check that the given file has one of the
@@ -195,8 +199,10 @@
     """Check that there's at least 'amount' space that can be made
     available on /cache."""
     self._required_cache = max(self._required_cache, amount)
-    self.script.append(('apply_patch_space(%d) || abort("Not enough free space '
-                        'on /cache to apply patches.");') % (amount,))
+    self.script.append(('apply_patch_space(%d) || abort("E%d: Not enough free '
+                        'space on /cache to apply patches.");') % (
+                            amount,
+                            common.ErrorCode.INSUFFICIENT_CACHE_SPACE))
 
   def Mount(self, mount_point, mount_options_by_format=""):
     """Mount the partition with the given mount_point.
@@ -246,8 +252,8 @@
         raise ValueError("Partition %s cannot be tuned\n" % (partition,))
     self.script.append(
         'tune2fs(' + "".join(['"%s", ' % (i,) for i in options]) +
-        '"%s") || abort("Failed to tune partition %s");' % (
-            p.device, partition))
+        '"%s") || abort("E%d: Failed to tune partition %s");' % (
+            p.device, common.ErrorCode.TUNE_PARTITION_FAILURE, partition))
 
   def FormatPartition(self, partition):
     """Format the given partition, specified by its mount point (eg,
@@ -309,7 +315,8 @@
            % (srcfile, tgtfile, tgtsha1, tgtsize)]
     for i in range(0, len(patchpairs), 2):
       cmd.append(',\0%s,\0package_extract_file("%s")' % patchpairs[i:i+2])
-    cmd.append(') ||\n    abort("Failed to apply patch to %s");' % (srcfile,))
+    cmd.append(') ||\n    abort("E%d: Failed to apply patch to %s");' % (
+        common.ErrorCode.APPLY_PATCH_FAILURE, srcfile))
     cmd = "".join(cmd)
     self.script.append(self.WordWrap(cmd))
 
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index f6db56f..f32d9d8 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -841,6 +841,10 @@
                                    OPTIONS.target_info_dict)
   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(
+      "ro.build.version.incremental", OPTIONS.target_info_dict)
 
   source_boot = common.GetBootableImage(
       "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT",
@@ -1208,6 +1212,8 @@
   metadata = {
       "post-build": CalculateFingerprint(oem_props, oem_dict,
                                          OPTIONS.info_dict),
+      "post-build-incremental" : GetBuildProp("ro.build.version.incremental",
+                                              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),
@@ -1218,6 +1224,8 @@
   if source_file is not None:
     metadata["pre-build"] = CalculateFingerprint(oem_props, oem_dict,
                                                  OPTIONS.source_info_dict)
+    metadata["pre-build-incremental"] = GetBuildProp(
+        "ro.build.version.incremental", OPTIONS.source_info_dict)
 
   # 1. Generate payload.
   payload_file = common.MakeTempFile(prefix="payload-", suffix=".bin")
@@ -1545,6 +1553,10 @@
 
   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(
+      "ro.build.version.incremental", OPTIONS.target_info_dict)
 
   source_boot = common.GetBootableImage(
       "/tmp/boot.img", "boot.img", OPTIONS.source_tmp, "BOOT",
diff --git a/tools/releasetools/rangelib.py b/tools/releasetools/rangelib.py
index 1638f8c..fa6eec1 100644
--- a/tools/releasetools/rangelib.py
+++ b/tools/releasetools/rangelib.py
@@ -313,6 +313,20 @@
         n -= e - s
     return RangeSet(data=out)
 
+  def next_item(self):
+    """Return the next integer represented by the RangeSet.
+
+    >>> list(RangeSet("0-9").next_item())
+    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    >>> list(RangeSet("10-19 3-5").next_item())
+    [3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
+    >>> list(rangelib.RangeSet("10-19 3 5 7").next_item())
+    [3, 5, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
+    """
+    for s, e in self:
+      for element in range(s, e):
+        yield element
+
 
 if __name__ == "__main__":
   import doctest
diff --git a/tools/releasetools/sign_target_files_apks.py b/tools/releasetools/sign_target_files_apks.py
index 0f20f82..7f69a57 100755
--- a/tools/releasetools/sign_target_files_apks.py
+++ b/tools/releasetools/sign_target_files_apks.py
@@ -280,7 +280,7 @@
       pass
 
     # Skip the care_map as we will regenerate the system/vendor images.
-    elif (info.filename == "META/care_map.txt"):
+    elif info.filename == "META/care_map.txt":
       pass
 
     # Copy BOOT/, RECOVERY/, META/, ROOT/ to rebuild recovery patch. This case
@@ -553,9 +553,12 @@
   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)
+      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()
+      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:
@@ -592,7 +595,6 @@
   codename = None
   for line in data.split("\n"):
     line = line.strip()
-    original_line = line
     if line and line[0] != '#' and "=" in line:
       key, value = line.split("=", 1)
       key = key.strip()
@@ -615,7 +617,6 @@
   codenames = None
   for line in data.split("\n"):
     line = line.strip()
-    original_line = line
     if line and line[0] != '#' and "=" in line:
       key, value = line.split("=", 1)
       key = key.strip()
@@ -698,12 +699,8 @@
   CheckAllApksSigned(input_zip, apk_key_map)
 
   key_passwords = common.GetKeyPasswords(set(apk_key_map.values()))
-  platform_api_level, platform_codename = GetApiLevelAndCodename(input_zip)
+  platform_api_level, _ = GetApiLevelAndCodename(input_zip)
   codename_to_api_level_map = GetCodenameToApiLevelMap(input_zip)
-  # Android N will be API Level 24, but isn't yet.
-  # TODO: Remove this workaround once Android N is officially API Level 24.
-  if platform_api_level == 23 and platform_codename == "N":
-    platform_api_level = 24
 
   ProcessTargetFiles(input_zip, output_zip, misc_info,
                      apk_key_map, key_passwords,
@@ -713,7 +710,9 @@
   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_rangelib.py b/tools/releasetools/test_rangelib.py
index 1c57cbc..e181187 100644
--- a/tools/releasetools/test_rangelib.py
+++ b/tools/releasetools/test_rangelib.py
@@ -138,3 +138,14 @@
 
     with self.assertRaises(AssertionError):
       RangeSet.parse_raw("4,0,10")
+
+  def test_next_item(self):
+    self.assertEqual(
+        list(RangeSet("0-9").next_item()),
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
+    self.assertEqual(
+        list(RangeSet("10-19 3-5").next_item()),
+        [3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
+    self.assertEqual(
+        list(RangeSet("10-19 3 5 7").next_item()),
+        [3, 5, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
diff --git a/tools/signapk/src/com/android/signapk/SignApk.java b/tools/signapk/src/com/android/signapk/SignApk.java
index 84fddec..10e220c 100644
--- a/tools/signapk/src/com/android/signapk/SignApk.java
+++ b/tools/signapk/src/com/android/signapk/SignApk.java
@@ -1010,6 +1010,7 @@
                                 .setV1SigningEnabled(true)
                                 .setV2SigningEnabled(signUsingApkSignatureSchemeV2)
                                 .setOtherSignersSignaturesPreserved(false)
+                                .setCreatedBy("1.0 (Android SignApk)")
                                 .build()) {
                     // We don't preserve the input APK's APK Signing Block (which contains v2
                     // signatures)
diff --git a/tools/soong_to_convert.py b/tools/soong_to_convert.py
new file mode 100755
index 0000000..379a1ad
--- /dev/null
+++ b/tools/soong_to_convert.py
@@ -0,0 +1,122 @@
+#!/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.
+
+"""Tool to prioritize which modules to convert to Soong.
+
+Generally, you'd use this through the make integration, which automatically
+generates the CSV input file that this tool expects:
+
+  $ m $OUT/soong_to_convert.txt
+  $ less $OUT/soong_to_convert.txt
+
+The output is a list of modules that are probably ready to convert to Soong:
+
+  # Blocked on Module (potential problems)
+           283 libEGL (srcs_dotarm)
+           246 libicuuc (dotdot_incs dotdot_srcs)
+           221 libspeexresampler
+           215 libcamera_metadata
+               ...
+             0 zram-perf (dotdot_incs)
+
+The number at the beginning of the line shows how many native modules depend
+on that module.
+
+All of their dependencies have been satisfied, and any potential problems
+that Make can detect are listed in parenthesis after the module:
+
+  dotdot_srcs: LOCAL_SRC_FILES contains paths outside $(LOCAL_PATH)
+  dotdot_incs: LOCAL_C_INCLUDES contains paths include '..'
+  srcs_dotarm: LOCAL_SRC_FILES contains source files like <...>.c.arm
+  aidl: LOCAL_SRC_FILES contains .aidl sources
+  dbus: LOCAL_SRC_FILES contains .dbus-xml sources
+  objc: LOCAL_SRC_FILES contains Objective-C sources
+  proto: LOCAL_SRC_FILES contains .proto sources
+  rs: LOCAL_SRC_FILES contains renderscript sources
+  vts: LOCAL_SRC_FILES contains .vts sources
+
+Not all problems can be discovered, but this is a starting point.
+
+"""
+
+from __future__ import print_function
+
+import csv
+import sys
+
+def count_deps(depsdb, module, seen):
+    """Based on the depsdb, count the number of transitive dependencies.
+
+    You can pass in an reversed dependency graph to conut the number of
+    modules that depend on the module."""
+    count = 0
+    seen.append(module)
+    if module in depsdb:
+        for dep in depsdb[module]:
+            if dep in seen:
+                continue
+            count += 1 + count_deps(depsdb, dep, seen)
+    return count
+
+def process(reader):
+    """Read the input file and produce a list of modules ready to move to Soong
+    """
+    problems = dict()
+    deps = dict()
+    reverse_deps = dict()
+
+    for (module, problem, dependencies) in reader:
+        problems[module] = problem
+        deps[module] = [d for d in dependencies.strip().split(' ') if d != ""]
+        for dep in deps[module]:
+            if not dep in reverse_deps:
+                reverse_deps[dep] = []
+            reverse_deps[dep].append(module)
+
+    results = []
+    for module in problems:
+        # Only display actionable conversions, ones without missing dependencies
+        if len(deps[module]) != 0:
+            continue
+
+        extra = ""
+        if len(problems[module]) > 0:
+            extra = " ({})".format(problems[module])
+        results.append((count_deps(reverse_deps, module, []), module + extra))
+
+    return sorted(results, key=lambda result: (-result[0], result[1]))
+
+def display(results):
+    """Displays the results"""
+    count_header = "# Blocked on"
+    count_width = len(count_header)
+    print("{} Module (potential problems)".format(count_header))
+    for (count, module) in results:
+        print("{:>{}} {}".format(count, count_width, module))
+
+def main(filename):
+    """Read the CSV file, print the results"""
+    with open(filename, 'rb') as csvfile:
+        results = process(csv.reader(csvfile))
+
+    display(results)
+
+if __name__ == "__main__":
+    if len(sys.argv) != 2:
+        print("usage: soong_conversion.py <file>", file=sys.stderr)
+        sys.exit(1)
+
+    main(sys.argv[1])
diff --git a/tools/warn.py b/tools/warn.py
index f118263..ea1cd22 100755
--- a/tools/warn.py
+++ b/tools/warn.py
@@ -1,18 +1,95 @@
-#!/usr/bin/env python
+#!/usr/bin/python
 # This file uses the following encoding: utf-8
 
+"""Grep warnings messages and output HTML tables or warning counts in CSV.
+
+Default is to output warnings in HTML tables grouped by warning severity.
+Use option --byproject to output tables grouped by source file projects.
+Use option --gencsv to output warning counts in CSV format.
+"""
+
+# List of important data structures and functions in this script.
+#
+# To parse and keep warning message in the input file:
+#   severity:                classification of message severity
+#   severity.range           [0, 1, ... last_severity_level]
+#   severity.colors          for header background
+#   severity.column_headers  for the warning count table
+#   severity.headers         for warning message tables
+#   warn_patterns:
+#   warn_patterns[w]['category']     tool that issued the warning, not used now
+#   warn_patterns[w]['description']  table heading
+#   warn_patterns[w]['members']      matched warnings from input
+#   warn_patterns[w]['option']       compiler flag to control the warning
+#   warn_patterns[w]['patterns']     regular expressions to match warnings
+#   warn_patterns[w]['projects'][p]  number of warnings of pattern w in p
+#   warn_patterns[w]['severity']     severity level
+#   project_list[p][0]               project name
+#   project_list[p][1]               regular expression to match a project path
+#   project_patterns[p]              re.compile(project_list[p][1])
+#   project_names[p]                 project_list[p][0]
+#   warning_messages     array of each warning message, without source url
+#   warning_records      array of [idx to warn_patterns,
+#                                  idx to project_names,
+#                                  idx to warning_messages]
+#   platform_version
+#   target_product
+#   target_variant
+#   compile_patterns, parse_input_file
+#
+# To emit html page of warning messages:
+#   flags: --byproject, --url, --separator
+# Old stuff for static html components:
+#   html_script_style:  static html scripts and styles
+#   htmlbig:
+#   dump_stats, dump_html_prologue, dump_html_epilogue:
+#   emit_buttons:
+#   dump_fixed
+#   sort_warnings:
+#   emit_stats_by_project:
+#   all_patterns,
+#   findproject, classify_warning
+#   dump_html
+#
+# New dynamic HTML page's static JavaScript data:
+#   Some data are copied from Python to JavaScript, to generate HTML elements.
+#   FlagURL                args.url
+#   FlagSeparator          args.separator
+#   SeverityColors:        severity.colors
+#   SeverityHeaders:       severity.headers
+#   SeverityColumnHeaders: severity.column_headers
+#   ProjectNames:          project_names, or project_list[*][0]
+#   WarnPatternsSeverity:     warn_patterns[*]['severity']
+#   WarnPatternsDescription:  warn_patterns[*]['description']
+#   WarnPatternsOption:       warn_patterns[*]['option']
+#   WarningMessages:          warning_messages
+#   Warnings:                 warning_records
+#   StatsHeader:           warning count table header row
+#   StatsRows:             array of warning count table rows
+#
+# New dynamic HTML page's dynamic JavaScript data:
+#
+# New dynamic HTML related function to emit data:
+#   escape_string, strip_escape_string, emit_warning_arrays
+#   emit_js_data():
+#
+# To emit csv files of warning message counts:
+#   flag --gencsv
+#   description_for_csv, string_for_csv:
+#   count_severity(sev, kind):
+#   dump_csv():
+
 import argparse
-import sys
 import re
 
 parser = argparse.ArgumentParser(description='Convert a build log into HTML')
 parser.add_argument('--gencsv',
                     help='Generate a CSV file with number of various warnings',
-                    action="store_true",
+                    action='store_true',
                     default=False)
 parser.add_argument('--byproject',
                     help='Separate warnings in HTML output by project names',
-                    action="store_true",
+                    action='store_true',
                     default=False)
 parser.add_argument('--url',
                     help='Root URL of an Android source code tree prefixed '
@@ -24,2179 +101,2260 @@
                     help='Path to build.log file')
 args = parser.parse_args()
 
-# if you add another level, don't forget to give it a color below
-class severity:
-    UNKNOWN=0
-    SKIP=100
-    FIXMENOW=1
-    HIGH=2
-    MEDIUM=3
-    LOW=4
-    TIDY=5
-    HARMLESS=6
 
-def colorforseverity(sev):
-    if sev == severity.FIXMENOW:
-        return 'fuchsia'
-    if sev == severity.HIGH:
-        return 'red'
-    if sev == severity.MEDIUM:
-        return 'orange'
-    if sev == severity.LOW:
-        return 'yellow'
-    if sev == severity.TIDY:
-        return 'peachpuff'
-    if sev == severity.HARMLESS:
-        return 'limegreen'
-    if sev == severity.UNKNOWN:
-        return 'lightblue'
-    return 'grey'
+class Severity(object):
+  """Severity levels and attributes."""
+  # numbered by dump order
+  FIXMENOW = 0
+  HIGH = 1
+  MEDIUM = 2
+  LOW = 3
+  ANALYZER = 4
+  TIDY = 5
+  HARMLESS = 6
+  UNKNOWN = 7
+  SKIP = 8
+  range = range(SKIP + 1)
+  attributes = [
+      # pylint:disable=bad-whitespace
+      ['fuchsia',   'FixNow',    'Critical warnings, fix me now'],
+      ['red',       'High',      'High severity warnings'],
+      ['orange',    'Medium',    'Medium severity warnings'],
+      ['yellow',    'Low',       'Low severity warnings'],
+      ['hotpink',   'Analyzer',  'Clang-Analyzer warnings'],
+      ['peachpuff', 'Tidy',      'Clang-Tidy warnings'],
+      ['limegreen', 'Harmless',  'Harmless warnings'],
+      ['lightblue', 'Unknown',   'Unknown warnings'],
+      ['grey',      'Unhandled', 'Unhandled warnings']
+  ]
+  colors = [a[0] for a in attributes]
+  column_headers = [a[1] for a in attributes]
+  headers = [a[2] for a in attributes]
 
-def headerforseverity(sev):
-    if sev == severity.FIXMENOW:
-        return 'Critical warnings, fix me now'
-    if sev == severity.HIGH:
-        return 'High severity warnings'
-    if sev == severity.MEDIUM:
-        return 'Medium severity warnings'
-    if sev == severity.LOW:
-        return 'Low severity warnings'
-    if sev == severity.HARMLESS:
-        return 'Harmless warnings'
-    if sev == severity.TIDY:
-        return 'Clang-Tidy warnings'
-    if sev == severity.UNKNOWN:
-        return 'Unknown warnings'
-    return 'Unhandled warnings'
-
-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.HIGH,   'members':[], 'option':'',
-        'description':'make: LOCAL_CLANG is false',
-        'patterns':[r".*: warning: LOCAL_CLANG is set to false"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wimplicit-function-declaration',
-        'description':'Implicit function declaration',
-        'patterns':[r".*: warning: implicit declaration of function .+",
-                    r".*: warning: implicitly declaring library function" ] },
-    { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: conflicting types for '.+'"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wtype-limits',
-        'description':'Expression always evaluates to true or false',
-        'patterns':[r".*: warning: comparison is always .+ due to limited range of data type",
-                    r".*: warning: comparison of unsigned .*expression .+ is always true",
-                    r".*: warning: comparison of unsigned .*expression .+ is always false"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Potential leak of memory, bad free, use after free',
-        'patterns':[r".*: warning: Potential leak of memory",
-                    r".*: warning: Potential memory leak",
-                    r".*: warning: Memory allocated by alloca\(\) should not be deallocated",
-                    r".*: warning: Memory allocated by .+ should be deallocated by .+ not .+",
-                    r".*: warning: 'delete' applied to a pointer that was allocated",
-                    r".*: warning: Use of memory after it is freed",
-                    r".*: warning: Argument to .+ is the address of .+ variable",
-                    r".*: warning: Argument to free\(\) is offset by .+ of memory allocated by",
-                    r".*: warning: Attempt to .+ released memory"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Use transient memory for control value',
-        'patterns':[r".*: warning: .+Using such transient memory for the control value is .*dangerous."] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Return address of stack memory',
-        'patterns':[r".*: warning: Address of stack memory .+ returned to caller",
-                    r".*: warning: Address of stack memory .+ will be a dangling reference"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Problem with vfork',
-        'patterns':[r".*: warning: This .+ is prohibited after a successful vfork",
-                    r".*: warning: Call to function '.+' is insecure "] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'infinite-recursion',
-        'description':'Infinite recursion',
-        'patterns':[r".*: warning: all paths through this function will call itself"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Potential buffer overflow',
-        'patterns':[r".*: warning: Size argument is greater than .+ the destination buffer",
-                    r".*: warning: Potential buffer overflow.",
-                    r".*: warning: String copy function overflows destination buffer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Incompatible pointer types',
-        'patterns':[r".*: warning: assignment from incompatible pointer type",
-                    r".*: warning: return from incompatible pointer type",
-                    r".*: warning: passing argument [0-9]+ of '.*' from incompatible pointer type",
-                    r".*: warning: initialization from incompatible pointer type"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-fno-builtin',
-        'description':'Incompatible declaration of built in function',
-        'patterns':[r".*: warning: incompatible implicit declaration of built-in function .+"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'',
-        'description':'Null passed as non-null argument',
-        'patterns':[r".*: warning: Null passed to a callee that requires a non-null"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunused-parameter',
-        'description':'Unused parameter',
-        'patterns':[r".*: warning: unused parameter '.*'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunused',
-        'description':'Unused function, variable or label',
-        'patterns':[r".*: warning: '.+' defined but not used",
-                    r".*: warning: unused function '.+'",
-                    r".*: warning: private field '.+' is not used",
-                    r".*: warning: unused variable '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunused-value',
-        'description':'Statement with no effect or result unused',
-        'patterns':[r".*: warning: statement with no effect",
-                    r".*: warning: expression result unused"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunused-result',
-        'description':'Ignoreing return value of function',
-        'patterns':[r".*: warning: ignoring return value of function .+Wunused-result"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-field-initializers',
-        'description':'Missing initializer',
-        'patterns':[r".*: warning: missing initializer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wdelete-non-virtual-dtor',
-        'description':'Need virtual destructor',
-        'patterns':[r".*: warning: delete called .* has virtual functions but non-virtual destructor"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: \(near initialization for '.+'\)"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wdate-time',
-        'description':'Expansion of data or time macro',
-        'patterns':[r".*: warning: expansion of date or time macro is not reproducible"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wformat',
-        'description':'Format string does not match arguments',
-        'patterns':[r".*: warning: format '.+' expects type '.+', but argument [0-9]+ has type '.+'",
-                    r".*: warning: more '%' conversions than data arguments",
-                    r".*: warning: data argument not used by format string",
-                    r".*: warning: incomplete format specifier",
-                    r".*: warning: unknown conversion type .* in format",
-                    r".*: warning: format .+ expects .+ but argument .+Wformat=",
-                    r".*: warning: field precision should have .+ but argument has .+Wformat",
-                    r".*: warning: format specifies type .+ but the argument has .*type .+Wformat"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wformat-extra-args',
-        'description':'Too many arguments for format string',
-        'patterns':[r".*: warning: too many arguments for format"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wformat-invalid-specifier',
-        'description':'Invalid format specifier',
-        'patterns':[r".*: warning: invalid .+ specifier '.+'.+format-invalid-specifier"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wsign-compare',
-        'description':'Comparison between signed and unsigned',
-        'patterns':[r".*: warning: comparison between signed and unsigned",
-                    r".*: warning: comparison of promoted \~unsigned with unsigned",
-                    r".*: warning: signed and unsigned type in conditional expression"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Comparison between enum and non-enum',
-        'patterns':[r".*: warning: enumeral and non-enumeral type in conditional expression"] },
-    { 'category':'libpng',  'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'libpng: zero area',
-        'patterns':[r".*libpng warning: Ignoring attempt to set cHRM RGB triangle with zero area"] },
-    { 'category':'aapt',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'aapt: no comment for public symbol',
-        'patterns':[r".*: warning: No comment for public symbol .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-braces',
-        'description':'Missing braces around initializer',
-        'patterns':[r".*: warning: missing braces around initializer.*"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS, 'members':[], 'option':'',
-        'description':'No newline at end of file',
-        'patterns':[r".*: warning: no newline at end of file"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS, 'members':[], 'option':'',
-        'description':'Missing space after macro name',
-        'patterns':[r".*: warning: missing whitespace after the macro name"] },
-    { 'category':'C/C++',   'severity':severity.LOW, 'members':[], 'option':'-Wcast-align',
-        'description':'Cast increases required alignment',
-        'patterns':[r".*: warning: cast from .* to .* increases required alignment .*"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wcast-qual',
-        'description':'Qualifier discarded',
-        'patterns':[r".*: warning: passing argument [0-9]+ of '.+' discards qualifiers from pointer target type",
-                    r".*: warning: assignment discards qualifiers from pointer target type",
-                    r".*: warning: passing .+ to parameter of type .+ discards qualifiers",
-                    r".*: warning: assigning to .+ from .+ discards qualifiers",
-                    r".*: warning: initializing .+ discards qualifiers .+types-discards-qualifiers",
-                    r".*: warning: return discards qualifiers from pointer target type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunknown-attributes',
-        'description':'Unknown attribute',
-        'patterns':[r".*: warning: unknown attribute '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wignored-attributes',
-        'description':'Attribute ignored',
-        'patterns':[r".*: warning: '_*packed_*' attribute ignored",
-                    r".*: warning: attribute declaration must precede definition .+ignored-attributes"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wvisibility',
-        'description':'Visibility problem',
-        'patterns':[r".*: warning: declaration of '.+' will not be visible outside of this function"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wattributes',
-        'description':'Visibility mismatch',
-        'patterns':[r".*: warning: '.+' declared with greater visibility than the type of its field '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Shift count greater than width of type',
-        'patterns':[r".*: warning: (left|right) shift count >= width of type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wextern-initializer',
-        'description':'extern &lt;foo&gt; is initialized',
-        'patterns':[r".*: warning: '.+' initialized and declared 'extern'",
-                    r".*: warning: 'extern' variable has an initializer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wold-style-declaration',
-        'description':'Old style declaration',
-        'patterns':[r".*: warning: 'static' is not at beginning of declaration"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wreturn-type',
-        'description':'Missing return value',
-        'patterns':[r".*: warning: control reaches end of non-void function"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wimplicit-int',
-        'description':'Implicit int type',
-        'patterns':[r".*: warning: type specifier missing, defaults to 'int'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmain-return-type',
-        'description':'Main function should return int',
-        'patterns':[r".*: warning: return type of 'main' is not 'int'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wuninitialized',
-        'description':'Variable may be used uninitialized',
-        'patterns':[r".*: warning: '.+' may be used uninitialized in this function"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wuninitialized',
-        'description':'Variable is used uninitialized',
-        'patterns':[r".*: warning: '.+' is used uninitialized in this function",
-                    r".*: warning: variable '.+' is uninitialized when used here"] },
-    { 'category':'ld',      'severity':severity.MEDIUM,   'members':[], 'option':'-fshort-enums',
-        'description':'ld: possible enum size mismatch',
-        'patterns':[r".*: warning: .* uses variable-size enums yet the output is to use 32-bit enums; use of enum values across objects may fail"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wpointer-sign',
-        'description':'Pointer targets differ in signedness',
-        'patterns':[r".*: warning: pointer targets in initialization differ in signedness",
-                    r".*: warning: pointer targets in assignment differ in signedness",
-                    r".*: warning: pointer targets in return differ in signedness",
-                    r".*: warning: pointer targets in passing argument [0-9]+ of '.+' differ in signedness"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wstrict-overflow',
-        'description':'Assuming overflow does not occur',
-        'patterns':[r".*: warning: assuming signed overflow does not occur when assuming that .* is always (true|false)"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wempty-body',
-        'description':'Suggest adding braces around empty body',
-        'patterns':[r".*: warning: suggest braces around empty body in an 'if' statement",
-                    r".*: warning: empty body in an if-statement",
-                    r".*: warning: suggest braces around empty body in an 'else' statement",
-                    r".*: warning: empty body in an else-statement"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wparentheses',
-        'description':'Suggest adding parentheses',
-        'patterns':[r".*: warning: suggest explicit braces to avoid ambiguous 'else'",
-                    r".*: warning: suggest parentheses around arithmetic in operand of '.+'",
-                    r".*: warning: suggest parentheses around comparison in operand of '.+'",
-                    r".*: warning: logical not is only applied to the left hand side of this comparison",
-                    r".*: warning: using the result of an assignment as a condition without parentheses",
-                    r".*: warning: .+ has lower precedence than .+ be evaluated first .+Wparentheses",
-                    r".*: warning: suggest parentheses around '.+?' .+ '.+?'",
-                    r".*: warning: suggest parentheses around assignment used as truth value"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Static variable used in non-static inline function',
-        'patterns':[r".*: warning: '.+' is static but used in inline function '.+' which is not static"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wimplicit int',
-        'description':'No type or storage class (will default to int)',
-        'patterns':[r".*: warning: data definition has no type or storage class"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Null pointer',
-        'patterns':[r".*: warning: Dereference of null pointer",
-                    r".*: warning: Called .+ pointer is null",
-                    r".*: warning: Forming reference to null pointer",
-                    r".*: warning: Returning null reference",
-                    r".*: warning: Null pointer passed as an argument to a 'nonnull' parameter",
-                    r".*: warning: .+ results in a null pointer dereference",
-                    r".*: warning: Access to .+ results in a dereference of a null pointer",
-                    r".*: warning: Null pointer argument in"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: type defaults to 'int' in declaration of '.+'"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: parameter names \(without types\) in function declaration"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wstrict-aliasing',
-        'description':'Dereferencing &lt;foo&gt; breaks strict aliasing rules',
-        'patterns':[r".*: warning: dereferencing .* break strict-aliasing rules"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wpointer-to-int-cast',
-        'description':'Cast from pointer to integer of different size',
-        'patterns':[r".*: warning: cast from pointer to integer of different size",
-                    r".*: warning: initialization makes pointer from integer without a cast"] } ,
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wint-to-pointer-cast',
-        'description':'Cast to pointer from integer of different size',
-        'patterns':[r".*: warning: cast to pointer from integer of different size"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Symbol redefined',
-        'patterns':[r".*: warning: "".+"" redefined"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: this is the location of the previous definition"] },
-    { 'category':'ld',      'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'ld: type and size of dynamic symbol are not defined',
-        'patterns':[r".*: warning: type and size of dynamic symbol `.+' are not defined"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Pointer from integer without cast',
-        'patterns':[r".*: warning: assignment makes pointer from integer without a cast"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Pointer from integer without cast',
-        'patterns':[r".*: warning: passing argument [0-9]+ of '.+' makes pointer from integer without a cast"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Integer from pointer without cast',
-        'patterns':[r".*: warning: assignment makes integer from pointer without a cast"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Integer from pointer without cast',
-        'patterns':[r".*: warning: passing argument [0-9]+ of '.+' makes integer from pointer without a cast"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Integer from pointer without cast',
-        'patterns':[r".*: warning: return makes integer from pointer without a cast"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wunknown-pragmas',
-        'description':'Ignoring pragma',
-        'patterns':[r".*: warning: ignoring #pragma .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wclobbered',
-        'description':'Variable might be clobbered by longjmp or vfork',
-        'patterns':[r".*: warning: variable '.+' might be clobbered by 'longjmp' or 'vfork'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wclobbered',
-        'description':'Argument might be clobbered by longjmp or vfork',
-        'patterns':[r".*: warning: argument '.+' might be clobbered by 'longjmp' or 'vfork'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wredundant-decls',
-        'description':'Redundant declaration',
-        'patterns':[r".*: warning: redundant redeclaration of '.+'"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: previous declaration of '.+' was here"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wswitch-enum',
-        'description':'Enum value not handled in switch',
-        'patterns':[r".*: warning: .*enumeration value.* not handled in switch.+Wswitch"] },
-    { 'category':'java',    'severity':severity.MEDIUM,   'members':[], 'option':'-encoding',
-        'description':'Java: Non-ascii characters used, but ascii encoding specified',
-        'patterns':[r".*: warning: unmappable character for encoding ascii"] },
-    { 'category':'java',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Java: Non-varargs call of varargs method with inexact argument type for last parameter',
-        'patterns':[r".*: warning: non-varargs call of varargs method with inexact argument type for last parameter"] },
-    { 'category':'java',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Java: Unchecked method invocation',
-        'patterns':[r".*: warning: \[unchecked\] unchecked method invocation: .+ in class .+"] },
-    { 'category':'java',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Java: Unchecked conversion',
-        'patterns':[r".*: warning: \[unchecked\] unchecked conversion"] },
+warn_patterns = [
+    # pylint:disable=line-too-long,g-inconsistent-quotes
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Security warning',
+     'patterns': [r".*: warning: .+\[clang-analyzer-security.*\]"]},
+    {'category': 'make', 'severity': Severity.MEDIUM,
+     '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.HIGH,
+     'description': 'make: LOCAL_CLANG is false',
+     'patterns': [r".*: warning: LOCAL_CLANG is set to false"]},
+    {'category': 'make', 'severity': Severity.HIGH,
+     'description': 'SDK App using platform shared library',
+     'patterns': [r".*: warning: .+ \(.*app:sdk.*\) should not link to .+ \(native:platform\)"]},
+    {'category': 'make', 'severity': Severity.HIGH,
+     'description': 'System module linking to a vendor module',
+     'patterns': [r".*: warning: .+ \(.+\) should not link to .+ \(partition:.+\)"]},
+    {'category': 'make', 'severity': Severity.MEDIUM,
+     'description': 'Invalid SDK/NDK linking',
+     'patterns': [r".*: warning: .+ \(.+\) should not link to .+ \(.+\)"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Wimplicit-function-declaration',
+     'description': 'Implicit function declaration',
+     'patterns': [r".*: warning: implicit declaration of function .+",
+                  r".*: warning: implicitly declaring library function"]},
+    {'category': 'C/C++', 'severity': Severity.SKIP,
+     'description': 'skip, conflicting types for ...',
+     'patterns': [r".*: warning: conflicting types for '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Wtype-limits',
+     'description': 'Expression always evaluates to true or false',
+     'patterns': [r".*: warning: comparison is always .+ due to limited range of data type",
+                  r".*: warning: comparison of unsigned .*expression .+ is always true",
+                  r".*: warning: comparison of unsigned .*expression .+ is always false"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Potential leak of memory, bad free, use after free',
+     'patterns': [r".*: warning: Potential leak of memory",
+                  r".*: warning: Potential memory leak",
+                  r".*: warning: Memory allocated by alloca\(\) should not be deallocated",
+                  r".*: warning: Memory allocated by .+ should be deallocated by .+ not .+",
+                  r".*: warning: 'delete' applied to a pointer that was allocated",
+                  r".*: warning: Use of memory after it is freed",
+                  r".*: warning: Argument to .+ is the address of .+ variable",
+                  r".*: warning: Argument to free\(\) is offset by .+ of memory allocated by",
+                  r".*: warning: Attempt to .+ released memory"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Use transient memory for control value',
+     'patterns': [r".*: warning: .+Using such transient memory for the control value is .*dangerous."]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Return address of stack memory',
+     'patterns': [r".*: warning: Address of stack memory .+ returned to caller",
+                  r".*: warning: Address of stack memory .+ will be a dangling reference"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Problem with vfork',
+     'patterns': [r".*: warning: This .+ is prohibited after a successful vfork",
+                  r".*: warning: Call to function '.+' is insecure "]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': 'infinite-recursion',
+     'description': 'Infinite recursion',
+     'patterns': [r".*: warning: all paths through this function will call itself"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Potential buffer overflow',
+     'patterns': [r".*: warning: Size argument is greater than .+ the destination buffer",
+                  r".*: warning: Potential buffer overflow.",
+                  r".*: warning: String copy function overflows destination buffer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Incompatible pointer types',
+     'patterns': [r".*: warning: assignment from incompatible pointer type",
+                  r".*: warning: return from incompatible pointer type",
+                  r".*: warning: passing argument [0-9]+ of '.*' from incompatible pointer type",
+                  r".*: warning: initialization from incompatible pointer type"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-fno-builtin',
+     'description': 'Incompatible declaration of built in function',
+     'patterns': [r".*: warning: incompatible implicit declaration of built-in function .+"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Wincompatible-library-redeclaration',
+     'description': 'Incompatible redeclaration of library function',
+     'patterns': [r".*: warning: incompatible redeclaration of library function .+"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH,
+     'description': 'Null passed as non-null argument',
+     'patterns': [r".*: warning: Null passed to a callee that requires a non-null"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunused-parameter',
+     'description': 'Unused parameter',
+     'patterns': [r".*: warning: unused parameter '.*'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunused',
+     'description': 'Unused function, variable or label',
+     'patterns': [r".*: warning: '.+' defined but not used",
+                  r".*: warning: unused function '.+'",
+                  r".*: warning: private field '.+' is not used",
+                  r".*: warning: unused variable '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunused-value',
+     'description': 'Statement with no effect or result unused',
+     'patterns': [r".*: warning: statement with no effect",
+                  r".*: warning: expression result unused"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunused-result',
+     'description': 'Ignoreing return value of function',
+     'patterns': [r".*: warning: ignoring return value of function .+Wunused-result"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmissing-field-initializers',
+     'description': 'Missing initializer',
+     'patterns': [r".*: warning: missing initializer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wdelete-non-virtual-dtor',
+     'description': 'Need virtual destructor',
+     'patterns': [r".*: warning: delete called .* has virtual functions but non-virtual destructor"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip, near initialization for ...',
+     'patterns': [r".*: warning: \(near initialization for '.+'\)"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wdate-time',
+     'description': 'Expansion of data or time macro',
+     'patterns': [r".*: warning: expansion of date or time macro is not reproducible"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wformat',
+     'description': 'Format string does not match arguments',
+     'patterns': [r".*: warning: format '.+' expects type '.+', but argument [0-9]+ has type '.+'",
+                  r".*: warning: more '%' conversions than data arguments",
+                  r".*: warning: data argument not used by format string",
+                  r".*: warning: incomplete format specifier",
+                  r".*: warning: unknown conversion type .* in format",
+                  r".*: warning: format .+ expects .+ but argument .+Wformat=",
+                  r".*: warning: field precision should have .+ but argument has .+Wformat",
+                  r".*: warning: format specifies type .+ but the argument has .*type .+Wformat"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wformat-extra-args',
+     'description': 'Too many arguments for format string',
+     'patterns': [r".*: warning: too many arguments for format"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wformat-invalid-specifier',
+     'description': 'Invalid format specifier',
+     'patterns': [r".*: warning: invalid .+ specifier '.+'.+format-invalid-specifier"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wsign-compare',
+     'description': 'Comparison between signed and unsigned',
+     'patterns': [r".*: warning: comparison between signed and unsigned",
+                  r".*: warning: comparison of promoted \~unsigned with unsigned",
+                  r".*: warning: signed and unsigned type in conditional expression"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Comparison between enum and non-enum',
+     'patterns': [r".*: warning: enumeral and non-enumeral type in conditional expression"]},
+    {'category': 'libpng', 'severity': Severity.MEDIUM,
+     'description': 'libpng: zero area',
+     'patterns': [r".*libpng warning: Ignoring attempt to set cHRM RGB triangle with zero area"]},
+    {'category': 'aapt', 'severity': Severity.MEDIUM,
+     'description': 'aapt: no comment for public symbol',
+     'patterns': [r".*: warning: No comment for public symbol .+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmissing-braces',
+     'description': 'Missing braces around initializer',
+     'patterns': [r".*: warning: missing braces around initializer.*"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'No newline at end of file',
+     'patterns': [r".*: warning: no newline at end of file"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Missing space after macro name',
+     'patterns': [r".*: warning: missing whitespace after the macro name"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wcast-align',
+     'description': 'Cast increases required alignment',
+     'patterns': [r".*: warning: cast from .* to .* increases required alignment .*"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wcast-qual',
+     'description': 'Qualifier discarded',
+     'patterns': [r".*: warning: passing argument [0-9]+ of '.+' discards qualifiers from pointer target type",
+                  r".*: warning: assignment discards qualifiers from pointer target type",
+                  r".*: warning: passing .+ to parameter of type .+ discards qualifiers",
+                  r".*: warning: assigning to .+ from .+ discards qualifiers",
+                  r".*: warning: initializing .+ discards qualifiers .+types-discards-qualifiers",
+                  r".*: warning: return discards qualifiers from pointer target type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunknown-attributes',
+     'description': 'Unknown attribute',
+     'patterns': [r".*: warning: unknown attribute '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wignored-attributes',
+     'description': 'Attribute ignored',
+     'patterns': [r".*: warning: '_*packed_*' attribute ignored",
+                  r".*: warning: attribute declaration must precede definition .+ignored-attributes"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wvisibility',
+     'description': 'Visibility problem',
+     'patterns': [r".*: warning: declaration of '.+' will not be visible outside of this function"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wattributes',
+     'description': 'Visibility mismatch',
+     'patterns': [r".*: warning: '.+' declared with greater visibility than the type of its field '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Shift count greater than width of type',
+     'patterns': [r".*: warning: (left|right) shift count >= width of type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wextern-initializer',
+     'description': 'extern &lt;foo&gt; is initialized',
+     'patterns': [r".*: warning: '.+' initialized and declared 'extern'",
+                  r".*: warning: 'extern' variable has an initializer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wold-style-declaration',
+     'description': 'Old style declaration',
+     'patterns': [r".*: warning: 'static' is not at beginning of declaration"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wreturn-type',
+     'description': 'Missing return value',
+     'patterns': [r".*: warning: control reaches end of non-void function"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wimplicit-int',
+     'description': 'Implicit int type',
+     'patterns': [r".*: warning: type specifier missing, defaults to 'int'",
+                  r".*: warning: type defaults to 'int' in declaration of '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmain-return-type',
+     'description': 'Main function should return int',
+     'patterns': [r".*: warning: return type of 'main' is not 'int'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wuninitialized',
+     'description': 'Variable may be used uninitialized',
+     'patterns': [r".*: warning: '.+' may be used uninitialized in this function"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Wuninitialized',
+     'description': 'Variable is used uninitialized',
+     'patterns': [r".*: warning: '.+' is used uninitialized in this function",
+                  r".*: warning: variable '.+' is uninitialized when used here"]},
+    {'category': 'ld', 'severity': Severity.MEDIUM, 'option': '-fshort-enums',
+     'description': 'ld: possible enum size mismatch',
+     'patterns': [r".*: warning: .* uses variable-size enums yet the output is to use 32-bit enums; use of enum values across objects may fail"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wpointer-sign',
+     'description': 'Pointer targets differ in signedness',
+     'patterns': [r".*: warning: pointer targets in initialization differ in signedness",
+                  r".*: warning: pointer targets in assignment differ in signedness",
+                  r".*: warning: pointer targets in return differ in signedness",
+                  r".*: warning: pointer targets in passing argument [0-9]+ of '.+' differ in signedness"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wstrict-overflow',
+     'description': 'Assuming overflow does not occur',
+     'patterns': [r".*: warning: assuming signed overflow does not occur when assuming that .* is always (true|false)"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wempty-body',
+     'description': 'Suggest adding braces around empty body',
+     'patterns': [r".*: warning: suggest braces around empty body in an 'if' statement",
+                  r".*: warning: empty body in an if-statement",
+                  r".*: warning: suggest braces around empty body in an 'else' statement",
+                  r".*: warning: empty body in an else-statement"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wparentheses',
+     'description': 'Suggest adding parentheses',
+     'patterns': [r".*: warning: suggest explicit braces to avoid ambiguous 'else'",
+                  r".*: warning: suggest parentheses around arithmetic in operand of '.+'",
+                  r".*: warning: suggest parentheses around comparison in operand of '.+'",
+                  r".*: warning: logical not is only applied to the left hand side of this comparison",
+                  r".*: warning: using the result of an assignment as a condition without parentheses",
+                  r".*: warning: .+ has lower precedence than .+ be evaluated first .+Wparentheses",
+                  r".*: warning: suggest parentheses around '.+?' .+ '.+?'",
+                  r".*: warning: suggest parentheses around assignment used as truth value"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Static variable used in non-static inline function',
+     'patterns': [r".*: warning: '.+' is static but used in inline function '.+' which is not static"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wimplicit int',
+     'description': 'No type or storage class (will default to int)',
+     'patterns': [r".*: warning: data definition has no type or storage class"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Null pointer',
+     'patterns': [r".*: warning: Dereference of null pointer",
+                  r".*: warning: Called .+ pointer is null",
+                  r".*: warning: Forming reference to null pointer",
+                  r".*: warning: Returning null reference",
+                  r".*: warning: Null pointer passed as an argument to a 'nonnull' parameter",
+                  r".*: warning: .+ results in a null pointer dereference",
+                  r".*: warning: Access to .+ results in a dereference of a null pointer",
+                  r".*: warning: Null pointer argument in"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip, parameter name (without types) in function declaration',
+     'patterns': [r".*: warning: parameter names \(without types\) in function declaration"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wstrict-aliasing',
+     'description': 'Dereferencing &lt;foo&gt; breaks strict aliasing rules',
+     'patterns': [r".*: warning: dereferencing .* break strict-aliasing rules"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wpointer-to-int-cast',
+     'description': 'Cast from pointer to integer of different size',
+     'patterns': [r".*: warning: cast from pointer to integer of different size",
+                  r".*: warning: initialization makes pointer from integer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wint-to-pointer-cast',
+     'description': 'Cast to pointer from integer of different size',
+     'patterns': [r".*: warning: cast to pointer from integer of different size"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Symbol redefined',
+     'patterns': [r".*: warning: "".+"" redefined"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip, ... location of the previous definition',
+     'patterns': [r".*: warning: this is the location of the previous definition"]},
+    {'category': 'ld', 'severity': Severity.MEDIUM,
+     'description': 'ld: type and size of dynamic symbol are not defined',
+     'patterns': [r".*: warning: type and size of dynamic symbol `.+' are not defined"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Pointer from integer without cast',
+     'patterns': [r".*: warning: assignment makes pointer from integer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Pointer from integer without cast',
+     'patterns': [r".*: warning: passing argument [0-9]+ of '.+' makes pointer from integer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Integer from pointer without cast',
+     'patterns': [r".*: warning: assignment makes integer from pointer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Integer from pointer without cast',
+     'patterns': [r".*: warning: passing argument [0-9]+ of '.+' makes integer from pointer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Integer from pointer without cast',
+     'patterns': [r".*: warning: return makes integer from pointer without a cast"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunknown-pragmas',
+     'description': 'Ignoring pragma',
+     'patterns': [r".*: warning: ignoring #pragma .+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-W#pragma-messages',
+     'description': 'Pragma warning messages',
+     'patterns': [r".*: warning: .+W#pragma-messages"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wclobbered',
+     'description': 'Variable might be clobbered by longjmp or vfork',
+     'patterns': [r".*: warning: variable '.+' might be clobbered by 'longjmp' or 'vfork'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wclobbered',
+     'description': 'Argument might be clobbered by longjmp or vfork',
+     'patterns': [r".*: warning: argument '.+' might be clobbered by 'longjmp' or 'vfork'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wredundant-decls',
+     'description': 'Redundant declaration',
+     'patterns': [r".*: warning: redundant redeclaration of '.+'"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip, previous declaration ... was here',
+     'patterns': [r".*: warning: previous declaration of '.+' was here"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wswitch-enum',
+     'description': 'Enum value not handled in switch',
+     'patterns': [r".*: warning: .*enumeration value.* not handled in switch.+Wswitch"]},
+    {'category': 'java', 'severity': Severity.MEDIUM, 'option': '-encoding',
+     'description': 'Java: Non-ascii characters used, but ascii encoding specified',
+     'patterns': [r".*: warning: unmappable character for encoding ascii"]},
+    {'category': 'java', 'severity': Severity.MEDIUM,
+     'description': 'Java: Non-varargs call of varargs method with inexact argument type for last parameter',
+     'patterns': [r".*: warning: non-varargs call of varargs method with inexact argument type for last parameter"]},
+    {'category': 'java', 'severity': Severity.MEDIUM,
+     'description': 'Java: Unchecked method invocation',
+     'patterns': [r".*: warning: \[unchecked\] unchecked method invocation: .+ in class .+"]},
+    {'category': 'java', 'severity': Severity.MEDIUM,
+     'description': 'Java: Unchecked conversion',
+     'patterns': [r".*: warning: \[unchecked\] unchecked conversion"]},
+    {'category': 'java', 'severity': Severity.MEDIUM,
+     'description': '_ used as an identifier',
+     'patterns': [r".*: warning: '_' used as an identifier"]},
 
     # Warnings from Error Prone.
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description': 'Java: Use of deprecated member',
      'patterns': [r'.*: warning: \[deprecation\] .+']},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description': 'Java: Unchecked conversion',
      'patterns': [r'.*: warning: \[unchecked\] .+']},
 
     # Warnings from Error Prone (auto generated list).
     {'category': 'java',
-     'severity': severity.LOW,
-     'members': [],
-     'option': '',
+     'severity': Severity.LOW,
      'description':
          'Java: Deprecated item is not annotated with @Deprecated',
      'patterns': [r".*: warning: \[DepAnn\] .+"]},
     {'category': 'java',
-     'severity': severity.LOW,
-     'members': [],
-     'option': '',
+     'severity': Severity.LOW,
      'description':
          'Java: Fallthrough warning suppression has no effect if warning is suppressed',
      'patterns': [r".*: warning: \[FallthroughSuppression\] .+"]},
     {'category': 'java',
-     'severity': severity.LOW,
-     'members': [],
-     'option': '',
+     'severity': Severity.LOW,
      'description':
          'Java: Prefer \'L\' to \'l\' for the suffix to long literals',
      'patterns': [r".*: warning: \[LongLiteralLowerCaseSuffix\] .+"]},
     {'category': 'java',
-     'severity': severity.LOW,
-     'members': [],
-     'option': '',
+     'severity': Severity.LOW,
      'description':
          'Java: @Binds is a more efficient and declaritive mechanism for delegating a binding.',
      'patterns': [r".*: warning: \[UseBinds\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Assertions may be disabled at runtime and do not guarantee that execution will halt here; consider throwing an exception instead',
      'patterns': [r".*: warning: \[AssertFalse\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Classes that implement Annotation must override equals and hashCode. Consider using AutoAnnotation instead of implementing Annotation by hand.',
      'patterns': [r".*: warning: \[BadAnnotationImplementation\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: BigDecimal(double) and BigDecimal.valueOf(double) may lose precision, prefer BigDecimal(String) or BigDecimal(long)',
      'patterns': [r".*: warning: \[BigDecimalLiteralDouble\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Mockito cannot mock final classes',
      'patterns': [r".*: warning: \[CannotMockFinalClass\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: This code, which counts elements using a loop, can be replaced by a simpler library method',
      'patterns': [r".*: warning: \[ElementsCountedInLoop\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Empty top-level type declaration',
      'patterns': [r".*: warning: \[EmptyTopLevelDeclaration\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Classes that override equals should also override hashCode.',
      'patterns': [r".*: warning: \[EqualsHashCode\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: An equality test between objects with incompatible types always returns false',
      'patterns': [r".*: warning: \[EqualsIncompatibleType\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: If you return or throw from a finally, then values returned or thrown from the try-catch block will be ignored. Consider using try-with-resources instead.',
      'patterns': [r".*: warning: \[Finally\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: This annotation has incompatible modifiers as specified by its @IncompatibleModifiers annotation',
      'patterns': [r".*: warning: \[IncompatibleModifiers\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Class should not implement both `Iterable` and `Iterator`',
      'patterns': [r".*: warning: \[IterableAndIterator\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Floating-point comparison without error tolerance',
      'patterns': [r".*: warning: \[JUnit3FloatingPointComparisonWithoutDelta\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Test class inherits from JUnit 3\'s TestCase but has JUnit 4 @Test annotations.',
      'patterns': [r".*: warning: \[JUnitAmbiguousTestClass\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Enum switch statement is missing cases',
      'patterns': [r".*: warning: \[MissingCasesInEnumSwitch\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Not calling fail() when expecting an exception masks bugs',
      'patterns': [r".*: warning: \[MissingFail\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: method overrides method in supertype; expected @Override',
      'patterns': [r".*: warning: \[MissingOverride\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Source files should not contain multiple top-level class declarations',
      'patterns': [r".*: warning: \[MultipleTopLevelClasses\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: This update of a volatile variable is non-atomic',
      'patterns': [r".*: warning: \[NonAtomicVolatileUpdate\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Static import of member uses non-canonical name',
      'patterns': [r".*: warning: \[NonCanonicalStaticMemberImport\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: equals method doesn\'t override Object.equals',
      'patterns': [r".*: warning: \[NonOverridingEquals\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Constructors should not be annotated with @Nullable since they cannot return null',
      'patterns': [r".*: warning: \[NullableConstructor\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: @Nullable should not be used for primitive types since they cannot be null',
      'patterns': [r".*: warning: \[NullablePrimitive\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: void-returning methods should not be annotated with @Nullable, since they cannot return null',
      'patterns': [r".*: warning: \[NullableVoid\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Package names should match the directory they are declared in',
      'patterns': [r".*: warning: \[PackageLocation\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Second argument to Preconditions.* is a call to String.format(), which can be unwrapped',
      'patterns': [r".*: warning: \[PreconditionsErrorMessageEagerEvaluation\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Preconditions only accepts the %s placeholder in error message strings',
      'patterns': [r".*: warning: \[PreconditionsInvalidPlaceholder\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Passing a primitive array to a varargs method is usually wrong',
      'patterns': [r".*: warning: \[PrimitiveArrayPassedToVarargsMethod\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Protobuf fields cannot be null, so this check is redundant',
      'patterns': [r".*: warning: \[ProtoFieldPreconditionsCheckNotNull\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: This annotation is missing required modifiers as specified by its @RequiredModifiers annotation',
      'patterns': [r".*: warning: \[RequiredModifiers\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: A static variable or method should not be accessed from an object instance',
      'patterns': [r".*: warning: \[StaticAccessedFromInstance\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: String comparison using reference equality instead of value equality',
      'patterns': [r".*: warning: \[StringEquality\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Declaring a type parameter that is only used in the return type is a misuse of generics: operations on the type parameter are unchecked, it hides unsafe casts at invocations of the method, and it interacts badly with method overload resolution.',
      'patterns': [r".*: warning: \[TypeParameterUnusedInFormals\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Using static imports for types is unnecessary',
      'patterns': [r".*: warning: \[UnnecessaryStaticImport\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Unsynchronized method overrides a synchronized method.',
      'patterns': [r".*: warning: \[UnsynchronizedOverridesSynchronized\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Non-constant variable missing @Var annotation',
      'patterns': [r".*: warning: \[Var\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Because of spurious wakeups, Object.wait() and Condition.await() must always be called in a loop',
      'patterns': [r".*: warning: \[WaitNotInLoop\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Subclasses of Fragment must be instantiable via Class#newInstance(): the class must be public, static and have a public nullary constructor',
      'patterns': [r".*: warning: \[FragmentNotInstantiable\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Hardcoded reference to /sdcard',
      'patterns': [r".*: warning: \[HardCodedSdCardPath\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Incompatible type as argument to Object-accepting Java collections method',
      'patterns': [r".*: warning: \[CollectionIncompatibleType\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: @AssistedInject and @Inject should not be used on different constructors in the same class.',
      'patterns': [r".*: warning: \[AssistedInjectAndInjectOnConstructors\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Although Guice allows injecting final fields, doing so is not recommended because the injected value may not be visible to other threads.',
      'patterns': [r".*: warning: \[GuiceInjectOnFinalField\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: This method is not annotated with @Inject, but it overrides a method that is annotated with @com.google.inject.Inject. Guice will inject this method, and it is recommended to annotate it explicitly.',
      'patterns': [r".*: warning: \[OverridesGuiceInjectableMethod\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Double-checked locking on non-volatile fields is unsafe',
      'patterns': [r".*: warning: \[DoubleCheckedLocking\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Writes to static fields should not be guarded by instance locks',
      'patterns': [r".*: warning: \[StaticGuardedByInstance\] .+"]},
     {'category': 'java',
-     'severity': severity.MEDIUM,
-     'members': [],
-     'option': '',
+     'severity': Severity.MEDIUM,
      'description':
          'Java: Synchronizing on non-final fields is not safe: if the field is ever updated, different threads may end up locking on different objects.',
      'patterns': [r".*: warning: \[SynchronizeOnNonFinalField\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Reference equality used to compare arrays',
      'patterns': [r".*: warning: \[ArrayEquals\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: hashcode method on array does not hash array contents',
      'patterns': [r".*: warning: \[ArrayHashCode\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Calling toString on an array does not provide useful information',
      'patterns': [r".*: warning: \[ArrayToString.*\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Arrays.asList does not autobox primitive arrays, as one might expect.',
      'patterns': [r".*: warning: \[ArraysAsListPrimitiveArray\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: AsyncCallable should not return a null Future, only a Future whose result is null.',
      'patterns': [r".*: warning: \[AsyncCallableReturnsNull\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: AsyncFunction should not return a null Future, only a Future whose result is null.',
      'patterns': [r".*: warning: \[AsyncFunctionReturnsNull\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Possible sign flip from narrowing conversion',
      'patterns': [r".*: warning: \[BadComparable\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Shift by an amount that is out of range',
      'patterns': [r".*: warning: \[BadShiftAmount\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: valueOf provides better time and space performance',
      'patterns': [r".*: warning: \[BoxedPrimitiveConstructor\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: The called constructor accepts a parameter with the same name and type as one of its caller\'s parameters, but its caller doesn\'t pass that parameter to it.  It\'s likely that it was intended to.',
      'patterns': [r".*: warning: \[ChainingConstructorIgnoresParameter\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Ignored return value of method that is annotated with @CheckReturnValue',
      'patterns': [r".*: warning: \[CheckReturnValue\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Inner class is non-static but does not reference enclosing class',
      'patterns': [r".*: warning: \[ClassCanBeStatic\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: The source file name should match the name of the top-level class it contains',
      'patterns': [r".*: warning: \[ClassName\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: This comparison method violates the contract',
      'patterns': [r".*: warning: \[ComparisonContractViolated\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Comparison to value that is out of range for the compared type',
      'patterns': [r".*: warning: \[ComparisonOutOfRange\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Non-compile-time constant expression passed to parameter with @CompileTimeConstant type annotation.',
      'patterns': [r".*: warning: \[CompileTimeConstant\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Exception created but not thrown',
      'patterns': [r".*: warning: \[DeadException\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Division by integer literal zero',
      'patterns': [r".*: warning: \[DivZero\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Empty statement after if',
      'patterns': [r".*: warning: \[EmptyIf\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: == NaN always returns false; use the isNaN methods instead',
      'patterns': [r".*: warning: \[EqualsNaN\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Method annotated @ForOverride must be protected or package-private and only invoked from declaring class',
      'patterns': [r".*: warning: \[ForOverride\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Futures.getChecked requires a checked exception type with a standard constructor.',
      'patterns': [r".*: warning: \[FuturesGetCheckedIllegalExceptionType\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Calling getClass() on an object of type Class returns the Class object for java.lang.Class; you probably meant to operate on the object directly',
      'patterns': [r".*: warning: \[GetClassOnClass\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: An object is tested for equality to itself using Guava Libraries',
      'patterns': [r".*: warning: \[GuavaSelfEquals\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: contains() is a legacy method that is equivalent to containsValue()',
      'patterns': [r".*: warning: \[HashtableContains\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Cipher.getInstance() is invoked using either the default settings or ECB mode',
      'patterns': [r".*: warning: \[InsecureCipherMode\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Invalid syntax used for a regular expression',
      'patterns': [r".*: warning: \[InvalidPatternSyntax\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: The argument to Class#isInstance(Object) should not be a Class',
      'patterns': [r".*: warning: \[IsInstanceOfClass\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: jMock tests must have a @RunWith(JMock.class) annotation, or the Mockery field must have a @Rule JUnit annotation',
      'patterns': [r".*: warning: \[JMockTestWithoutRunWithOrRuleAnnotation\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Test method will not be run; please prefix name with "test"',
      'patterns': [r".*: warning: \[JUnit3TestNotRun\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: setUp() method will not be run; Please add a @Before annotation',
      'patterns': [r".*: warning: \[JUnit4SetUpNotRun\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: tearDown() method will not be run; Please add an @After annotation',
      'patterns': [r".*: warning: \[JUnit4TearDownNotRun\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Test method will not be run; please add @Test annotation',
      'patterns': [r".*: warning: \[JUnit4TestNotRun\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Printf-like format string does not match its arguments',
      'patterns': [r".*: warning: \[MalformedFormatString\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Use of "YYYY" (week year) in a date pattern without "ww" (week in year). You probably meant to use "yyyy" (year) instead.',
      'patterns': [r".*: warning: \[MisusedWeekYear\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: A bug in Mockito will cause this test to fail at runtime with a ClassCastException',
      'patterns': [r".*: warning: \[MockitoCast\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Missing method call for verify(mock) here',
      'patterns': [r".*: warning: \[MockitoUsage\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Modifying a collection with itself',
      'patterns': [r".*: warning: \[ModifyingCollectionWithItself\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Compound assignments to bytes, shorts, chars, and floats hide dangerous casts',
      'patterns': [r".*: warning: \[NarrowingCompoundAssignment\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: @NoAllocation was specified on this method, but something was found that would trigger an allocation',
      'patterns': [r".*: warning: \[NoAllocation\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Static import of type uses non-canonical name',
      'patterns': [r".*: warning: \[NonCanonicalStaticImport\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: @CompileTimeConstant parameters should be final',
      'patterns': [r".*: warning: \[NonFinalCompileTimeConstant\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Calling getAnnotation on an annotation that is not retained at runtime.',
      'patterns': [r".*: warning: \[NonRuntimeAnnotation\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Numeric comparison using reference equality instead of value equality',
      'patterns': [r".*: warning: \[NumericEquality\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Comparison using reference equality instead of value equality',
      'patterns': [r".*: warning: \[OptionalEquality\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Varargs doesn\'t agree for overridden method',
      'patterns': [r".*: warning: \[Overrides\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Literal passed as first argument to Preconditions.checkNotNull() can never be null',
      'patterns': [r".*: warning: \[PreconditionsCheckNotNull\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: First argument to `Preconditions.checkNotNull()` is a primitive rather than an object reference',
      'patterns': [r".*: warning: \[PreconditionsCheckNotNullPrimitive\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Protobuf fields cannot be null',
      'patterns': [r".*: warning: \[ProtoFieldNullComparison\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Comparing protobuf fields of type String using reference equality',
      'patterns': [r".*: warning: \[ProtoStringFieldReferenceEquality\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java:  Check for non-whitelisted callers to RestrictedApiChecker.',
      'patterns': [r".*: warning: \[RestrictedApiChecker\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Return value of this method must be used',
      'patterns': [r".*: warning: \[ReturnValueIgnored\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Variable assigned to itself',
      'patterns': [r".*: warning: \[SelfAssignment\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: An object is compared to itself',
      'patterns': [r".*: warning: \[SelfComparision\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Variable compared to itself',
      'patterns': [r".*: warning: \[SelfEquality\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: An object is tested for equality to itself',
      'patterns': [r".*: warning: \[SelfEquals\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Comparison of a size >= 0 is always true, did you intend to check for non-emptiness?',
      'patterns': [r".*: warning: \[SizeGreaterThanOrEqualsZero\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Calling toString on a Stream does not provide useful information',
      'patterns': [r".*: warning: \[StreamToString\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: StringBuilder does not have a char constructor; this invokes the int constructor.',
      'patterns': [r".*: warning: \[StringBuilderInitWithChar\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Suppressing "deprecated" is probably a typo for "deprecation"',
      'patterns': [r".*: warning: \[SuppressWarningsDeprecated\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: throwIfUnchecked(knownCheckedException) is a no-op.',
      'patterns': [r".*: warning: \[ThrowIfUncheckedKnownChecked\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Catching Throwable/Error masks failures from fail() or assert*() in the try block',
      'patterns': [r".*: warning: \[TryFailThrowable\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Type parameter used as type qualifier',
      'patterns': [r".*: warning: \[TypeParameterQualifier\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Non-generic methods should not be invoked with type arguments',
      'patterns': [r".*: warning: \[UnnecessaryTypeArgument\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Instance created but never used',
      'patterns': [r".*: warning: \[UnusedAnonymousClass\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Use of wildcard imports is forbidden',
      'patterns': [r".*: warning: \[WildcardImport\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Method parameter has wrong package',
      'patterns': [r".*: warning: \[ParameterPackage\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Certain resources in `android.R.string` have names that do not match their content',
      'patterns': [r".*: warning: \[MislabeledAndroidString\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Return value of android.graphics.Rect.intersect() must be checked',
      'patterns': [r".*: warning: \[RectIntersectReturnValueIgnored\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Invalid printf-style format string',
      'patterns': [r".*: warning: \[FormatString\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: @AssistedInject and @Inject cannot be used on the same constructor.',
      'patterns': [r".*: warning: \[AssistedInjectAndInjectOnSameConstructor\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Injected constructors cannot be optional nor have binding annotations',
      'patterns': [r".*: warning: \[InjectedConstructorAnnotations\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: The target of a scoping annotation must be set to METHOD and/or TYPE.',
      'patterns': [r".*: warning: \[InjectInvalidTargetingOnScopingAnnotation\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Abstract methods are not injectable with javax.inject.Inject.',
      'patterns': [r".*: warning: \[JavaxInjectOnAbstractMethod\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: @javax.inject.Inject cannot be put on a final field.',
      'patterns': [r".*: warning: \[JavaxInjectOnFinalField\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: A class may not have more than one injectable constructor.',
      'patterns': [r".*: warning: \[MoreThanOneInjectableConstructor\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Using more than one qualifier annotation on the same element is not allowed.',
      'patterns': [r".*: warning: \[InjectMoreThanOneQualifier\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: A class can be annotated with at most one scope annotation',
      'patterns': [r".*: warning: \[InjectMoreThanOneScopeAnnotationOnClass\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Annotations cannot be both Qualifiers/BindingAnnotations and Scopes',
      'patterns': [r".*: warning: \[OverlappingQualifierAndScopeAnnotation\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Scope annotation on an interface or abstact class is not allowed',
      'patterns': [r".*: warning: \[InjectScopeAnnotationOnInterfaceOrAbstractClass\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Scoping and qualifier annotations must have runtime retention.',
      'patterns': [r".*: warning: \[InjectScopeOrQualifierAnnotationRetention\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Dagger @Provides methods may not return null unless annotated with @Nullable',
      'patterns': [r".*: warning: \[DaggerProvidesNull\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Scope annotation on implementation class of AssistedInject factory is not allowed',
      'patterns': [r".*: warning: \[GuiceAssistedInjectScoping\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: A constructor cannot have two @Assisted parameters of the same type unless they are disambiguated with named @Assisted annotations. ',
      'patterns': [r".*: warning: \[GuiceAssistedParameters\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: This method is not annotated with @Inject, but it overrides a  method that is  annotated with @javax.inject.Inject.',
      'patterns': [r".*: warning: \[OverridesJavaxInjectableMethod\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Checks for unguarded accesses to fields and methods with @GuardedBy annotations',
      'patterns': [r".*: warning: \[GuardedByChecker\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Invalid @GuardedBy expression',
      'patterns': [r".*: warning: \[GuardedByValidator\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: Type declaration annotated with @Immutable is not immutable',
      'patterns': [r".*: warning: \[Immutable\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: This method does not acquire the locks specified by its @LockMethod annotation',
      'patterns': [r".*: warning: \[LockMethodChecker\] .+"]},
     {'category': 'java',
-     'severity': severity.HIGH,
-     'members': [],
-     'option': '',
+     'severity': Severity.HIGH,
      'description':
          'Java: This method does not acquire the locks specified by its @UnlockMethod annotation',
      'patterns': [r".*: warning: \[UnlockMethod\] .+"]},
 
     {'category': 'java',
-     'severity': severity.UNKNOWN,
-     'members': [],
-     'option': '',
+     'severity': Severity.UNKNOWN,
      'description': 'Java: Unclassified/unrecognized warnings',
      'patterns': [r".*: warning: \[.+\] .+"]},
 
-    { 'category':'aapt',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'aapt: No default translation',
-        'patterns':[r".*: warning: string '.+' has no default translation in .*"] },
-    { 'category':'aapt',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'aapt: Missing default or required localization',
-        'patterns':[r".*: warning: \*\*\*\* string '.+' has no default or required localization for '.+' in .+"] },
-    { 'category':'aapt',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'aapt: String marked untranslatable, but translation exists',
-        'patterns':[r".*: warning: string '.+' in .* marked untranslatable but exists in locale '??_??'"] },
-    { 'category':'aapt',    'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'aapt: empty span in string',
-        'patterns':[r".*: warning: empty '.+' span found in text '.+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Taking address of temporary',
-        'patterns':[r".*: warning: taking address of temporary"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Possible broken line continuation',
-        'patterns':[r".*: warning: backslash and newline separated by space"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wundefined-var-template',
-        'description':'Undefined variable template',
-        'patterns':[r".*: warning: instantiation of variable .* no definition is available"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wundefined-inline',
-        'description':'Inline function is not defined',
-        'patterns':[r".*: warning: inline function '.*' is not defined"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Warray-bounds',
-        'description':'Array subscript out of bounds',
-        'patterns':[r".*: warning: array subscript is above array bounds",
-                    r".*: warning: Array subscript is undefined",
-                    r".*: warning: array subscript is below array bounds"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Excess elements in initializer',
-        'patterns':[r".*: warning: excess elements in .+ initializer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Decimal constant is unsigned only in ISO C90',
-        'patterns':[r".*: warning: this decimal constant is unsigned only in ISO C90"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmain',
-        'description':'main is usually a function',
-        'patterns':[r".*: warning: 'main' is usually a function"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Typedef ignored',
-        'patterns':[r".*: warning: 'typedef' was ignored in this declaration"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Waddress',
-        'description':'Address always evaluates to true',
-        'patterns':[r".*: warning: the address of '.+' will always evaluate as 'true'"] },
-    { 'category':'C/C++',   'severity':severity.FIXMENOW, 'members':[], 'option':'',
-        'description':'Freeing a non-heap object',
-        'patterns':[r".*: warning: attempt to free a non-heap object '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wchar-subscripts',
-        'description':'Array subscript has type char',
-        'patterns':[r".*: warning: array subscript .+ type 'char'.+Wchar-subscripts"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Constant too large for type',
-        'patterns':[r".*: warning: integer constant is too large for '.+' type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Woverflow',
-        'description':'Constant too large for type, truncated',
-        'patterns':[r".*: warning: large integer implicitly truncated to unsigned type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Winteger-overflow',
-        'description':'Overflow in expression',
-        'patterns':[r".*: warning: overflow in expression; .*Winteger-overflow"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Woverflow',
-        'description':'Overflow in implicit constant conversion',
-        'patterns':[r".*: warning: overflow in implicit constant conversion"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Declaration does not declare anything',
-        'patterns':[r".*: warning: declaration 'class .+' does not declare anything"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wreorder',
-        'description':'Initialization order will be different',
-        'patterns':[r".*: warning: '.+' will be initialized after",
-                    r".*: warning: field .+ will be initialized after .+Wreorder"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning:   '.+'"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning:   base '.+'"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning:   when initialized here"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-parameter-type',
-        'description':'Parameter type not specified',
-        'patterns':[r".*: warning: type of '.+' defaults to 'int'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-declarations',
-        'description':'Missing declarations',
-        'patterns':[r".*: warning: declaration does not declare anything"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wmissing-noreturn',
-        'description':'Missing noreturn',
-        'patterns':[r".*: warning: function '.*' could be declared with attribute 'noreturn'"] },
-    { 'category':'gcc',     'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Invalid option for C file',
-        'patterns':[r".*: warning: command line option "".+"" is valid for C\+\+\/ObjC\+\+ but not for C"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'User warning',
-        'patterns':[r".*: warning: #warning "".+"""] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wvexing-parse',
-        'description':'Vexing parsing problem',
-        'patterns':[r".*: warning: empty parentheses interpreted as a function declaration"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wextra',
-        'description':'Dereferencing void*',
-        'patterns':[r".*: warning: dereferencing 'void \*' pointer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Comparison of pointer and integer',
-        'patterns':[r".*: warning: ordered comparison of pointer with integer zero",
-                    r".*: warning: .*comparison between pointer and integer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Use of error-prone unary operator',
-        'patterns':[r".*: warning: use of unary operator that may be intended as compound assignment"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wwrite-strings',
-        'description':'Conversion of string constant to non-const char*',
-        'patterns':[r".*: warning: deprecated conversion from string constant to '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wstrict-prototypes',
-        'description':'Function declaration isn''t a prototype',
-        'patterns':[r".*: warning: function declaration isn't a prototype"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wignored-qualifiers',
-        'description':'Type qualifiers ignored on function return value',
-        'patterns':[r".*: warning: type qualifiers ignored on function return type",
-                    r".*: warning: .+ type qualifier .+ has no effect .+Wignored-qualifiers"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'&lt;foo&gt; declared inside parameter list, scope limited to this definition',
-        'patterns':[r".*: warning: '.+' declared inside parameter list"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: its scope is only this definition or declaration, which is probably not what you want"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'-Wcomment',
-        'description':'Line continuation inside comment',
-        'patterns':[r".*: warning: multi-line comment"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'-Wcomment',
-        'description':'Comment inside comment',
-        'patterns':[r".*: warning: "".+"" within comment"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'',
-        'description':'Value stored is never read',
-        'patterns':[r".*: warning: Value stored to .+ is never read"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'-Wdeprecated-declarations',
-        'description':'Deprecated declarations',
-        'patterns':[r".*: warning: .+ is deprecated.+deprecated-declarations"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'-Wdeprecated-register',
-        'description':'Deprecated register',
-        'patterns':[r".*: warning: 'register' storage class specifier is deprecated"] },
-    { 'category':'C/C++',   'severity':severity.LOW,      'members':[], 'option':'-Wpointer-sign',
-        'description':'Converts between pointers to integer types with different sign',
-        'patterns':[r".*: warning: .+ converts between pointers to integer types with different sign"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS, 'members':[], 'option':'',
-        'description':'Extra tokens after #endif',
-        'patterns':[r".*: warning: extra tokens at end of #endif directive"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wenum-compare',
-        'description':'Comparison between different enums',
-        'patterns':[r".*: warning: comparison between '.+' and '.+'.+Wenum-compare"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wconversion',
-        'description':'Conversion may change value',
-        'patterns':[r".*: warning: converting negative value '.+' to '.+'",
-                    r".*: warning: conversion to '.+' .+ may alter its value"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wconversion-null',
-        'description':'Converting to non-pointer type from NULL',
-        'patterns':[r".*: warning: converting to non-pointer type '.+' from NULL"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wnull-conversion',
-        'description':'Converting NULL to non-pointer type',
-        'patterns':[r".*: warning: implicit conversion of NULL constant to '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wnon-literal-null-conversion',
-        'description':'Zero used as null pointer',
-        'patterns':[r".*: warning: expression .* zero treated as a null pointer constant"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Implicit conversion changes value',
-        'patterns':[r".*: warning: implicit conversion .* changes value from .* to .*-conversion"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'',
-        'description':'Passing NULL as non-pointer argument',
-        'patterns':[r".*: warning: passing NULL to non-pointer argument [0-9]+ of '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wctor-dtor-privacy',
-        'description':'Class seems unusable because of private ctor/dtor' ,
-        'patterns':[r".*: warning: all member functions in class '.+' are private"] },
+    {'category': 'aapt', 'severity': Severity.MEDIUM,
+     'description': 'aapt: No default translation',
+     'patterns': [r".*: warning: string '.+' has no default translation in .*"]},
+    {'category': 'aapt', 'severity': Severity.MEDIUM,
+     'description': 'aapt: Missing default or required localization',
+     'patterns': [r".*: warning: \*\*\*\* string '.+' has no default or required localization for '.+' in .+"]},
+    {'category': 'aapt', 'severity': Severity.MEDIUM,
+     'description': 'aapt: String marked untranslatable, but translation exists',
+     'patterns': [r".*: warning: string '.+' in .* marked untranslatable but exists in locale '??_??'"]},
+    {'category': 'aapt', 'severity': Severity.MEDIUM,
+     'description': 'aapt: empty span in string',
+     'patterns': [r".*: warning: empty '.+' span found in text '.+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Taking address of temporary',
+     'patterns': [r".*: warning: taking address of temporary"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Possible broken line continuation',
+     'patterns': [r".*: warning: backslash and newline separated by space"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wundefined-var-template',
+     'description': 'Undefined variable template',
+     'patterns': [r".*: warning: instantiation of variable .* no definition is available"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wundefined-inline',
+     'description': 'Inline function is not defined',
+     'patterns': [r".*: warning: inline function '.*' is not defined"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Warray-bounds',
+     'description': 'Array subscript out of bounds',
+     'patterns': [r".*: warning: array subscript is above array bounds",
+                  r".*: warning: Array subscript is undefined",
+                  r".*: warning: array subscript is below array bounds"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Excess elements in initializer',
+     'patterns': [r".*: warning: excess elements in .+ initializer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Decimal constant is unsigned only in ISO C90',
+     'patterns': [r".*: warning: this decimal constant is unsigned only in ISO C90"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmain',
+     'description': 'main is usually a function',
+     'patterns': [r".*: warning: 'main' is usually a function"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Typedef ignored',
+     'patterns': [r".*: warning: 'typedef' was ignored in this declaration"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Waddress',
+     'description': 'Address always evaluates to true',
+     'patterns': [r".*: warning: the address of '.+' will always evaluate as 'true'"]},
+    {'category': 'C/C++', 'severity': Severity.FIXMENOW,
+     'description': 'Freeing a non-heap object',
+     'patterns': [r".*: warning: attempt to free a non-heap object '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wchar-subscripts',
+     'description': 'Array subscript has type char',
+     'patterns': [r".*: warning: array subscript .+ type 'char'.+Wchar-subscripts"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Constant too large for type',
+     'patterns': [r".*: warning: integer constant is too large for '.+' type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Woverflow',
+     'description': 'Constant too large for type, truncated',
+     'patterns': [r".*: warning: large integer implicitly truncated to unsigned type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Winteger-overflow',
+     'description': 'Overflow in expression',
+     'patterns': [r".*: warning: overflow in expression; .*Winteger-overflow"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Woverflow',
+     'description': 'Overflow in implicit constant conversion',
+     'patterns': [r".*: warning: overflow in implicit constant conversion"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Declaration does not declare anything',
+     'patterns': [r".*: warning: declaration 'class .+' does not declare anything"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wreorder',
+     'description': 'Initialization order will be different',
+     'patterns': [r".*: warning: '.+' will be initialized after",
+                  r".*: warning: field .+ will be initialized after .+Wreorder"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip,   ....',
+     'patterns': [r".*: warning:   '.+'"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip,   base ...',
+     'patterns': [r".*: warning:   base '.+'"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip,   when initialized here',
+     'patterns': [r".*: warning:   when initialized here"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmissing-parameter-type',
+     'description': 'Parameter type not specified',
+     'patterns': [r".*: warning: type of '.+' defaults to 'int'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmissing-declarations',
+     'description': 'Missing declarations',
+     'patterns': [r".*: warning: declaration does not declare anything"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wmissing-noreturn',
+     'description': 'Missing noreturn',
+     'patterns': [r".*: warning: function '.*' could be declared with attribute 'noreturn'"]},
+    # pylint:disable=anomalous-backslash-in-string
+    # TODO(chh): fix the backslash pylint warning.
+    {'category': 'gcc', 'severity': Severity.MEDIUM,
+     'description': 'Invalid option for C file',
+     'patterns': [r".*: warning: command line option "".+"" is valid for C\+\+\/ObjC\+\+ but not for C"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'User warning',
+     'patterns': [r".*: warning: #warning "".+"""]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wvexing-parse',
+     'description': 'Vexing parsing problem',
+     'patterns': [r".*: warning: empty parentheses interpreted as a function declaration"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wextra',
+     'description': 'Dereferencing void*',
+     'patterns': [r".*: warning: dereferencing 'void \*' pointer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Comparison of pointer and integer',
+     'patterns': [r".*: warning: ordered comparison of pointer with integer zero",
+                  r".*: warning: .*comparison between pointer and integer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Use of error-prone unary operator',
+     'patterns': [r".*: warning: use of unary operator that may be intended as compound assignment"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wwrite-strings',
+     'description': 'Conversion of string constant to non-const char*',
+     'patterns': [r".*: warning: deprecated conversion from string constant to '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wstrict-prototypes',
+     'description': 'Function declaration isn''t a prototype',
+     'patterns': [r".*: warning: function declaration isn't a prototype"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wignored-qualifiers',
+     'description': 'Type qualifiers ignored on function return value',
+     'patterns': [r".*: warning: type qualifiers ignored on function return type",
+                  r".*: warning: .+ type qualifier .+ has no effect .+Wignored-qualifiers"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': '&lt;foo&gt; declared inside parameter list, scope limited to this definition',
+     'patterns': [r".*: warning: '.+' declared inside parameter list"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip, its scope is only this ...',
+     'patterns': [r".*: warning: its scope is only this definition or declaration, which is probably not what you want"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wcomment',
+     'description': 'Line continuation inside comment',
+     'patterns': [r".*: warning: multi-line comment"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wcomment',
+     'description': 'Comment inside comment',
+     'patterns': [r".*: warning: "".+"" within comment"]},
+    # Warning "value stored is never read" could be from clang-tidy or clang static analyzer.
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Value stored is never read',
+     'patterns': [r".*: warning: Value stored to .+ is never read.*clang-analyzer-deadcode.DeadStores"]},
+    {'category': 'C/C++', 'severity': Severity.LOW,
+     'description': 'Value stored is never read',
+     'patterns': [r".*: warning: Value stored to .+ is never read"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wdeprecated-declarations',
+     'description': 'Deprecated declarations',
+     'patterns': [r".*: warning: .+ is deprecated.+deprecated-declarations"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wdeprecated-register',
+     'description': 'Deprecated register',
+     'patterns': [r".*: warning: 'register' storage class specifier is deprecated"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wpointer-sign',
+     'description': 'Converts between pointers to integer types with different sign',
+     'patterns': [r".*: warning: .+ converts between pointers to integer types with different sign"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Extra tokens after #endif',
+     'patterns': [r".*: warning: extra tokens at end of #endif directive"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wenum-compare',
+     'description': 'Comparison between different enums',
+     'patterns': [r".*: warning: comparison between '.+' and '.+'.+Wenum-compare"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wconversion',
+     'description': 'Conversion may change value',
+     'patterns': [r".*: warning: converting negative value '.+' to '.+'",
+                  r".*: warning: conversion to '.+' .+ may (alter|change)"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wconversion-null',
+     'description': 'Converting to non-pointer type from NULL',
+     'patterns': [r".*: warning: converting to non-pointer type '.+' from NULL"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wnull-conversion',
+     'description': 'Converting NULL to non-pointer type',
+     'patterns': [r".*: warning: implicit conversion of NULL constant to '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wnon-literal-null-conversion',
+     'description': 'Zero used as null pointer',
+     'patterns': [r".*: warning: expression .* zero treated as a null pointer constant"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Implicit conversion changes value',
+     'patterns': [r".*: warning: implicit conversion .* changes value from .* to .*-conversion"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Passing NULL as non-pointer argument',
+     'patterns': [r".*: warning: passing NULL to non-pointer argument [0-9]+ of '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wctor-dtor-privacy',
+     'description': 'Class seems unusable because of private ctor/dtor',
+     'patterns': [r".*: warning: all member functions in class '.+' are private"]},
     # skip this next one, because it only points out some RefBase-based classes where having a private destructor is perfectly fine
-    { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'-Wctor-dtor-privacy',
-        'description':'Class seems unusable because of private ctor/dtor' ,
-        'patterns':[r".*: warning: 'class .+' only defines a private destructor and has no friends"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wctor-dtor-privacy',
-        'description':'Class seems unusable because of private ctor/dtor' ,
-        'patterns':[r".*: warning: 'class .+' only defines private constructors and has no friends"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wgnu-static-float-init',
-        'description':'In-class initializer for static const float/double' ,
-        'patterns':[r".*: warning: in-class initializer for static data member of .+const (float|double)"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wpointer-arith',
-        'description':'void* used in arithmetic' ,
-        'patterns':[r".*: warning: pointer of type 'void \*' used in (arithmetic|subtraction)",
-                    r".*: warning: arithmetic on .+ to void is a GNU extension.*Wpointer-arith",
-                    r".*: warning: wrong type argument to increment"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,   'members':[], 'option':'-Wsign-promo',
-        'description':'Overload resolution chose to promote from unsigned or enum to signed type' ,
-        'patterns':[r".*: warning: passing '.+' chooses 'int' over '.* int'"] },
-    { 'category':'cont.',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning:   in call to '.+'"] },
-    { 'category':'C/C++',   'severity':severity.HIGH,     'members':[], 'option':'-Wextra',
-        'description':'Base should be explicitly initialized in copy constructor',
-        'patterns':[r".*: warning: base class '.+' should be explicitly initialized in the copy constructor"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Converting from <type> to <other type>',
-        'patterns':[r".*: warning: converting to '.+' from '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'VLA has zero or negative size',
-        'patterns':[r".*: warning: Declared variable-length array \(VLA\) has .+ size"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Return value from void function',
-        'patterns':[r".*: warning: 'return' with a value, in function returning void"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'multichar',
-        'description':'Multi-character character constant',
-        'patterns':[r".*: warning: multi-character character constant"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'writable-strings',
-        'description':'Conversion from string literal to char*',
-        'patterns':[r".*: warning: .+ does not allow conversion from string literal to 'char \*'"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Wextra-semi',
-        'description':'Extra \';\'',
-        'patterns':[r".*: warning: extra ';' .+extra-semi"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'',
-        'description':'Useless specifier',
-        'patterns':[r".*: warning: useless storage class specifier in empty declaration"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Wduplicate-decl-specifier',
-        'description':'Duplicate declaration specifier',
-        'patterns':[r".*: warning: duplicate '.+' declaration specifier"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'',
-        'description':'Duplicate logtag',
-        'patterns':[r".*: warning: tag \".+\" \(.+\) duplicated in .+"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'typedef-redefinition',
-        'description':'Typedef redefinition',
-        'patterns':[r".*: warning: redefinition of typedef '.+' is a C11 feature"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'gnu-designator',
-        'description':'GNU old-style field designator',
-        'patterns':[r".*: warning: use of GNU old-style field designator extension"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'missing-field-initializers',
-        'description':'Missing field initializers',
-        'patterns':[r".*: warning: missing field '.+' initializer"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'missing-braces',
-        'description':'Missing braces',
-        'patterns':[r".*: warning: suggest braces around initialization of",
-                    r".*: warning: too many braces around scalar initializer .+Wmany-braces-around-scalar-init",
-                    r".*: warning: braces around scalar initializer"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'sign-compare',
-        'description':'Comparison of integers of different signs',
-        'patterns':[r".*: warning: comparison of integers of different signs.+sign-compare"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'dangling-else',
-        'description':'Add braces to avoid dangling else',
-        'patterns':[r".*: warning: add explicit braces to avoid dangling else"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'initializer-overrides',
-        'description':'Initializer overrides prior initialization',
-        'patterns':[r".*: warning: initializer overrides prior initialization of this subobject"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'self-assign',
-        'description':'Assigning value to self',
-        'patterns':[r".*: warning: explicitly assigning value of .+ to itself"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'gnu-variable-sized-type-not-at-end',
-        'description':'GNU extension, variable sized type not at end',
-        'patterns':[r".*: warning: field '.+' with variable sized type '.+' not at the end of a struct or class"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'tautological-constant-out-of-range-compare',
-        'description':'Comparison of constant is always false/true',
-        'patterns':[r".*: comparison of .+ is always .+Wtautological-constant-out-of-range-compare"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'overloaded-virtual',
-        'description':'Hides overloaded virtual function',
-        'patterns':[r".*: '.+' hides overloaded virtual function"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'incompatible-pointer-types',
-        'description':'Incompatible pointer types',
-        'patterns':[r".*: warning: incompatible pointer types .+Wincompatible-pointer-types"] },
-    { 'category':'logtags',   'severity':severity.LOW,     'members':[], 'option':'asm-operand-widths',
-        'description':'ASM value size does not match register size',
-        'patterns':[r".*: warning: value size does not match register size specified by the constraint and modifier"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'tautological-compare',
-        'description':'Comparison of self is always false',
-        'patterns':[r".*: self-comparison always evaluates to false"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'constant-logical-operand',
-        'description':'Logical op with constant operand',
-        'patterns':[r".*: use of logical '.+' with constant operand"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'literal-suffix',
-        'description':'Needs a space between literal and string macro',
-        'patterns':[r".*: warning: invalid suffix on literal.+ requires a space .+Wliteral-suffix"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'#warnings',
-        'description':'Warnings from #warning',
-        'patterns':[r".*: warning: .+-W#warnings"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'absolute-value',
-        'description':'Using float/int absolute value function with int/float argument',
-        'patterns':[r".*: warning: using .+ absolute value function .+ when argument is .+ type .+Wabsolute-value",
-                    r".*: warning: absolute value function '.+' given .+ which may cause truncation .+Wabsolute-value"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Wc++11-extensions',
-        'description':'Using C++11 extensions',
-        'patterns':[r".*: warning: 'auto' type specifier is a C\+\+11 extension"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'',
-        'description':'Refers to implicitly defined namespace',
-        'patterns':[r".*: warning: using directive refers to implicitly-defined namespace .+"] },
-    { 'category':'C/C++',   'severity':severity.LOW,     'members':[], 'option':'-Winvalid-pp-token',
-        'description':'Invalid pp token',
-        'patterns':[r".*: warning: missing .+Winvalid-pp-token"] },
+    {'category': 'C/C++', 'severity': Severity.SKIP, 'option': '-Wctor-dtor-privacy',
+     'description': 'Class seems unusable because of private ctor/dtor',
+     'patterns': [r".*: warning: 'class .+' only defines a private destructor and has no friends"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wctor-dtor-privacy',
+     'description': 'Class seems unusable because of private ctor/dtor',
+     'patterns': [r".*: warning: 'class .+' only defines private constructors and has no friends"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wgnu-static-float-init',
+     'description': 'In-class initializer for static const float/double',
+     'patterns': [r".*: warning: in-class initializer for static data member of .+const (float|double)"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wpointer-arith',
+     'description': 'void* used in arithmetic',
+     'patterns': [r".*: warning: pointer of type 'void \*' used in (arithmetic|subtraction)",
+                  r".*: warning: arithmetic on .+ to void is a GNU extension.*Wpointer-arith",
+                  r".*: warning: wrong type argument to increment"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wsign-promo',
+     'description': 'Overload resolution chose to promote from unsigned or enum to signed type',
+     'patterns': [r".*: warning: passing '.+' chooses '.+' over '.+'.*Wsign-promo"]},
+    {'category': 'cont.', 'severity': Severity.SKIP,
+     'description': 'skip,   in call to ...',
+     'patterns': [r".*: warning:   in call to '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.HIGH, 'option': '-Wextra',
+     'description': 'Base should be explicitly initialized in copy constructor',
+     'patterns': [r".*: warning: base class '.+' should be explicitly initialized in the copy constructor"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'VLA has zero or negative size',
+     'patterns': [r".*: warning: Declared variable-length array \(VLA\) has .+ size"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Return value from void function',
+     'patterns': [r".*: warning: 'return' with a value, in function returning void"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'multichar',
+     'description': 'Multi-character character constant',
+     'patterns': [r".*: warning: multi-character character constant"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'writable-strings',
+     'description': 'Conversion from string literal to char*',
+     'patterns': [r".*: warning: .+ does not allow conversion from string literal to 'char \*'"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wextra-semi',
+     'description': 'Extra \';\'',
+     'patterns': [r".*: warning: extra ';' .+extra-semi"]},
+    {'category': 'C/C++', 'severity': Severity.LOW,
+     'description': 'Useless specifier',
+     'patterns': [r".*: warning: useless storage class specifier in empty declaration"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wduplicate-decl-specifier',
+     'description': 'Duplicate declaration specifier',
+     'patterns': [r".*: warning: duplicate '.+' declaration specifier"]},
+    {'category': 'logtags', 'severity': Severity.LOW,
+     'description': 'Duplicate logtag',
+     'patterns': [r".*: warning: tag \".+\" \(.+\) duplicated in .+"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'typedef-redefinition',
+     'description': 'Typedef redefinition',
+     'patterns': [r".*: warning: redefinition of typedef '.+' is a C11 feature"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'gnu-designator',
+     'description': 'GNU old-style field designator',
+     'patterns': [r".*: warning: use of GNU old-style field designator extension"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'missing-field-initializers',
+     'description': 'Missing field initializers',
+     'patterns': [r".*: warning: missing field '.+' initializer"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'missing-braces',
+     'description': 'Missing braces',
+     'patterns': [r".*: warning: suggest braces around initialization of",
+                  r".*: warning: too many braces around scalar initializer .+Wmany-braces-around-scalar-init",
+                  r".*: warning: braces around scalar initializer"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'sign-compare',
+     'description': 'Comparison of integers of different signs',
+     'patterns': [r".*: warning: comparison of integers of different signs.+sign-compare"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'dangling-else',
+     'description': 'Add braces to avoid dangling else',
+     'patterns': [r".*: warning: add explicit braces to avoid dangling else"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'initializer-overrides',
+     'description': 'Initializer overrides prior initialization',
+     'patterns': [r".*: warning: initializer overrides prior initialization of this subobject"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'self-assign',
+     'description': 'Assigning value to self',
+     'patterns': [r".*: warning: explicitly assigning value of .+ to itself"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'gnu-variable-sized-type-not-at-end',
+     'description': 'GNU extension, variable sized type not at end',
+     'patterns': [r".*: warning: field '.+' with variable sized type '.+' not at the end of a struct or class"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'tautological-constant-out-of-range-compare',
+     'description': 'Comparison of constant is always false/true',
+     'patterns': [r".*: comparison of .+ is always .+Wtautological-constant-out-of-range-compare"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'overloaded-virtual',
+     'description': 'Hides overloaded virtual function',
+     'patterns': [r".*: '.+' hides overloaded virtual function"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'incompatible-pointer-types',
+     'description': 'Incompatible pointer types',
+     'patterns': [r".*: warning: incompatible pointer types .+Wincompatible-pointer-types"]},
+    {'category': 'logtags', 'severity': Severity.LOW, 'option': 'asm-operand-widths',
+     'description': 'ASM value size does not match register size',
+     'patterns': [r".*: warning: value size does not match register size specified by the constraint and modifier"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': 'tautological-compare',
+     'description': 'Comparison of self is always false',
+     'patterns': [r".*: self-comparison always evaluates to false"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': 'constant-logical-operand',
+     'description': 'Logical op with constant operand',
+     'patterns': [r".*: use of logical '.+' with constant operand"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': 'literal-suffix',
+     'description': 'Needs a space between literal and string macro',
+     'patterns': [r".*: warning: invalid suffix on literal.+ requires a space .+Wliteral-suffix"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '#warnings',
+     'description': 'Warnings from #warning',
+     'patterns': [r".*: warning: .+-W#warnings"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': 'absolute-value',
+     'description': 'Using float/int absolute value function with int/float argument',
+     'patterns': [r".*: warning: using .+ absolute value function .+ when argument is .+ type .+Wabsolute-value",
+                  r".*: warning: absolute value function '.+' given .+ which may cause truncation .+Wabsolute-value"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Wc++11-extensions',
+     'description': 'Using C++11 extensions',
+     'patterns': [r".*: warning: 'auto' type specifier is a C\+\+11 extension"]},
+    {'category': 'C/C++', 'severity': Severity.LOW,
+     'description': 'Refers to implicitly defined namespace',
+     'patterns': [r".*: warning: using directive refers to implicitly-defined namespace .+"]},
+    {'category': 'C/C++', 'severity': Severity.LOW, 'option': '-Winvalid-pp-token',
+     'description': 'Invalid pp token',
+     'patterns': [r".*: warning: missing .+Winvalid-pp-token"]},
 
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Operator new returns NULL',
-        'patterns':[r".*: warning: 'operator new' must not return NULL unless it is declared 'throw\(\)' .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wnull-arithmetic',
-        'description':'NULL used in arithmetic',
-        'patterns':[r".*: warning: NULL used in arithmetic",
-                    r".*: warning: comparison between NULL and non-pointer"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'header-guard',
-        'description':'Misspelled header guard',
-        'patterns':[r".*: warning: '.+' is used as a header guard .+ followed by .+ different macro"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'empty-body',
-        'description':'Empty loop body',
-        'patterns':[r".*: warning: .+ loop has empty body"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'enum-conversion',
-        'description':'Implicit conversion from enumeration type',
-        'patterns':[r".*: warning: implicit conversion from enumeration type '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'switch',
-        'description':'case value not in enumerated type',
-        'patterns':[r".*: warning: case value not in enumerated type '.+'"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Undefined result',
-        'patterns':[r".*: warning: The result of .+ is undefined",
-                    r".*: warning: passing an object that .+ has undefined behavior \[-Wvarargs\]",
-                    r".*: warning: 'this' pointer cannot be null in well-defined C\+\+ code;",
-                    r".*: warning: shifting a negative signed value is undefined"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Division by zero',
-        'patterns':[r".*: warning: Division by zero"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Use of deprecated method',
-        'patterns':[r".*: warning: '.+' is deprecated .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Use of garbage or uninitialized value',
-        'patterns':[r".*: warning: .+ is a garbage value",
-                    r".*: warning: Function call argument is an uninitialized value",
-                    r".*: warning: Undefined or garbage value returned to caller",
-                    r".*: warning: Called .+ pointer is.+uninitialized",
-                    r".*: warning: Called .+ pointer is.+uninitalized",  # match a typo in compiler message
-                    r".*: warning: Use of zero-allocated memory",
-                    r".*: warning: Dereference of undefined pointer value",
-                    r".*: warning: Passed-by-value .+ contains uninitialized data",
-                    r".*: warning: Branch condition evaluates to a garbage value",
-                    r".*: warning: The .+ of .+ is an uninitialized value.",
-                    r".*: warning: .+ is used uninitialized whenever .+sometimes-uninitialized",
-                    r".*: warning: Assigned value is garbage or undefined"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Result of malloc type incompatible with sizeof operand type',
-        'patterns':[r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wsizeof-array-argument',
-        'description':'Sizeof on array argument',
-        'patterns':[r".*: warning: sizeof on array function parameter will return"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'-Wsizeof-pointer-memacces',
-        'description':'Bad argument size of memory access functions',
-        'patterns':[r".*: warning: .+\[-Wsizeof-pointer-memaccess\]"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Return value not checked',
-        'patterns':[r".*: warning: The return value from .+ is not checked"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Possible heap pollution',
-        'patterns':[r".*: warning: .*Possible heap pollution from .+ type .+"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Allocation size of 0 byte',
-        'patterns':[r".*: warning: Call to .+ has an allocation size of 0 byte"] },
-    { 'category':'C/C++',   'severity':severity.MEDIUM,     'members':[], 'option':'',
-        'description':'Result of malloc type incompatible with sizeof operand type',
-        'patterns':[r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"] },
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Operator new returns NULL',
+     'patterns': [r".*: warning: 'operator new' must not return NULL unless it is declared 'throw\(\)' .+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wnull-arithmetic',
+     'description': 'NULL used in arithmetic',
+     'patterns': [r".*: warning: NULL used in arithmetic",
+                  r".*: warning: comparison between NULL and non-pointer"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'header-guard',
+     'description': 'Misspelled header guard',
+     'patterns': [r".*: warning: '.+' is used as a header guard .+ followed by .+ different macro"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'empty-body',
+     'description': 'Empty loop body',
+     'patterns': [r".*: warning: .+ loop has empty body"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'enum-conversion',
+     'description': 'Implicit conversion from enumeration type',
+     'patterns': [r".*: warning: implicit conversion from enumeration type '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': 'switch',
+     'description': 'case value not in enumerated type',
+     'patterns': [r".*: warning: case value not in enumerated type '.+'"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Undefined result',
+     'patterns': [r".*: warning: The result of .+ is undefined",
+                  r".*: warning: passing an object that .+ has undefined behavior \[-Wvarargs\]",
+                  r".*: warning: 'this' pointer cannot be null in well-defined C\+\+ code;",
+                  r".*: warning: shifting a negative signed value is undefined"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Division by zero',
+     'patterns': [r".*: warning: Division by zero"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Use of deprecated method',
+     'patterns': [r".*: warning: '.+' is deprecated .+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Use of garbage or uninitialized value',
+     'patterns': [r".*: warning: .+ is a garbage value",
+                  r".*: warning: Function call argument is an uninitialized value",
+                  r".*: warning: Undefined or garbage value returned to caller",
+                  r".*: warning: Called .+ pointer is.+uninitialized",
+                  r".*: warning: Called .+ pointer is.+uninitalized",  # match a typo in compiler message
+                  r".*: warning: Use of zero-allocated memory",
+                  r".*: warning: Dereference of undefined pointer value",
+                  r".*: warning: Passed-by-value .+ contains uninitialized data",
+                  r".*: warning: Branch condition evaluates to a garbage value",
+                  r".*: warning: The .+ of .+ is an uninitialized value.",
+                  r".*: warning: .+ is used uninitialized whenever .+sometimes-uninitialized",
+                  r".*: warning: Assigned value is garbage or undefined"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Result of malloc type incompatible with sizeof operand type',
+     'patterns': [r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wsizeof-array-argument',
+     'description': 'Sizeof on array argument',
+     'patterns': [r".*: warning: sizeof on array function parameter will return"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wsizeof-pointer-memacces',
+     'description': 'Bad argument size of memory access functions',
+     'patterns': [r".*: warning: .+\[-Wsizeof-pointer-memaccess\]"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Return value not checked',
+     'patterns': [r".*: warning: The return value from .+ is not checked"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Possible heap pollution',
+     'patterns': [r".*: warning: .*Possible heap pollution from .+ type .+"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Allocation size of 0 byte',
+     'patterns': [r".*: warning: Call to .+ has an allocation size of 0 byte"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Result of malloc type incompatible with sizeof operand type',
+     'patterns': [r".*: warning: Result of '.+' is converted to .+ incompatible with sizeof operand type"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wfor-loop-analysis',
+     'description': 'Variable used in loop condition not modified in loop body',
+     'patterns': [r".*: warning: variable '.+' used in loop condition.*Wfor-loop-analysis"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM,
+     'description': 'Closing a previously closed file',
+     'patterns': [r".*: warning: Closing a previously closed file"]},
+    {'category': 'C/C++', 'severity': Severity.MEDIUM, 'option': '-Wunnamed-type-template-args',
+     'description': 'Unnamed template type argument',
+     'patterns': [r".*: warning: template argument.+Wunnamed-type-template-args"]},
 
-    { 'category':'C/C++',   'severity':severity.HARMLESS,     'members':[], 'option':'',
-        'description':'Discarded qualifier from pointer target type',
-        'patterns':[r".*: warning: .+ discards '.+' qualifier from pointer target type"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS,     'members':[], 'option':'',
-        'description':'Use snprintf instead of sprintf',
-        'patterns':[r".*: warning: .*sprintf is often misused; please use snprintf"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS,     'members':[], 'option':'',
-        'description':'Unsupported optimizaton flag',
-        'patterns':[r".*: warning: optimization flag '.+' is not supported"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS,     'members':[], 'option':'',
-        'description':'Extra or missing parentheses',
-        'patterns':[r".*: warning: equality comparison with extraneous parentheses",
-                    r".*: warning: .+ within .+Wlogical-op-parentheses"] },
-    { 'category':'C/C++',   'severity':severity.HARMLESS,     'members':[], 'option':'mismatched-tags',
-        'description':'Mismatched class vs struct tags',
-        'patterns':[r".*: warning: '.+' defined as a .+ here but previously declared as a .+mismatched-tags",
-                    r".*: warning: .+ was previously declared as a .+mismatched-tags"] },
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Discarded qualifier from pointer target type',
+     'patterns': [r".*: warning: .+ discards '.+' qualifier from pointer target type"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Use snprintf instead of sprintf',
+     'patterns': [r".*: warning: .*sprintf is often misused; please use snprintf"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Unsupported optimizaton flag',
+     'patterns': [r".*: warning: optimization flag '.+' is not supported"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS,
+     'description': 'Extra or missing parentheses',
+     'patterns': [r".*: warning: equality comparison with extraneous parentheses",
+                  r".*: warning: .+ within .+Wlogical-op-parentheses"]},
+    {'category': 'C/C++', 'severity': Severity.HARMLESS, 'option': 'mismatched-tags',
+     'description': 'Mismatched class vs struct tags',
+     'patterns': [r".*: warning: '.+' defined as a .+ here but previously declared as a .+mismatched-tags",
+                  r".*: warning: .+ was previously declared as a .+mismatched-tags"]},
 
     # these next ones are to deal with formatting problems resulting from the log being mixed up by 'make -j'
-    { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: ,$"] },
-    { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: $"] },
-    { 'category':'C/C++',   'severity':severity.SKIP,     'members':[], 'option':'',
-        'description':'',
-        'patterns':[r".*: warning: In file included from .+,"] },
+    {'category': 'C/C++', 'severity': Severity.SKIP,
+     'description': 'skip, ,',
+     'patterns': [r".*: warning: ,$"]},
+    {'category': 'C/C++', 'severity': Severity.SKIP,
+     'description': 'skip,',
+     'patterns': [r".*: warning: $"]},
+    {'category': 'C/C++', 'severity': Severity.SKIP,
+     'description': 'skip, In file included from ...',
+     'patterns': [r".*: warning: In file included from .+,"]},
 
     # warnings from clang-tidy
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy readability',
-        'patterns':[r".*: .+\[readability-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy c++ core guidelines',
-        'patterns':[r".*: .+\[cppcoreguidelines-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-default-arguments',
-        'patterns':[r".*: .+\[google-default-arguments\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-runtime-int',
-        'patterns':[r".*: .+\[google-runtime-int\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-runtime-operator',
-        'patterns':[r".*: .+\[google-runtime-operator\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-runtime-references',
-        'patterns':[r".*: .+\[google-runtime-references\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-build',
-        'patterns':[r".*: .+\[google-build-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-explicit',
-        'patterns':[r".*: .+\[google-explicit-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-readability',
-        'patterns':[r".*: .+\[google-readability-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google-global',
-        'patterns':[r".*: .+\[google-global-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy google- other',
-        'patterns':[r".*: .+\[google-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy modernize',
-        'patterns':[r".*: .+\[modernize-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy misc',
-        'patterns':[r".*: .+\[misc-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy performance-faster-string-find',
-        'patterns':[r".*: .+\[performance-faster-string-find\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy performance-for-range-copy',
-        'patterns':[r".*: .+\[performance-for-range-copy\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy performance-implicit-cast-in-loop',
-        'patterns':[r".*: .+\[performance-implicit-cast-in-loop\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy performance-unnecessary-copy-initialization',
-        'patterns':[r".*: .+\[performance-unnecessary-copy-initialization\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy performance-unnecessary-value-param',
-        'patterns':[r".*: .+\[performance-unnecessary-value-param\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy CERT',
-        'patterns':[r".*: .+\[cert-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy llvm',
-        'patterns':[r".*: .+\[llvm-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy clang-diagnostic',
-        'patterns':[r".*: .+\[clang-diagnostic-.+\]$"] },
-    { 'category':'C/C++',   'severity':severity.TIDY,     'members':[], 'option':'',
-        'description':'clang-tidy clang-analyzer',
-        'patterns':[r".*: .+\[clang-analyzer-.+\]$",
-                    r".*: Call Path : .+$"] },
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy readability',
+     'patterns': [r".*: .+\[readability-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy c++ core guidelines',
+     'patterns': [r".*: .+\[cppcoreguidelines-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-default-arguments',
+     'patterns': [r".*: .+\[google-default-arguments\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-runtime-int',
+     'patterns': [r".*: .+\[google-runtime-int\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-runtime-operator',
+     'patterns': [r".*: .+\[google-runtime-operator\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-runtime-references',
+     'patterns': [r".*: .+\[google-runtime-references\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-build',
+     'patterns': [r".*: .+\[google-build-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-explicit',
+     'patterns': [r".*: .+\[google-explicit-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-readability',
+     'patterns': [r".*: .+\[google-readability-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google-global',
+     'patterns': [r".*: .+\[google-global-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy google- other',
+     'patterns': [r".*: .+\[google-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy modernize',
+     'patterns': [r".*: .+\[modernize-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy misc',
+     'patterns': [r".*: .+\[misc-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy performance-faster-string-find',
+     'patterns': [r".*: .+\[performance-faster-string-find\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy performance-for-range-copy',
+     'patterns': [r".*: .+\[performance-for-range-copy\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy performance-implicit-cast-in-loop',
+     'patterns': [r".*: .+\[performance-implicit-cast-in-loop\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy performance-unnecessary-copy-initialization',
+     'patterns': [r".*: .+\[performance-unnecessary-copy-initialization\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy performance-unnecessary-value-param',
+     'patterns': [r".*: .+\[performance-unnecessary-value-param\]$"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Unreachable code',
+     'patterns': [r".*: warning: This statement is never executed.*UnreachableCode"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Size of malloc may overflow',
+     'patterns': [r".*: warning: .* size of .* may overflow .*MallocOverflow"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Stream pointer might be NULL',
+     'patterns': [r".*: warning: Stream pointer might be NULL .*unix.Stream"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Opened file never closed',
+     'patterns': [r".*: warning: Opened File never closed.*unix.Stream"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer sozeof() on a pointer type',
+     'patterns': [r".*: warning: .*calls sizeof.* on a pointer type.*SizeofPtr"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Pointer arithmetic on non-array variables',
+     'patterns': [r".*: warning: Pointer arithmetic on non-array variables .*PointerArithm"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Subtraction of pointers of different memory chunks',
+     'patterns': [r".*: warning: Subtraction of two pointers .*PointerSub"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Access out-of-bound array element',
+     'patterns': [r".*: warning: Access out-of-bound array element .*ArrayBound"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Out of bound memory access',
+     'patterns': [r".*: warning: Out of bound memory access .*ArrayBoundV2"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Possible lock order reversal',
+     'patterns': [r".*: warning: .* Possible lock order reversal.*PthreadLock"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer Argument is a pointer to uninitialized value',
+     'patterns': [r".*: warning: .* argument is a pointer to uninitialized value .*CallAndMessage"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer cast to struct',
+     'patterns': [r".*: warning: Casting a non-structure type to a structure type .*CastToStruct"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer call path problems',
+     'patterns': [r".*: warning: Call Path : .+"]},
+    {'category': 'C/C++', 'severity': Severity.ANALYZER,
+     'description': 'clang-analyzer other',
+     'patterns': [r".*: .+\[clang-analyzer-.+\]$",
+                  r".*: Call Path : .+$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy CERT',
+     'patterns': [r".*: .+\[cert-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-tidy llvm',
+     'patterns': [r".*: .+\[llvm-.+\]$"]},
+    {'category': 'C/C++', 'severity': Severity.TIDY,
+     'description': 'clang-diagnostic',
+     'patterns': [r".*: .+\[clang-diagnostic-.+\]$"]},
 
     # catch-all for warnings this script doesn't know about yet
-    { 'category':'C/C++',   'severity':severity.UNKNOWN,  'members':[], 'option':'',
-        'description':'Unclassified/unrecognized warnings',
-        'patterns':[r".*: warning: .+"] },
+    {'category': 'C/C++', 'severity': Severity.UNKNOWN,
+     'description': 'Unclassified/unrecognized warnings',
+     'patterns': [r".*: warning: .+"]},
 ]
 
+
+def project_name_and_pattern(name, pattern):
+  return [name, '(^|.*/)' + pattern + '/.*: warning:']
+
+
+def simple_project_pattern(pattern):
+  return project_name_and_pattern(pattern, pattern)
+
+
 # A list of [project_name, file_path_pattern].
 # project_name should not contain comma, to be used in CSV output.
-projectlist = [
-    ['art',                 r"(^|.*/)art/.*: warning:"],
-    ['bionic',              r"(^|.*/)bionic/.*: warning:"],
-    ['bootable',            r"(^|.*/)bootable/.*: warning:"],
-    ['build',               r"(^|.*/)build/.*: warning:"],
-    ['cts',                 r"(^|.*/)cts/.*: warning:"],
-    ['dalvik',              r"(^|.*/)dalvik/.*: warning:"],
-    ['developers',          r"(^|.*/)developers/.*: warning:"],
-    ['development',         r"(^|.*/)development/.*: warning:"],
-    ['device',              r"(^|.*/)device/.*: warning:"],
-    ['doc',                 r"(^|.*/)doc/.*: warning:"],
+project_list = [
+    simple_project_pattern('art'),
+    simple_project_pattern('bionic'),
+    simple_project_pattern('bootable'),
+    simple_project_pattern('build'),
+    simple_project_pattern('cts'),
+    simple_project_pattern('dalvik'),
+    simple_project_pattern('developers'),
+    simple_project_pattern('development'),
+    simple_project_pattern('device'),
+    simple_project_pattern('doc'),
     # match external/google* before external/
-    ['external/google',     r"(^|.*/)external/google.*: warning:"],
-    ['external/non-google', r"(^|.*/)external/.*: warning:"],
-    ['frameworks',          r"(^|.*/)frameworks/.*: warning:"],
-    ['hardware',            r"(^|.*/)hardware/.*: warning:"],
-    ['kernel',              r"(^|.*/)kernel/.*: warning:"],
-    ['libcore',             r"(^|.*/)libcore/.*: warning:"],
-    ['libnativehelper',      r"(^|.*/)libnativehelper/.*: warning:"],
-    ['ndk',                 r"(^|.*/)ndk/.*: warning:"],
-    ['packages',            r"(^|.*/)packages/.*: warning:"],
-    ['pdk',                 r"(^|.*/)pdk/.*: warning:"],
-    ['prebuilts',           r"(^|.*/)prebuilts/.*: warning:"],
-    ['system',              r"(^|.*/)system/.*: warning:"],
-    ['toolchain',           r"(^|.*/)toolchain/.*: warning:"],
-    ['test',                r"(^|.*/)test/.*: warning:"],
-    ['tools',               r"(^|.*/)tools/.*: warning:"],
+    project_name_and_pattern('external/google', 'external/google.*'),
+    project_name_and_pattern('external/non-google', 'external'),
+    simple_project_pattern('frameworks/av/camera'),
+    simple_project_pattern('frameworks/av/cmds'),
+    simple_project_pattern('frameworks/av/drm'),
+    simple_project_pattern('frameworks/av/include'),
+    simple_project_pattern('frameworks/av/media'),
+    simple_project_pattern('frameworks/av/radio'),
+    simple_project_pattern('frameworks/av/services'),
+    project_name_and_pattern('frameworks/av/Other', 'frameworks/av'),
+    simple_project_pattern('frameworks/base'),
+    simple_project_pattern('frameworks/compile'),
+    simple_project_pattern('frameworks/minikin'),
+    simple_project_pattern('frameworks/native'),
+    simple_project_pattern('frameworks/opt'),
+    simple_project_pattern('frameworks/rs'),
+    simple_project_pattern('frameworks/webview'),
+    simple_project_pattern('frameworks/wilhelm'),
+    project_name_and_pattern('frameworks/Other', 'frameworks'),
+    simple_project_pattern('hardware/akm'),
+    simple_project_pattern('hardware/broadcom'),
+    simple_project_pattern('hardware/google'),
+    simple_project_pattern('hardware/intel'),
+    simple_project_pattern('hardware/interfaces'),
+    simple_project_pattern('hardware/libhardware'),
+    simple_project_pattern('hardware/libhardware_legacy'),
+    simple_project_pattern('hardware/qcom'),
+    simple_project_pattern('hardware/ril'),
+    project_name_and_pattern('hardware/Other', 'hardware'),
+    simple_project_pattern('kernel'),
+    simple_project_pattern('libcore'),
+    simple_project_pattern('libnativehelper'),
+    simple_project_pattern('ndk'),
+    # match vendor/unbungled_google/packages before other packages
+    simple_project_pattern('unbundled_google'),
+    simple_project_pattern('packages'),
+    simple_project_pattern('pdk'),
+    simple_project_pattern('prebuilts'),
+    simple_project_pattern('system/bt'),
+    simple_project_pattern('system/connectivity'),
+    simple_project_pattern('system/core'),
+    simple_project_pattern('system/extras'),
+    simple_project_pattern('system/gatekeeper'),
+    simple_project_pattern('system/keymaster'),
+    simple_project_pattern('system/libhwbinder'),
+    simple_project_pattern('system/media'),
+    simple_project_pattern('system/netd'),
+    simple_project_pattern('system/security'),
+    simple_project_pattern('system/sepolicy'),
+    simple_project_pattern('system/tools'),
+    simple_project_pattern('system/vold'),
+    project_name_and_pattern('system/Other', 'system'),
+    simple_project_pattern('toolchain'),
+    simple_project_pattern('test'),
+    simple_project_pattern('tools'),
     # match vendor/google* before vendor/
-    ['vendor/google',       r"(^|.*/)vendor/google.*: warning:"],
-    ['vendor/non-google',   r"(^|.*/)vendor/.*: warning:"],
+    project_name_and_pattern('vendor/google', 'vendor/google.*'),
+    project_name_and_pattern('vendor/non-google', 'vendor'),
     # keep out/obj and other patterns at the end.
-    ['out/obj', r".*/(gen|obj[^/]*)/(include|EXECUTABLES|SHARED_LIBRARIES|STATIC_LIBRARIES)/.*: warning:"],
-    ['other',   r".*: warning:"],
+    ['out/obj',
+     '.*/(gen|obj[^/]*)/(include|EXECUTABLES|SHARED_LIBRARIES|'
+     'STATIC_LIBRARIES|NATIVE_TESTS)/.*: warning:'],
+    ['other', '.*']  # all other unrecognized patterns
 ]
 
-projectpatterns = []
-for p in projectlist:
-    projectpatterns.append({'description':p[0], 'members':[], 'pattern':re.compile(p[1])})
+project_patterns = []
+project_names = []
+warning_messages = []
+warning_records = []
 
-# Each warning pattern has 3 dictionaries:
-# (1) 'projects' maps a project name to number of warnings in that project.
-# (2) 'projectanchor' maps a project name to its anchor number for HTML.
-# (3) 'projectwarning' maps a project name to a list of warning of that project.
-for w in warnpatterns:
+
+def initialize_arrays():
+  """Complete global arrays before they are used."""
+  global project_names, project_patterns
+  project_names = [p[0] for p in project_list]
+  project_patterns = [re.compile(p[1]) for p in project_list]
+  for w in warn_patterns:
+    w['members'] = []
+    if 'option' not in w:
+      w['option'] = ''
+    # Each warning pattern has a 'projects' dictionary, that
+    # maps a project name to number of warnings in that project.
     w['projects'] = {}
-    w['projectanchor'] = {}
-    w['projectwarning'] = {}
 
-platformversion = 'unknown'
-targetproduct = 'unknown'
-targetvariant = 'unknown'
+
+initialize_arrays()
+
+
+platform_version = 'unknown'
+target_product = 'unknown'
+target_variant = 'unknown'
 
 
 ##### Data and functions to dump html file. ##################################
 
-anchor = 0
-cur_row_class = 0
-
-html_script_style = """\
-    <script type="text/javascript">
-    function expand(id) {
-      var e = document.getElementById(id);
+html_head_scripts = """\
+  <script type="text/javascript">
+  function expand(id) {
+    var e = document.getElementById(id);
+    var f = document.getElementById(id + "_mark");
+    if (e.style.display == 'block') {
+       e.style.display = 'none';
+       f.innerHTML = '&#x2295';
+    }
+    else {
+       e.style.display = 'block';
+       f.innerHTML = '&#x2296';
+    }
+  };
+  function expandCollapse(show) {
+    for (var id = 1; ; id++) {
+      var e = document.getElementById(id + "");
       var f = document.getElementById(id + "_mark");
-      if (e.style.display == 'block') {
-         e.style.display = 'none';
-         f.innerHTML = '&#x2295';
-      }
-      else {
-         e.style.display = 'block';
-         f.innerHTML = '&#x2296';
-      }
-    };
-    function expand_collapse(show) {
-      for (var id = 1; ; id++) {
-        var e = document.getElementById(id + "");
-        var f = document.getElementById(id + "_mark");
-        if (!e || !f) break;
-        e.style.display = (show ? 'block' : 'none');
-        f.innerHTML = (show ? '&#x2296' : '&#x2295');
-      }
-    };
-    </script>
-    <style type="text/css">
-    table,th,td{border-collapse:collapse; width:100%;}
-    .button{color:blue;font-size:110%;font-weight:bolder;}
-    .bt{color:black;background-color:transparent;border:none;outline:none;
-        font-size:140%;font-weight:bolder;}
-    .c0{background-color:#e0e0e0;}
-    .c1{background-color:#d0d0d0;}
-    </style>\n"""
+      if (!e || !f) break;
+      e.style.display = (show ? 'block' : 'none');
+      f.innerHTML = (show ? '&#x2296' : '&#x2295');
+    }
+  };
+  </script>
+  <style type="text/css">
+  th,td{border-collapse:collapse; border:1px solid black;}
+  .button{color:blue;font-size:110%;font-weight:bolder;}
+  .bt{color:black;background-color:transparent;border:none;outline:none;
+      font-size:140%;font-weight:bolder;}
+  .c0{background-color:#e0e0e0;}
+  .c1{background-color:#d0d0d0;}
+  .t1{border-collapse:collapse; width:100%; border:1px solid black;}
+  </style>
+  <script src="https://www.gstatic.com/charts/loader.js"></script>
+"""
 
 
-def output(text):
-    print text,
-
-def htmlbig(param):
-    return '<font size="+2">' + param + '</font>'
-
-def dumphtmlprologue(title):
-    output('<html>\n<head>\n')
-    output('<title>' + title + '</title>\n')
-    output(html_script_style)
-    output('</head>\n<body>\n')
-    output(htmlbig(title))
-    output('<p>\n')
-
-def dumphtmlepilogue():
-    output('</body>\n</head>\n</html>\n')
-
-def tablerow(text):
-    global cur_row_class
-    output('<tr><td class="c' + str(cur_row_class) + '">')
-    cur_row_class = 1 - cur_row_class
-    output(text)
-    output('</td></tr>')
-
-def sortwarnings():
-    for i in warnpatterns:
-        i['members'] = sorted(set(i['members']))
-
-# dump some stats about total number of warnings and such
-def dumpstats():
-    known = 0
-    unknown = 0
-    sortwarnings()
-    for i in warnpatterns:
-        if i['severity'] == severity.UNKNOWN:
-            unknown += len(i['members'])
-        elif i['severity'] != severity.SKIP:
-            known += len(i['members'])
-    output('\nNumber of classified warnings: <b>' + str(known) + '</b><br>' )
-    output('\nNumber of unclassified warnings: <b>' + str(unknown) + '</b><br>')
-    total = unknown + known
-    output('\nTotal number of warnings: <b>' + str(total) + '</b>')
-    if total < 1000:
-        output('(low count may indicate incremental build)')
-    output('<br><br>\n')
-    output('<button class="button" onclick="expand_collapse(1);">' +
-           'Expand all warnings</button> ' +
-           '<button class="button" onclick="expand_collapse(0);">' +
-           'Collapse all warnings</button>')
-    output('<br>\n')
-
-# dump everything for a given severity
-def dumpseverity(sev):
-    global anchor
-    output('\n<br><span style="background-color:' + colorforseverity(sev) + '"><b>' +
-           headerforseverity(sev) + ':</b></span>\n')
-    output('<blockquote>\n')
-    for i in warnpatterns:
-      if i['severity'] == sev and len(i['members']) > 0:
-          anchor += 1
-          i['anchor'] = str(anchor)
-          if args.byproject:
-              dumpcategorybyproject(sev, i)
-          else:
-              dumpcategory(sev, i)
-    output('</blockquote>\n')
-
-def allpatterns(cat):
-    pats = ''
-    for i in cat['patterns']:
-        pats += i
-        pats += ' / '
-    return pats
-
-def descriptionfor(cat):
-    if cat['description'] != '':
-        return cat['description']
-    return allpatterns(cat)
+def html_big(param):
+  return '<font size="+2">' + param + '</font>'
 
 
-# show which warnings no longer occur
-def dumpfixed():
-    global anchor
-    anchor += 1
-    mark = str(anchor) + '_mark'
-    output('\n<br><p style="background-color:lightblue"><b>' +
-           '<button id="' + mark + '" ' +
-           'class="bt" onclick="expand(' + str(anchor) + ');">' +
-           '&#x2295</button> Fixed warnings. ' +
-           'No more occurences. Please consider turning these into ' +
-           'errors if possible, before they are reintroduced in to the build' +
-           ':</b></p>\n')
-    output('<blockquote>\n')
-    fixed_patterns = []
-    for i in warnpatterns:
-        if len(i['members']) == 0 and i['severity'] != severity.SKIP:
-            fixed_patterns.append(i['description'] + ' (' +
-                                  allpatterns(i) + ') ' + i['option'])
-    fixed_patterns.sort()
-    output('<div id="' + str(anchor) + '" style="display:none;"><table>\n')
-    for i in fixed_patterns:
-        tablerow(i)
-    output('</table></div>\n')
-    output('</blockquote>\n')
+def dump_html_prologue(title):
+  print '<html>\n<head>'
+  print '<title>' + title + '</title>'
+  print html_head_scripts
+  emit_stats_by_project()
+  print '</head>\n<body>'
+  print html_big(title)
+  print '<p>'
 
-def warningwithurl(line):
-    if not args.url:
-        return line
-    m = re.search( r'^([^ :]+):(\d+):(.+)', line, re.M|re.I)
-    if not m:
-        return line
-    filepath = m.group(1)
-    linenumber = m.group(2)
-    warning = m.group(3)
-    if args.separator:
-        return '<a href="' + args.url + '/' + filepath + args.separator + linenumber + '">' + filepath + ':' + linenumber + '</a>:' + warning
+
+def dump_html_epilogue():
+  print '</body>\n</head>\n</html>'
+
+
+def sort_warnings():
+  for i in warn_patterns:
+    i['members'] = sorted(set(i['members']))
+
+
+def emit_stats_by_project():
+  """Dump a google chart table of warnings per project and severity."""
+  # warnings[p][s] is number of warnings in project p of severity s.
+  warnings = {p: {s: 0 for s in Severity.range} for p in project_names}
+  for i in warn_patterns:
+    s = i['severity']
+    for p in i['projects']:
+      warnings[p][s] += i['projects'][p]
+
+  # total_by_project[p] is number of warnings in project p.
+  total_by_project = {p: sum(warnings[p][s] for s in Severity.range)
+                      for p in project_names}
+
+  # total_by_severity[s] is number of warnings of severity s.
+  total_by_severity = {s: sum(warnings[p][s] for p in project_names)
+                       for s in Severity.range}
+
+  # emit table header
+  stats_header = ['Project']
+  for s in Severity.range:
+    if total_by_severity[s]:
+      stats_header.append("<span style='background-color:{}'>{}</span>".
+                          format(Severity.colors[s],
+                                 Severity.column_headers[s]))
+  stats_header.append('TOTAL')
+
+  # emit a row of warning counts per project, skip no-warning projects
+  total_all_projects = 0
+  stats_rows = []
+  for p in project_names:
+    if total_by_project[p]:
+      one_row = [p]
+      for s in Severity.range:
+        if total_by_severity[s]:
+          one_row.append(warnings[p][s])
+      one_row.append(total_by_project[p])
+      stats_rows.append(one_row)
+      total_all_projects += total_by_project[p]
+
+  # emit a row of warning counts per severity
+  total_all_severities = 0
+  one_row = ['<b>TOTAL</b>']
+  for s in Severity.range:
+    if total_by_severity[s]:
+      one_row.append(total_by_severity[s])
+      total_all_severities += total_by_severity[s]
+  one_row.append(total_all_projects)
+  stats_rows.append(one_row)
+  print '<script>'
+  emit_const_string_array('StatsHeader', stats_header)
+  emit_const_object_array('StatsRows', stats_rows)
+  print draw_table_javascript
+  print '</script>'
+
+
+def dump_stats():
+  """Dump some stats about total number of warnings and such."""
+  known = 0
+  skipped = 0
+  unknown = 0
+  sort_warnings()
+  for i in warn_patterns:
+    if i['severity'] == Severity.UNKNOWN:
+      unknown += len(i['members'])
+    elif i['severity'] == Severity.SKIP:
+      skipped += len(i['members'])
     else:
-        return '<a href="' + args.url + '/' + filepath + '">' + filepath + '</a>:' + linenumber + ':' + warning
+      known += len(i['members'])
+  print 'Number of classified warnings: <b>' + str(known) + '</b><br>'
+  print 'Number of skipped warnings: <b>' + str(skipped) + '</b><br>'
+  print 'Number of unclassified warnings: <b>' + str(unknown) + '</b><br>'
+  total = unknown + known + skipped
+  extra_msg = ''
+  if total < 1000:
+    extra_msg = ' (low count may indicate incremental build)'
+  print 'Total number of warnings: <b>' + str(total) + '</b>' + extra_msg
 
-def dumpgroup(sev, anchor, description, warnings):
-    mark = anchor + '_mark'
-    output('\n<table frame="box">\n')
-    output('<tr bgcolor="' + colorforseverity(sev) + '">' +
-           '<td><button class="bt" id="' + mark +
-           '" onclick="expand(\'' + anchor + '\');">' +
-           '&#x2295</button> ' + description + '</td></tr>\n')
-    output('</table>\n')
-    output('<div id="' + anchor + '" style="display:none;">')
-    output('<table>\n')
-    for i in warnings:
-        tablerow(warningwithurl(i))
-    output('</table></div>\n')
 
-# dump warnings in a category
-def dumpcategory(sev, cat):
-    description = descriptionfor(cat) + ' (' + str(len(cat['members'])) + ')'
-    dumpgroup(sev, cat['anchor'], description, cat['members'])
+# New base table of warnings, [severity, warn_id, project, warning_message]
+# Need buttons to show warnings in different grouping options.
+# (1) Current, group by severity, id for each warning pattern
+#     sort by severity, warn_id, warning_message
+# (2) Current --byproject, group by severity,
+#     id for each warning pattern + project name
+#     sort by severity, warn_id, project, warning_message
+# (3) New, group by project + severity,
+#     id for each warning pattern
+#     sort by project, severity, warn_id, warning_message
+def emit_buttons():
+  print ('<button class="button" onclick="expandCollapse(1);">'
+         'Expand all warnings</button>\n'
+         '<button class="button" onclick="expandCollapse(0);">'
+         'Collapse all warnings</button>\n'
+         '<button class="button" onclick="groupBySeverity();">'
+         'Group warnings by severity</button>\n'
+         '<button class="button" onclick="groupByProject();">'
+         'Group warnings by project</button><br>')
 
-# similar to dumpcategory but output one table per project.
-def dumpcategorybyproject(sev, cat):
-    warning = descriptionfor(cat)
-    projects = cat['projectwarning'].keys()
-    projects.sort()
-    for p in projects:
-        anchor = cat['projectanchor'][p]
-        projectwarnings = cat['projectwarning'][p]
-        description = '{}, in {} ({})'.format(warning, p, len(projectwarnings))
-        dumpgroup(sev, anchor, description, projectwarnings)
 
-def findproject(line):
-    for p in projectpatterns:
-        if p['pattern'].match(line):
-            return p['description']
-    return '???'
+def all_patterns(category):
+  patterns = ''
+  for i in category['patterns']:
+    patterns += i
+    patterns += ' / '
+  return patterns
 
-def classifywarning(line):
-    global anchor
-    for i in warnpatterns:
-        for cpat in i['compiledpatterns']:
-            if cpat.match(line):
-                i['members'].append(line)
-                pname = findproject(line)
-                # Count warnings by project.
-                if pname in i['projects']:
-                    i['projects'][pname] += 1
-                else:
-                    i['projects'][pname] = 1
-                # Collect warnings by project.
-                if args.byproject:
-                    if pname in i['projectwarning']:
-                        i['projectwarning'][pname].append(line)
-                    else:
-                        i['projectwarning'][pname] = [line]
-                    if pname not in i['projectanchor']:
-                        anchor += 1
-                        i['projectanchor'][pname] = str(anchor)
-                return
-            else:
-                # If we end up here, there was a problem parsing the log
-                # probably caused by 'make -j' mixing the output from
-                # 2 or more concurrent compiles
-                pass
 
-# precompiling every pattern speeds up parsing by about 30x
-def compilepatterns():
-    for i in warnpatterns:
-        i['compiledpatterns'] = []
-        for pat in i['patterns']:
-            i['compiledpatterns'].append(re.compile(pat))
+def dump_fixed():
+  """Show which warnings no longer occur."""
+  anchor = 'fixed_warnings'
+  mark = anchor + '_mark'
+  print ('\n<br><p style="background-color:lightblue"><b>'
+         '<button id="' + mark + '" '
+         'class="bt" onclick="expand(\'' + anchor + '\');">'
+         '&#x2295</button> Fixed warnings. '
+         'No more occurrences. Please consider turning these into '
+         'errors if possible, before they are reintroduced in to the build'
+         ':</b></p>')
+  print '<blockquote>'
+  fixed_patterns = []
+  for i in warn_patterns:
+    if not i['members']:
+      fixed_patterns.append(i['description'] + ' (' +
+                            all_patterns(i) + ')')
+    if i['option']:
+      fixed_patterns.append(' ' + i['option'])
+  fixed_patterns.sort()
+  print '<div id="' + anchor + '" style="display:none;"><table>'
+  cur_row_class = 0
+  for text in fixed_patterns:
+    cur_row_class = 1 - cur_row_class
+    # remove last '\n'
+    t = text[:-1] if text[-1] == '\n' else text
+    print '<tr><td class="c' + str(cur_row_class) + '">' + t + '</td></tr>'
+  print '</table></div>'
+  print '</blockquote>'
 
-def parseinputfile():
-    global platformversion
-    global targetproduct
-    global targetvariant
-    infile = open(args.buildlog, 'r')
-    linecounter = 0
 
-    warningpattern = re.compile('.* warning:.*')
-    compilepatterns()
+def find_project_index(line):
+  for p in range(len(project_patterns)):
+    if project_patterns[p].match(line):
+      return p
+  return -1
 
-    # read the log file and classify all the warnings
-    warninglines = set()
-    for line in infile:
-        # replace fancy quotes with plain ol' quotes
-        line = line.replace("‘", "'");
-        line = line.replace("’", "'");
-        if warningpattern.match(line):
-            if line not in warninglines:
-                classifywarning(line)
-                warninglines.add(line)
+
+def classify_warning(line):
+  for i in range(len(warn_patterns)):
+    w = warn_patterns[i]
+    for cpat in w['compiled_patterns']:
+      if cpat.match(line):
+        w['members'].append(line)
+        p = find_project_index(line)
+        index = len(warning_messages)
+        warning_messages.append(line)
+        warning_records.append([i, p, index])
+        pname = '???' if p < 0 else project_names[p]
+        # Count warnings by project.
+        if pname in w['projects']:
+          w['projects'][pname] += 1
         else:
-            # save a little bit of time by only doing this for the first few lines
-            if linecounter < 50:
-                linecounter +=1
-                m = re.search('(?<=^PLATFORM_VERSION=).*', line)
-                if m != None:
-                    platformversion = m.group(0)
-                m = re.search('(?<=^TARGET_PRODUCT=).*', line)
-                if m != None:
-                    targetproduct = m.group(0)
-                m = re.search('(?<=^TARGET_BUILD_VARIANT=).*', line)
-                if m != None:
-                    targetvariant = m.group(0)
+          w['projects'][pname] = 1
+        return
+      else:
+        # If we end up here, there was a problem parsing the log
+        # probably caused by 'make -j' mixing the output from
+        # 2 or more concurrent compiles
+        pass
 
 
-# dump the html output to stdout
-def dumphtml():
-    dumphtmlprologue('Warnings for ' + platformversion + ' - ' + targetproduct + ' - ' + targetvariant)
-    dumpstats()
-    # sort table based on number of members once dumpstats has deduplicated the
-    # members.
-    warnpatterns.sort(reverse=True, key=lambda i: len(i['members']))
-    dumpseverity(severity.FIXMENOW)
-    dumpseverity(severity.HIGH)
-    dumpseverity(severity.MEDIUM)
-    dumpseverity(severity.LOW)
-    dumpseverity(severity.TIDY)
-    dumpseverity(severity.HARMLESS)
-    dumpseverity(severity.UNKNOWN)
-    dumpfixed()
-    dumphtmlepilogue()
+def compile_patterns():
+  """Precompiling every pattern speeds up parsing by about 30x."""
+  for i in warn_patterns:
+    i['compiled_patterns'] = []
+    for pat in i['patterns']:
+      i['compiled_patterns'].append(re.compile(pat))
+
+
+def parse_input_file():
+  """Parse input file, match warning lines."""
+  global platform_version
+  global target_product
+  global target_variant
+  infile = open(args.buildlog, 'r')
+  line_counter = 0
+
+  warning_pattern = re.compile('.* warning:.*')
+  compile_patterns()
+
+  # read the log file and classify all the warnings
+  warning_lines = set()
+  for line in infile:
+    # replace fancy quotes with plain ol' quotes
+    line = line.replace('‘', "'")
+    line = line.replace('’', "'")
+    if warning_pattern.match(line):
+      if line not in warning_lines:
+        classify_warning(line)
+        warning_lines.add(line)
+    elif line_counter < 50:
+      # save a little bit of time by only doing this for the first few lines
+      line_counter += 1
+      m = re.search('(?<=^PLATFORM_VERSION=).*', line)
+      if m is not None:
+        platform_version = m.group(0)
+      m = re.search('(?<=^TARGET_PRODUCT=).*', line)
+      if m is not None:
+        target_product = m.group(0)
+      m = re.search('(?<=^TARGET_BUILD_VARIANT=).*', line)
+      if m is not None:
+        target_variant = m.group(0)
+
+
+# Return s with escaped quotation characters.
+def escape_string(s):
+  return s.replace('"', '\\"')
+
+
+# Return s without trailing '\n' and escape the quotation characters.
+def strip_escape_string(s):
+  if not s:
+    return s
+  s = s[:-1] if s[-1] == '\n' else s
+  return escape_string(s)
+
+
+def emit_warning_array(name):
+  print 'var warning_{} = ['.format(name)
+  for i in range(len(warn_patterns)):
+    print '{},'.format(warn_patterns[i][name])
+  print '];'
+
+
+def emit_warning_arrays():
+  emit_warning_array('severity')
+  print 'var warning_description = ['
+  for i in range(len(warn_patterns)):
+    if warn_patterns[i]['members']:
+      print '"{}",'.format(escape_string(warn_patterns[i]['description']))
+    else:
+      print '"",'  # no such warning
+  print '];'
+
+scripts_for_warning_groups = """
+  function compareMessages(x1, x2) { // of the same warning type
+    return (WarningMessages[x1[2]] <= WarningMessages[x2[2]]) ? -1 : 1;
+  }
+  function byMessageCount(x1, x2) {
+    return x2[2] - x1[2];  // reversed order
+  }
+  function bySeverityMessageCount(x1, x2) {
+    // orer by severity first
+    if (x1[1] != x2[1])
+      return  x1[1] - x2[1];
+    return byMessageCount(x1, x2);
+  }
+  const ParseLinePattern = /^([^ :]+):(\\d+):(.+)/;
+  function addURL(line) {
+    if (FlagURL == "") return line;
+    if (FlagSeparator == "") {
+      return line.replace(ParseLinePattern,
+        "<a href='" + FlagURL + "/$1'>$1</a>:$2:$3");
+    }
+    return line.replace(ParseLinePattern,
+      "<a href='" + FlagURL + "/$1" + FlagSeparator + "$2'>$1:$2</a>:$3");
+  }
+  function createArrayOfDictionaries(n) {
+    var result = [];
+    for (var i=0; i<n; i++) result.push({});
+    return result;
+  }
+  function groupWarningsBySeverity() {
+    // groups is an array of dictionaries,
+    // each dictionary maps from warning type to array of warning messages.
+    var groups = createArrayOfDictionaries(SeverityColors.length);
+    for (var i=0; i<Warnings.length; i++) {
+      var w = Warnings[i][0];
+      var s = WarnPatternsSeverity[w];
+      var k = w.toString();
+      if (!(k in groups[s]))
+        groups[s][k] = [];
+      groups[s][k].push(Warnings[i]);
+    }
+    return groups;
+  }
+  function groupWarningsByProject() {
+    var groups = createArrayOfDictionaries(ProjectNames.length);
+    for (var i=0; i<Warnings.length; i++) {
+      var w = Warnings[i][0];
+      var p = Warnings[i][1];
+      var k = w.toString();
+      if (!(k in groups[p]))
+        groups[p][k] = [];
+      groups[p][k].push(Warnings[i]);
+    }
+    return groups;
+  }
+  var GlobalAnchor = 0;
+  function createWarningSection(header, color, group) {
+    var result = "";
+    var groupKeys = [];
+    var totalMessages = 0;
+    for (var k in group) {
+       totalMessages += group[k].length;
+       groupKeys.push([k, WarnPatternsSeverity[parseInt(k)], group[k].length]);
+    }
+    groupKeys.sort(bySeverityMessageCount);
+    for (var idx=0; idx<groupKeys.length; idx++) {
+      var k = groupKeys[idx][0];
+      var messages = group[k];
+      var w = parseInt(k);
+      var wcolor = SeverityColors[WarnPatternsSeverity[w]];
+      var description = WarnPatternsDescription[w];
+      if (description.length == 0)
+          description = "???";
+      GlobalAnchor += 1;
+      result += "<table class='t1'><tr bgcolor='" + wcolor + "'><td>" +
+                "<button class='bt' id='" + GlobalAnchor + "_mark" +
+                "' onclick='expand(\\"" + GlobalAnchor + "\\");'>" +
+                "&#x2295</button> " +
+                description + " (" + messages.length + ")</td></tr></table>";
+      result += "<div id='" + GlobalAnchor +
+                "' style='display:none;'><table class='t1'>";
+      var c = 0;
+      messages.sort(compareMessages);
+      for (var i=0; i<messages.length; i++) {
+        result += "<tr><td class='c" + c + "'>" +
+                  addURL(WarningMessages[messages[i][2]]) + "</td></tr>";
+        c = 1 - c;
+      }
+      result += "</table></div>";
+    }
+    if (result.length > 0) {
+      return "<br><span style='background-color:" + color + "'><b>" +
+             header + ": " + totalMessages +
+             "</b></span><blockquote><table class='t1'>" +
+             result + "</table></blockquote>";
+
+    }
+    return "";  // empty section
+  }
+  function generateSectionsBySeverity() {
+    var result = "";
+    var groups = groupWarningsBySeverity();
+    for (s=0; s<SeverityColors.length; s++) {
+      result += createWarningSection(SeverityHeaders[s], SeverityColors[s], groups[s]);
+    }
+    return result;
+  }
+  function generateSectionsByProject() {
+    var result = "";
+    var groups = groupWarningsByProject();
+    for (i=0; i<groups.length; i++) {
+      result += createWarningSection(ProjectNames[i], 'lightgrey', groups[i]);
+    }
+    return result;
+  }
+  function groupWarnings(generator) {
+    GlobalAnchor = 0;
+    var e = document.getElementById("warning_groups");
+    e.innerHTML = generator();
+  }
+  function groupBySeverity() {
+    groupWarnings(generateSectionsBySeverity);
+  }
+  function groupByProject() {
+    groupWarnings(generateSectionsByProject);
+  }
+"""
+
+
+# Emit a JavaScript const string
+def emit_const_string(name, value):
+  print 'const ' + name + ' = "' + escape_string(value) + '";'
+
+
+# Emit a JavaScript const integer array.
+def emit_const_int_array(name, array):
+  print 'const ' + name + ' = ['
+  for n in array:
+    print str(n) + ','
+  print '];'
+
+
+# Emit a JavaScript const string array.
+def emit_const_string_array(name, array):
+  print 'const ' + name + ' = ['
+  for s in array:
+    print '"' + strip_escape_string(s) + '",'
+  print '];'
+
+
+# Emit a JavaScript const object array.
+def emit_const_object_array(name, array):
+  print 'const ' + name + ' = ['
+  for x in array:
+    print str(x) + ','
+  print '];'
+
+
+def emit_js_data():
+  """Dump dynamic HTML page's static JavaScript data."""
+  emit_const_string('FlagURL', args.url if args.url else '')
+  emit_const_string('FlagSeparator', args.separator if args.separator else '')
+  emit_const_string_array('SeverityColors', Severity.colors)
+  emit_const_string_array('SeverityHeaders', Severity.headers)
+  emit_const_string_array('SeverityColumnHeaders', Severity.column_headers)
+  emit_const_string_array('ProjectNames', project_names)
+  emit_const_int_array('WarnPatternsSeverity',
+                       [w['severity'] for w in warn_patterns])
+  emit_const_string_array('WarnPatternsDescription',
+                          [w['description'] for w in warn_patterns])
+  emit_const_string_array('WarnPatternsOption',
+                          [w['option'] for w in warn_patterns])
+  emit_const_string_array('WarningMessages', warning_messages)
+  emit_const_object_array('Warnings', warning_records)
+
+draw_table_javascript = """
+google.charts.load('current', {'packages':['table']});
+google.charts.setOnLoadCallback(drawTable);
+function drawTable() {
+  var data = new google.visualization.DataTable();
+  data.addColumn('string', StatsHeader[0]);
+  for (var i=1; i<StatsHeader.length; i++) {
+    data.addColumn('number', StatsHeader[i]);
+  }
+  data.addRows(StatsRows);
+  for (var i=0; i<StatsRows.length; i++) {
+    for (var j=0; j<StatsHeader.length; j++) {
+      data.setProperty(i, j, 'style', 'border:1px solid black;');
+    }
+  }
+  var table = new google.visualization.Table(document.getElementById('stats_table'));
+  table.draw(data, {allowHtml: true, alternatingRowStyle: true});
+}
+"""
+
+
+def dump_html():
+  """Dump the html output to stdout."""
+  dump_html_prologue('Warnings for ' + platform_version + ' - ' +
+                     target_product + ' - ' + target_variant)
+  dump_stats()
+  print '<br><div id="stats_table"></div><br>'
+  print '\n<script>'
+  emit_js_data()
+  print scripts_for_warning_groups
+  print '</script>'
+  emit_buttons()
+  # Warning messages are grouped by severities or project names.
+  print '<br><div id="warning_groups"></div>'
+  if args.byproject:
+    print '<script>groupByProject();</script>'
+  else:
+    print '<script>groupBySeverity();</script>'
+  dump_fixed()
+  dump_html_epilogue()
 
 
 ##### Functions to count warnings and dump csv file. #########################
 
-def descriptionforcsv(cat):
-    if cat['description'] == '':
-        return '?'
-    return cat['description']
 
-def stringforcsv(s):
-    if ',' in s:
-        return '"{}"'.format(s)
-    return s
+def description_for_csv(category):
+  if not category['description']:
+    return '?'
+  return category['description']
 
-def countseverity(sev, kind):
-  sum = 0
-  for i in warnpatterns:
-      if i['severity'] == sev and len(i['members']) > 0:
-          n = len(i['members'])
-          sum += n
-          warning = stringforcsv(kind + ': ' + descriptionforcsv(i))
-          print '{},,{}'.format(n, warning)
-          # print number of warnings for each project, ordered by project name.
-          projects = i['projects'].keys()
-          projects.sort()
-          for p in projects:
-              print '{},{},{}'.format(i['projects'][p], p, warning)
-  print '{},,{}'.format(sum, kind + ' warnings')
-  return sum
+
+def string_for_csv(s):
+  # Only some Java warning desciptions have used quotation marks.
+  # TODO(chh): if s has double quote character, s should be quoted.
+  if ',' in s:
+    # TODO(chh): replace a double quote with two double quotes in s.
+    return '"{}"'.format(s)
+  return s
+
+
+def count_severity(sev, kind):
+  """Count warnings of given severity."""
+  total = 0
+  for i in warn_patterns:
+    if i['severity'] == sev and i['members']:
+      n = len(i['members'])
+      total += n
+      warning = string_for_csv(kind + ': ' + description_for_csv(i))
+      print '{},,{}'.format(n, warning)
+      # print number of warnings for each project, ordered by project name.
+      projects = i['projects'].keys()
+      projects.sort()
+      for p in projects:
+        print '{},{},{}'.format(i['projects'][p], p, warning)
+  print '{},,{}'.format(total, kind + ' warnings')
+  return total
+
 
 # dump number of warnings in csv format to stdout
-def dumpcsv():
-    sortwarnings()
-    total = 0
-    total += countseverity(severity.FIXMENOW, 'FixNow')
-    total += countseverity(severity.HIGH, 'High')
-    total += countseverity(severity.MEDIUM, 'Medium')
-    total += countseverity(severity.LOW, 'Low')
-    total += countseverity(severity.TIDY, 'Tidy')
-    total += countseverity(severity.HARMLESS, 'Harmless')
-    total += countseverity(severity.UNKNOWN, 'Unknown')
-    print '{},,{}'.format(total, 'All warnings')
+def dump_csv():
+  """Dump number of warnings in csv format to stdout."""
+  sort_warnings()
+  total = 0
+  for s in Severity.range:
+    total += count_severity(s, Severity.column_headers[s])
+  print '{},,{}'.format(total, 'All warnings')
 
 
-parseinputfile()
-if args.gencsv:
-    dumpcsv()
-else:
-    dumphtml()
+def main():
+  parse_input_file()
+  if args.gencsv:
+    dump_csv()
+  else:
+    dump_html()
+
+
+# Run main function if warn.py is the main program.
+if __name__ == '__main__':
+  main()
diff --git a/tools/zipalign/Android.mk b/tools/zipalign/Android.mk
index 0775d43..8c0240a 100644
--- a/tools/zipalign/Android.mk
+++ b/tools/zipalign/Android.mk
@@ -35,6 +35,4 @@
 LOCAL_MODULE := zipalign
 LOCAL_MODULE_HOST_OS := darwin linux windows
 
-LOCAL_CFLAGS := -Werror
-
 include $(BUILD_HOST_EXECUTABLE)
diff --git a/tools/zipalign/ZipEntry.cpp b/tools/zipalign/ZipEntry.cpp
index 1031dbe..a9c2d33 100644
--- a/tools/zipalign/ZipEntry.cpp
+++ b/tools/zipalign/ZipEntry.cpp
@@ -130,6 +130,7 @@
     if (mCDE.mFileCommentLength > 0) {
         /* TODO: stop assuming null-terminated ASCII here? */
         mCDE.mFileComment = new uint8_t[mCDE.mFileCommentLength+1];
+        assert(comment != NULL);
         strcpy((char*) mCDE.mFileComment, comment);
     }
 
@@ -142,8 +143,7 @@
  *
  * Initializes the CDE and the LFH.
  */
-status_t ZipEntry::initFromExternal(const ZipFile*,
-    const ZipEntry* pEntry)
+status_t ZipEntry::initFromExternal(const ZipEntry* pEntry)
 {
     /*
      * Copy everything in the CDE over, then fix up the hairy bits.
@@ -694,3 +694,4 @@
     if (mFileComment != NULL)
         ALOGD("  comment: '%s'\n", mFileComment);
 }
+
diff --git a/tools/zipalign/ZipEntry.h b/tools/zipalign/ZipEntry.h
index eb68afe..431b6db 100644
--- a/tools/zipalign/ZipEntry.h
+++ b/tools/zipalign/ZipEntry.h
@@ -167,7 +167,7 @@
      * Initialize the structure with the contents of a ZipEntry from
      * another file.
      */
-    status_t initFromExternal(const ZipFile* pZipFile, const ZipEntry* pEntry);
+    status_t initFromExternal(const ZipEntry* pEntry);
 
     /*
      * Add some pad bytes to the LFH.  We do this by adding or resizing
diff --git a/tools/zipalign/ZipFile.cpp b/tools/zipalign/ZipFile.cpp
index 7c3ff37..98d02e0 100644
--- a/tools/zipalign/ZipFile.cpp
+++ b/tools/zipalign/ZipFile.cpp
@@ -566,7 +566,7 @@
         goto bail;
     }
 
-    result = pEntry->initFromExternal(pSourceZip, pSourceEntry);
+    result = pEntry->initFromExternal(pSourceEntry);
     if (result != NO_ERROR)
         goto bail;
     if (padding != 0) {
@@ -673,7 +673,7 @@
         goto bail;
     }
 
-    result = pEntry->initFromExternal(pSourceZip, pSourceEntry);
+    result = pEntry->initFromExternal(pSourceEntry);
     if (result != NO_ERROR)
         goto bail;
 
@@ -919,6 +919,7 @@
             getSize = fread(inBuf, 1, kBufSize, srcFp);
             if (ferror(srcFp)) {
                 ALOGD("deflate read failed (errno=%d)\n", errno);
+                result = UNKNOWN_ERROR;
                 delete[] inBuf;
                 goto bail;
             }
@@ -937,6 +938,7 @@
     ALOGV("+++ writing %d bytes\n", (int)outSize);
     if (fwrite(outBuf, 1, outSize, dstFp) != outSize) {
         ALOGD("write %d failed in deflate\n", (int)outSize);
+        result = UNKNOWN_ERROR;
         goto bail;
     }